summaryrefslogtreecommitdiff
path: root/js/dojo-1.7.2/dojox/widget
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo-1.7.2/dojox/widget')
-rw-r--r--js/dojo-1.7.2/dojox/widget/AnalogGauge.js12
-rw-r--r--js/dojo-1.7.2/dojox/widget/AutoRotator.js221
-rw-r--r--js/dojo-1.7.2/dojox/widget/BarGauge.js11
-rw-r--r--js/dojo-1.7.2/dojox/widget/Calendar.js944
-rw-r--r--js/dojo-1.7.2/dojox/widget/Calendar/Calendar.css307
-rw-r--r--js/dojo-1.7.2/dojox/widget/Calendar/Calendar.html24
-rw-r--r--js/dojo-1.7.2/dojox/widget/Calendar/CalendarDay.html23
-rw-r--r--js/dojo-1.7.2/dojox/widget/Calendar/CalendarMonth.html12
-rw-r--r--js/dojo-1.7.2/dojox/widget/Calendar/CalendarMonthYear.html31
-rw-r--r--js/dojo-1.7.2/dojox/widget/Calendar/CalendarYear.html12
-rw-r--r--js/dojo-1.7.2/dojox/widget/CalendarFx.js31
-rw-r--r--js/dojo-1.7.2/dojox/widget/CalendarViews.js153
-rw-r--r--js/dojo-1.7.2/dojox/widget/ColorPicker.js575
-rw-r--r--js/dojo-1.7.2/dojox/widget/ColorPicker/ColorPicker.css118
-rw-r--r--js/dojo-1.7.2/dojox/widget/ColorPicker/ColorPicker.html72
-rw-r--r--js/dojo-1.7.2/dojox/widget/ColorPicker/images/hue.pngbin0 -> 1991 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/ColorPicker/images/hueHandle.pngbin0 -> 280 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/ColorPicker/images/hueHandleA11y.pngbin0 -> 199 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/ColorPicker/images/pickerPointer.pngbin0 -> 228 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/ColorPicker/images/underlay.pngbin0 -> 10788 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/DataPresentation.js902
-rw-r--r--js/dojo-1.7.2/dojox/widget/Dialog.js253
-rw-r--r--js/dojo-1.7.2/dojox/widget/Dialog/Dialog.css112
-rw-r--r--js/dojo-1.7.2/dojox/widget/Dialog/Dialog.html11
-rw-r--r--js/dojo-1.7.2/dojox/widget/Dialog/images/dialogCloseButton.gifbin0 -> 1408 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/Dialog/images/dialogCloseButton.pngbin0 -> 1357 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/DialogSimple.js12
-rw-r--r--js/dojo-1.7.2/dojox/widget/DocTester.js90
-rw-r--r--js/dojo-1.7.2/dojox/widget/DocTester/DocTester.css32
-rw-r--r--js/dojo-1.7.2/dojox/widget/DocTester/DocTester.html10
-rw-r--r--js/dojo-1.7.2/dojox/widget/DynamicTooltip.js112
-rw-r--r--js/dojo-1.7.2/dojox/widget/FeedPortlet.js443
-rw-r--r--js/dojo-1.7.2/dojox/widget/FilePicker.js227
-rw-r--r--js/dojo-1.7.2/dojox/widget/FilePicker/FilePicker.css76
-rw-r--r--js/dojo-1.7.2/dojox/widget/FilePicker/_FileInfoPane.html19
-rw-r--r--js/dojo-1.7.2/dojox/widget/FilePicker/images/nihiloFileIcons.gifbin0 -> 986 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/FilePicker/images/soriaFileIcons.gifbin0 -> 986 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/FilePicker/images/tundraFileIcons.gifbin0 -> 986 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/FisheyeList.js713
-rw-r--r--js/dojo-1.7.2/dojox/widget/FisheyeList/FisheyeList.css28
-rw-r--r--js/dojo-1.7.2/dojox/widget/FisheyeLite.js151
-rw-r--r--js/dojo-1.7.2/dojox/widget/Iterator.js178
-rw-r--r--js/dojo-1.7.2/dojox/widget/Loader.js111
-rw-r--r--js/dojo-1.7.2/dojox/widget/Loader/Loader.css27
-rw-r--r--js/dojo-1.7.2/dojox/widget/Loader/icons/loading.gifbin0 -> 751 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/MultiSelectCalendar.js977
-rw-r--r--js/dojo-1.7.2/dojox/widget/MultiSelectCalendar/MultiSelectCalendar.html38
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager.js555
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager/Pager.css92
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager/Pager.html13
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager/images/hNext.pngbin0 -> 496 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager/images/hPrevious.pngbin0 -> 502 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager/images/pageActive.pngbin0 -> 276 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager/images/pageInactive.pngbin0 -> 288 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager/images/vNext.pngbin0 -> 500 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/Pager/images/vPrevious.pngbin0 -> 512 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/PlaceholderMenuItem.js108
-rw-r--r--js/dojo-1.7.2/dojox/widget/Portlet.js435
-rw-r--r--js/dojo-1.7.2/dojox/widget/Portlet/Portlet.css161
-rw-r--r--js/dojo-1.7.2/dojox/widget/Portlet/images/icons.gifbin0 -> 896 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/Portlet/images/icons.pngbin0 -> 593 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/README186
-rw-r--r--js/dojo-1.7.2/dojox/widget/Roller.js232
-rw-r--r--js/dojo-1.7.2/dojox/widget/RollingList.js1210
-rw-r--r--js/dojo-1.7.2/dojox/widget/RollingList/RollingList.css156
-rw-r--r--js/dojo-1.7.2/dojox/widget/RollingList/RollingList.html10
-rw-r--r--js/dojo-1.7.2/dojox/widget/Rotator.js368
-rw-r--r--js/dojo-1.7.2/dojox/widget/SortList.js155
-rw-r--r--js/dojo-1.7.2/dojox/widget/SortList/SortList.css68
-rw-r--r--js/dojo-1.7.2/dojox/widget/SortList/SortList.html9
-rw-r--r--js/dojo-1.7.2/dojox/widget/Standby.js777
-rw-r--r--js/dojo-1.7.2/dojox/widget/Standby/images/loading.gifbin0 -> 4178 bytes
-rw-r--r--js/dojo-1.7.2/dojox/widget/TitleGroup.js83
-rw-r--r--js/dojo-1.7.2/dojox/widget/TitleGroup/TitleGroup.css28
-rw-r--r--js/dojo-1.7.2/dojox/widget/Toaster.js290
-rw-r--r--js/dojo-1.7.2/dojox/widget/Toaster/Toaster.css42
-rw-r--r--js/dojo-1.7.2/dojox/widget/UpgradeBar.js228
-rw-r--r--js/dojo-1.7.2/dojox/widget/UpgradeBar/UpgradeBar.css73
-rw-r--r--js/dojo-1.7.2/dojox/widget/UpgradeBar/UpgradeBar.html5
-rw-r--r--js/dojo-1.7.2/dojox/widget/Wizard.js210
-rw-r--r--js/dojo-1.7.2/dojox/widget/Wizard/Wizard.css57
-rw-r--r--js/dojo-1.7.2/dojox/widget/Wizard/Wizard.html9
-rw-r--r--js/dojo-1.7.2/dojox/widget/gauge/AnalogArcIndicator.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/gauge/AnalogArrowIndicator.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/gauge/AnalogNeedleIndicator.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/gauge/BarIndicator.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/gauge/_Gauge.js11
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ColorPicker.js49
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/FilePicker.js42
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/Wizard.js42
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ar/ColorPicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ar/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ar/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/az/ColorPicker.js17
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/az/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/az/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ca/ColorPicker.js11
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ca/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ca/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/cs/ColorPicker.js14
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/cs/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/cs/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/da/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/da/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/da/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/de/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/de/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/de/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/el/ColorPicker.js15
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/el/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/el/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/es/ColorPicker.js11
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/es/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/es/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/fi/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/fi/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/fi/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/fr/ColorPicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/fr/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/fr/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/he/ColorPicker.js16
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/he/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/he/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/hr/ColorPicker.js15
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/hr/FilePicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/hr/Wizard.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/hu/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/hu/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/hu/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/it/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/it/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/it/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ja/ColorPicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ja/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ja/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/kk/ColorPicker.js15
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/kk/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/kk/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ko/ColorPicker.js15
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ko/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ko/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/nb/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/nb/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/nb/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/nl/ColorPicker.js11
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/nl/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/nl/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pl/ColorPicker.js15
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pl/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pl/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pt-pt/ColorPicker.js13
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pt-pt/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pt-pt/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pt/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pt/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/pt/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ro/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ro/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ro/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ru/ColorPicker.js15
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ru/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/ru/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sk/ColorPicker.js6
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sk/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sk/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sl/ColorPicker.js8
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sl/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sl/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sv/ColorPicker.js11
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sv/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/sv/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/th/ColorPicker.js14
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/th/FilePicker.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/th/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/tr/ColorPicker.js15
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/tr/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/tr/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/zh-tw/ColorPicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/zh-tw/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/zh-tw/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/zh/ColorPicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/zh/FilePicker.js9
-rw-r--r--js/dojo-1.7.2/dojox/widget/nls/zh/Wizard.js10
-rw-r--r--js/dojo-1.7.2/dojox/widget/rotator/Controller.js196
-rw-r--r--js/dojo-1.7.2/dojox/widget/rotator/Fade.js44
-rw-r--r--js/dojo-1.7.2/dojox/widget/rotator/Pan.js212
-rw-r--r--js/dojo-1.7.2/dojox/widget/rotator/PanFade.js216
-rw-r--r--js/dojo-1.7.2/dojox/widget/rotator/Slide.js66
-rw-r--r--js/dojo-1.7.2/dojox/widget/rotator/ThumbnailController.js100
-rw-r--r--js/dojo-1.7.2/dojox/widget/rotator/Wipe.js92
190 files changed, 14676 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/widget/AnalogGauge.js b/js/dojo-1.7.2/dojox/widget/AnalogGauge.js
new file mode 100644
index 0000000..426ffa5
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/AnalogGauge.js
@@ -0,0 +1,12 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/AnalogGauge", ["dijit","dojo","dojox","dojo/require!dojox/widget/gauge/_Gauge,dojox/gauges/AnalogGauge"], function(dijit,dojo,dojox){
+// backward compatibility for dojox.widget.AnalogGauge
+dojo.provide("dojox.widget.AnalogGauge");
+dojo.require("dojox.widget.gauge._Gauge");
+
+dojo.require("dojox.gauges.AnalogGauge");
+dojox.widget.AnalogGauge = dojox.gauges.AnalogGauge;
+dojox.widget.gauge.AnalogLineIndicator = dojox.gauges.AnalogLineIndicator;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/AutoRotator.js b/js/dojo-1.7.2/dojox/widget/AutoRotator.js
new file mode 100644
index 0000000..7c6ffb3
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/AutoRotator.js
@@ -0,0 +1,221 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/AutoRotator", ["dijit","dojo","dojox","dojo/require!dojox/widget/Rotator"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.AutoRotator");
+dojo.require("dojox.widget.Rotator");
+
+(function(d){
+
+ d.declare("dojox.widget.AutoRotator", dojox.widget.Rotator, {
+ // summary:
+ // A rotator that automatically transitions between child nodes.
+ //
+ // description:
+ // Adds automatic rotating to the dojox.widget.Rotator. The
+ // AutoRotator has parameters that control how user input can
+ // affect the rotator including a suspend when hovering over the
+ // rotator and pausing when the user manually advances to another
+ // pane.
+ //
+ // example:
+ // | <div dojoType="dojox.widget.AutoRotator" duration="3000">
+ // | <div>
+ // | Pane 1!
+ // | </div>
+ // | <div duration="5000">
+ // | Pane 2 with an overrided duration!
+ // | </div>
+ // | </div>
+
+ // suspendOnHover: boolean
+ // Pause the rotator when the mouse hovers over it.
+ suspendOnHover: false,
+
+ // duration: int
+ // The time in milliseconds before transitioning to the next pane. The
+ // default value is 4000 (4 seconds).
+ duration: 4000,
+
+ // autoStart: boolean
+ // Starts the timer to transition children upon creation.
+ autoStart: true,
+
+ // pauseOnManualChange: boolean
+ // Pause the rotator when the pane is changed or a controller's next or
+ // previous buttons are clicked.
+ pauseOnManualChange: false,
+
+ // cycles: int
+ // Number of cycles before pausing.
+ cycles: -1,
+
+ // random: boolean
+ // Determines if the panes should cycle randomly.
+ random: false,
+
+ // reverse: boolean
+ // Causes the rotator to rotate in reverse order.
+ reverse: false,
+
+ constructor: function(){
+ // summary:
+ // Initializes the timer and connect to the rotator.
+
+ var _t = this;
+
+ // validate the cycles counter
+ if(_t.cycles-0 == _t.cycles && _t.cycles > 0){
+ // we need to add 1 because we decrement cycles before the animation starts
+ _t.cycles++;
+ }else{
+ _t.cycles = _t.cycles ? -1 : 0;
+ }
+
+ // wire up the mouse hover events
+ _t._connects = [
+ d.connect(_t._domNode, "onmouseover", function(){
+ // temporarily suspend the cycling, but don't officially pause
+ // it and don't allow suspending if we're transitioning
+ if(_t.suspendOnHover && !_t.anim && !_t.wfe){
+ var t = _t._endTime,
+ n = _t._now();
+ _t._suspended = true;
+ _t._resetTimer();
+ _t._resumeDuration = t > n ? t - n : 0.01;
+ }
+ }),
+
+ d.connect(_t._domNode, "onmouseout", function(){
+ // if we were playing, resume playback unless were in the
+ // middle of a transition
+ if(_t.suspendOnHover && !_t.anim){
+ _t._suspended = false;
+ if(_t.playing && !_t.wfe){
+ _t.play(true);
+ }
+ }
+ })
+ ];
+
+ // everything is ready, so start
+ if(_t.autoStart && _t.panes.length > 1){
+ // start playing
+ _t.play();
+ }else{
+ // since we're not playing, lets pause
+ _t.pause();
+ }
+ },
+
+ destroy: function(){
+ // summary:
+ // Disconnect the AutoRotator's events.
+ d.forEach(this._connects, d.disconnect);
+ this.inherited(arguments);
+ },
+
+ play: function(/*boolean?*/skipCycleDecrement, /*boolean?*/skipDuration){
+ // summary:
+ // Sets the state to "playing" and schedules the next cycle to run.
+ this.playing = true;
+ this._resetTimer();
+
+ // don't decrement the count if we're resuming play
+ if(skipCycleDecrement !== true && this.cycles > 0){
+ this.cycles--;
+ }
+
+ if(this.cycles == 0){
+ // we have reached the number of cycles, so pause
+ this.pause();
+ }else if(!this._suspended){
+ this.onUpdate("play");
+ // if we haven't been suspended, then grab the duration for this pane and
+ // schedule a cycle to be run
+ if(skipDuration){
+ this._cycle();
+ }else{
+ var r = (this._resumeDuration || 0)-0,
+ u = (r > 0 ? r : (this.panes[this.idx].duration || this.duration))-0;
+ // call _cycle() after a duration and pass in false so it isn't manual
+ this._resumeDuration = 0;
+ this._endTime = this._now() + u;
+ this._timer = setTimeout(d.hitch(this, "_cycle", false), u);
+ }
+ }
+ },
+
+ pause: function(){
+ // summary:
+ // Sets the state to "not playing" and clears the cycle timer.
+ this.playing = this._suspended = false;
+ this.cycles = -1;
+ this._resetTimer();
+
+ // notify the controllers we're paused
+ this.onUpdate("pause");
+ },
+
+ _now: function(){
+ // summary:
+ // Helper function to return the current system time in milliseconds.
+ return (new Date()).getTime(); /*int*/
+ },
+
+ _resetTimer: function(){
+ // summary:
+ // Resets the timer used to schedule the next transition.
+ clearTimeout(this._timer);
+ },
+
+ _cycle: function(/*boolean|int?*/manual){
+ // summary:
+ // Cycles the rotator to the next/previous pane.
+ var _t = this,
+ i = _t.idx,
+ j;
+
+ if(_t.random){
+ // make sure we don't randomly pick the pane we're already on
+ do{
+ j = Math.floor(Math.random() * _t.panes.length + 1);
+ }while(j == i);
+ }else{
+ j = i + (_t.reverse ? -1 : 1)
+ }
+
+ // rotate!
+ var def = _t.go(j);
+
+ if(def){
+ def.addCallback(function(/*boolean?*/skipDuration){
+ _t.onUpdate("cycle");
+ if(_t.playing){
+ _t.play(false, skipDuration);
+ }
+ });
+ }
+ },
+
+ onManualChange: function(/*string*/action){
+ // summary:
+ // Override the Rotator's onManualChange so we can pause.
+
+ this.cycles = -1;
+
+ // obviously we don't want to pause if play was just clicked
+ if(action != "play"){
+ this._resetTimer();
+ if(this.pauseOnManualChange){
+ this.pause();
+ }
+ }
+
+ if(this.playing){
+ this.play();
+ }
+ }
+ });
+
+})(dojo);
+});
diff --git a/js/dojo-1.7.2/dojox/widget/BarGauge.js b/js/dojo-1.7.2/dojox/widget/BarGauge.js
new file mode 100644
index 0000000..e0f65ed
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/BarGauge.js
@@ -0,0 +1,11 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/BarGauge", ["dijit","dojo","dojox","dojo/require!dojox/widget/gauge/_Gauge,dojox/gauges/BarGauge"], function(dijit,dojo,dojox){
+// backward compatibility for dojox.widget.BarGauge
+dojo.provide("dojox.widget.BarGauge");
+dojo.require("dojox.widget.gauge._Gauge");
+dojo.require("dojox.gauges.BarGauge");
+dojox.widget.BarGauge = dojox.gauges.BarGauge;
+dojox.widget.gauge.BarLineIndicator = dojox.gauges.BarLineIndicator;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Calendar.js b/js/dojo-1.7.2/dojox/widget/Calendar.js
new file mode 100644
index 0000000..496e7c3
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Calendar.js
@@ -0,0 +1,944 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/Calendar", ["dijit","dojo","dojox","dojo/require!dijit/_Widget,dijit/_Templated,dijit/_Container,dijit/typematic,dojo/date,dojo/date/locale"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.Calendar");
+dojo.experimental("dojox.widget.Calendar");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Container");
+dojo.require("dijit.typematic");
+
+dojo.require("dojo.date");
+dojo.require("dojo.date.locale");
+
+dojo.declare("dojox.widget._CalendarBase", [dijit._Widget, dijit._Templated, dijit._Container], {
+ // summary:
+ // The Root class for all _Calendar extensions
+
+ // templateString: String
+ // The template to be used to construct the widget.
+ 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=\"monthLabelSpacer\"></div>\n\t\t</div>\n <div class=\"dojoxCalendarHeader\">\n <div>\n <div class=\"dojoxCalendarDecrease\" dojoAttachPoint=\"decrementMonth\"></div>\n </div>\n <div class=\"\">\n <div class=\"dojoxCalendarIncrease\" dojoAttachPoint=\"incrementMonth\"></div>\n </div>\n <div class=\"dojoxCalendarTitle\" dojoAttachPoint=\"header\" dojoAttachEvent=\"onclick: onHeaderClick\">\n </div>\n </div>\n <div class=\"dojoxCalendarBody\" dojoAttachPoint=\"containerNode\"></div>\n <div class=\"\">\n <div class=\"dojoxCalendarFooter\" dojoAttachPoint=\"footer\"> \n </div>\n </div>\n </div>\n</div>\n"),
+
+ // _views: Array
+ // The list of mixin views available on this calendar.
+ _views: null,
+
+ // useFx: Boolean
+ // Specifies if visual effects should be applied to the widget.
+ // The default behavior of the widget does not contain any effects.
+ // The dojox.widget.CalendarFx package is needed for these.
+ useFx: true,
+
+ // widgetsInTemplate: Boolean
+ // This widget is a container of other widgets, so this is true.
+ widgetsInTemplate: true,
+
+ // value: Date
+ // The currently selected Date
+ value: new Date(),
+
+ constraints: null,
+
+ // footerFormat: String
+ // The date format of the date displayed in the footer. Can be
+ // 'short', 'medium', and 'long'
+ footerFormat: "medium",
+
+ constructor: function(){
+ this._views = [];
+ this.value = new Date();
+ },
+
+ postMixInProperties: function(){
+ var c = this.constraints;
+ if(c){
+ var fromISO = dojo.date.stamp.fromISOString;
+ if(typeof c.min == "string"){
+ c.min = fromISO(c.min);
+ }
+ if(typeof c.max == "string"){
+ c.max = fromISO(c.max);
+ }
+ }
+ this.value = this.parseInitialValue(this.value);
+ },
+
+ parseInitialValue: function(value){
+ if (!value || value === -1){
+ return new Date();
+ }else if(value.getFullYear){
+ return value;
+ }else if (!isNaN(value)) {
+ if (typeof this.value == "string") {
+ value = parseInt(value);
+ }
+ value = this._makeDate(value);
+ }
+ return value;
+ },
+
+ _makeDate: function(value){
+ return value;//new Date(value);
+ },
+
+ postCreate: function(){
+ // summary:
+ // Instantiates the mixin views
+
+ this.displayMonth = new Date(this.get('value'));
+
+ if(this._isInvalidDate(this.displayMonth)){
+ this.displayMonth = new Date();
+ }
+
+ var mixin = {
+ 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;}),
+ getLang: dojo.hitch(this, function(){return this.lang;}),
+ isDisabledDate: dojo.hitch(this, this.isDisabledDate),
+ getClassForDate: dojo.hitch(this, this.getClassForDate),
+ addFx: this.useFx ? dojo.hitch(this, this.addFx) : function(){}
+ };
+
+ //Add the mixed in views.
+ dojo.forEach(this._views, function(widgetType){
+ var widget = new widgetType(mixin, dojo.create('div'));
+ this.addChild(widget);
+
+ var header = widget.getHeader();
+ if(header){
+ //place the views's header node in the header of the main widget
+ this.header.appendChild(header);
+
+ //hide the header node of the widget
+ dojo.style(header, "display", "none");
+ }
+ //Hide all views
+ dojo.style(widget.domNode, "visibility", "hidden");
+
+ //Listen for the values in a view to be selected
+ dojo.connect(widget, "onValueSelected", this, "_onDateSelected");
+ widget.set("value", this.get('value'));
+ }, this);
+
+ if(this._views.length < 2){
+ dojo.style(this.header, "cursor", "auto");
+ }
+
+ this.inherited(arguments);
+
+ // Cache the list of children widgets.
+ this._children = this.getChildren();
+
+ this._currentChild = 0;
+
+ //Populate the footer with today's date.
+ var today = new Date();
+
+ this.footer.innerHTML = "Today: "
+ + dojo.date.locale.format(today, {
+ formatLength:this.footerFormat,
+ selector:'date',
+ locale:this.lang});
+
+ dojo.connect(this.footer, "onclick", this, "goToToday");
+
+ var first = this._children[0];
+
+ dojo.style(first.domNode, "top", "0px");
+ dojo.style(first.domNode, "visibility", "visible");
+
+ var header = first.getHeader();
+ if(header){
+ dojo.style(first.getHeader(), "display", "");
+ }
+
+ dojo[first.useHeader ? "removeClass" : "addClass"](this.container, "no-header");
+
+ first.onDisplay();
+
+ var _this = this;
+
+ var typematic = function(nodeProp, dateProp, adj){
+ dijit.typematic.addMouseListener(_this[nodeProp], _this, function(count){
+ if(count >= 0){ _this._adjustDisplay(dateProp, adj);}
+ }, 0.8, 500);
+ };
+ typematic("incrementMonth", "month", 1);
+ typematic("decrementMonth", "month", -1);
+ this._updateTitleStyle();
+ },
+
+ addFx: function(query, fromNode){
+ // Stub function than can be overridden to add effects.
+ },
+
+ _isInvalidDate: function(/*Date*/ value){
+ // summary:
+ // Runs various tests on the value, checking for invalid conditions
+ // tags:
+ // private
+ return !value || isNaN(value) || typeof value != "object" || value.toString() == this._invalidDate;
+ },
+
+ _setValueAttr: function(/*Date*/ value){
+ // summary:
+ // Set the current date and update the UI. If the date is disabled, the selection will
+ // not change, but the display will change to the corresponding month.
+ if(!value){
+ value = new Date();
+ }
+ if(!value["getFullYear"]){
+ value = dojo.date.stamp.fromISOString(value + "");
+ }
+ if(this._isInvalidDate(value)){
+ return false;
+ }
+ if(!this.value || dojo.date.compare(value, this.value)){
+ value = new Date(value);
+ this.displayMonth = new Date(value);
+ this._internalValue = value;
+ if(!this.isDisabledDate(value, this.lang) && this._currentChild == 0){
+ this.value = value;
+ this.onChange(value);
+ }
+ if (this._children && this._children.length > 0) {
+ this._children[this._currentChild].set("value", this.value);
+ }
+ return true;
+ }
+ return false;
+ },
+
+ isDisabledDate: function(/*Date*/date, /*String?*/locale){
+ // summary:
+ // May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+ var c = this.constraints;
+ var compare = dojo.date.compare;
+ return c && (c.min && (compare(c.min, date, "date") > 0) ||
+ (c.max && compare(c.max, date, "date") < 0));
+ },
+
+ onValueSelected: function(/*Date*/date){
+ // summary:
+ // A date cell was selected. It may be the same as the previous value.
+ },
+
+ _onDateSelected: function(date, formattedValue, force){
+ this.displayMonth = date;
+
+ this.set("value", date)
+ //Only change the selected value if it was chosen from the
+ //first child.
+ if(!this._transitionVert(-1)){
+ if(!formattedValue && formattedValue !== 0){
+ formattedValue = this.get('value');
+ }
+ this.onValueSelected(formattedValue);
+ }
+
+ },
+
+ onChange: function(/*Date*/date){
+ // summary:
+ // Called only when the selected date has changed
+ },
+
+ onHeaderClick: function(e){
+ // summary:
+ // Transitions to the next view.
+ this._transitionVert(1);
+ },
+
+ goToToday: function(){
+ this.set("value", new Date());
+ this.onValueSelected(this.get('value'));
+ },
+
+ _transitionVert: function(/*Number*/direction){
+ // summary:
+ // Animates the views to show one and hide another, in a
+ // vertical direction.
+ // If 'direction' is 1, then the views slide upwards.
+ // If 'direction' is -1, the views slide downwards.
+ var curWidget = this._children[this._currentChild];
+ var nextWidget = this._children[this._currentChild + direction];
+ if(!nextWidget){return false;}
+
+ dojo.style(nextWidget.domNode, "visibility", "visible");
+
+ var height = dojo.style(this.containerNode, "height");
+ nextWidget.set("value", this.displayMonth);
+
+ if(curWidget.header){
+ dojo.style(curWidget.header, "display", "none");
+ }
+ if(nextWidget.header){
+ dojo.style(nextWidget.header, "display", "");
+ }
+ dojo.style(nextWidget.domNode, "top", (height * -1) + "px");
+ dojo.style(nextWidget.domNode, "visibility", "visible");
+
+ this._currentChild += direction;
+
+ var height1 = height * direction;
+ var height2 = 0;
+ dojo.style(nextWidget.domNode, "top", (height1 * -1) + "px");
+
+ // summary: Slides two nodes vertically.
+ var anim1 = dojo.animateProperty({
+ node: curWidget.domNode,
+ properties: {top: height1},
+ onEnd: function(){
+ dojo.style(curWidget.domNode, "visibility", "hidden");
+ }
+ });
+ var anim2 = dojo.animateProperty({
+ node: nextWidget.domNode,
+ properties: {top: height2},
+ onEnd: function(){
+ nextWidget.onDisplay();
+ }
+ });
+
+ dojo[nextWidget.useHeader ? "removeClass" : "addClass"](this.container, "no-header");
+
+ anim1.play();
+ anim2.play();
+ curWidget.onBeforeUnDisplay()
+ nextWidget.onBeforeDisplay();
+
+ this._updateTitleStyle();
+ return true;
+ },
+
+ _updateTitleStyle: function(){
+ dojo[this._currentChild < this._children.length -1 ? "addClass" : "removeClass"](this.header, "navToPanel");
+ },
+
+ _slideTable: function(/*String*/widget, /*Number*/direction, /*Function*/callback){
+ // summary:
+ // Animates the horizontal sliding of a table.
+ var table = widget.domNode;
+
+ //Clone the existing table
+ var newTable = table.cloneNode(true);
+ var left = dojo.style(table, "width");
+
+ table.parentNode.appendChild(newTable);
+
+ //Place the existing node either to the left or the right of the new node,
+ //depending on which direction it is to slide.
+ dojo.style(table, "left", (left * direction) + "px");
+
+ //Call the function that generally populates the new cloned node with new data.
+ //It may also attach event listeners.
+ callback();
+
+ //Animate the two nodes.
+ var anim1 = dojo.animateProperty({node: newTable, properties:{left: left * direction * -1}, duration: 500, onEnd: function(){
+ newTable.parentNode.removeChild(newTable);
+ }});
+ var anim2 = dojo.animateProperty({node: table, properties:{left: 0}, duration: 500});
+
+ anim1.play();
+ anim2.play();
+ },
+
+ _addView: function(view){
+ //Insert the view at the start of the array.
+ this._views.push(view);
+ },
+
+ getClassForDate: function(/*Date*/dateObject, /*String?*/locale){
+ // summary:
+ // May be overridden to return CSS classes to associate with the date entry for the given dateObject,
+ // for example to indicate a holiday in specified locale.
+
+/*=====
+ return ""; // String
+=====*/
+ },
+
+ _adjustDisplay: function(/*String*/part, /*int*/amount, noSlide){
+ // summary:
+ // This function overrides the base function defined in dijit.Calendar.
+ // It changes the displayed years, months and days depending on the inputs.
+ var child = this._children[this._currentChild];
+
+ var month = this.displayMonth = child.adjustDate(this.displayMonth, amount);
+
+ this._slideTable(child, amount, function(){
+ child.set("value", month);
+ });
+ }
+});
+
+dojo.declare("dojox.widget._CalendarView", dijit._Widget, {
+ // summary:
+ // Base implementation for all view mixins.
+ // All calendar views should extend this widget.
+ headerClass: "",
+
+ useHeader: true,
+
+ cloneClass: function(clazz, n, before){
+ // summary:
+ // Clones all nodes with the class 'clazz' in a widget
+ var template = dojo.query(clazz, this.domNode)[0];
+ var i;
+ if(!before){
+ for(i = 0; i < n; i++){
+ template.parentNode.appendChild(template.cloneNode(true));
+ }
+ }else{
+ var bNode = dojo.query(clazz, this.domNode)[0];
+ for(i = 0; i < n; i++){
+ template.parentNode.insertBefore(template.cloneNode(true), bNode);
+ }
+ }
+ },
+
+ _setText: function(node, text){
+ // summary:
+ // Sets the text inside a node
+ if(node.innerHTML != text){
+ dojo.empty(node);
+ node.appendChild(dojo.doc.createTextNode(text));
+ }
+ },
+
+ getHeader: function(){
+ // summary:
+ // Returns the header node of a view. If none exists,
+ // an empty DIV is created and returned.
+ return this.header || (this.header = this.header = dojo.create("span", { "class":this.headerClass }));
+ },
+
+ onValueSelected: function(date){
+ //Stub function called when a date is selected
+ },
+
+ adjustDate: function(date, amount){
+ // summary:
+ // Adds or subtracts values from a date.
+ // The unit, e.g. "day", "month" or "year", is
+ // specified in the "datePart" property of the
+ // calendar view mixin.
+ return dojo.date.add(date, this.datePart, amount);
+ },
+
+ onDisplay: function(){
+ // summary:
+ // Stub function that can be used to tell a view when it is shown.
+ },
+
+ onBeforeDisplay: function(){
+ // summary:
+ // Stub function that can be used to tell a view it is about to be shown.
+ },
+
+ onBeforeUnDisplay: function(){
+ // summary:
+ // Stub function that can be used to tell
+ // a view when it is no longer shown.
+ }
+});
+
+dojo.declare("dojox.widget._CalendarDay", null, {
+ // summary:
+ // Mixin for the dojox.widget.Calendar which provides
+ // the standard day-view. A single month is shown at a time.
+ parent: null,
+
+ constructor: function(){
+ this._addView(dojox.widget._CalendarDayView);
+ }
+});
+
+dojo.declare("dojox.widget._CalendarDayView", [dojox.widget._CalendarView, dijit._Templated], {
+ // summary: View class for the dojox.widget.Calendar.
+ // Adds a view showing every day of a single month to the calendar.
+ // This should not be mixed in directly with dojox.widget._CalendarBase.
+ // Instead, use dojox.widget._CalendarDay
+
+ // templateString: String
+ // The template to be used to construct the widget.
+ 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=\"dojoxCalendarComma\">,</span>\n\t\t\t<span dojoAttachPoint=\"yearLabelNode\" class=\"dojoxCalendarDayYearLabel\"></span>\n\t\t</div>\n\t</div>\n\t<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"margin: auto;\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<td class=\"dijitCalendarDayLabelTemplate\"><div class=\"dijitCalendarDayLabel\"></div></td>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody dojoAttachEvent=\"onclick: _onDayClick\">\n\t\t\t<tr class=\"dijitCalendarWeekTemplate\">\n\t\t\t\t<td class=\"dojoxCalendarNextMonth dijitCalendarDateTemplate\">\n\t\t\t\t\t<div class=\"dijitCalendarDateLabel\"></div>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</div>\n"),
+
+ // datePart: String
+ // Specifies how much to increment the displayed date when the user
+ // clicks the array button to increment of decrement the view.
+ datePart: "month",
+
+ // dayWidth: String
+ // Specifies the type of day name to display. "narrow" causes just one letter to be shown.
+ dayWidth: "narrow",
+
+ postCreate: function(){
+ // summary:
+ // Constructs the calendar view.
+ this.cloneClass(".dijitCalendarDayLabelTemplate", 6);
+ this.cloneClass(".dijitCalendarDateTemplate", 6);
+
+ // now make 6 week rows
+ this.cloneClass(".dijitCalendarWeekTemplate", 5);
+
+ // insert localized day names in the header
+ var dayNames = dojo.date.locale.getNames('days', this.dayWidth, 'standAlone', this.getLang());
+ var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.getLang());
+
+ // Set the text of the day labels.
+ dojo.query(".dijitCalendarDayLabel", this.domNode).forEach(function(label, i){
+ this._setText(label, dayNames[(i + dayOffset) % 7]);
+ }, this);
+ },
+
+ onDisplay: function(){
+ if(!this._addedFx){
+ // Add visual effects to the view, if any has been specified.
+ this._addedFx = true;
+ this.addFx(".dijitCalendarDateTemplate div", this.domNode);
+ }
+ },
+
+ _onDayClick: function(e){
+ // summary:
+ // Executed when a day value is clicked.
+
+ // If the user somehow clicked the TR, rather than a
+ // cell, ignore it.
+ if(typeof(e.target._date) == "undefined"){return;}
+
+ var date = new Date(this.get("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){date = dojo.date.add(date, "month", d)}
+ date.setDate(e.target._date);
+
+ // If the day is disabled, ignore it
+ if(this.isDisabledDate(date)){
+ dojo.stopEvent(e);
+ return;
+ }
+ this.parent._onDateSelected(date);
+ },
+
+ _setValueAttr: function(value){
+ //Change the day values
+ this._populateDays();
+ },
+
+ _populateDays: function(){
+ // summary:
+ // Fills the days of the current month.
+
+ var currentDate = new Date(this.get("displayMonth"));
+ currentDate.setDate(1);
+ var firstDay = currentDate.getDay();
+ var daysInMonth = dojo.date.getDaysInMonth(currentDate);
+ var daysInPreviousMonth = dojo.date.getDaysInMonth(dojo.date.add(currentDate, "month", -1));
+ var today = new Date();
+ var selected = this.get('value');
+
+ var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.getLang());
+ if(dayOffset > firstDay){ dayOffset -= 7; }
+
+ var compareDate = dojo.date.compare;
+ var templateCls = ".dijitCalendarDateTemplate";
+ var selectedCls = "dijitCalendarSelectedDate";
+
+ var oldDate = this._lastDate;
+ var redrawRequired = oldDate == null
+ || oldDate.getMonth() != currentDate.getMonth()
+ || oldDate.getFullYear() != currentDate.getFullYear();
+ this._lastDate = currentDate;
+
+ // If still showing the same month, it's much faster to not redraw,
+ // and just change the selected date.
+ if(!redrawRequired){
+ dojo.query(templateCls, this.domNode)
+ .removeClass(selectedCls)
+ .filter(function(node){
+ return node.className.indexOf("dijitCalendarCurrent") > -1
+ && node._date == selected.getDate();
+ })
+ .addClass(selectedCls);
+ return;
+ }
+
+ // Iterate through dates in the calendar and fill in date numbers and style info
+ dojo.query(templateCls, this.domNode).forEach(function(template, i){
+ i += dayOffset;
+ var date = new Date(currentDate);
+ var number, clazz = "dijitCalendar", adj = 0;
+
+ if(i < firstDay){
+ number = daysInPreviousMonth - firstDay + i + 1;
+ adj = -1;
+ clazz += "Previous";
+ }else if(i >= (firstDay + daysInMonth)){
+ number = i - firstDay - daysInMonth + 1;
+ adj = 1;
+ clazz += "Next";
+ }else{
+ number = i - firstDay + 1;
+ clazz += "Current";
+ }
+
+ if(adj){
+ date = dojo.date.add(date, "month", adj);
+ }
+ date.setDate(number);
+
+ if(!compareDate(date, today, "date")){
+ clazz = "dijitCalendarCurrentDate " + clazz;
+ }
+
+ if(!compareDate(date, selected, "date")
+ && !compareDate(date, selected, "month")
+ && !compareDate(date, selected, "year") ){
+ clazz = selectedCls + " " + clazz;
+ }
+
+ if(this.isDisabledDate(date, this.getLang())){
+ clazz = " dijitCalendarDisabledDate " + clazz;
+ }
+
+ var clazz2 = this.getClassForDate(date, this.getLang());
+ if(clazz2){
+ clazz = clazz2 + " " + clazz;
+ }
+
+ template.className = clazz + "Month dijitCalendarDateTemplate";
+ template.dijitDateValue = date.valueOf();
+ var label = dojo.query(".dijitCalendarDateLabel", template)[0];
+
+ this._setText(label, date.getDate());
+
+ label._date = label.parentNode._date = date.getDate();
+ }, this);
+
+ // Fill in localized month name
+ var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.getLang());
+ this._setText(this.monthLabelNode, monthNames[currentDate.getMonth()]);
+ this._setText(this.yearLabelNode, currentDate.getFullYear());
+ }
+});
+
+
+dojo.declare("dojox.widget._CalendarMonthYear", null, {
+ // summary:
+ // Mixin class for adding a view listing all 12
+ // months of the year to the dojox.widget._CalendarBase
+
+ constructor: function(){
+ // summary:
+ // Adds a dojox.widget._CalendarMonthView view to the calendar widget.
+ this._addView(dojox.widget._CalendarMonthYearView);
+ }
+});
+
+dojo.declare("dojox.widget._CalendarMonthYearView", [dojox.widget._CalendarView, dijit._Templated], {
+ // summary:
+ // A Calendar view listing the 12 months of the year
+
+ // templateString: String
+ // The template to be used to construct the widget.
+ 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=\"dojoxCal-MY-M-Template\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"dojoxCalendarMonthLabel\"></div>\n\t\t\t\t\t\t\t\t</td>\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=\"dojoxCalendarMonthLabel\"></div>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td class=\"dojoxCal-MY-Y-Template\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"dojoxCalendarYearLabel\"></div>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td class=\"dojoxCal-MY-Y-Template\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"dojoxCalendarYearLabel\"></div>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t </tr>\n\t\t\t\t\t\t <tr class=\"dojoxCal-MY-btns\">\n\t\t\t\t\t\t \t <td class=\"dojoxCal-MY-btns\" colspan=\"4\">\n\t\t\t\t\t\t \t\t <span class=\"dijitReset dijitInline dijitButtonNode ok-btn\" dojoAttachEvent=\"onclick: onOk\" dojoAttachPoint=\"okBtn\">\n\t\t\t\t\t\t \t \t \t <button\tclass=\"dijitReset dijitStretch dijitButtonContents\">OK</button>\n\t\t\t\t\t\t\t\t </span>\n\t\t\t\t\t\t\t\t <span class=\"dijitReset dijitInline dijitButtonNode cancel-btn\" dojoAttachEvent=\"onclick: onCancel\" dojoAttachPoint=\"cancelBtn\">\n\t\t\t\t\t\t \t \t\t <button\tclass=\"dijitReset dijitStretch dijitButtonContents\">Cancel</button>\n\t\t\t\t\t\t\t\t </span>\n\t\t\t\t\t\t \t </td>\n\t\t\t\t\t\t </tr>\n\t\t\t\t</tbody>\n\t\t</table>\n</div>\n"),
+
+ // datePart: String
+ // Specifies how much to increment the displayed date when the user
+ // clicks the array button to increment of decrement the view.
+ datePart: "year",
+
+ // displayedYears: Number
+ // The number of years to display at once.
+ displayedYears: 10,
+
+ useHeader: false,
+
+ postCreate: function(){
+ this.cloneClass(".dojoxCal-MY-G-Template", 5, ".dojoxCal-MY-btns");
+ this.monthContainer = this.yearContainer = this.myContainer;
+
+ var yClass = "dojoxCalendarYearLabel";
+ var dClass = "dojoxCalendarDecrease";
+ var iClass = "dojoxCalendarIncrease";
+
+ dojo.query("." + yClass, this.myContainer).forEach(function(node, idx){
+ var clazz = iClass;
+ switch(idx){
+ case 0:
+ clazz = dClass;
+ case 1:
+ dojo.removeClass(node, yClass);
+ dojo.addClass(node, clazz);
+ break;
+ }
+ });
+ // Get the year increment and decrement buttons.
+ this._decBtn = dojo.query('.' + dClass, this.myContainer)[0];
+ this._incBtn = dojo.query('.' + iClass, this.myContainer)[0];
+
+ dojo.query(".dojoxCal-MY-M-Template", this.domNode)
+ .filter(function(item){
+ return item.cellIndex == 1;
+ })
+ .addClass("dojoxCal-MY-M-last");
+
+ dojo.connect(this, "onBeforeDisplay", dojo.hitch(this, function(){
+ this._cachedDate = new Date(this.get("value").getTime());
+ this._populateYears(this._cachedDate.getFullYear());
+ this._populateMonths();
+ this._updateSelectedMonth();
+ this._updateSelectedYear();
+ }));
+
+ dojo.connect(this, "_populateYears", dojo.hitch(this, function(){
+ this._updateSelectedYear();
+ }));
+ dojo.connect(this, "_populateMonths", dojo.hitch(this, function(){
+ this._updateSelectedMonth();
+ }));
+
+ this._cachedDate = this.get("value");
+
+ this._populateYears();
+ this._populateMonths();
+
+ // Add visual effects to the view, if any have been mixed in
+ this.addFx(".dojoxCalendarMonthLabel,.dojoxCalendarYearLabel ", this.myContainer);
+ },
+
+ _setValueAttr: function(value){
+ if (value && value.getFullYear()) {
+ this._populateYears(value.getFullYear());
+ }
+ },
+
+ getHeader: function(){
+ return null;
+ },
+
+ _getMonthNames: function(format){
+ // summary:
+ // Returns localized month names
+ this._monthNames = this._monthNames || dojo.date.locale.getNames('months', format, 'standAlone', this.getLang());
+ return this._monthNames;
+ },
+
+ _populateMonths: function(){
+ // summary:
+ // Populate the month names using the localized values.
+ var monthNames = this._getMonthNames('abbr');
+ dojo.query(".dojoxCalendarMonthLabel", this.monthContainer).forEach(dojo.hitch(this, function(node, cnt){
+ this._setText(node, monthNames[cnt]);
+ }));
+ var constraints = this.get('constraints');
+
+ if(constraints){
+ var date = new Date();
+ date.setFullYear(this._year);
+ var min = -1, max = 12;
+ if(constraints.min){
+ var minY = constraints.min.getFullYear();
+ if(minY > this._year){
+ min = 12;
+ }else if(minY == this._year){
+ min = constraints.min.getMonth();
+ }
+ }
+ if(constraints.max){
+ var maxY = constraints.max.getFullYear();
+ if(maxY < this._year){
+ max = -1;
+ }else if(maxY == this._year){
+ max = constraints.max.getMonth();
+ }
+ }
+
+ dojo.query(".dojoxCalendarMonthLabel", this.monthContainer)
+ .forEach(dojo.hitch(this, function(node, cnt){
+ dojo[(cnt < min || cnt > max) ? "addClass" : "removeClass"]
+ (node, 'dijitCalendarDisabledDate');
+ }));
+ }
+
+ var h = this.getHeader();
+ if(h){
+ this._setText(this.getHeader(), this.get("value").getFullYear());
+ }
+ },
+
+ _populateYears: function(year){
+ // summary:
+ // Fills the list of years with a range of 12 numbers, with the current year
+ // being the 6th number.
+ var constraints = this.get('constraints');
+ var dispYear = year || this.get("value").getFullYear();
+ var firstYear = dispYear - Math.floor(this.displayedYears/2);
+ var min = constraints && constraints.min ? constraints.min.getFullYear() : firstYear -10000;
+ firstYear = Math.max(min, firstYear);
+
+ // summary: Writes the years to display to the view
+ this._displayedYear = dispYear;
+
+ var yearLabels = dojo.query(".dojoxCalendarYearLabel", this.yearContainer);
+
+ var max = constraints && constraints.max ? constraints.max.getFullYear() - firstYear : yearLabels.length;
+ var disabledClass = 'dijitCalendarDisabledDate';
+
+ yearLabels.forEach(dojo.hitch(this, function(node, cnt){
+ if(cnt <= max){
+ this._setText(node, firstYear + cnt);
+ dojo.removeClass(node, disabledClass);
+ }else{
+ dojo.addClass(node, disabledClass);
+ }
+ }));
+
+ if(this._incBtn){
+ dojo[max < yearLabels.length ? "addClass" : "removeClass"](this._incBtn, disabledClass);
+ }
+ if(this._decBtn){
+ dojo[min >= firstYear ? "addClass" : "removeClass"](this._decBtn, disabledClass);
+ }
+
+ var h = this.getHeader();
+ if(h){
+ this._setText(this.getHeader(), firstYear + " - " + (firstYear + 11));
+ }
+ },
+
+ _updateSelectedYear: function(){
+ this._year = String((this._cachedDate || this.get("value")).getFullYear());
+ this._updateSelectedNode(".dojoxCalendarYearLabel", dojo.hitch(this, function(node, idx){
+ return this._year !== null && node.innerHTML == this._year;
+ }));
+ },
+
+ _updateSelectedMonth: function(){
+ var month = (this._cachedDate || this.get("value")).getMonth();
+ this._month = month;
+ this._updateSelectedNode(".dojoxCalendarMonthLabel", function(node, idx){
+ return idx == month;
+ });
+ },
+
+ _updateSelectedNode: function(query, filter){
+ var sel = "dijitCalendarSelectedDate";
+ dojo.query(query, this.domNode)
+ .forEach(function(node, idx, array){
+ dojo[filter(node, idx, array) ? "addClass" : "removeClass"](node.parentNode, sel);
+ });
+ var selMonth = dojo.query('.dojoxCal-MY-M-Template div', this.myContainer)
+ .filter(function(node){
+ return dojo.hasClass(node.parentNode, sel);
+ })[0];
+ if(!selMonth){return;}
+ var disabled = dojo.hasClass(selMonth, 'dijitCalendarDisabledDate');
+
+ dojo[disabled ? 'addClass' : 'removeClass'](this.okBtn, "dijitDisabled");
+ },
+
+ onClick: function(evt){
+ // summary:
+ // Handles clicks on month names
+ var clazz;
+ var _this = this;
+ var sel = "dijitCalendarSelectedDate";
+ function hc(c){
+ return dojo.hasClass(evt.target, c);
+ }
+
+ if(hc('dijitCalendarDisabledDate')){
+ dojo.stopEvent(evt);
+ return false;
+ }
+
+ if(hc("dojoxCalendarMonthLabel")){
+ clazz = "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")){
+ clazz = "dojoxCal-MY-Y-Template";
+ this._year = Number(evt.target.innerHTML);
+ this._cachedDate.setYear(this._year);
+ this._populateMonths();
+ this._updateSelectedYear();
+ }else if(hc("dojoxCalendarDecrease")){
+ this._populateYears(this._displayedYear - 10);
+ return true;
+ }else if(hc("dojoxCalendarIncrease")){
+ this._populateYears(this._displayedYear + 10);
+ return true;
+ }else{
+ return true;
+ }
+ dojo.stopEvent(evt);
+ return false;
+ },
+
+ onOk: function(evt){
+ dojo.stopEvent(evt);
+ if(dojo.hasClass(this.okBtn, "dijitDisabled")){
+ return false;
+ }
+ this.onValueSelected(this._cachedDate);
+ return false;
+ },
+
+ onCancel: function(evt){
+ dojo.stopEvent(evt);
+ this.onValueSelected(this.get("value"));
+ return false;
+ }
+});
+
+dojo.declare("dojox.widget.Calendar2Pane",
+ [dojox.widget._CalendarBase,
+ dojox.widget._CalendarDay,
+ dojox.widget._CalendarMonthYear], {
+ // summary: A Calendar withtwo panes, the second one
+ // containing both month and year
+ }
+);
+
+dojo.declare("dojox.widget.Calendar",
+ [dojox.widget._CalendarBase,
+ dojox.widget._CalendarDay,
+ dojox.widget._CalendarMonthYear], {
+ // summary: The standard Calendar. It includes day and month/year views.
+ // No visual effects are included.
+ }
+);
+
+dojo.declare("dojox.widget.DailyCalendar",
+ [dojox.widget._CalendarBase,
+ dojox.widget._CalendarDay], {
+ // summary: A calendar withonly a daily view.
+ _makeDate: function(value){
+ var now = new Date();
+ now.setDate(value);
+ return now;
+ }
+ }
+
+);
+
+dojo.declare("dojox.widget.MonthAndYearlyCalendar",
+ [dojox.widget._CalendarBase,
+ dojox.widget._CalendarMonthYear], {
+ // summary: A calendar withonly a daily view.
+ }
+);
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Calendar/Calendar.css b/js/dojo-1.7.2/dojox/widget/Calendar/Calendar.css
new file mode 100644
index 0000000..4837459
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Calendar/Calendar.css
@@ -0,0 +1,307 @@
+.dojoxCalendar {
+ width: 182px;
+}
+.dojoxCalendarContainer {
+ cursor: default;
+ font-family: tahoma, verdana, helvetica;
+ font-size: 11px;
+ padding: 0px;
+ text-align: center;
+ width: 180px;
+ overflow: hidden;
+}
+.dj_ie6 .dojoxCalendarContainer {
+ width: auto;
+ position: relative;
+}
+
+.dojoxCalendarBody {
+ height: 138px;
+ overflow: hidden;
+ position: relative;
+ margin: auto;
+ width: 180px;
+}
+.dojoxCalendar .no-header .dojoxCalendarBody {
+ height: 162px;
+}
+
+.dojoxCalendar .dijitCalendarDayLabels, .dojoxCalendarMonthLabels, .dojoxCalendarYearLabels, .dojoxCal-MY-labels {
+ width: 180px;
+ height: 138px;
+ top: 0px;
+ position: absolute;
+ left: 0px;
+ margin: auto;
+ text-align: center;
+}
+
+.dojoxCalendar .dojoxCalendarBody > div {
+ width: 180px;
+}
+
+.dojoxCalendar .dijitCalendarDateTemplate {
+ padding: 0 1px 0 0 !important;
+}
+
+.nihilo .dojoxCalendar .dijitCalendarDateTemplate,
+.soria .dojoxCalendar .dijitCalendarDateTemplate {
+ border: 0px none !important;
+}
+
+.soria tr.dojoxCal-MY-btns {
+ background: url(../../../dijit/themes/soria/images/tabBottomHoverC.gif) repeat-x scroll 0px -21px;
+}
+
+.dojoxCalendar .noPointer, .dojoxCalendar .noPointer * {
+ cursor: auto;
+}
+
+.dojoxCalendarContainer table {
+ font-size: 11px;
+ border-bottom: 4px solid white;
+}
+
+.dojoxCalendarHeader {
+ height: 20px;
+ width: 172px;
+ padding: 4px 4px 0;
+}
+.dojoxCalendar .no-header .dojoxCalendarHeader {
+ display: none;
+}
+
+.soria .dojoxCalendarHeader {
+ background: #BED7F0 url(../../../dijit/themes/soria/images/titleBar.png) repeat-x scroll center top;
+}
+
+
+.dojoxCalendarDecrease, .dojoxCalendarIncrease {
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+
+.dojoxCalendarDecrease {
+ background: transparent url(../../../dijit/themes/nihilo/images/spriteRoundedIconsSmall.png) no-repeat scroll left top;
+ float: left;
+}
+
+.dojoxCalendarIncrease {
+ background: transparent url(../../../dijit/themes/nihilo/images/spriteRoundedIconsSmall.png) no-repeat scroll -30px top;
+ float: right;
+}
+
+
+.dojoxCalendarMonthLabel {
+ cursor: pointer;
+ height: 35px;
+ width: 41px;
+ overflow: hidden;
+ text-align: center;
+ padding-top: 10px;
+}
+
+.dojoxCalendarYearLabel {
+ cursor: pointer;
+ height: 35px;
+ width: 41px;
+ overflow: hidden;
+ text-align: center;
+ padding-top: 10px;
+}
+
+.dojoxCalendarTitle {
+ cursor: pointer;
+ font-weight: bold;
+}
+
+.dojoxCalendar .navToPanel .dojoxCalendarDayYearLabel,
+.dojoxCalendar .navToPanel .dojoxCalendarYearHeader,
+.dojoxCalendar .navToPanel .dojoxCalendarMonthHeader {
+ padding-right: 15px;
+ background: url(../../../dijit/themes/tundra/images/comboArrowDown.gif) right no-repeat;
+}
+
+.dojoxCalendar .dijitCalendarDateLabel {
+ height: 17px;
+ width: 17px;
+ padding: 1px 3px 0px 3px;
+ text-align: center;
+ border: 1px solid white;
+}
+
+.dojoxCalendar .dijitCalendarDayLabel {
+ cursor: pointer;
+ height: 17px;
+ width: 18px;
+ padding: 0pt 2px;
+ text-align: center;
+}
+
+
+.dojoxCalendar .dojoxCalendarContainer {
+ background-color: white;
+ border: 1px solid #656565;
+ color: black;
+}
+
+.dojoxCalendar .dijitCalendarDisabledDate {
+ text-decoration:line-through !important;
+ cursor:default !important;
+}
+
+.dojoxCalendar .dojoxCalendarFooter {
+ border-top: 1px solid #F4F4F4;
+ height: 15px;
+ padding-top: 4px;
+ cursor: pointer;
+}
+
+.soria .dojoxCalendar .dojoxCalendarFooter {
+ border-top: 0px none;
+ padding-top: 5px;
+ background: white url(../../../dijit/themes/soria/images/titleBar.png) repeat-x scroll center top
+}
+
+.dojoxCalendar .dojoxCalendarMonthLabel {
+ border: 1px solid white;
+}
+
+.dojoxCalendar .dojoxCalendarYearLabel {
+ border: 1px solid white;
+}
+
+.dojoxCalendar .dijitCalendarNextMonth .dijitCalendarDateLabel,
+.dojoxCalendar .dijitCalendarPreviousMonth .dijitCalendarDateLabel {
+ border: 0px;
+ color: #646464;
+ padding-left: 0px;
+ padding-right: 0px;
+}
+
+.dojoxCalendar .dijitCalendarNextMonth, .dojoxCalendar .dijitCalendarPreviousMonth {
+ background-color: #E4E4E4;
+}
+
+.dojoxCalendar .dijitCalendarNextMonth .dojoxCalendarYearLabel,
+.dojoxCalendar .dijitCalendarPreviousMonth .dojoxCalendarYearLabel {
+ background-color: white;
+ border-color: white;
+ color: #646464;
+}
+.dojoxCalendar .dijitCalendarSelectedDate,
+.tundra .dojoxCalendar .dijitCalendarSelectedDate,
+.nihilo .dojoxCalendar .dijitCalendarSelectedDate {
+ /* cell for the selected date */
+ background-color:#ffe284 !important;
+ color:black !important;
+ border:#f5b93c solid 1px !important;
+}
+
+
+.soria .dojoxCalendar td.dijitCalendarSelectedDate {
+ background-color: #B9CBF1 !important;
+ color: black !important;
+ border: 1px solid #4B5AAA !important;
+}
+
+.soria .dojoxCalendar .dijitCalendarSelectedDate div {
+ /* cell for the selected date */
+ background-color: #B9CBF1 !important;
+ border: none !important;
+}
+.dojoxCalendar .dijitCalendarSelectedDate div {
+ /* cell for the selected date */
+ background-color: #FFE284 !important;
+ border: none !important;
+}
+div.dojoxCalendar tr.dojoxCal-MY-G-Template td.dijitCalendarSelectedDate {
+ background-color: transparent;
+ width: 43px;
+}
+
+.dojoxCalendar tr.dojoxCal-MY-G-Template td {
+ width: 45px;
+}
+
+.dojoxCalendar .dijitCalendarSelectedDate div.dijitCalendarDateLabel {
+ padding: 1px 1px 0px 3px;
+}
+
+.dojoxCalendar .monthOnly .dijitCalendarDayLabels,
+.dojoxCalendar .yearOnly .dijitCalendarDayLabels,
+.dojoxCalendar .monthOnly .dojoxCalendarComma,
+.dojoxCalendar .yearOnly .dojoxCalendarComma,
+.dojoxCalendar .monthOnly .dojoxCalendarFooter,
+.dojoxCalendar .yearOnly .dojoxCalendarFooter,
+.dojoxCalendar .monthOnly .dojoxCalendarYearHeader,
+.dojoxCalendar .monthOnly .dojoxCalendarIncrease,
+.dojoxCalendar .monthOnly .dojoxCalendarDecrease,
+.dojoxCalendar .yearOnly .dojoxCalendarMonthLabelNode {
+ display: none;
+}
+
+.dojoxCal-MY-labels .dojoxCalendarMonthLabel,
+.dojoxCal-MY-labels .dojoxCalendarYearLabel {
+ height: 13px;
+ padding-top: 4px;
+ padding-bottom: 3px;
+}
+
+.dojoxCal-MY-labels td.dojoxCal-MY-btns {
+ padding-top: 2px;
+ border-top: 1px solid grey;
+ text-align: center;
+}
+
+.dojoxCal-MY-labels {
+ background-color: white;
+}
+
+.dojoxCal-MY-labels .dojoxCalendarIncrease,
+.dojoxCal-MY-labels .dojoxCalendarDecrease {
+ float: none;
+ margin-left: 14px;
+}
+
+.dojoxCal-MY-btns button {
+ font-size: 8pt;
+}
+.dojoxCalendar .dojoxCal-MY-btns .dijitDisabled button {
+ color: #999;
+}
+.dojoxCal-hidden {
+ visibility: hidden;
+}
+.dojoxCalendar .dojoxCal-MY-labels {
+ height: 164px;
+}
+.dojoxCalendar .dojoxCal-MY-labels .dijitCalendarSelectedDate div {
+ padding-top: 3px;
+ padding-bottom: 2px;
+}
+.soria .dojoxCal-MY-labels .dijitCalendarSelectedDate div {
+ padding-top: 4px;
+ padding-bottom: 3px;
+}
+.dojoxCal-MY-labels .dojoxCalendarMonthLabel {
+ width: 38px;
+}
+.dojoxCal-MY-labels .dojoxCal-MY-M-last {
+ border-right: 1px grey solid;
+}
+.soria .dojoxCal-MY-labels .dojoxCal-MY-M-last {
+ border-right: 1px #B9CBF1 solid;
+}
+.dojoxCal-MY-labels .dojoxCal-MY-M-last .dojoxCalendarMonthLabel,
+.dojoxCal-MY-labels .dojoxCal-MY-G-Template div.dojoxCalendarYearLabel {
+ width: 42px;
+}
+
+.dojoxCalendar .cancel-btn {
+ margin-left: 11px;
+}
+.dojoxCalendar .ok-btn {
+ margin-left: 15px;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/Calendar/Calendar.html b/js/dojo-1.7.2/dojox/widget/Calendar/Calendar.html
new file mode 100644
index 0000000..7aafc40
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Calendar/Calendar.html
@@ -0,0 +1,24 @@
+<div class="dojoxCalendar">
+ <div tabindex="0" class="dojoxCalendarContainer" style="visibility: visible;" dojoAttachPoint="container">
+ <div style="display:none">
+ <div dojoAttachPoint="previousYearLabelNode"></div>
+ <div dojoAttachPoint="nextYearLabelNode"></div>
+ <div dojoAttachPoint="monthLabelSpacer"></div>
+ </div>
+ <div class="dojoxCalendarHeader">
+ <div>
+ <div class="dojoxCalendarDecrease" dojoAttachPoint="decrementMonth"></div>
+ </div>
+ <div class="">
+ <div class="dojoxCalendarIncrease" dojoAttachPoint="incrementMonth"></div>
+ </div>
+ <div class="dojoxCalendarTitle" dojoAttachPoint="header" dojoAttachEvent="onclick: onHeaderClick">
+ </div>
+ </div>
+ <div class="dojoxCalendarBody" dojoAttachPoint="containerNode"></div>
+ <div class="">
+ <div class="dojoxCalendarFooter" dojoAttachPoint="footer">
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/js/dojo-1.7.2/dojox/widget/Calendar/CalendarDay.html b/js/dojo-1.7.2/dojox/widget/Calendar/CalendarDay.html
new file mode 100644
index 0000000..1180d6f
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Calendar/CalendarDay.html
@@ -0,0 +1,23 @@
+<div class="dijitCalendarDayLabels" style="left: 0px;" dojoAttachPoint="dayContainer">
+ <div dojoAttachPoint="header">
+ <div dojoAttachPoint="monthAndYearHeader">
+ <span dojoAttachPoint="monthLabelNode" class="dojoxCalendarMonthLabelNode"></span>
+ <span dojoAttachPoint="headerComma" class="dojoxCalendarComma">,</span>
+ <span dojoAttachPoint="yearLabelNode" class="dojoxCalendarDayYearLabel"></span>
+ </div>
+ </div>
+ <table cellspacing="0" cellpadding="0" border="0" style="margin: auto;">
+ <thead>
+ <tr>
+ <td class="dijitCalendarDayLabelTemplate"><div class="dijitCalendarDayLabel"></div></td>
+ </tr>
+ </thead>
+ <tbody dojoAttachEvent="onclick: _onDayClick">
+ <tr class="dijitCalendarWeekTemplate">
+ <td class="dojoxCalendarNextMonth dijitCalendarDateTemplate">
+ <div class="dijitCalendarDateLabel"></div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
diff --git a/js/dojo-1.7.2/dojox/widget/Calendar/CalendarMonth.html b/js/dojo-1.7.2/dojox/widget/Calendar/CalendarMonth.html
new file mode 100644
index 0000000..f0bc3e8
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Calendar/CalendarMonth.html
@@ -0,0 +1,12 @@
+<div class="dojoxCalendarMonthLabels" style="left: 0px;"
+ dojoAttachPoint="monthContainer" dojoAttachEvent="onclick: onClick">
+ <table cellspacing="0" cellpadding="0" border="0" style="margin: auto;">
+ <tbody>
+ <tr class="dojoxCalendarMonthGroupTemplate">
+ <td class="dojoxCalendarMonthTemplate">
+ <div class="dojoxCalendarMonthLabel"></div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
diff --git a/js/dojo-1.7.2/dojox/widget/Calendar/CalendarMonthYear.html b/js/dojo-1.7.2/dojox/widget/Calendar/CalendarMonthYear.html
new file mode 100644
index 0000000..f87a09d
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Calendar/CalendarMonthYear.html
@@ -0,0 +1,31 @@
+<div class="dojoxCal-MY-labels" style="left: 0px;"
+ dojoAttachPoint="myContainer" dojoAttachEvent="onclick: onClick">
+ <table cellspacing="0" cellpadding="0" border="0" style="margin: auto;">
+ <tbody>
+ <tr class="dojoxCal-MY-G-Template">
+ <td class="dojoxCal-MY-M-Template">
+ <div class="dojoxCalendarMonthLabel"></div>
+ </td>
+ <td class="dojoxCal-MY-M-Template">
+ <div class="dojoxCalendarMonthLabel"></div>
+ </td>
+ <td class="dojoxCal-MY-Y-Template">
+ <div class="dojoxCalendarYearLabel"></div>
+ </td>
+ <td class="dojoxCal-MY-Y-Template">
+ <div class="dojoxCalendarYearLabel"></div>
+ </td>
+ </tr>
+ <tr class="dojoxCal-MY-btns">
+ <td class="dojoxCal-MY-btns" colspan="4">
+ <span class="dijitReset dijitInline dijitButtonNode ok-btn" dojoAttachEvent="onclick: onOk" dojoAttachPoint="okBtn">
+ <button class="dijitReset dijitStretch dijitButtonContents">OK</button>
+ </span>
+ <span class="dijitReset dijitInline dijitButtonNode cancel-btn" dojoAttachEvent="onclick: onCancel" dojoAttachPoint="cancelBtn">
+ <button class="dijitReset dijitStretch dijitButtonContents">Cancel</button>
+ </span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
diff --git a/js/dojo-1.7.2/dojox/widget/Calendar/CalendarYear.html b/js/dojo-1.7.2/dojox/widget/Calendar/CalendarYear.html
new file mode 100644
index 0000000..08ca429
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Calendar/CalendarYear.html
@@ -0,0 +1,12 @@
+<div class="dojoxCalendarYearLabels" style="left: 0px;" dojoAttachPoint="yearContainer">
+ <table cellspacing="0" cellpadding="0" border="0" style="margin: auto;" dojoAttachEvent="onclick: onClick">
+ <tbody>
+ <tr class="dojoxCalendarYearGroupTemplate">
+ <td class="dojoxCalendarNextMonth dojoxCalendarYearTemplate">
+ <div class="dojoxCalendarYearLabel">
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
diff --git a/js/dojo-1.7.2/dojox/widget/CalendarFx.js b/js/dojo-1.7.2/dojox/widget/CalendarFx.js
new file mode 100644
index 0000000..4d3a419
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/CalendarFx.js
@@ -0,0 +1,31 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/CalendarFx", ["dijit","dojo","dojox","dojo/require!dojox/widget/FisheyeLite"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.CalendarFx");
+dojo.require("dojox.widget.FisheyeLite");
+
+dojo.declare("dojox.widget._FisheyeFX",null, {
+ // summary
+ // A mixin to add a FisheyeLite effect to the calendar
+ addFx: function(query, fromNode) {
+ //Use the query and base node passed from the calendar view mixin
+ //to select the nodes to attach the event to.
+ dojo.query(query, fromNode).forEach(function(node){
+ new dojox.widget.FisheyeLite({
+ properties: {
+ fontSize: 1.1
+ }
+ }, node);
+ });
+ }
+});
+
+dojo.declare("dojox.widget.CalendarFisheye",
+ [dojox.widget.Calendar,
+ dojox.widget._FisheyeFX], {
+ // summary: The standard Calendar. It includes day, month and year views.
+ // FisheyeLite effects are included.
+ }
+);
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/CalendarViews.js b/js/dojo-1.7.2/dojox/widget/CalendarViews.js
new file mode 100644
index 0000000..3dda8ab
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/CalendarViews.js
@@ -0,0 +1,153 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/CalendarViews", ["dijit","dojo","dojox","dojo/require!dojox/widget/Calendar"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.CalendarViews");
+dojo.experimental("dojox.widget.CalendarViews");
+
+dojo.require("dojox.widget.Calendar");
+
+dojo.declare("dojox.widget._CalendarMonth", null, {
+ // summary: Mixin class for adding a view listing all 12 months of the year to the
+ // dojox.widget._CalendarBase
+
+
+ constructor: function(){
+ // summary: Adds a dojox.widget._CalendarMonthView view to the calendar widget.
+ this._addView(dojox.widget._CalendarMonthView);
+ }
+});
+
+dojo.declare("dojox.widget._CalendarMonthView", [dojox.widget._CalendarView, dijit._Templated], {
+ // summary: A Calendar view listing the 12 months of the year
+
+ // templateString: String
+ // The template to be used to construct the widget.
+ 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 class=\"dojoxCalendarMonthTemplate\">\n <div class=\"dojoxCalendarMonthLabel\"></div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n"),
+
+ // datePart: String
+ // Specifies how much to increment the displayed date when the user
+ // clicks the array button to increment of decrement the view.
+ datePart: "year",
+
+ // headerClass: String
+ // Specifies the CSS class to apply to the header node for this view.
+ headerClass: "dojoxCalendarMonthHeader",
+
+ postCreate: function(){
+ // summary: Constructs the view
+ this.cloneClass(".dojoxCalendarMonthTemplate", 3);
+ this.cloneClass(".dojoxCalendarMonthGroupTemplate", 2);
+ this._populateMonths();
+
+ // Add visual effects to the view, if any have been mixed in
+ this.addFx(".dojoxCalendarMonthLabel", this.domNode);
+ },
+
+ _setValueAttr: function(value){
+ this.header.innerHTML = value.getFullYear();
+ },
+
+ _getMonthNames: dojox.widget._CalendarMonthYearView.prototype._getMonthNames,
+
+ _populateMonths: dojox.widget._CalendarMonthYearView.prototype._populateMonths,
+
+ onClick: function(evt){
+ // summary: Handles clicks on month names
+ if(!dojo.hasClass(evt.target, "dojoxCalendarMonthLabel")){dojo.stopEvent(evt); return;}
+ var parentNode = evt.target.parentNode;
+ var month = parentNode.cellIndex + (parentNode.parentNode.rowIndex * 4);
+ var date = this.get("value");
+
+ // Seeing a really strange bug in FF3.6 where this has to be called twice
+ // in order to take affect
+ date.setMonth(month);
+ date.setMonth(month);
+ this.onValueSelected(date, month);
+ }
+});
+
+dojo.declare("dojox.widget._CalendarYear", null, {
+ // summary: Mixin class for adding a view listing 12 years to the
+ // dojox.widget._CalendarBase
+ parent: null,
+
+ constructor: function(){
+ // summary: Adds a dojox.widget._CalendarYearView view to the
+ // dojo.widget._CalendarBase widget.
+ this._addView(dojox.widget._CalendarYearView);
+ }
+});
+
+dojo.declare("dojox.widget._CalendarYearView", [dojox.widget._CalendarView, dijit._Templated], {
+ // summary: A Calendar view listing 12 years
+
+ // templateString: String
+ // The template to be used to construct the widget.
+ 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=\"dojoxCalendarNextMonth dojoxCalendarYearTemplate\">\n <div class=\"dojoxCalendarYearLabel\">\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n"),
+
+ displayedYears: 6,
+
+ postCreate: function(){
+ // summary: Constructs the view
+ this.cloneClass(".dojoxCalendarYearTemplate", 3);
+ this.cloneClass(".dojoxCalendarYearGroupTemplate", 2);
+ this._populateYears();
+ this.addFx(".dojoxCalendarYearLabel", this.domNode);
+ },
+
+ _setValueAttr: function(value){
+ this._populateYears(value.getFullYear());
+ },
+
+ _populateYears: dojox.widget._CalendarMonthYearView.prototype._populateYears,
+
+ adjustDate: function(date, amount){
+ // summary: Adjusts the value of a date. It moves it by 12 years each time.
+ return dojo.date.add(date, "year", amount * 12);
+ },
+
+ onClick: function(evt){
+ // summary: Handles clicks on year values.
+ if(!dojo.hasClass(evt.target, "dojoxCalendarYearLabel")){dojo.stopEvent(evt); return;}
+ var year = Number(evt.target.innerHTML);
+ var date = this.get("value");
+ date.setYear(year);
+ this.onValueSelected(date, year);
+ }
+});
+
+
+dojo.declare("dojox.widget.Calendar3Pane",
+ [dojox.widget._CalendarBase,
+ dojox.widget._CalendarDay,
+ dojox.widget._CalendarMonth,
+ dojox.widget._CalendarYear], {
+ // summary: The Calendar includes day, month and year views.
+ // No visual effects are included.
+ }
+);
+
+dojo.declare("dojox.widget.MonthlyCalendar",
+ [dojox.widget._CalendarBase,
+ dojox.widget._CalendarMonth], {
+ // summary: A calendar with only a month view.
+ _makeDate: function(value){
+ var now = new Date();
+ now.setMonth(value);
+ return now;
+ }
+ }
+);
+dojo.declare("dojox.widget.YearlyCalendar",
+ [dojox.widget._CalendarBase,
+ dojox.widget._CalendarYear], {
+ // summary: A calendar with only a year view.
+ _makeDate: function(value){
+ var now = new Date();
+ now.setFullYear(value);
+ return now;
+ }
+ }
+);
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/ColorPicker.js
new file mode 100644
index 0000000..9c4501a
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/ColorPicker.js
@@ -0,0 +1,575 @@
+//>>built
+require({cache:{
+'url:dojox/widget/ColorPicker/ColorPicker.html':"<table class=\"dojoxColorPicker\" dojoAttachEvent=\"onkeypress: _handleKey\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tr>\n\t\t<td valign=\"top\" class=\"dojoxColorPickerRightPad\">\n\t\t\t<div class=\"dojoxColorPickerBox\">\n\t\t\t\t<!-- Forcing ABS in style attr due to dojo DND issue with not picking it up form the class. -->\n\t\t\t\t<img role=\"status\" title=\"${saturationPickerTitle}\" alt=\"${saturationPickerTitle}\" class=\"dojoxColorPickerPoint\" src=\"${_pickerPointer}\" tabIndex=\"0\" dojoAttachPoint=\"cursorNode\" style=\"position: absolute; top: 0px; left: 0px;\">\n\t\t\t\t<img role=\"presentation\" alt=\"\" dojoAttachPoint=\"colorUnderlay\" dojoAttachEvent=\"onclick: _setPoint, onmousedown: _stopDrag\" class=\"dojoxColorPickerUnderlay\" src=\"${_underlay}\" ondragstart=\"return false\">\n\t\t\t</div>\n\t\t</td>\n\t\t<td valign=\"top\" class=\"dojoxColorPickerRightPad\">\n\t\t\t<div class=\"dojoxHuePicker\">\n\t\t\t\t<!-- Forcing ABS in style attr due to dojo DND issue with not picking it up form the class. -->\n\t\t\t\t<img role=\"status\" dojoAttachPoint=\"hueCursorNode\" tabIndex=\"0\" class=\"dojoxHuePickerPoint\" title=\"${huePickerTitle}\" alt=\"${huePickerTitle}\" src=\"${_huePickerPointer}\" style=\"position: absolute; top: 0px; left: 0px;\">\n\t\t\t\t<div class=\"dojoxHuePickerUnderlay\" dojoAttachPoint=\"hueNode\">\n\t\t\t\t <img role=\"presentation\" alt=\"\" dojoAttachEvent=\"onclick: _setHuePoint, onmousedown: _stopDrag\" src=\"${_hueUnderlay}\">\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</td>\n\t\t<td valign=\"top\">\n\t\t\t<table cellpadding=\"0\" cellspacing=\"0\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td valign=\"top\" class=\"dojoxColorPickerPreviewContainer\">\n\t\t\t\t\t\t<table cellpadding=\"0\" cellspacing=\"0\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td valign=\"top\" class=\"dojoxColorPickerRightPad\">\n\t\t\t\t\t\t\t\t\t<div dojoAttachPoint=\"previewNode\" class=\"dojoxColorPickerPreview\"></div>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td valign=\"top\">\n\t\t\t\t\t\t\t\t\t<div dojoAttachPoint=\"safePreviewNode\" class=\"dojoxColorPickerWebSafePreview\"></div>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td valign=\"bottom\">\n\t\t\t\t\t\t<table class=\"dojoxColorPickerOptional\" cellpadding=\"0\" cellspacing=\"0\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<div class=\"dijitInline dojoxColorPickerRgb\" dojoAttachPoint=\"rgbNode\">\n\t\t\t\t\t\t\t\t\t\t<table cellpadding=\"1\" cellspacing=\"1\">\n\t\t\t\t\t\t\t\t\t\t<tr><td><label for=\"${_uId}_r\">${redLabel}</label></td><td><input id=\"${_uId}_r\" dojoAttachPoint=\"Rval\" size=\"1\" dojoAttachEvent=\"onchange: _colorInputChange\"></td></tr>\n\t\t\t\t\t\t\t\t\t\t<tr><td><label for=\"${_uId}_g\">${greenLabel}</label></td><td><input id=\"${_uId}_g\" dojoAttachPoint=\"Gval\" size=\"1\" dojoAttachEvent=\"onchange: _colorInputChange\"></td></tr>\n\t\t\t\t\t\t\t\t\t\t<tr><td><label for=\"${_uId}_b\">${blueLabel}</label></td><td><input id=\"${_uId}_b\" dojoAttachPoint=\"Bval\" size=\"1\" dojoAttachEvent=\"onchange: _colorInputChange\"></td></tr>\n\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<div class=\"dijitInline dojoxColorPickerHsv\" dojoAttachPoint=\"hsvNode\">\n\t\t\t\t\t\t\t\t\t\t<table cellpadding=\"1\" cellspacing=\"1\">\n\t\t\t\t\t\t\t\t\t\t<tr><td><label for=\"${_uId}_h\">${hueLabel}</label></td><td><input id=\"${_uId}_h\" dojoAttachPoint=\"Hval\"size=\"1\" dojoAttachEvent=\"onchange: _colorInputChange\"> ${degLabel}</td></tr>\n\t\t\t\t\t\t\t\t\t\t<tr><td><label for=\"${_uId}_s\">${saturationLabel}</label></td><td><input id=\"${_uId}_s\" dojoAttachPoint=\"Sval\" size=\"1\" dojoAttachEvent=\"onchange: _colorInputChange\"> ${percentSign}</td></tr>\n\t\t\t\t\t\t\t\t\t\t<tr><td><label for=\"${_uId}_v\">${valueLabel}</label></td><td><input id=\"${_uId}_v\" dojoAttachPoint=\"Vval\" size=\"1\" dojoAttachEvent=\"onchange: _colorInputChange\"> ${percentSign}</td></tr>\n\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td colspan=\"2\">\n\t\t\t\t\t\t\t\t\t<div class=\"dojoxColorPickerHex\" dojoAttachPoint=\"hexNode\" aria-live=\"polite\">\t\n\t\t\t\t\t\t\t\t\t\t<label for=\"${_uId}_hex\">&nbsp;${hexLabel}&nbsp;</label><input id=\"${_uId}_hex\" dojoAttachPoint=\"hexCode, focusNode, valueNode\" size=\"6\" class=\"dojoxColorPickerHexCode\" dojoAttachEvent=\"onchange: _colorInputChange\">\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>\n\n"}});
+define("dojox/widget/ColorPicker", [
+ "dojo/_base/kernel","dojo/_base/declare","dojo/_base/lang","dojo/_base/array",
+ "dojo/_base/html","dojo/_base/connect","dojo/_base/sniff","dojo/_base/window",
+ "dojo/_base/event","dojo/dom","dojo/dom-class","dojo/keys","dojo/fx","dojo/dnd/move",
+ "dijit/registry","dijit/_base/focus","dijit/form/_FormWidget","dijit/typematic",
+ "dojox/color","dojo/i18n","dojo/i18n!./nls/ColorPicker","dojo/i18n!dojo/cldr/nls/number",
+ "dojo/text!./ColorPicker/ColorPicker.html"
+], function(kernel,declare,lang,ArrayUtil,html,Hub,has,win,Event,DOM,DOMClass,Keys,fx,move,
+ registry,FocusManager,FormWidget,Typematic,color,i18n,bundle1,bundle2,template){
+
+ kernel.experimental("dojox.widget.ColorPicker");
+
+ var webSafeFromHex = function(hex){
+ // stub, this is planned later:
+ return hex;
+ };
+/*=====
+ var FormWidget = dijit.form._FormWidget;
+=====*/
+ // TODO: shouldn't this extend _FormValueWidget?
+ return declare("dojox.widget.ColorPicker", FormWidget, {
+ // summary:
+ // a HSV color picker - similar to Photoshop picker
+ //
+ // description:
+ // Provides an interactive HSV ColorPicker similar to
+ // PhotoShop's color selction tool. This is an enhanced
+ // version of the default dijit.ColorPalette, though provides
+ // no accessibility.
+ //
+ // example:
+ // | var picker = new dojox.widget.ColorPicker({
+ // | // a couple of example toggles:
+ // | animatePoint:false,
+ // | showHsv: false,
+ // | webSafe: false,
+ // | showRgb: false
+ // | });
+ //
+ // example:
+ // | <!-- markup: -->
+ // | <div dojoType="dojox.widget.ColorPicker"></div>
+ //
+ // showRgb: Boolean
+ // show/update RGB input nodes
+ showRgb: true,
+
+ // showHsv: Boolean
+ // show/update HSV input nodes
+ showHsv: true,
+
+ // showHex: Boolean
+ // show/update Hex value field
+ showHex: true,
+
+ // webSafe: Boolean
+ // deprecated? or just use a toggle to show/hide that node, too?
+ webSafe: true,
+
+ // animatePoint: Boolean
+ // toggle to use slideTo (true) or just place the cursor (false) on click
+ animatePoint: true,
+
+ // slideDuration: Integer
+ // time in ms picker node will slide to next location (non-dragging) when animatePoint=true
+ slideDuration: 250,
+
+ // liveUpdate: Boolean
+ // Set to true to fire onChange in an indeterminate way
+ liveUpdate: false,
+
+ // PICKER_HUE_H: int
+ // Height of the hue picker, used to calculate positions
+ PICKER_HUE_H: 150,
+
+ // PICKER_SAT_VAL_H: int
+ // Height of the 2d picker, used to calculate positions
+ PICKER_SAT_VAL_H: 150,
+
+ // PICKER_SAT_VAL_W: int
+ // Width of the 2d picker, used to calculate positions
+ PICKER_SAT_VAL_W: 150,
+
+ // PICKER_HUE_SELECTOR_H: int
+ // Height of the hue selector DOM node, used to calc offsets so that selection
+ // is center of the image node.
+ PICKER_HUE_SELECTOR_H: 8,
+
+ // PICKER_SAT_SELECTOR_H: int
+ // Height of the saturation selector DOM node, used to calc offsets so that selection
+ // is center of the image node.
+ PICKER_SAT_SELECTOR_H: 10,
+
+ // PICKER_SAT_SELECTOR_W: int
+ // Width of the saturation selector DOM node, used to calc offsets so that selection
+ // is center of the image node.
+ PICKER_SAT_SELECTOR_W: 10,
+
+ // value: String
+ // Default color for this component. Only hex values are accepted as incoming/returned
+ // values. Adjust this value with `.attr`, eg: dijit.byId("myPicker").attr("value", "#ededed");
+ // to cause the points to adjust and the values to reflect the current color.
+ value: "#ffffff",
+
+ _underlay: kernel.moduleUrl("dojox.widget","ColorPicker/images/underlay.png"),
+
+ _hueUnderlay: kernel.moduleUrl("dojox.widget","ColorPicker/images/hue.png"),
+
+ _pickerPointer: kernel.moduleUrl("dojox.widget","ColorPicker/images/pickerPointer.png"),
+
+ _huePickerPointer: kernel.moduleUrl("dojox.widget","ColorPicker/images/hueHandle.png"),
+
+ _huePickerPointerAlly: kernel.moduleUrl("dojox.widget","ColorPicker/images/hueHandleA11y.png"),
+
+ templateString: template,
+
+ postMixInProperties: function(){
+ if(DOMClass.contains(win.body(), "dijit_a11y")){
+ // Use the pointer that will show up in high contrast.
+ this._huePickerPointer = this._huePickerPointerAlly;
+ }
+ this._uId = registry.getUniqueId(this.id);
+ lang.mixin(this, i18n.getLocalization("dojox.widget", "ColorPicker"));
+ lang.mixin(this, i18n.getLocalization("dojo.cldr", "number"));
+ this.inherited(arguments);
+ },
+
+ postCreate: function(){
+ // summary:
+ // As quickly as we can, set up ie6 alpha-filter support for our
+ // underlay. we don't do image handles (done in css), just the 'core'
+ // of this widget: the underlay.
+ this.inherited(arguments);
+ if(has("ie") < 7){
+ this.colorUnderlay.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this._underlay+"', sizingMethod='scale')";
+ this.colorUnderlay.src = this._blankGif.toString();
+ }
+ // hide toggle-able nodes:
+ if(!this.showRgb){ this.rgbNode.style.visibility = "hidden"; }
+ if(!this.showHsv){ this.hsvNode.style.visibility = "hidden"; }
+ if(!this.showHex){ this.hexNode.style.visibility = "hidden"; }
+ if(!this.webSafe){ this.safePreviewNode.style.visibility = "hidden"; }
+ },
+
+ startup: function(){
+ if(this._started){
+ return;
+ }
+ this._started = true;
+ this.set("value", this.value);
+ this._mover = new move.boxConstrainedMoveable(this.cursorNode, {
+ box: {
+ t: -(this.PICKER_SAT_SELECTOR_H/2),
+ l: -(this.PICKER_SAT_SELECTOR_W/2),
+ w:this.PICKER_SAT_VAL_W,
+ h:this.PICKER_SAT_VAL_H
+ }
+ });
+
+ this._hueMover = new move.boxConstrainedMoveable(this.hueCursorNode, {
+ box: {
+ t: -(this.PICKER_HUE_SELECTOR_H/2),
+ l:0,
+ w:0,
+ h:this.PICKER_HUE_H
+ }
+ });
+
+ this._subs = [];
+ // no dnd/move/move published ... use a timer:
+ this._subs.push(Hub.subscribe("/dnd/move/stop", lang.hitch(this, "_clearTimer")));
+ this._subs.push(Hub.subscribe("/dnd/move/start", lang.hitch(this, "_setTimer")));
+
+ // Bind to up, down, left and right arrows on the hue and saturation nodes.
+ this._keyListeners = [];
+ this._connects.push(Typematic.addKeyListener(this.hueCursorNode,{
+ charOrCode: Keys.UP_ARROW,
+ shiftKey: false,
+ metaKey: false,
+ ctrlKey: false,
+ altKey: false
+ }, this, lang.hitch(this, this._updateHueCursorNode), 25, 25));
+ this._connects.push(Typematic.addKeyListener(this.hueCursorNode,{
+ charOrCode: Keys.DOWN_ARROW,
+ shiftKey: false,
+ metaKey: false,
+ ctrlKey: false,
+ altKey: false
+ }, this, lang.hitch(this, this._updateHueCursorNode), 25, 25));
+ this._connects.push(Typematic.addKeyListener(this.cursorNode,{
+ charOrCode: Keys.UP_ARROW,
+ shiftKey: false,
+ metaKey: false,
+ ctrlKey: false,
+ altKey: false
+ }, this, lang.hitch(this, this._updateCursorNode), 25, 25));
+ this._connects.push(Typematic.addKeyListener(this.cursorNode,{
+ charOrCode: Keys.DOWN_ARROW,
+ shiftKey: false,
+ metaKey: false,
+ ctrlKey: false,
+ altKey: false
+ }, this, lang.hitch(this, this._updateCursorNode), 25, 25));
+ this._connects.push(Typematic.addKeyListener(this.cursorNode,{
+ charOrCode: Keys.LEFT_ARROW,
+ shiftKey: false,
+ metaKey: false,
+ ctrlKey: false,
+ altKey: false
+ }, this, lang.hitch(this, this._updateCursorNode), 25, 25));
+ this._connects.push(Typematic.addKeyListener(this.cursorNode,{
+ charOrCode: Keys.RIGHT_ARROW,
+ shiftKey: false,
+ metaKey: false,
+ ctrlKey: false,
+ altKey: false
+ }, this, lang.hitch(this, this._updateCursorNode), 25, 25));
+ },
+
+ _setValueAttr: function(value){
+ if(!this._started){ return; }
+ this.setColor(value, true);
+ },
+
+ setColor: function(/* String */col, force){
+ // summary: Set a color on a picker. Usually used to set
+ // initial color as an alternative to passing defaultColor option
+ // to the constructor.
+ col = color.fromString(col);
+ this._updatePickerLocations(col);
+ this._updateColorInputs(col);
+ this._updateValue(col, force);
+ },
+
+ _setTimer: function(/* d.dnd.Mover */mover){
+ if(mover.node != this.cursorNode){ return; }
+ // FIXME: should I assume this? focus on mouse down so on mouse up
+ FocusManager.focus(mover.node);
+ DOM.setSelectable(this.domNode,false);
+ this._timer = setInterval(lang.hitch(this, "_updateColor"), 45);
+ },
+
+ _clearTimer: function(/* d.dnd.Mover */mover){
+ if(!this._timer){ return; }
+ clearInterval(this._timer);
+ this._timer = null;
+ this.onChange(this.value);
+ DOM.setSelectable(this.domNode,true);
+ },
+
+ _setHue: function(/* Decimal */h){
+ // summary:
+ // Sets a natural color background for the
+ // underlay image against closest hue value (full saturation)
+ // h: 0..360
+ html.style(this.colorUnderlay, "backgroundColor", color.fromHsv(h,100,100).toHex());
+
+ },
+
+ _updateHueCursorNode: function(count, node, e){
+ // summary:
+ // Function used by the typematic code to handle cursor position and update
+ // via keyboard.
+ // count:
+ // -1 means stop, anything else is just how many times it was called.
+ // node:
+ // The node generating the event.
+ // e:
+ // The event.
+ if(count !== -1){
+ var y = html.style(this.hueCursorNode, "top");
+ var selCenter = this.PICKER_HUE_SELECTOR_H/2;
+
+ // Account for our offset
+ y += selCenter;
+ var update = false;
+ if(e.charOrCode == Keys.UP_ARROW){
+ if(y > 0){
+ y -= 1;
+ update = true;
+ }
+ }else if(e.charOrCode == Keys.DOWN_ARROW){
+ if(y < this.PICKER_HUE_H){
+ y += 1;
+ update = true;
+ }
+ }
+ y -= selCenter;
+ if(update){
+ html.style(this.hueCursorNode, "top", y + "px");
+ }
+ }else{
+ this._updateColor(true);
+ }
+ },
+
+ _updateCursorNode: function(count, node, e){
+ // summary:
+ // Function used by the typematic code to handle cursor position and update
+ // via keyboard.
+ // count:
+ // -1 means stop, anything else is just how many times it was called.
+ // node:
+ // The node generating the event.
+ // e:
+ // The event.
+ var selCenterH = this.PICKER_SAT_SELECTOR_H/2;
+ var selCenterW = this.PICKER_SAT_SELECTOR_W/2;
+
+ if(count !== -1){
+ var y = html.style(this.cursorNode, "top");
+ var x = html.style(this.cursorNode, "left");
+
+ // Account for our offsets to center
+ y += selCenterH;
+ x += selCenterW;
+
+ var update = false;
+ if(e.charOrCode == Keys.UP_ARROW){
+ if(y > 0){
+ y -= 1;
+ update = true;
+ }
+ }else if(e.charOrCode == Keys.DOWN_ARROW){
+ if(y < this.PICKER_SAT_VAL_H){
+ y += 1;
+ update = true;
+ }
+ }else if(e.charOrCode == Keys.LEFT_ARROW){
+ if(x > 0){
+ x -= 1;
+ update = true;
+ }
+ }else if(e.charOrCode == Keys.RIGHT_ARROW){
+ if(x < this.PICKER_SAT_VAL_W){
+ x += 1;
+ update = true;
+ }
+ }
+ if(update){
+ // Account for our offsets to center
+ y -= selCenterH;
+ x -= selCenterW;
+ html.style(this.cursorNode, "top", y + "px");
+ html.style(this.cursorNode, "left", x + "px");
+ }
+ }else{
+ this._updateColor(true);
+ }
+ },
+
+ _updateColor: function(){
+ // summary: update the previewNode color, and input values [optional]
+
+ var hueSelCenter = this.PICKER_HUE_SELECTOR_H/2,
+ satSelCenterH = this.PICKER_SAT_SELECTOR_H/2,
+ satSelCenterW = this.PICKER_SAT_SELECTOR_W/2;
+
+ var _huetop = html.style(this.hueCursorNode,"top") + hueSelCenter,
+ _pickertop = html.style(this.cursorNode,"top") + satSelCenterH,
+ _pickerleft = html.style(this.cursorNode,"left") + satSelCenterW,
+ h = Math.round(360 - (_huetop / this.PICKER_HUE_H * 360)),
+ col = color.fromHsv(h, _pickerleft / this.PICKER_SAT_VAL_W * 100, 100 - (_pickertop / this.PICKER_SAT_VAL_H * 100))
+ ;
+
+ this._updateColorInputs(col);
+ this._updateValue(col, true);
+
+ // update hue, not all the pickers
+ if(h!=this._hue){
+ this._setHue(h);
+ }
+ },
+
+ _colorInputChange: function(e){
+ //summary: updates picker position and inputs
+ // according to rgb, hex or hsv input changes
+ var col, hasit = false;
+ switch(e.target){
+ //transform to hsv to pixels
+
+ case this.hexCode:
+ col = color.fromString(e.target.value);
+ hasit = true;
+
+ break;
+ case this.Rval:
+ case this.Gval:
+ case this.Bval:
+ col = color.fromArray([this.Rval.value, this.Gval.value, this.Bval.value]);
+ hasit = true;
+ break;
+ case this.Hval:
+ case this.Sval:
+ case this.Vval:
+ col = color.fromHsv(this.Hval.value, this.Sval.value, this.Vval.value);
+ hasit = true;
+ break;
+ }
+
+ if(hasit){
+ this._updatePickerLocations(col);
+ this._updateColorInputs(col);
+ this._updateValue(col, true);
+ }
+
+ },
+
+ _updateValue: function(/* dojox.color.Color */col, /* Boolean */fireChange){
+ // summary: updates the value of the widget
+ // can cancel reverse onChange by specifying second param
+ var hex = col.toHex();
+
+ this.value = this.valueNode.value = hex;
+
+ // anytime we muck with the color, fire onChange?
+ if(fireChange && (!this._timer || this.liveUpdate)){
+ this.onChange(hex);
+ }
+ },
+
+ _updatePickerLocations: function(/* dojox.color.Color */col){
+ //summary: update handles on the pickers acording to color values
+ //
+ var hueSelCenter = this.PICKER_HUE_SELECTOR_H/2,
+ satSelCenterH = this.PICKER_SAT_SELECTOR_H/2,
+ satSelCenterW = this.PICKER_SAT_SELECTOR_W/2;
+
+ var hsv = col.toHsv(),
+ ypos = Math.round(this.PICKER_HUE_H - hsv.h / 360 * this.PICKER_HUE_H) - hueSelCenter,
+ newLeft = Math.round(hsv.s / 100 * this.PICKER_SAT_VAL_W) - satSelCenterW,
+ newTop = Math.round(this.PICKER_SAT_VAL_H - hsv.v / 100 * this.PICKER_SAT_VAL_H) - satSelCenterH
+ ;
+
+ if(this.animatePoint){
+ fx.slideTo({
+ node: this.hueCursorNode,
+ duration: this.slideDuration,
+ top: ypos,
+ left: 0
+ }).play();
+
+ fx.slideTo({
+ node: this.cursorNode,
+ duration: this.slideDuration,
+ top: newTop,
+ left: newLeft
+ }).play();
+
+ }
+ else {
+ html.style(this.hueCursorNode, "top", ypos + "px");
+ html.style(this.cursorNode, {
+ left: newLeft + "px",
+ top: newTop + "px"
+ });
+ }
+
+ // limit hue calculations to only when it changes
+ if(hsv.h != this._hue){
+ this._setHue(hsv.h);
+ }
+
+ },
+
+ _updateColorInputs: function(/* dojox.color.Color */col){
+ //summary: updates color inputs that were changed through other inputs
+ //or by clicking on the picker
+
+ var hex = col.toHex();
+
+ if(this.showRgb){
+ this.Rval.value = col.r;
+ this.Gval.value = col.g;
+ this.Bval.value = col.b;
+ }
+
+ if(this.showHsv){
+ var hsv = col.toHsv();
+ this.Hval.value = Math.round((hsv.h)); // convert to 0..360
+ this.Sval.value = Math.round(hsv.s);
+ this.Vval.value = Math.round(hsv.v);
+ }
+
+ if(this.showHex){
+ this.hexCode.value = hex;
+ }
+
+ this.previewNode.style.backgroundColor = hex;
+
+ if(this.webSafe){
+ this.safePreviewNode.style.backgroundColor = webSafeFromHex(hex);
+ }
+ },
+
+ _setHuePoint: function(/* Event */evt){
+ // summary: set the hue picker handle on relative y coordinates
+ var selCenter = this.PICKER_HUE_SELECTOR_H/2;
+ var ypos = evt.layerY - selCenter;
+ if(this.animatePoint){
+ fx.slideTo({
+ node: this.hueCursorNode,
+ duration:this.slideDuration,
+ top: ypos,
+ left: 0,
+ onEnd: lang.hitch(this, function(){ this._updateColor(true); FocusManager.focus(this.hueCursorNode); })
+ }).play();
+ }else{
+ html.style(this.hueCursorNode, "top", ypos + "px");
+ this._updateColor(false);
+ }
+ },
+
+ _setPoint: function(/* Event */evt){
+ // summary: set our picker point based on relative x/y coordinates
+ // evt.preventDefault();
+ var satSelCenterH = this.PICKER_SAT_SELECTOR_H/2;
+ var satSelCenterW = this.PICKER_SAT_SELECTOR_W/2;
+ var newTop = evt.layerY - satSelCenterH;
+ var newLeft = evt.layerX - satSelCenterW;
+
+ if(evt){ FocusManager.focus(evt.target); }
+
+ if(this.animatePoint){
+ fx.slideTo({
+ node: this.cursorNode,
+ duration: this.slideDuration,
+ top: newTop,
+ left: newLeft,
+ onEnd: lang.hitch(this, function(){ this._updateColor(true); FocusManager.focus(this.cursorNode); })
+ }).play();
+ }else{
+ html.style(this.cursorNode, {
+ left: newLeft + "px",
+ top: newTop + "px"
+ });
+ this._updateColor(false);
+ }
+ },
+
+ _handleKey: function(/* Event */e){
+ // FIXME: not implemented YET
+ // var keys = d.keys;
+ },
+
+ focus: function(){
+ // summary:
+ // Put focus on this widget, only if focus isn't set on it already.
+ if(!this.focused){
+ FocusManager.focus(this.focusNode);
+ }
+ },
+
+ _stopDrag: function(e){
+ // summary:
+ // Function to hald the mouse down default
+ // to disable draggong of images out of the color
+ // picker.
+ Event.stop(e);
+ },
+
+ destroy: function(){
+ // summary:
+ // Over-ride to clean up subscriptions, etc.
+ this.inherited(arguments);
+ ArrayUtil.forEach(this._subs, function(sub){
+ Hub.unsubscribe(sub);
+ });
+ delete this._subs;
+ }
+ });
+});
diff --git a/js/dojo-1.7.2/dojox/widget/ColorPicker/ColorPicker.css b/js/dojo-1.7.2/dojox/widget/ColorPicker/ColorPicker.css
new file mode 100644
index 0000000..a7b8fa9
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/ColorPicker/ColorPicker.css
@@ -0,0 +1,118 @@
+.dojoxColorPicker {
+ padding:8px;
+ -moz-border-radius:4pt;
+ -webkit-border-radius:5pt;
+ -webkit-drop-shadow:3pt;
+}
+
+.dojoxColorPickerRightPad {
+ padding-right: 8px;
+}
+
+.tundra .dojoxColorPicker {
+ background:#ededed;
+ border:1px solid #ccc;
+}
+
+.dojoxColorPickerBox {
+ position:relative;
+ width:150px;
+ height:150px;
+ margin:0;
+ padding:0;
+}
+
+.dojoxColorPickerUnderlay {
+ position:relative;
+ top:0; left:0;
+ width:150px;
+ height:150px;
+ z-index:1;
+}
+.tundra .dojoxColorPickerUnderlay {
+ border:1px solid #a0a0a0;
+}
+
+.claro .dojoxColorPicker {
+ background:#ededed;
+ border:1px solid #cdcdcd;
+}
+
+.claro .dojoxColorPickerUnderlay {
+ border:1px solid #cccccc;
+}
+
+.dojoxHuePickerUnderlay {
+ position:relative;
+ top:0; left:0;
+ height:150px;
+ width:20px;
+ z-index:1;
+ text-align: center;
+}
+
+.dojoxHuePicker { position:relative; top: 0px; left: 0px; padding: 0px;}
+
+.dojoxHuePickerPoint {
+ position:absolute;
+ top:0; left:0;
+ width:20px;
+ height:8px;
+ z-index:3;
+ cursor:move;
+}
+
+.dojoxColorPickerPoint {
+ position:absolute;
+ width:10px;
+ height:10px;
+ border:0;
+ z-index:3;
+ cursor:move;
+}
+
+.dojoxColorPickerPreview {
+ display:block;
+ width:45px;
+ height:45px;
+ border:1px solid #333;
+ background-color:#fff;
+ position:relative;
+ top: 0px;
+ left: 0px;
+}
+.dojoxColorPickerWebSafePreview {
+ display:block;
+ width:25px;
+ height:25px;
+ position:relative;
+ top: 0px;
+ left: 0px;
+ border:1px solid #333;
+}
+
+.dojoxColorPickerOptional {
+ position:relative;
+ top: 0px;
+ left: 0px;
+ height: 100%;
+}
+
+.dojoxColorPickerOptional table {
+ border-spacing: 4px;
+}
+
+.dojoxColorPickerPreviewContainer table {
+ border-spacing: 6px 0px;
+}
+
+.dojoxColorPickerOptional input {
+ border:1px solid #a7a7a7;
+ width:25px;
+ padding:1px 3px 1px 3px;
+ line-height:1.1em;
+}
+
+.dojoxColorPickerHex input {
+ width:55px;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/ColorPicker/ColorPicker.html b/js/dojo-1.7.2/dojox/widget/ColorPicker/ColorPicker.html
new file mode 100644
index 0000000..2939ac6
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/ColorPicker/ColorPicker.html
@@ -0,0 +1,72 @@
+<table class="dojoxColorPicker" dojoAttachEvent="onkeypress: _handleKey" cellpadding="0" cellspacing="0">
+ <tr>
+ <td valign="top" class="dojoxColorPickerRightPad">
+ <div class="dojoxColorPickerBox">
+ <!-- Forcing ABS in style attr due to dojo DND issue with not picking it up form the class. -->
+ <img role="status" title="${saturationPickerTitle}" alt="${saturationPickerTitle}" class="dojoxColorPickerPoint" src="${_pickerPointer}" tabIndex="0" dojoAttachPoint="cursorNode" style="position: absolute; top: 0px; left: 0px;">
+ <img role="presentation" alt="" dojoAttachPoint="colorUnderlay" dojoAttachEvent="onclick: _setPoint, onmousedown: _stopDrag" class="dojoxColorPickerUnderlay" src="${_underlay}" ondragstart="return false">
+ </div>
+ </td>
+ <td valign="top" class="dojoxColorPickerRightPad">
+ <div class="dojoxHuePicker">
+ <!-- Forcing ABS in style attr due to dojo DND issue with not picking it up form the class. -->
+ <img role="status" dojoAttachPoint="hueCursorNode" tabIndex="0" class="dojoxHuePickerPoint" title="${huePickerTitle}" alt="${huePickerTitle}" src="${_huePickerPointer}" style="position: absolute; top: 0px; left: 0px;">
+ <div class="dojoxHuePickerUnderlay" dojoAttachPoint="hueNode">
+ <img role="presentation" alt="" dojoAttachEvent="onclick: _setHuePoint, onmousedown: _stopDrag" src="${_hueUnderlay}">
+ </div>
+ </div>
+ </td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0">
+ <tr>
+ <td valign="top" class="dojoxColorPickerPreviewContainer">
+ <table cellpadding="0" cellspacing="0">
+ <tr>
+ <td valign="top" class="dojoxColorPickerRightPad">
+ <div dojoAttachPoint="previewNode" class="dojoxColorPickerPreview"></div>
+ </td>
+ <td valign="top">
+ <div dojoAttachPoint="safePreviewNode" class="dojoxColorPickerWebSafePreview"></div>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td valign="bottom">
+ <table class="dojoxColorPickerOptional" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <div class="dijitInline dojoxColorPickerRgb" dojoAttachPoint="rgbNode">
+ <table cellpadding="1" cellspacing="1">
+ <tr><td><label for="${_uId}_r">${redLabel}</label></td><td><input id="${_uId}_r" dojoAttachPoint="Rval" size="1" dojoAttachEvent="onchange: _colorInputChange"></td></tr>
+ <tr><td><label for="${_uId}_g">${greenLabel}</label></td><td><input id="${_uId}_g" dojoAttachPoint="Gval" size="1" dojoAttachEvent="onchange: _colorInputChange"></td></tr>
+ <tr><td><label for="${_uId}_b">${blueLabel}</label></td><td><input id="${_uId}_b" dojoAttachPoint="Bval" size="1" dojoAttachEvent="onchange: _colorInputChange"></td></tr>
+ </table>
+ </div>
+ </td>
+ <td>
+ <div class="dijitInline dojoxColorPickerHsv" dojoAttachPoint="hsvNode">
+ <table cellpadding="1" cellspacing="1">
+ <tr><td><label for="${_uId}_h">${hueLabel}</label></td><td><input id="${_uId}_h" dojoAttachPoint="Hval"size="1" dojoAttachEvent="onchange: _colorInputChange"> ${degLabel}</td></tr>
+ <tr><td><label for="${_uId}_s">${saturationLabel}</label></td><td><input id="${_uId}_s" dojoAttachPoint="Sval" size="1" dojoAttachEvent="onchange: _colorInputChange"> ${percentSign}</td></tr>
+ <tr><td><label for="${_uId}_v">${valueLabel}</label></td><td><input id="${_uId}_v" dojoAttachPoint="Vval" size="1" dojoAttachEvent="onchange: _colorInputChange"> ${percentSign}</td></tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <div class="dojoxColorPickerHex" dojoAttachPoint="hexNode" aria-live="polite">
+ <label for="${_uId}_hex">&nbsp;${hexLabel}&nbsp;</label><input id="${_uId}_hex" dojoAttachPoint="hexCode, focusNode, valueNode" size="6" class="dojoxColorPickerHexCode" dojoAttachEvent="onchange: _colorInputChange">
+ </div>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
diff --git a/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hue.png b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hue.png
new file mode 100644
index 0000000..2746235
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hue.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hueHandle.png b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hueHandle.png
new file mode 100644
index 0000000..c7b56e8
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hueHandle.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hueHandleA11y.png b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hueHandleA11y.png
new file mode 100644
index 0000000..58c648d
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/hueHandleA11y.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/ColorPicker/images/pickerPointer.png b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/pickerPointer.png
new file mode 100644
index 0000000..28a3c81
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/pickerPointer.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/ColorPicker/images/underlay.png b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/underlay.png
new file mode 100644
index 0000000..0f5eb7c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/ColorPicker/images/underlay.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/DataPresentation.js b/js/dojo-1.7.2/dojox/widget/DataPresentation.js
new file mode 100644
index 0000000..f616445
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/DataPresentation.js
@@ -0,0 +1,902 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/DataPresentation", ["dijit","dojo","dojox","dojo/require!dojox/grid/DataGrid,dojox/charting/Chart2D,dojox/charting/widget/Legend,dojox/charting/action2d/Tooltip,dojox/charting/action2d/Highlight,dojo/colors,dojo/data/ItemFileWriteStore"], function(dijit,dojo,dojox){
+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(){
+
+ // sort out the labels for the independent axis of the chart
+ var getLabels = function(range, labelMod, charttype, domNode){
+
+ // prepare labels for the independent axis
+ var labels = [];
+ // add empty label, hack
+ labels[0] = {value: 0, text: ''};
+
+ var nlabels = range.length;
+
+ // auto-set labelMod for horizontal charts if the labels will otherwise collide
+ if((charttype !== "ClusteredBars") && (charttype !== "StackedBars")){
+ var cwid = domNode.offsetWidth;
+ var tmp = ("" + range[0]).length * range.length * 7; // *assume* 7 pixels width per character ( was 9 )
+
+ if(labelMod == 1){
+ for(var z = 1; z < 500; ++z){
+ if((tmp / z) < cwid){
+ break;
+ }
+ ++labelMod;
+ }
+ }
+ }
+
+ // now set the labels
+ for(var i = 0; i < nlabels; i++){
+ //sparse labels
+ labels.push({
+ value: i + 1,
+ text: (!labelMod || i % labelMod) ? "" : range[i]
+ });
+ }
+
+ // add empty label again, hack
+ labels.push({value: nlabels + 1, text:''});
+
+ return labels;
+ };
+
+ // get the configuration of an independent axis for the chart
+ var getIndependentAxisArgs = function(charttype, labels){
+
+ var args = { vertical: false, labels: labels, min: 0, max: labels.length-1, majorTickStep: 1, minorTickStep: 1 };
+
+ // clustered or stacked bars have a vertical independent axis
+ if((charttype === "ClusteredBars") || (charttype === "StackedBars")){
+ args.vertical = true;
+ }
+
+ // lines, areas and stacked areas don't need the extra slots at each end
+ if((charttype === "Lines") || (charttype === "Areas") || (charttype === "StackedAreas")){
+ args.min++;
+ args.max--;
+ }
+
+ return args;
+ };
+
+ // get the configuration of a dependent axis for the chart
+ var getDependentAxisArgs = function(charttype, axistype, minval, maxval){
+
+ var args = { vertical: true, fixLower: "major", fixUpper: "major", natural: true };
+
+ // secondary dependent axis is not left-bottom
+ if(axistype === "secondary"){
+ args.leftBottom = false;
+ }
+
+ // clustered or stacked bars have horizontal dependent axes
+ if((charttype === "ClusteredBars") || (charttype === "StackedBars")){
+ args.vertical = false;
+ }
+
+ // ensure axis does not "collapse" for flat series
+ if(minval == maxval){
+ args.min = minval - 1;
+ args.max = maxval + 1;
+ }
+
+ return args;
+ };
+
+ // get the configuration of a plot for the chart
+ var getPlotArgs = function(charttype, axistype, animate){
+
+ var args = { type: charttype, hAxis: "independent", vAxis: "dependent-" + axistype, gap: 4, lines: false, areas: false, markers: false };
+
+ // clustered or stacked bars have horizontal dependent axes
+ if((charttype === "ClusteredBars") || (charttype === "StackedBars")){
+ args.hAxis = args.vAxis;
+ args.vAxis = "independent";
+ }
+
+ // turn on lines for Lines, Areas and StackedAreas
+ if((charttype === "Lines") || (charttype === "Hybrid-Lines") || (charttype === "Areas") || (charttype === "StackedAreas")){
+ args.lines = true;
+ }
+
+ // turn on areas for Areas and StackedAreas
+ if((charttype === "Areas") || (charttype === "StackedAreas")){
+ args.areas = true;
+ }
+
+ // turn on markers and shadow for Lines
+ if(charttype === "Lines"){
+ args.markers = true;
+ }
+
+ // turn on shadow for Hybrid-Lines
+ // also, Hybrid-Lines is not a true chart type: use Lines for the actual plot
+ if(charttype === "Hybrid-Lines"){
+ args.shadows = {dx: 2, dy: 2, dw: 2};
+ args.type = "Lines";
+ }
+
+ // also, Hybrid-ClusteredColumns is not a true chart type: use ClusteredColumns for the actual plot
+ if(charttype === "Hybrid-ClusteredColumns"){
+ args.type = "ClusteredColumns";
+ }
+
+ // enable animation on the plot if animation is requested
+ if(animate){
+ args.animate = animate;
+ }
+
+ return args;
+ };
+
+ // set up a chart presentation
+ var setupChart = function(/*DomNode*/domNode, /*Object?*/chart, /*String*/type, /*Boolean*/reverse, /*Object*/animate, /*Integer*/labelMod, /*String*/theme, /*String*/tooltip, /*Object?*/store, /*String?*/query, /*String?*/queryOptions){
+ var _chart = chart;
+
+ if(!_chart){
+ domNode.innerHTML = ""; // any other content in the node disrupts the chart rendering
+ _chart = new dojox.charting.Chart2D(domNode);
+ }
+
+ // set the theme
+ if(theme){
+
+ // workaround for a theme bug: its _clone method
+ // does not transfer the markers, so we repair
+ // that omission here
+ // FIXME this should be removed once the theme bug is fixed
+ theme._clone = function(){
+ var result = 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)
+ });
+
+ result.markers = this.markers;
+ result._buildMarkerArray();
+
+ return result;
+ };
+
+ _chart.setTheme(theme);
+ }
+
+ var range = store.series_data[0].slice(0);
+
+ // reverse the labels if requested
+ if(reverse){
+ range.reverse();
+ }
+
+ var labels = getLabels(range, labelMod, type, domNode);
+
+ // collect details of whether primary and/or secondary axes are required
+ // and what plots we have instantiated using each type of axis
+ var plots = {};
+
+ // collect maximum and minimum data values
+ var maxval = null;
+ var minval = null;
+
+ var seriestoremove = {};
+ for(var sname in _chart.runs){
+ seriestoremove[sname] = true;
+ }
+
+ // set x values & max data value
+ var nseries = store.series_name.length;
+ for(var i = 0; i < nseries; i++){
+ // only include series with chart=true and with some data values in
+ if(store.series_chart[i] && (store.series_data[i].length > 0)){
+
+ var charttype = type;
+ var axistype = store.series_axis[i];
+
+ if(charttype == "Hybrid"){
+ if(store.series_charttype[i] == 'line'){
+ charttype = "Hybrid-Lines";
+ }else{
+ charttype = "Hybrid-ClusteredColumns";
+ }
+ }
+
+ // ensure we have recorded that we are using this axis type
+ if(!plots[axistype]){
+ plots[axistype] = {};
+ }
+
+ // ensure we have the correct type of plot for this series
+ if(!plots[axistype][charttype]){
+ var axisname = axistype + "-" + charttype;
+
+ // create the plot and enable tooltips
+ _chart.addPlot(axisname, getPlotArgs(charttype, axistype, animate));
+
+ var tooltipArgs = {};
+ if(typeof tooltip == 'string'){
+ tooltipArgs.text = function(o){
+ var substitutions = [o.element, o.run.name, range[o.index], ((charttype === "ClusteredBars") || (charttype === "StackedBars")) ? o.x : o.y];
+ return dojo.replace(tooltip, substitutions); // from Dojo 1.4 onward
+ //return tooltip.replace(/\{([^\}]+)\}/g, function(_, token){ return dojo.getObject(token, false, substitutions); }); // prior to Dojo 1.4
+ }
+ }else if(typeof tooltip == 'function'){
+ tooltipArgs.text = tooltip;
+ }
+ new dojox.charting.action2d.Tooltip(_chart, axisname, tooltipArgs);
+
+ // add highlighting, except for lines
+ if(charttype !== "Lines" && charttype !== "Hybrid-Lines"){
+ new dojox.charting.action2d.Highlight(_chart, axisname);
+ }
+
+ // record that this plot type is now created
+ plots[axistype][charttype] = true;
+ }
+
+ // extract the series values
+ var xvals = [];
+ var valen = store.series_data[i].length;
+ for(var j = 0; j < valen; j++){
+ var val = store.series_data[i][j];
+ xvals.push(val);
+ if(maxval === null || val > maxval){
+ maxval = val;
+ }
+ if(minval === null || val < minval){
+ minval = val;
+ }
+ }
+
+ // reverse the values if requested
+ if(reverse){
+ xvals.reverse();
+ }
+
+ var seriesargs = { plot: axistype + "-" + charttype };
+ if(store.series_linestyle[i]){
+ seriesargs.stroke = { style: store.series_linestyle[i] };
+ }
+
+ _chart.addSeries(store.series_name[i], xvals, seriesargs);
+ delete seriestoremove[store.series_name[i]];
+ }
+ }
+
+ // remove any series that are no longer needed
+ for(sname in seriestoremove){
+ _chart.removeSeries(sname);
+ }
+
+ // create axes
+ _chart.addAxis("independent", getIndependentAxisArgs(type, labels));
+ _chart.addAxis("dependent-primary", getDependentAxisArgs(type, "primary", minval, maxval));
+ _chart.addAxis("dependent-secondary", getDependentAxisArgs(type, "secondary", minval, maxval));
+
+ return _chart;
+ };
+
+ // set up a legend presentation
+ var setupLegend = function(/*DomNode*/domNode, /*Legend*/legend, /*Chart2D*/chart, /*Boolean*/horizontal){
+ // destroy any existing legend and recreate
+ var _legend = legend;
+
+ if(!_legend){
+ _legend = new dojox.charting.widget.Legend({ chart: chart, horizontal: horizontal }, domNode);
+ }else{
+ _legend.refresh();
+ }
+
+ return _legend;
+ };
+
+ // set up a grid presentation
+ var setupGrid = function(/*DomNode*/domNode, /*Object?*/grid, /*Object?*/store, /*String?*/query, /*String?*/queryOptions){
+ var _grid = grid || new dojox.grid.DataGrid({}, domNode);
+ _grid.startup();
+ _grid.setStore(store, query, queryOptions);
+
+ var structure = [];
+ for(var ser = 0; ser < store.series_name.length; ser++){
+ // only include series with grid=true and with some data values in
+ if(store.series_grid[ser] && (store.series_data[ser].length > 0)){
+ structure.push({ field: "data." + ser, name: store.series_name[ser], width: "auto", formatter: store.series_gridformatter[ser] });
+ }
+ }
+
+ _grid.setStructure(structure);
+
+ return _grid;
+ };
+
+ // set up a title presentation
+ var setupTitle = function(/*DomNode*/domNode, /*object*/store){
+ if(store.title){
+ domNode.innerHTML = store.title;
+ }
+ };
+
+ // set up a footer presentation
+ var setupFooter = function(/*DomNode*/domNode, /*object*/store){
+ if(store.footer){
+ domNode.innerHTML = store.footer;
+ }
+ };
+
+ // obtain a subfield from a field specifier which may contain
+ // multiple levels (eg, "child.foo[36].manacle")
+ var getSubfield = function(/*Object*/object, /*String*/field){
+ var result = object;
+
+ if(field){
+ var fragments = field.split(/[.\[\]]+/);
+ for(var frag = 0, l = fragments.length; frag < l; frag++){
+ if(result){
+ result = result[fragments[frag]];
+ }
+ }
+ }
+
+ return result;
+ };
+
+ dojo.declare("dojox.widget.DataPresentation", null, {
+ // summary:
+ //
+ // DataPresentation
+ //
+ // A widget that connects to a data store in a simple manner,
+ // and also provides some additional convenience mechanisms
+ // for connecting to common data sources without needing to
+ // explicitly construct a Dojo data store. The widget can then
+ // present the data in several forms: as a graphical chart,
+ // as a tabular grid, or as display panels presenting meta-data
+ // (title, creation information, etc) from the data. The
+ // widget can also create and manage several of these forms
+ // in one simple construction.
+ //
+ // Note: this is a first experimental draft and any/all details
+ // are subject to substantial change in later drafts.
+ //
+ // example:
+ //
+ // var pres = new dojox.data.DataPresentation("myChartNode", {
+ // type: "chart",
+ // url: "/data/mydata",
+ // gridNode: "myGridNode"
+ // });
+ //
+ // properties:
+ //
+ // store: Object
+ // Dojo data store used to supply data to be presented. This may
+ // be supplied on construction or created implicitly based on
+ // other construction parameters ('data', 'url').
+ //
+ // query: String
+ // Query to apply to the Dojo data store used to supply data to
+ // be presented.
+ //
+ // queryOptions: String
+ // Query options to apply to the Dojo data store used to supply
+ // data to be presented.
+ //
+ // data: Object
+ // Data to be presented. If supplied on construction this property
+ // will override any value supplied for the 'store' property.
+ //
+ // url: String
+ // URL to fetch data from in JSON format. If supplied on
+ // construction this property will override any values supplied
+ // for the 'store' and/or 'data' properties. Note that the data
+ // can also be comment-filtered JSON, although this will trigger
+ // a warning message in the console unless djConfig.useCommentedJson
+ // has been set to true.
+ //
+ // urlContent: Object
+ // Content to be passed to the URL when fetching data. If a URL has
+ // not been supplied, this value is ignored.
+ //
+ // urlError: function
+ // A function to be called if an error is encountered when fetching
+ // data from the supplied URL. This function will be supplied with
+ // two parameters exactly as the error function supplied to the
+ // dojo.xhrGet function. This function may be called multiple times
+ // if a refresh interval has been supplied.
+ //
+ // refreshInterval: Number
+ // the time interval in milliseconds after which the data supplied
+ // via the 'data' property or fetched from a URL via the 'url'
+ // property should be regularly refreshed. This property is
+ // ignored if neither the 'data' nor 'url' property has been
+ // supplied. If the refresh interval is zero, no regular refresh is done.
+ //
+ // refreshIntervalPending:
+ // the JavaScript set interval currently in progress, if any
+ //
+ // series: Array
+ // an array of objects describing the data series to be included
+ // in the data presentation. Each object may contain the
+ // following fields:
+ // datapoints: the name of the field from the source data which
+ // contains an array of the data points for this data series.
+ // If not supplied, the source data is assumed to be an array
+ // of data points to be used.
+ // field: the name of the field within each data point which
+ // contains the data for this data series. If not supplied,
+ // each data point is assumed to be the value for the series.
+ // name: a name for the series, used in the legend and grid headings
+ // namefield: the name of the field from the source data which
+ // contains the name the series, used in the legend and grid
+ // headings. If both name and namefield are supplied, name takes
+ // precedence. If neither are supplied, a default name is used.
+ // chart: true if the series should be included in a chart presentation (default: true)
+ // charttype: the type of presentation of the series in the chart, which can be
+ // "range", "line", "bar" (default: "bar")
+ // linestyle: the stroke style for lines (if applicable) (default: "Solid")
+ // axis: the dependant axis to which the series will be attached in the chart,
+ // which can be "primary" or "secondary"
+ // grid: true if the series should be included in a data grid presentation (default: true)
+ // gridformatter: an optional formatter to use for this series in the data grid
+ //
+ // a call-back function may alternatively be supplied. The function takes
+ // a single parameter, which will be the data (from the 'data' field or
+ // loaded from the value in the 'url' field), and should return the array
+ // of objects describing the data series to be included in the data
+ // presentation. This enables the series structures to be built dynamically
+ // after data load, and rebuilt if necessary on data refresh. The call-back
+ // function will be called each time new data is set, loaded or refreshed.
+ // A call-back function cannot be used if the data is supplied directly
+ // from a Dojo data store.
+ //
+ // type: String
+ // the type of presentation to be applied at the DOM attach point.
+ // This can be 'chart', 'legend', 'grid', 'title', 'footer'. The
+ // default type is 'chart'.
+ type: "chart",
+ //
+ // chartType: String
+ // the type of chart to display. This can be 'clusteredbars',
+ // 'areas', 'stackedcolumns', 'stackedbars', 'stackedareas',
+ // 'lines', 'hybrid'. The default type is 'bar'.
+ chartType: "clusteredBars",
+ //
+ // reverse: Boolean
+ // true if the chart independant axis should be reversed.
+ reverse: false,
+ //
+ // animate: Object
+ // if an object is supplied, then the chart bars or columns will animate
+ // into place. If the object contains a field 'duration' then the value
+ // supplied is the duration of the animation in milliseconds, otherwise
+ // a default duration is used. A boolean value true can alternatively be
+ // supplied to enable animation with the default duration.
+ // The default is null (no animation).
+ animate: null,
+ //
+ // labelMod: Integer
+ // the frequency of label annotations to be included on the
+ // independent axis. 1=every label. 0=no labels. The default is 1.
+ labelMod: 1,
+ //
+ // tooltip: String | Function
+ // a string pattern defining the tooltip text to be applied to chart
+ // data points, or a function which takes a single parameter and returns
+ // the tooltip text to be applied to chart data points. The string pattern
+ // will have the following substitutions applied:
+ // {0} - the type of chart element ('bar', 'surface', etc)
+ // {1} - the name of the data series
+ // {2} - the independent axis value at the tooltip data point
+ // {3} - the series value at the tooltip data point point
+ // The function, if supplied, will receive a single parameter exactly
+ // as per the dojox.charting.action2D.Tooltip class. The default value
+ // is to apply the default tooltip as defined by the
+ // dojox.charting.action2D.Tooltip class.
+ //
+ // legendHorizontal: Boolean | Number
+ // true if the legend should be rendered horizontally, or a number if
+ // the legend should be rendered as horizontal rows with that number of
+ // items in each row, or false if the legend should be rendered
+ // vertically (same as specifying 1). The default is true (legend
+ // rendered horizontally).
+ legendHorizontal: true,
+ //
+ // theme: String|Theme
+ // a theme to use for the chart, or the name of a theme.
+ //
+ // chartNode: String|DomNode
+ // an optional DOM node or the id of a DOM node to receive a
+ // chart presentation of the data. Supply only when a chart is
+ // required and the type is not 'chart'; when the type is
+ // 'chart' this property will be set to the widget attach point.
+ //
+ // legendNode: String|DomNode
+ // an optional DOM node or the id of a DOM node to receive a
+ // chart legend for the data. Supply only when a legend is
+ // required and the type is not 'legend'; when the type is
+ // 'legend' this property will be set to the widget attach point.
+ //
+ // gridNode: String|DomNode
+ // an optional DOM node or the id of a DOM node to receive a
+ // grid presentation of the data. Supply only when a grid is
+ // required and the type is not 'grid'; when the type is
+ // 'grid' this property will be set to the widget attach point.
+ //
+ // titleNode: String|DomNode
+ // an optional DOM node or the id of a DOM node to receive a
+ // title for the data. Supply only when a title is
+ // required and the type is not 'title'; when the type is
+ // 'title' this property will be set to the widget attach point.
+ //
+ // footerNode: String|DomNode
+ // an optional DOM node or the id of a DOM node to receive a
+ // footer presentation of the data. Supply only when a footer is
+ // required and the type is not 'footer'; when the type is
+ // 'footer' this property will be set to the widget attach point.
+ //
+ // chartWidget: Object
+ // the chart widget, if any
+ //
+ // legendWidget: Object
+ // the legend widget, if any
+ //
+ // gridWidget: Object
+ // the grid widget, if any
+
+ constructor: function(node, args){
+ // summary:
+ // Set up properties and initialize.
+ //
+ // arguments:
+ // node: DomNode
+ // The node to attach the data presentation to.
+ // kwArgs: Object (see above)
+
+ // apply arguments directly
+ dojo.mixin(this, args);
+
+ // store our DOM attach point
+ this.domNode = dojo.byId(node);
+
+ // also apply the DOM attach point as the node for the presentation type
+ this[this.type + "Node"] = this.domNode;
+
+ // load the theme if provided by name
+ if(typeof this.theme == 'string'){
+ this.theme = dojo.getObject(this.theme);
+ }
+
+ // resolve any the nodes that were supplied as ids
+ 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);
+
+ // we used to support a 'legendVertical' so for now
+ // at least maintain backward compatibility
+ if(this.legendVertical){
+ this.legendHorizontal = !this.legendVertical;
+ }
+
+ if(this.url){
+ this.setURL(null, null, this.refreshInterval);
+ }
+ else{
+ if(this.data){
+ this.setData(null, this.refreshInterval);
+ }
+ else{
+ this.setStore();
+ }
+ }
+ },
+
+ setURL: function(/*String?*/url, /*Object?*/ urlContent, /*Number?*/refreshInterval){
+ // summary:
+ // Sets the URL to fetch data from, with optional content
+ // supplied with the request, and an optional
+ // refresh interval in milliseconds (0=no refresh)
+
+ // if a refresh interval is supplied we will start a fresh
+ // refresh after storing the supplied url
+ if(refreshInterval){
+ this.cancelRefresh();
+ }
+
+ this.url = url || this.url;
+ this.urlContent = urlContent || this.urlContent;
+ this.refreshInterval = refreshInterval || this.refreshInterval;
+
+ var me = this;
+
+ dojo.xhrGet({
+ url: this.url,
+ content: this.urlContent,
+ handleAs: 'json-comment-optional',
+ load: function(response, ioArgs){
+ me.setData(response);
+ },
+ error: function(xhr, ioArgs){
+ if(me.urlError && (typeof me.urlError == "function")){
+ me.urlError(xhr, ioArgs);
+ }
+ }
+ });
+
+ if(refreshInterval && (this.refreshInterval > 0)){
+ this.refreshIntervalPending = setInterval(function(){
+ me.setURL();
+ }, this.refreshInterval);
+ }
+ },
+
+ setData: function(/*Object?*/data, /*Number?*/refreshInterval){
+ // summary:
+ // Sets the data to be presented, and an optional
+ // refresh interval in milliseconds (0=no refresh)
+
+ // if a refresh interval is supplied we will start a fresh
+ // refresh after storing the supplied data reference
+ if(refreshInterval){
+ this.cancelRefresh();
+ }
+
+ this.data = data || this.data;
+ this.refreshInterval = refreshInterval || this.refreshInterval;
+
+ // TODO if no 'series' property was provided, build one intelligently here
+ // (until that is done, a 'series' property must be supplied)
+
+ var _series = (typeof this.series == 'function') ? this.series(this.data) : this.series;
+
+ var datasets = [],
+ series_data = [],
+ series_name = [],
+ series_chart = [],
+ series_charttype = [],
+ series_linestyle = [],
+ series_axis = [],
+ series_grid = [],
+ series_gridformatter = [],
+ maxlen = 0;
+
+ // identify the dataset arrays in which series values can be found
+ for(var ser = 0; ser < _series.length; ser++){
+ datasets[ser] = getSubfield(this.data, _series[ser].datapoints);
+ if(datasets[ser] && (datasets[ser].length > maxlen)){
+ maxlen = datasets[ser].length;
+ }
+
+ series_data[ser] = [];
+ // name can be specified in series structure, or by field in series structure, otherwise use a default
+ series_name[ser] = _series[ser].name || (_series[ser].namefield ? getSubfield(this.data, _series[ser].namefield) : null) || ("series " + ser);
+ series_chart[ser] = (_series[ser].chart !== false);
+ series_charttype[ser] = _series[ser].charttype || "bar";
+ series_linestyle[ser] = _series[ser].linestyle;
+ series_axis[ser] = _series[ser].axis || "primary";
+ series_grid[ser] = (_series[ser].grid !== false);
+ series_gridformatter[ser] = _series[ser].gridformatter;
+ }
+
+ // create an array of data points by sampling the series
+ // and an array of series arrays by collecting the series
+ // each data point has an 'index' item containing a sequence number
+ // and items named "data.0", "data.1", ... containing the series samples
+ // and the first data point also has items named "name.0", "name.1", ... containing the series names
+ // and items named "series.0", "series.1", ... containing arrays with the complete series in
+ var point, datapoint, datavalue, fdatavalue;
+ var datapoints = [];
+
+ for(point = 0; point < maxlen; point++){
+ datapoint = { index: point };
+ for(ser = 0; ser < _series.length; ser++){
+ if(datasets[ser] && (datasets[ser].length > point)){
+ datavalue = getSubfield(datasets[ser][point], _series[ser].field);
+
+ if(series_chart[ser]){
+ // convert the data value to a float if possible
+ fdatavalue = parseFloat(datavalue);
+ if(!isNaN(fdatavalue)){
+ datavalue = fdatavalue;
+ }
+ }
+
+ datapoint["data." + ser] = datavalue;
+ series_data[ser].push(datavalue);
+ }
+ }
+ datapoints.push(datapoint);
+ }
+
+ if(maxlen <= 0){
+ datapoints.push({index: 0});
+ }
+
+ // now build a prepared store from the data points we've constructed
+ var store = new dojo.data.ItemFileWriteStore({ data: { identifier: 'index', items: datapoints }});
+ if(this.data.title){
+ store.title = this.data.title;
+ }
+ if(this.data.footer){
+ store.footer = this.data.footer;
+ }
+
+ store.series_data = series_data;
+ store.series_name = series_name;
+ store.series_chart = series_chart;
+ store.series_charttype = series_charttype;
+ store.series_linestyle = series_linestyle;
+ store.series_axis = series_axis;
+ store.series_grid = series_grid;
+ store.series_gridformatter = series_gridformatter;
+
+ this.setPreparedStore(store);
+
+ if(refreshInterval && (this.refreshInterval > 0)){
+ var me = this;
+ this.refreshIntervalPending = setInterval(function(){
+ me.setData();
+ }, this.refreshInterval);
+ }
+ },
+
+ refresh: function(){
+ // summary:
+ // If a URL or data has been supplied, refreshes the
+ // presented data from the URL or data. If a refresh
+ // interval is also set, the periodic refresh is
+ // restarted. If a URL or data was not supplied, this
+ // method has no effect.
+ if(this.url){
+ this.setURL(this.url, this.urlContent, this.refreshInterval);
+ }else if(this.data){
+ this.setData(this.data, this.refreshInterval);
+ }
+ },
+
+ cancelRefresh: function(){
+ // summary:
+ // Cancels any and all outstanding data refreshes
+ if(this.refreshIntervalPending){
+ // cancel existing refresh
+ clearInterval(this.refreshIntervalPending);
+ this.refreshIntervalPending = undefined;
+ }
+ },
+
+ setStore: function(/*Object?*/store, /*String?*/query, /*Object?*/queryOptions){
+ // FIXME build a prepared store properly -- this requires too tight a convention to be followed to be useful
+ this.setPreparedStore(store, query, queryOptions);
+ },
+
+ setPreparedStore: function(/*Object?*/store, /*String?*/query, /*Object?*/queryOptions){
+ // summary:
+ // Sets the store and query.
+ //
+ this.preparedstore = store || this.store;
+ this.query = query || this.query;
+ this.queryOptions = queryOptions || this.queryOptions;
+
+ if(this.preparedstore){
+ if(this.chartNode){
+ this.chartWidget = setupChart(this.chartNode, this.chartWidget, this.chartType, this.reverse, this.animate, this.labelMod, this.theme, this.tooltip, this.preparedstore, this.query, this,queryOptions);
+ this.renderChartWidget();
+ }
+ if(this.legendNode){
+ this.legendWidget = setupLegend(this.legendNode, this.legendWidget, this.chartWidget, this.legendHorizontal);
+ }
+ if(this.gridNode){
+ this.gridWidget = setupGrid(this.gridNode, this.gridWidget, this.preparedstore, this.query, this.queryOptions);
+ this.renderGridWidget();
+ }
+ if(this.titleNode){
+ setupTitle(this.titleNode, this.preparedstore);
+ }
+ if(this.footerNode){
+ setupFooter(this.footerNode, this.preparedstore);
+ }
+ }
+ },
+
+ renderChartWidget: function(){
+ // summary:
+ // Renders the chart widget (if any). This method is
+ // called whenever a chart widget is created or
+ // configured, and may be connected to.
+ if(this.chartWidget){
+ this.chartWidget.render();
+ }
+ },
+
+ renderGridWidget: function(){
+ // summary:
+ // Renders the grid widget (if any). This method is
+ // called whenever a grid widget is created or
+ // configured, and may be connected to.
+ if(this.gridWidget){
+ this.gridWidget.render();
+ }
+ },
+
+ getChartWidget: function(){
+ // summary:
+ // Returns the chart widget (if any) created if the type
+ // is "chart" or the "chartNode" property was supplied.
+ return this.chartWidget;
+ },
+
+ getGridWidget: function(){
+ // summary:
+ // Returns the grid widget (if any) created if the type
+ // is "grid" or the "gridNode" property was supplied.
+ return this.gridWidget;
+ },
+
+ destroy: function(){
+ // summary:
+ // Destroys the widget and all components and resources.
+
+ // cancel any outstanding refresh requests
+ this.cancelRefresh();
+
+ if(this.chartWidget){
+ this.chartWidget.destroy();
+ delete this.chartWidget;
+ }
+
+ if(this.legendWidget){
+ // no legend.destroy()
+ delete this.legendWidget;
+ }
+
+ if(this.gridWidget){
+ // no grid.destroy()
+ delete this.gridWidget;
+ }
+
+ 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/js/dojo-1.7.2/dojox/widget/Dialog.js b/js/dojo-1.7.2/dojox/widget/Dialog.js
new file mode 100644
index 0000000..0ca4bc5
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Dialog.js
@@ -0,0 +1,253 @@
+//>>built
+require({cache:{
+'url:dojox/widget/Dialog/Dialog.html':"<div class=\"dojoxDialog\" tabindex=\"-1\" role=\"dialog\" aria-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<div dojoAttachPoint=\"closeButtonNode\" class=\"dojoxDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel\">\n\t\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\">x</span>\n\t</div>\n</div>\n"}});
+define("dojox/widget/Dialog", [
+ "dojo", "dojox", "dojo/text!./Dialog/Dialog.html",
+ "dijit/Dialog", "dojo/window", "dojox/fx", "./DialogSimple"
+], function(dojo, dojox, template){
+
+ dojo.getObject('widget', true, dojox);
+
+ dojo.declare('dojox.widget.Dialog', dojox.widget.DialogSimple,
+ {
+ // summary:
+ // A Lightbox-like Modal-dialog for HTML Content
+ //
+ // description:
+ // An HTML-capable Dialog widget with advanced sizing
+ // options, animated show/hide and other useful options.
+ //
+ // This Dialog is also very easy to apply custom styles to.
+ //
+ // It works identically to a `dijit.Dialog` with several
+ // additional parameters.
+
+ templateString: template,
+
+ // sizeToViewport: Boolean
+ // If true, fix the size of the dialog to the Viewport based on
+ // viewportPadding value rather than the calculated or natural
+ // stlye. If false, base the size on a passed dimension attribute.
+ // Eitherway, the viewportPadding value is used if the the content
+ // extends beyond the viewport size for whatever reason.
+ sizeToViewport: false,
+
+ // viewportPadding: Integer
+ // If sizeToViewport="true", this is the amount of padding in pixels to leave
+ // between the dialog border and the viewport edge.
+ // This value is also used when sizeToViewport="false" and dimensions exceeded
+ // by dialog content to ensure dialog does not go outside viewport boundary
+ viewportPadding: 35,
+
+ // dimensions: Array
+ // A two-element array of [widht,height] to animate the Dialog to if sizeToViewport="false"
+ // Defaults to [300,300]
+ dimensions: null,
+
+ // easing: Function?|String?
+ // An easing function to apply to the sizing animation.
+ easing: null,
+
+ // sizeDuration: Integer
+ // Time (in ms) to use in the Animation for sizing.
+ sizeDuration: dijit._defaultDuration,
+
+ // sizeMethod: String
+ // To be passed to dojox.fx.sizeTo, one of "chain" or "combine" to effect
+ // the animation sequence.
+ sizeMethod: "chain",
+
+ // showTitle: Boolean
+ // Toogle to show or hide the Title area. Can only be set at startup.
+ showTitle: false,
+
+ // draggable: Boolean
+ // Make the pane draggable. Differs from dijit.Dialog by setting default to false
+ draggable: false, // simply over-ride the default from dijit.Dialog
+
+ // modal: Boolean
+ // If true, this Dialog instance will be truly modal and prevent closing until
+ // explicitly told to by calling hide() - Defaults to false to preserve previous
+ // behaviors.
+ modal: false,
+
+ constructor: function(props, node){
+ this.easing = props.easing || dojo._defaultEasing;
+ this.dimensions = props.dimensions || [300, 300];
+ },
+
+ _setup: function(){
+ // summary: Piggyback on dijit.Dialog's _setup for load-time options, deferred to
+
+ this.inherited(arguments);
+ if(!this._alreadyInitialized){
+ this._navIn = dojo.fadeIn({ node: this.closeButtonNode });
+ this._navOut = dojo.fadeOut({ node: this.closeButtonNode });
+ if(!this.showTitle){
+ dojo.addClass(this.domNode,"dojoxDialogNoTitle");
+ }
+ }
+ },
+
+ layout: function(e){
+ this._setSize();
+ this.inherited(arguments);
+ },
+
+ _setSize: function(){
+ // summary: cache and set our desired end position
+ this._vp = dojo.window.getBox();
+ var tc = this.containerNode,
+ vpSized = this.sizeToViewport
+ ;
+ return this._displaysize = {
+ w: vpSized ? tc.scrollWidth : this.dimensions[0],
+ h: vpSized ? tc.scrollHeight : this.dimensions[1]
+ }; // Object
+ },
+
+ 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"
+ });
+ dojo.style(this.containerNode, {
+ opacity: 0,
+ overflow: "hidden"
+ });
+
+ this.inherited(arguments);
+
+ if(this.modal){
+ // prevent escape key from closing dialog
+ // connect to body to trap this event from the Dialog a11y code, and stop escape key
+ // from doing anything in the modal:true case:
+ this._modalconnects.push(dojo.connect(dojo.body(), "onkeypress", function(e){
+ if(e.charOrCode == dojo.keys.ESCAPE){
+ dojo.stopEvent(e);
+ }
+ }));
+ }else{
+ // otherwise, allow clicking on the underlay to close
+ this._modalconnects.push(dojo.connect(dijit._underlay.domNode, "onclick", this, "onCancel"));
+ }
+ this._modalconnects.push(dojo.connect(this.domNode,"onmouseenter",this,"_handleNav"));
+ this._modalconnects.push(dojo.connect(this.domNode,"onmouseleave",this,"_handleNav"));
+
+ },
+
+ _handleNav: function(e){
+ // summary: Handle's showing or hiding the close icon
+
+ var navou = "_navOut",
+ navin = "_navIn",
+ animou = (e.type == "mouseout" ? navin : navou),
+ animin = (e.type == "mouseout" ? navou : navin)
+ ;
+
+ this[animou].stop();
+ this[animin].play();
+
+ },
+
+ // an experiment in a quicksilver-like hide. too choppy for me.
+ /*
+ hide: function(){
+ // summary: Hide the dialog
+
+ // if we haven't been initialized yet then we aren't showing and we can just return
+ if(!this._alreadyInitialized){
+ return;
+ }
+
+ this._fadeIn && this._fadeIn.stop();
+
+ 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;
+ }
+
+ dojox.fx.sizeTo({
+ node: this.domNode,
+ duration:this.sizeDuration || this.duration,
+ width: this._vp.w - 1,
+ height: 5,
+ onBegin: dojo.hitch(this,function(){
+ this._fadeOut.play(this.sizeDuration / 2);
+ })
+ }).play();
+
+ this.open = false;
+ }, */
+
+ _position: function(){
+
+ if(!this._started){ return; } // prevent content: from firing this anim #8914
+
+ if(this._sizing){
+ this._sizing.stop();
+ this.disconnect(this._sizingConnect);
+ delete this._sizing;
+ }
+
+ this.inherited(arguments);
+
+ if(!this.open){ dojo.style(this.containerNode, "opacity", 0); }
+ var pad = this.viewportPadding * 2;
+
+ var props = {
+ node: this.domNode,
+ duration: this.sizeDuration || dijit._defaultDuration,
+ easing: this.easing,
+ method: this.sizeMethod
+ };
+
+ var ds = this._displaysize || this._setSize();
+ props['width'] = ds.w = (ds.w + pad >= this._vp.w || this.sizeToViewport)
+ ? this._vp.w - pad : ds.w;
+
+ props['height'] = ds.h = (ds.h + pad >= this._vp.h || this.sizeToViewport)
+ ? this._vp.h - pad : ds.h;
+
+ this._sizing = dojox.fx.sizeTo(props);
+ this._sizingConnect = this.connect(this._sizing,"onEnd","_showContent");
+ this._sizing.play();
+
+ },
+
+ _showContent: function(e){
+ // summary: Show the inner container after sizing animation
+
+ var container = this.containerNode;
+ dojo.style(this.domNode, {
+ overflow: "visible",
+ opacity: 1
+ });
+ dojo.style(this.closeButtonNode,"opacity",1);
+ dojo.style(container, {
+ height: this._displaysize.h - this.titleNode.offsetHeight + "px",
+ width: this._displaysize.w + "px",
+ overflow:"auto"
+ });
+ dojo.anim(container, { opacity:1 });
+ }
+
+ });
+
+ return dojox.widget.Dialog;
+
+});
+
diff --git a/js/dojo-1.7.2/dojox/widget/Dialog/Dialog.css b/js/dojo-1.7.2/dojox/widget/Dialog/Dialog.css
new file mode 100644
index 0000000..fd41fce
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Dialog/Dialog.css
@@ -0,0 +1,112 @@
+
+.dojoxDialog {
+ position: absolute;
+ z-index: 999;
+ outline:0;
+}
+
+.dojoxDialog .closeText {
+ display:none;
+ /* for the onhover border in high contrast on IE: */
+ position:absolute;
+}
+
+.dojoxDialogFixed div.dojoxDialogTitleBar {
+ cursor:default;
+}
+
+.dojoxDialogWrapper {
+ left: 0;
+ top: 0;
+}
+
+.dojoxDialog {
+ background: #fff;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ -moz-border-radius:9pt;
+ -webkit-border-radius:8pt;
+ border:1px solid #b7b7b7;
+ padding:1.5em 3px 3px 3px;
+}
+
+.dojoxDialogFocused {
+ border:1px solid #ccc;
+}
+
+.dojoxDialog .dojoxDialogPaneContent {
+ border:none;
+ padding:0;
+}
+
+.dojoxDialogTitleBar {
+ /* outer container for the titlebar of the dialog */
+ cursor:move;
+ top:0;
+ left:0;
+ right:0;
+ background:#ededed;
+ height:1.5em;
+ outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
+ -moz-border-radius-topleft:8pt;
+ -moz-border-radius-topright:8pt;
+ -webkik-border-radius-topleft:7pt;
+ -webkit-border-radius-topright:7pt;
+}
+.dj_webkit .dojoxDialogTitleBar {
+ border:1px solid #ccc;
+}
+
+.dojoxDialogNoTitle .dojoxDialogTitleBar {
+ display:none;
+}
+
+.dojoxDialogContent {
+ /* the body of the dialog */
+ padding: 3px;
+ margin-top:1.2em;
+}
+
+/* pseudo-tundra-like */
+
+.dojoxDialogTitle {
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+ border-bottom:#b7b7b7;
+}
+
+div.dojoxDialogNoTitle {
+ padding-top:9px;
+}
+
+.dojoxDialogCloseIcon, .dojoxDialogCloseIconHover {
+ background : url("images/dialogCloseButton.png") no-repeat top right;
+ position: absolute;
+ vertical-align: middle;
+ left: -19px;
+ top: -19px;
+ height: 29px;
+ width: 29px;
+ cursor: pointer;
+ z-index: 999;
+}
+.dj_ie6 .dojoxDialogCloseIcon {
+ background-image: url("images/dialogCloseButton.gif");
+}
+
+.dojoxDialog div.dijitDialogCloseIconHover,
+.dojoxDialog div.dijitDialogCloseIconActive {
+ background-position:0 0;
+}
+
+.dojoxDialog .dijitDialogCloseIconHover {
+ background-image: url("images/dialogCloseButton.png");
+}
+.dj_ie6 .dojoxDialog .dijitDialogCloseIconHover {
+ background-image: url("images/dialogCloseButton.gif");
+}
+
+.dojoxDialogNoTitle .dojoxDialogCloseIcon {
+ top: -15px;
+ left: -15px;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/Dialog/Dialog.html b/js/dojo-1.7.2/dojox/widget/Dialog/Dialog.html
new file mode 100644
index 0000000..dad17de
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Dialog/Dialog.html
@@ -0,0 +1,11 @@
+<div class="dojoxDialog" tabindex="-1" role="dialog" aria-labelledby="${id}_title">
+ <div dojoAttachPoint="titleBar" class="dojoxDialogTitleBar">
+ <span dojoAttachPoint="titleNode" class="dojoxDialogTitle" id="${id}_title">${title}</span>
+ </div>
+ <div dojoAttachPoint="dojoxDialogWrapper">
+ <div dojoAttachPoint="containerNode" class="dojoxDialogPaneContent"></div>
+ </div>
+ <div dojoAttachPoint="closeButtonNode" class="dojoxDialogCloseIcon" dojoAttachEvent="onclick: onCancel">
+ <span dojoAttachPoint="closeText" class="closeText">x</span>
+ </div>
+</div>
diff --git a/js/dojo-1.7.2/dojox/widget/Dialog/images/dialogCloseButton.gif b/js/dojo-1.7.2/dojox/widget/Dialog/images/dialogCloseButton.gif
new file mode 100644
index 0000000..1f45a5c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Dialog/images/dialogCloseButton.gif
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/Dialog/images/dialogCloseButton.png b/js/dojo-1.7.2/dojox/widget/Dialog/images/dialogCloseButton.png
new file mode 100644
index 0000000..9d2f423
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Dialog/images/dialogCloseButton.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/DialogSimple.js b/js/dojo-1.7.2/dojox/widget/DialogSimple.js
new file mode 100644
index 0000000..a5d6c79
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/DialogSimple.js
@@ -0,0 +1,12 @@
+//>>built
+define("dojox/widget/DialogSimple", ["dojo", "dijit", "dojox", "dijit/Dialog", "dojox/layout/ContentPane"], function(dojo, dijit, dojox){
+
+ dojo.getObject("widget", true, dojox);
+ return dojo.declare("dojox.widget.DialogSimple", [dojox.layout.ContentPane, dijit._DialogBase], {
+ // summary: A Simple Dialog Mixing the `dojox.layout.ContentPane` functionality over
+ // top of a vanilla `dijit.Dialog`. See `dojox.widget.Dialog` for a more flexible
+ // dialog option allowing animations and different styles/theme support.
+ });
+
+});
+
diff --git a/js/dojo-1.7.2/dojox/widget/DocTester.js b/js/dojo-1.7.2/dojox/widget/DocTester.js
new file mode 100644
index 0000000..ce00720
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/DocTester.js
@@ -0,0 +1,90 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/DocTester", ["dijit","dojo","dojox","dojo/require!dojo/string,dijit/_Widget,dijit/_Templated,dojox/form/BusyButton,dojox/testing/DocTest"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.DocTester");
+
+dojo.require("dojo.string");
+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],
+ {
+ // summary: A widget to run DocTests inside an HTML page.
+ //
+ 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\t<span>\n\t\t<span dojoAttachPoint=\"numTestsNode\">0</span> tests,\n\t\t<span dojoAttachPoint=\"numTestsOkNode\">0</span> passed,\n\t\t<span dojoAttachPoint=\"numTestsNokNode\">0</span> failed\n\t</span>\n</div>"),
+ widgetsInTemplate: true,
+
+ _fillContent:function(/*DomNode*/source){
+ // summary: Overridden from _Templates.js, which actually just takes care of filling the containerNode.
+ var src = source.innerHTML;
+ this.doctests = new dojox.testing.DocTest();
+ this.tests = this.doctests.getTestsFromString(this._unescapeHtml(src));
+ var lineNumbers = dojo.map(this.tests, 'return item.line-1');
+ var lines = src.split("\n");
+ var actualResultHtml = '<div class="actualResult">FAILED, actual result was: <span class="result"></span></div>';
+ var content = '<pre class="testCase testNum0 odd">';
+ for (var i=0; i<lines.length; i++){
+ var index = dojo.indexOf(lineNumbers, i);
+ if (index>0 && index!=-1){
+ var evenOdd = index%2 ? "even" : "odd";
+ content += actualResultHtml;
+ content += '</pre><pre class="testCase testNum'+ index +' '+evenOdd+'">';
+ }
+ content += lines[i].replace(/^\s+/, "")+"\n";
+ }
+ content += actualResultHtml + '</pre>';
+ this.containerNode.innerHTML = content;
+ },
+
+ postCreate:function(){
+ this.inherited("postCreate", arguments);
+ 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 results = {ok:0, nok:0};
+ for (var i=0; i<this.tests.length; i++){
+ var ret = this.doctests.runTest(this.tests[i].commands, this.tests[i].expectedResult);
+ dojo.query(".testNum"+i, this.domNode).addClass(ret.success ? "resultOk" : "resultNok");
+ if (!ret.success){
+ results.nok++;
+ this.numTestsNokNode.innerHTML = results.nok;
+ var act = dojo.query(".testNum"+i+" .actualResult", this.domNode)[0];
+ dojo.style(act, "display", "inline");
+ dojo.query(".result", act)[0].innerHTML = dojo.toJson(ret.actualResult);
+ } else {
+ results.ok++;
+ this.numTestsOkNode.innerHTML = results.ok;
+ }
+ }
+ this.runButtonNode.cancel();
+ dojo.style(this.runButtonNode.domNode, "display", "none");
+ dojo.style(this.resetButtonNode.domNode, "display", "");
+ },
+
+ reset:function(){
+ // summary: Reset the DocTester visuals and enable the "Run tests" button again.
+ dojo.style(this.runButtonNode.domNode, "display", "");
+ dojo.style(this.resetButtonNode.domNode, "display", "none");
+ 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(/*string*/str){
+ // TODO Should become dojo.html.unentities() or so, when exists use instead
+ // summary:
+ // Adds escape sequences for special characters in XML: &<>"'
+ str = String(str).replace(/&amp;/gm, "&").replace(/&lt;/gm, "<")
+ .replace(/&gt;/gm, ">").replace(/&quot;/gm, '"');
+ return str; // string
+ }
+ }
+);
+});
diff --git a/js/dojo-1.7.2/dojox/widget/DocTester/DocTester.css b/js/dojo-1.7.2/dojox/widget/DocTester/DocTester.css
new file mode 100644
index 0000000..04dac19
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/DocTester/DocTester.css
@@ -0,0 +1,32 @@
+.dojoxDocTester pre.testCase{
+ border:0;
+ padding:0.3em;
+ padding-left:2em;
+}
+.dojoxDocTester pre.odd{
+ background-color:#E3E3E3;
+}
+.dojoxDocTester pre.odd.resultOk{
+ background-color:#C3FFC3;
+}
+.dojoxDocTester pre.odd.resultNok{
+ background-color:#FFC3C3;
+}
+
+.dojoxDocTester pre.even{
+ background-color:#F3F3F3;
+}
+.dojoxDocTester pre.even.resultOk{
+ background-color:#DFFFDF;
+}
+.dojoxDocTester pre.even.resultNok{
+ background-color:#FFCFCF;
+}
+
+.dojoxDocTester .actualResult{
+ display:none;
+ font-weight:bold;
+}
+.dojoxDocTester .actualResult .result{
+ color:red;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/DocTester/DocTester.html b/js/dojo-1.7.2/dojox/widget/DocTester/DocTester.html
new file mode 100644
index 0000000..fbb7a6b
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/DocTester/DocTester.html
@@ -0,0 +1,10 @@
+<div dojoAttachPoint="domNode" class="dojoxDocTester">
+ <div dojoAttachPoint="containerNode"></div>
+ <button dojoType="dojox.form.BusyButton" busyLabel="Testing..." dojoAttachPoint="runButtonNode">Run tests</button>
+ <button dojoType="dijit.form.Button" dojoAttachPoint="resetButtonNode" style="display:none;">Reset</button>
+ <span>
+ <span dojoAttachPoint="numTestsNode">0</span> tests,
+ <span dojoAttachPoint="numTestsOkNode">0</span> passed,
+ <span dojoAttachPoint="numTestsNokNode">0</span> failed
+ </span>
+</div> \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/DynamicTooltip.js b/js/dojo-1.7.2/dojox/widget/DynamicTooltip.js
new file mode 100644
index 0000000..c9a2124
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/DynamicTooltip.js
@@ -0,0 +1,112 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/DynamicTooltip", ["dijit","dojo","dojox","dojo/i18n!dijit/nls/loading","dojo/require!dijit/Tooltip"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.DynamicTooltip");
+dojo.experimental("dojox.widget.DynamicTooltip");
+
+dojo.require("dijit.Tooltip");
+dojo.requireLocalization("dijit", "loading");
+
+dojo.declare("dojox.widget.DynamicTooltip", dijit.Tooltip,
+ {
+ // summary:
+ // Extention of dijit.Tooltip providing content set via XHR
+ // request via href param
+
+ // hasLoaded: Boolean
+ // false if the contents are yet to be loaded from the HTTP request
+ hasLoaded: false,
+
+ // href: String
+ // location from where to fetch the contents
+ href: "",
+
+ // label: String
+ // contents to diplay in the tooltip. Initialized to a loading icon.
+ label: "",
+
+ // preventCache: Boolean
+ // Cache content retreived externally
+ preventCache: false,
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this._setLoadingLabel();
+ },
+
+ _setLoadingLabel: function(){
+ // summary:
+ // Changes the tooltip label / contents to loading message, only if
+ // there's an href param, otherwise acts as normal tooltip
+
+ if(this.href){
+ this.label = dojo.i18n.getLocalization("dijit", "loading", this.lang).loadingState;
+ }
+ },
+
+ // MOW: this is a new widget, do we really need a deprecated stub?
+ // setHref: function(/*String|Uri*/ href){
+ // // summary:
+ // // Deprecated. Use set('href', ...) instead.
+ // dojo.deprecated("dojox.widget.DynamicTooltip.setHref() is deprecated. Use set('href', ...) instead.", "", "2.0");
+ // return this.set("href", href);
+ // },
+
+ _setHrefAttr: function(/*String|Uri*/ href){
+ // summary:
+ // Hook so attr("href", ...) works.
+ // description:
+ // resets so next show loads new href
+ // href:
+ // url to the content you want to show, must be within the same domain as your mainpage
+
+ this.href = href;
+ this.hasLoaded = false;
+ },
+
+ loadContent: function(node){
+ // summary:
+ // Download contents of href via XHR and display
+ // description:
+ // 1. checks if content already loaded
+ // 2. if not, sends XHR to download new data
+ if(!this.hasLoaded && this.href){
+ this._setLoadingLabel();
+ this.hasLoaded = true;
+
+ dojo.xhrGet({
+ url: this.href,
+ handleAs: "text",
+ tooltipWidget: this,
+ load: function(response, ioArgs){
+ this.tooltipWidget.label = response;
+ this.tooltipWidget.close();
+ this.tooltipWidget.open(node);
+ },
+ preventCache: this.preventCache
+ });
+ }
+ },
+
+ refresh: function(){
+ // summary:
+ // Allows re-download of contents of href and display
+ // Useful with preventCache = true
+
+ this.hasLoaded = false;
+ },
+
+ open: function(/*DomNode*/ target){
+ // summary:
+ // Display the tooltip; usually not called directly.
+
+ target = target || (this._connectNodes && this._connectNodes[0]);
+ if(!target){ return; }
+
+ this.loadContent(target);
+ this.inherited(arguments);
+ }
+ }
+);
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/FeedPortlet.js b/js/dojo-1.7.2/dojox/widget/FeedPortlet.js
new file mode 100644
index 0000000..9c64bea
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FeedPortlet.js
@@ -0,0 +1,443 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/FeedPortlet", ["dijit","dojo","dojox","dojo/require!dojox/widget/Portlet,dijit/Tooltip,dijit/form/TextBox,dijit/form/Button,dojox/data/GoogleFeedStore"], function(dijit,dojo,dojox){
+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, {
+ // summary:
+ // A Portlet that loads a XML feed.
+ // description: The feed is displayed as
+ // an unordered list of links. When a link is hovered over
+ // by the mouse, it displays a summary in a tooltip.
+
+ // local: Boolean
+ // Specifies whether the feed is to be loaded from the same domain as the
+ // page, or a remote domain. If local is true, then the feed must be an
+ // Atom feed. If it is false, it can be an Atom or RSS feed.
+ local: false,
+
+ // maxResults: Number
+ // The number of results to display from the feed.
+ maxResults: 5,
+
+ // url: String
+ // The URL of the feed to load. If this is different to the domain
+ // of the HTML page, local should be set to false.
+ url: "",
+
+ // openNew: Boolean
+ // If true, when a link is clicked it will open in a new window.
+ // If false, it will not.
+ openNew: true,
+
+ // useFeedTitle: Boolean
+ // If true, the title of the loaded feed is displayed in the title bar of the portlet.
+ // If false, the title remains unchanged.
+ 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(){
+ // summary:
+ // Called when a feed fails to load successfully.
+ this.containerNode.innerHTML = "Error accessing the feed."
+ },
+
+ addChild: function(child){
+ this.inherited(arguments);
+ var url = child.attr("feedPortletUrl");
+ if(url){
+ this.set("url", url);
+ }
+ },
+
+ _getTitle: function(item){
+ // summary:
+ // Gets the title of a feed item.
+ var t = this.store.getValue(item, "title");
+ return this.local ? t.text : t;
+ },
+
+ _getLink: function(item){
+ // summary:
+ // Gets the href link of a feed item.
+ var l = this.store.getValue(item, "link");
+ return this.local ? l.href : l;
+ },
+
+ _getContent: function(item){
+ // summary:
+ // Gets the summary of a feed item.
+ var c = this.store.getValue(item, "summary");
+ if(!c){
+ return null;
+ }
+ if(this.local){
+ c = c.text;
+ }
+ // Filter out any sneaky scripts in the code
+ c = c.split("<script").join("<!--").split("</script>").join("-->");
+ c = c.split("<iframe").join("<!--").split("</iframe>").join("-->");
+ return c;
+
+ },
+
+ _setUrlAttr: function(url){
+ // summary:
+ // Sets the URL to load.
+ this.url = url;
+ if(this._started){
+ this.load();
+ }
+ },
+
+ startup: function(){
+ // summary:
+ // Loads the widget.
+ 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(){
+ // summary:
+ // Loads the feed.
+ if(this._resultList){
+ dojo.destroy(this._resultList);
+ }
+ var store, query;
+
+ // If the feed is on the same domain, use the AtomReadStore,
+ // as we cannot be guaranteed that it will be available to
+ // Google services.
+ if(this.local){
+ store = new dojox.data.AtomReadStore({
+ url: this.url
+ });
+ query = {};
+
+ }else{
+ store = new dojox.data.GoogleFeedStore();
+ query = {url: this.url};
+ }
+ var request = {
+ query: query,
+ count: this.maxResults,
+ onComplete: dojo.hitch(this, function(items){
+ if (this.showFeedTitle && store.getFeedValue) {
+ var title = this.store.getFeedValue("title");
+ if(title){
+ this.set("title", title.text ? title.text : title);
+ }
+ }
+ this.generateResults(items);
+ }),
+ onError: dojo.hitch(this, "onFeedError")
+ };
+
+ this.store = store;
+ store.fetch(request);
+ },
+
+ generateResults: function (items){
+ // summary:
+ // Generates a list of hyperlinks and displays a tooltip
+ // containing a summary when the mouse hovers over them.
+ var store = this.store;
+ var timer;
+ var ul = (this._resultList =
+ dojo.create("ul", {"class" : "dojoxFeedPortletList"}, this.containerNode));
+
+ dojo.forEach(items, dojo.hitch(this, function(item){
+ var li = dojo.create("li", {
+ innerHTML: '<a href="'
+ + this._getLink(item)
+ + '"'
+ + (this.openNew ? ' target="_blank"' : '')
+ +'>'
+ + this._getTitle(item) + '</a>'
+ },ul);
+
+ dojo.connect(li, "onmouseover", dojo.hitch(this, function(evt){
+ if(timer){
+ clearTimeout(timer);
+ }
+
+ // Show the tooltip after the mouse has been hovering
+ // for a short time.
+ timer = setTimeout(dojo.hitch(this, function(){
+ timer = null;
+ var summary = this._getContent(item);
+ if(!summary){return;}
+ var content = '<div class="dojoxFeedPortletPreview">'
+ + summary + '</div>'
+
+ dojo.query("li", ul).forEach(function(item){
+ if(item != evt.target){
+ dijit.hideTooltip(item);
+ }
+ });
+
+ // Hover the tooltip over the anchor tag
+ dijit.showTooltip(content, li.firstChild, !this.isLeftToRight());
+ }), 500);
+
+
+ }));
+
+ // Hide the tooltip when the mouse leaves a list item.
+ dojo.connect(li, "onmouseout", function(){
+ if(timer){
+ clearTimeout(timer);
+ timer = null;
+ }
+ dijit.hideTooltip(li.firstChild);
+ });
+ }));
+
+ this.resize();
+ }
+});
+
+dojo.declare("dojox.widget.ExpandableFeedPortlet", dojox.widget.FeedPortlet, {
+ // summary:
+ // A FeedPortlet that uses an list of expandable links to display
+ // a feed. An icon is placed to the left of each item
+ // which, when clicked, toggles the visible state
+ // of the item summary.
+
+ // onlyOpenOne: Boolean
+ // If true, only a single item can be expanded at any given time.
+ onlyOpenOne: false,
+
+ generateResults: function(items){
+ // summary:
+ // Generates a list of items, and places an icon beside them that
+ // can be used to show or hide a summary of that item.
+
+ var store = this.store;
+ var iconCls = "dojoxPortletToggleIcon";
+ var collapsedCls = "dojoxPortletItemCollapsed";
+ var expandedCls = "dojoxPortletItemOpen";
+
+ var timer;
+ var ul = (this._resultList = dojo.create("ul", {
+ "class": "dojoxFeedPortletExpandableList"
+ }, this.containerNode));
+
+ // Create the LI elements. Each LI has two DIV elements, the
+ // top DIV contains the toggle icon and title, and the bottom
+ // div contains the extended summary.
+ dojo.forEach(items, dojo.hitch(this, dojo.hitch(this, function(item){
+ var li = dojo.create("li", {"class": collapsedCls}, ul);
+ var upper = dojo.create("div", {style: "width: 100%;"}, li);
+ var lower = dojo.create("div", {"class": "dojoxPortletItemSummary", innerHTML: this._getContent(item)}, li);
+ dojo.create("span", {
+ "class": iconCls,
+ innerHTML: "<img src='" + dojo.config.baseUrl + "/resources/blank.gif'>"}, upper);
+ var a = dojo.create("a", {href: this._getLink(item), innerHTML: this._getTitle(item) }, upper);
+
+ if(this.openNew){
+ dojo.attr(a, "target", "_blank");
+ }
+ })));
+
+ // Catch all clicks on the list. If a toggle icon is clicked,
+ // toggle the visible state of the summary DIV.
+ dojo.connect(ul, "onclick", dojo.hitch(this, function(evt){
+ if(dojo.hasClass(evt.target, iconCls) || dojo.hasClass(evt.target.parentNode, iconCls)){
+ dojo.stopEvent(evt);
+ var li = evt.target.parentNode;
+ while(li.tagName != "LI"){
+ li = li.parentNode;
+ }
+ if(this.onlyOpenOne){
+ dojo.query("li", ul).filter(function(item){
+ return item != li;
+ }).removeClass(expandedCls).addClass(collapsedCls);
+ }
+ var isExpanded = dojo.hasClass(li, expandedCls);
+ dojo.toggleClass(li, expandedCls, !isExpanded);
+ dojo.toggleClass(li, collapsedCls, isExpanded);
+ }
+ }));
+ }
+});
+
+
+dojo.declare("dojox.widget.PortletFeedSettings",
+ dojox.widget.PortletSettings, {
+
+ // summary:
+ // A Settings widget designed to be used with a dojox.widget.FeedPortlet
+ // description:
+ // It provides form items that the user can use to change the URL
+ // for a feed to load into the FeedPortlet.
+ // There are two forms that it can take. <br>
+ // The first is to display a text field, with Load and Cancel buttons,
+ // which is prepopulated with the enclosing FeedPortlet's URL.
+ // If a <select> DOM node is used as the source node for this widget,
+ // it displays a list of predefined URLs that the user can select from
+ // to load into the enclosing FeedPortlet.
+ //
+ // example:
+ // <div dojoType="dojox.widget.PortletFeedSettings"></div>
+ //
+ // example:
+ // <select dojoType="dojox.widget.PortletFeedSettings">
+ // <option>http://www.dojotoolkit.org/aggregator/rss</option>
+ // <option>http://dojocampus.org/content/category/podcast/feed/</option>
+ // </select>
+
+ "class" : "dojoxPortletFeedSettings",
+
+ // urls: Array
+ // An array of JSON object specifying URLs to display in the
+ // PortletFeedSettings object. Each object contains a 'url' and 'label'
+ // attribute, e.g.
+ // [{url:'http:google.com', label:'Google'}, {url:'http://dojotoolkit.org', label: 'Dojo'}]
+ urls: null,
+
+ // selectedIndex: Number
+ // The selected URL. Defaults to zero.
+ selectedIndex: 0,
+
+ buildRendering: function(){
+ // If JSON URLs have been specified, create a SELECT DOM node,
+ // and insert the required OPTION elements.
+ var s;
+ if(this.urls && this.urls.length > 0){
+ console.log(this.id + " -> creating select with urls ", this.urls)
+ 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 the srcNodeRef is a SELECT node, then replace it with a DIV, and insert
+ // the SELECT node into that div.
+ 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){
+ if(this.content && this.text.options.length == 0){
+ this.text.appendChild(this.content);
+ }
+ dojo.attr(s || this.text, "value", this.text.options[this.selectedIndex].value);
+ }
+ }
+ this.inherited(arguments);
+ },
+
+ _setContentAttr: function(){
+
+ },
+
+ postCreate: function(){
+ console.log(this.id + " -> postCreate");
+ if(!this.text){
+ // If a select node is not being used, create a new TextBox to
+ // edit the URL.
+ var text = this.text = new dijit.form.TextBox({});
+ dojo.create("span", {
+ innerHTML: "Choose Url: "
+ }, this.domNode);
+ this.addChild(text);
+ }
+
+ // Add a LOAD button
+ this.addChild(new dijit.form.Button({
+ label: "Load",
+ onClick: dojo.hitch(this, function(){
+ // Set the URL of the containing Portlet with the selected URL.
+ this.portlet.attr("url",
+ (this.text.tagName == "SELECT") ? this.text.value : this.text.attr('value'));
+ if(this.text.tagName == "SELECT"){
+ // Set the selected index on the Select node.
+ dojo.some(this.text.options, dojo.hitch(this, function(opt, idx){
+ if(opt.selected){
+ this.set("selectedIndex", idx);
+ return true;
+ }
+ return false;
+ }));
+ }
+ // Hide the widget.
+ this.toggle();
+ })
+ }));
+
+ // Add a CANCEL button, which hides this widget
+ this.addChild(new dijit.form.Button({
+ label: "Cancel",
+ onClick: dojo.hitch(this, "toggle")
+ }));
+ this.inherited(arguments);
+ },
+
+ startup: function(){
+ // summary:
+ // Sets the portlet associated with this PortletSettings object.
+ if(this._started){return;}
+ console.log(this.id + " -> startup");
+ this.inherited(arguments);
+
+ if(!this.portlet){
+ throw Error(this.declaredClass + ": A PortletFeedSettings widget cannot exist without a Portlet.");
+ }
+ if(this.text.tagName == "SELECT"){
+ // Set the initial selected option.
+ dojo.forEach(this.text.options, dojo.hitch(this, function(opt, index){
+ dojo.attr(opt, "selected", index == this.selectedIndex);
+ }));
+ }
+ var url = this.portlet.attr("url");
+ if(url){
+ // If a SELECT node is used to choose a URL, ensure that the Portlet's URL
+ // is one of the options.
+ 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.get("feedPortletUrl"));
+ }
+ },
+
+ _getFeedPortletUrlAttr: function(){
+ return this.text.value;
+ }
+});
+});
diff --git a/js/dojo-1.7.2/dojox/widget/FilePicker.js b/js/dojo-1.7.2/dojox/widget/FilePicker.js
new file mode 100644
index 0000000..4d16d37
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FilePicker.js
@@ -0,0 +1,227 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/FilePicker", ["dijit","dojo","dojox","dojo/i18n!dojox/widget/nls/FilePicker","dojo/require!dojox/widget/RollingList,dojo/i18n"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.FilePicker");
+
+dojo.require("dojox.widget.RollingList");
+
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojox.widget", "FilePicker");
+
+dojo.declare("dojox.widget._FileInfoPane",
+ [dojox.widget._RollingListPane], {
+ // summary: a pane to display the information for the currently-selected
+ // file
+
+ // templateString: string
+ // delete our template string
+ templateString: "",
+
+ // templateString: String
+ // The template to be used to construct the widget.
+ 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\">${_messages.path}</td>\n\t\t\t\t<td class=\"dojoxFileInfoPath\" dojoAttachPoint=\"pathNode\"></td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td class=\"dojoxFileInfoLabel dojoxFileInfoSizeLabel\">${_messages.size}</td>\n\t\t\t\t<td class=\"dojoxFileInfoSize\" dojoAttachPoint=\"sizeNode\"></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n\t<div dojoAttachPoint=\"containerNode\" style=\"display:none;\"></div>\n</div>"),
+
+ postMixInProperties: function(){
+ this._messages = dojo.i18n.getLocalization("dojox.widget", "FilePicker", this.lang);
+ this.inherited(arguments);
+ },
+
+ onItems: function(){
+ // summary:
+ // called after a fetch or load - at this point, this.items should be
+ // set and loaded.
+ var store = this.store, item = this.items[0];
+ if(!item){
+ this._onError("Load", new Error("No item defined"));
+ }else{
+ this.nameNode.innerHTML = store.getLabel(item);
+ this.pathNode.innerHTML = store.getIdentity(item);
+ this.sizeNode.innerHTML = store.getValue(item, "size");
+ this.parentWidget.scrollIntoView(this);
+ this.inherited(arguments);
+ }
+ }
+});
+
+dojo.declare("dojox.widget.FilePicker", dojox.widget.RollingList, {
+ // summary: a specialized version of RollingList that handles file information
+ // in a store
+
+ className: "dojoxFilePicker",
+
+ // pathSeparator: string
+ // Our file separator - it will be guessed if not set
+ pathSeparator: "",
+
+ // topDir: string
+ // The top directory string - it will be guessed if not set
+ topDir: "",
+
+ // parentAttr: string
+ // the attribute to read for finding our parent directory
+ parentAttr: "parentDir",
+
+ // pathAttr: string
+ // the attribute to read for getting the full path of our file
+ pathAttr: "path",
+
+ // preloadItems: boolean or int
+ // Set this to a sane number - since we expect to mostly be using the
+ // dojox.data.FileStore - which doesn't like loading lots of items
+ // all at once.
+ preloadItems: 50,
+
+ // selectDirectories: boolean
+ // whether or not we allow selection of directories - that is, whether or
+ // our value can be set to a directory.
+ selectDirectories: true,
+
+ // selectFiles: boolean
+ // whether or not we allow selection of files - that is, we will disable
+ // the file entries.
+ selectFiles: true,
+
+ _itemsMatch: function(/*item*/ item1, /*item*/ item2){
+ // Summary: returns whether or not the two items match - checks ID if
+ // they aren't the exact same object - ignoring trailing slashes
+ if(!item1 && !item2){
+ return true;
+ }else if(!item1 || !item2){
+ return false;
+ }else if(item1 == item2){
+ return true;
+ }else if (this._isIdentity){
+ var iArr = [ this.store.getIdentity(item1), this.store.getIdentity(item2) ];
+ dojo.forEach(iArr, function(i, idx){
+ if(i.lastIndexOf(this.pathSeparator) == (i.length - 1)){
+ iArr[idx] = i.substring(0, i.length - 1);
+ }else{
+ }
+ }, this);
+ return (iArr[0] == iArr[1]);
+ }
+ return false;
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ this.inherited(arguments);
+ // Figure out our file separator if we don't have it yet
+ var conn, child = this.getChildren()[0];
+ var setSeparator = dojo.hitch(this, function(){
+ if(conn){
+ this.disconnect(conn);
+ }
+ delete conn;
+ var item = child.items[0];
+ if(item){
+ var store = this.store;
+ var parent = store.getValue(item, this.parentAttr);
+ var path = store.getValue(item, this.pathAttr);
+ this.pathSeparator = this.pathSeparator || store.pathSeparator;
+ if(!this.pathSeparator){
+ this.pathSeparator = path.substring(parent.length, parent.length + 1);
+ }
+ if(!this.topDir){
+ this.topDir = parent;
+ if(this.topDir.lastIndexOf(this.pathSeparator) != (this.topDir.length - 1)){
+ this.topDir += this.pathSeparator;
+ }
+ }
+ }
+ });
+ if(!this.pathSeparator || !this.topDir){
+ if(!child.items){
+ conn = this.connect(child, "onItems", setSeparator);
+ }else{
+ setSeparator();
+ }
+ }
+ },
+
+ getChildItems: function(item){
+ var ret = this.inherited(arguments);
+ if(!ret && this.store.getValue(item, "directory")){
+ // It's an empty directory - so pass through an empty array
+ ret = [];
+ }
+ return ret;
+ },
+
+ getMenuItemForItem: function(/*item*/ item, /* dijit._Contained */ parentPane, /* item[]? */ children){
+ var menuOptions = {iconClass: "dojoxDirectoryItemIcon"};
+ if(!this.store.getValue(item, "directory")){
+ menuOptions.iconClass = "dojoxFileItemIcon";
+ var l = this.store.getLabel(item), idx = l.lastIndexOf(".");
+ if(idx >= 0){
+ menuOptions.iconClass += " dojoxFileItemIcon_" + l.substring(idx + 1);
+ }
+ if(!this.selectFiles){
+ menuOptions.disabled = true;
+ }
+ }
+ var ret = new dijit.MenuItem(menuOptions);
+ return ret;
+ },
+
+ getPaneForItem: function(/*item*/ item, /* dijit._Contained */ parentPane, /* item[]? */ children){
+ var ret = null;
+ if(!item || (this.store.isItem(item) && this.store.getValue(item, "directory"))){
+ ret = new dojox.widget._RollingListGroupPane({});
+ }else if(this.store.isItem(item) && !this.store.getValue(item, "directory")){
+ ret = new dojox.widget._FileInfoPane({});
+ }
+ return ret;
+ },
+
+ _setPathValueAttr: function(/*string*/ path, /*boolean?*/ resetLastExec, /*function?*/ onSet){
+ // Summary: sets the value of this widget based off the given path
+ if(!path){
+ this.set("value", null);
+ return;
+ }
+ if(path.lastIndexOf(this.pathSeparator) == (path.length - 1)){
+ path = path.substring(0, path.length - 1);
+ }
+ this.store.fetchItemByIdentity({identity: path,
+ onItem: function(v){
+ if(resetLastExec){
+ this._lastExecutedValue = v;
+ }
+ this.set("value", v);
+ if(onSet){ onSet(); }
+ },
+ scope: this});
+ },
+
+ _getPathValueAttr: function(/*item?*/val){
+ // summary: returns the path value of the given value (or current value
+ // if not passed a value)
+ if(!val){
+ val = this.value;
+ }
+ if(val && this.store.isItem(val)){
+ return this.store.getValue(val, this.pathAttr);
+ }else{
+ return "";
+ }
+ },
+
+ _setValue: function(/* item */ value){
+ // summary: internally sets the value and fires onchange
+ delete this._setInProgress;
+ var store = this.store;
+ if(value && store.isItem(value)){
+ var isDirectory = this.store.getValue(value, "directory");
+ if((isDirectory && !this.selectDirectories) ||
+ (!isDirectory && !this.selectFiles)){ return; }
+ }else{
+ value = null;
+ }
+ if(!this._itemsMatch(this.value, value)){
+ this.value = value;
+ this._onChange(value);
+ }
+ }
+});
+});
diff --git a/js/dojo-1.7.2/dojox/widget/FilePicker/FilePicker.css b/js/dojo-1.7.2/dojox/widget/FilePicker/FilePicker.css
new file mode 100644
index 0000000..fefea25
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FilePicker/FilePicker.css
@@ -0,0 +1,76 @@
+@import url("../RollingList/RollingList.css");
+
+.dojoxFileInfoPane *{
+ white-space: normal;
+}
+
+.dojoxFileInfoLabel {
+ font-weight: bold;
+ white-space: nowrap;
+}
+
+.dojoxFileInfoPane {
+ width: 20em;
+}
+
+.tundra .dojoxFilePickerItem .dijitMenuItemIcon {
+ background-image: url("images/tundraFileIcons.gif");
+ background-repeat: no-repeat;
+}
+.tundra .dojoxFilePickerItem .dojoxEmpty {
+ background-image: none;
+}
+.tundra .dojoxFilePickerItem .dojoxDirectoryItemIcon {
+ background-position: 0px;
+}
+.tundra .dojoxFilePickerItemSelected .dojoxDirectoryItemIcon {
+ background-position: -16px;
+}
+.tundra .dojoxFilePickerItem .dojoxFileItemIcon {
+ background-position: -32px;
+}
+.tundra .dojoxFilePickerItemSelected .dojoxFileItemIcon {
+ background-position: -48px;
+}
+
+.soria .dojoxFilePickerItem .dijitMenuItemIcon {
+ background-image: url("images/soriaFileIcons.gif");
+ background-repeat: no-repeat;
+}
+.soria .dojoxFilePickerItem .dojoxEmpty {
+ background-image: none;
+}
+.soria .dojoxFilePickerItem .dojoxDirectoryItemIcon {
+ background-position: 0px;
+}
+.soria .dojoxFilePickerItemSelected .dojoxDirectoryItemIcon {
+ background-position: -16px;
+}
+.soria .dojoxFilePickerItem .dojoxFileItemIcon {
+ background-position: -32px;
+}
+.soria .dojoxFilePickerItemSelected .dojoxFileItemIcon {
+ background-position: -48px;
+}
+
+
+.nihilo .dojoxFilePickerItem .dijitMenuItemIcon {
+ background-image: url("images/nihiloFileIcons.gif");
+ background-repeat: no-repeat;
+}
+.nihilo .dojoxFilePickerItem .dojoxEmpty {
+ background-image: none;
+}
+.nihilo .dojoxFilePickerItem .dojoxDirectoryItemIcon {
+ background-position: 0px;
+}
+.nihilo .dojoxFilePickerItemSelected .dojoxDirectoryItemIcon {
+ background-position: -16px;
+}
+.nihilo .dojoxFilePickerItem .dojoxFileItemIcon {
+ background-position: -32px;
+}
+.nihilo .dojoxFilePickerItemSelected .dojoxFileItemIcon {
+ background-position: -48px;
+}
+
diff --git a/js/dojo-1.7.2/dojox/widget/FilePicker/_FileInfoPane.html b/js/dojo-1.7.2/dojox/widget/FilePicker/_FileInfoPane.html
new file mode 100644
index 0000000..4a45e61
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FilePicker/_FileInfoPane.html
@@ -0,0 +1,19 @@
+<div class="dojoxFileInfoPane">
+ <table>
+ <tbody>
+ <tr>
+ <td class="dojoxFileInfoLabel dojoxFileInfoNameLabel">${_messages.name}</td>
+ <td class="dojoxFileInfoName" dojoAttachPoint="nameNode"></td>
+ </tr>
+ <tr>
+ <td class="dojoxFileInfoLabel dojoxFileInfoPathLabel">${_messages.path}</td>
+ <td class="dojoxFileInfoPath" dojoAttachPoint="pathNode"></td>
+ </tr>
+ <tr>
+ <td class="dojoxFileInfoLabel dojoxFileInfoSizeLabel">${_messages.size}</td>
+ <td class="dojoxFileInfoSize" dojoAttachPoint="sizeNode"></td>
+ </tr>
+ </tbody>
+ </table>
+ <div dojoAttachPoint="containerNode" style="display:none;"></div>
+</div> \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/FilePicker/images/nihiloFileIcons.gif b/js/dojo-1.7.2/dojox/widget/FilePicker/images/nihiloFileIcons.gif
new file mode 100644
index 0000000..f029204
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FilePicker/images/nihiloFileIcons.gif
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/FilePicker/images/soriaFileIcons.gif b/js/dojo-1.7.2/dojox/widget/FilePicker/images/soriaFileIcons.gif
new file mode 100644
index 0000000..8087146
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FilePicker/images/soriaFileIcons.gif
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/FilePicker/images/tundraFileIcons.gif b/js/dojo-1.7.2/dojox/widget/FilePicker/images/tundraFileIcons.gif
new file mode 100644
index 0000000..744525e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FilePicker/images/tundraFileIcons.gif
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/FisheyeList.js b/js/dojo-1.7.2/dojox/widget/FisheyeList.js
new file mode 100644
index 0000000..f791677
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FisheyeList.js
@@ -0,0 +1,713 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/FisheyeList", ["dijit","dojo","dojox","dojo/require!dijit/_Widget,dijit/_Templated,dijit/_Container,dijit/_Contained"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.FisheyeList");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Container");
+dojo.require("dijit._Contained");
+
+dojo.declare("dojox.widget.FisheyeList", [dijit._Widget, dijit._Templated, dijit._Container], {
+ // summary:
+ // Menu similar to the fish eye menu on the Mac OS
+ // example:
+ // | <div dojoType="FisheyeList"
+ // | itemWidth="40" itemHeight="40"
+ // | itemMaxWidth="150" itemMaxHeight="150"
+ // | orientation="horizontal"
+ // | effectUnits="2"
+ // | itemPadding="10"
+ // | attachEdge="center"
+ // | labelEdge="bottom">
+ // |
+ // | <div dojoType="FisheyeListItem"
+ // | id="item1"
+ // | onclick="alert('click on' + this.label + '(from widget id ' + this.widgetId + ')!');"
+ // | label="Item 1"
+ // | iconSrc="images/fisheye_1.png">
+ // | </div>
+ // | ...
+ // | </div>
+ //
+ constructor: function(){
+ //
+ // TODO
+ // fix really long labels in vertical mode
+ //
+
+ this.pos = {'x': -1, 'y': -1}; // current cursor position, relative to the grid
+
+ // for conservative trigger mode, when triggered, timerScale is gradually increased from 0 to 1
+ this.timerScale = 1.0;
+
+ },
+
+ EDGE: {
+ CENTER: 0,
+ LEFT: 1,
+ RIGHT: 2,
+ TOP: 3,
+ BOTTOM: 4
+ },
+
+ templateString: '<div class="dojoxFisheyeListBar" dojoAttachPoint="containerNode"></div>',
+
+ snarfChildDomOutput: true,
+
+ // itemWidth: Integer
+ // width of menu item (in pixels) in it's dormant state (when the mouse is far away)
+ itemWidth: 40,
+
+ // itemHeight: Integer
+ // height of menu item (in pixels) in it's dormant state (when the mouse is far away)
+ itemHeight: 40,
+
+ // itemMaxWidth: Integer
+ // width of menu item (in pixels) in it's fully enlarged state (when the mouse is directly over it)
+ itemMaxWidth: 150,
+
+ // itemMaxHeight: Integer
+ // height of menu item (in pixels) in it's fully enlarged state (when the mouse is directly over it)
+ itemMaxHeight: 150,
+
+ imgNode: null,
+
+ // orientation: String
+ // orientation of the menu, either "horizontal" or "vertical"
+ orientation: 'horizontal',
+
+ // isFixed: Boolean
+ // toggle to enable additional listener (window scroll) if FisheyeList is in a fixed postion
+ isFixed: false,
+
+ // conservativeTrigger: Boolean
+ // if true, don't start enlarging menu items until mouse is over an image;
+ // if false, start enlarging menu items as the mouse moves near them.
+ conservativeTrigger: false,
+
+ // effectUnits: Number
+ // controls how much reaction the menu makes, relative to the distance of the mouse from the menu
+ effectUnits: 2,
+
+ // itemPadding: Integer
+ // padding (in pixels) betweeen each menu item
+ itemPadding: 10,
+
+ // attachEdge: String
+ // controls the border that the menu items don't expand past;
+ // for example, if set to "top", then the menu items will drop downwards as they expand.
+ // values
+ // "center", "left", "right", "top", "bottom".
+ attachEdge: 'center',
+
+ // labelEdge: String
+ // controls were the labels show up in relation to the menu item icons
+ // values
+ // "center", "left", "right", "top", "bottom".
+ labelEdge: 'bottom',
+
+ postCreate: function(){
+ var e = this.EDGE;
+ dojo.setSelectable(this.domNode, false);
+
+ var isHorizontal = this.isHorizontal = (this.orientation == 'horizontal');
+ this.selectedNode = -1;
+
+ this.isOver = false;
+ this.hitX1 = -1;
+ this.hitY1 = -1;
+ this.hitX2 = -1;
+ this.hitY2 = -1;
+
+ //
+ // only some edges make sense...
+ //
+ this.anchorEdge = this._toEdge(this.attachEdge, e.CENTER);
+ this.labelEdge = this._toEdge(this.labelEdge, e.TOP);
+
+ if(this.labelEdge == e.CENTER){ this.labelEdge = e.TOP; }
+
+ if(isHorizontal){
+ if(this.anchorEdge == e.LEFT){ this.anchorEdge = e.CENTER; }
+ if(this.anchorEdge == e.RIGHT){ this.anchorEdge = e.CENTER; }
+ if(this.labelEdge == e.LEFT){ this.labelEdge = e.TOP; }
+ if(this.labelEdge == e.RIGHT){ this.labelEdge = e.TOP; }
+ }else{
+ if(this.anchorEdge == e.TOP){ this.anchorEdge = e.CENTER; }
+ if(this.anchorEdge == e.BOTTOM){ this.anchorEdge = e.CENTER; }
+ if(this.labelEdge == e.TOP){ this.labelEdge = e.LEFT; }
+ if(this.labelEdge == e.BOTTOM){ this.labelEdge = e.LEFT; }
+ }
+
+ //
+ // figure out the proximity size
+ //
+ var effectUnits = this.effectUnits;
+ this.proximityLeft = this.itemWidth * (effectUnits - 0.5);
+ this.proximityRight = this.itemWidth * (effectUnits - 0.5);
+ this.proximityTop = this.itemHeight * (effectUnits - 0.5);
+ this.proximityBottom = this.itemHeight * (effectUnits - 0.5);
+
+ if(this.anchorEdge == e.LEFT){
+ this.proximityLeft = 0;
+ }
+ if(this.anchorEdge == e.RIGHT){
+ this.proximityRight = 0;
+ }
+ if(this.anchorEdge == e.TOP){
+ this.proximityTop = 0;
+ }
+ if(this.anchorEdge == e.BOTTOM){
+ this.proximityBottom = 0;
+ }
+ if(this.anchorEdge == e.CENTER){
+ this.proximityLeft /= 2;
+ this.proximityRight /= 2;
+ this.proximityTop /= 2;
+ this.proximityBottom /= 2;
+ }
+ },
+
+ startup: function(){
+ // summary: create our connections and setup our FisheyeList
+ this.children = this.getChildren();
+ //original postCreate() --tk
+ this._initializePositioning();
+
+ //
+ // in liberal trigger mode, activate menu whenever mouse is close
+ //
+ if(!this.conservativeTrigger){
+ this._onMouseMoveHandle = dojo.connect(document.documentElement, "onmousemove", this, "_onMouseMove");
+ }
+ if(this.isFixed){
+ this._onScrollHandle = dojo.connect(document,"onscroll",this,"_onScroll");
+ }
+
+ // Deactivate the menu if mouse is moved off screen (doesn't work for FF?)
+ this._onMouseOutHandle = dojo.connect(document.documentElement, "onmouseout", this, "_onBodyOut");
+ this._addChildHandle = dojo.connect(this, "addChild", this, "_initializePositioning");
+ this._onResizeHandle = dojo.connect(window,"onresize", this, "_initializePositioning");
+ },
+
+ _initializePositioning: function(){
+ this.itemCount = this.children.length;
+
+ this.barWidth = (this.isHorizontal ? this.itemCount : 1) * this.itemWidth;
+ this.barHeight = (this.isHorizontal ? 1 : this.itemCount) * this.itemHeight;
+
+ this.totalWidth = this.proximityLeft + this.proximityRight + this.barWidth;
+ this.totalHeight = this.proximityTop + this.proximityBottom + this.barHeight;
+
+ //
+ // calculate effect ranges for each item
+ //
+
+ for(var i=0; i<this.children.length; i++){
+
+ this.children[i].posX = this.itemWidth * (this.isHorizontal ? i : 0);
+ this.children[i].posY = this.itemHeight * (this.isHorizontal ? 0 : i);
+
+ this.children[i].cenX = this.children[i].posX + (this.itemWidth / 2);
+ this.children[i].cenY = this.children[i].posY + (this.itemHeight / 2);
+
+ var isz = this.isHorizontal ? this.itemWidth : this.itemHeight;
+ var r = this.effectUnits * isz;
+ var c = this.isHorizontal ? this.children[i].cenX : this.children[i].cenY;
+ var lhs = this.isHorizontal ? this.proximityLeft : this.proximityTop;
+ var rhs = this.isHorizontal ? this.proximityRight : this.proximityBottom;
+ var siz = this.isHorizontal ? this.barWidth : this.barHeight;
+
+ var range_lhs = r;
+ var range_rhs = r;
+
+ if(range_lhs > c+lhs){ range_lhs = c+lhs; }
+ if(range_rhs > (siz-c+rhs)){ range_rhs = siz-c+rhs; }
+
+ this.children[i].effectRangeLeft = range_lhs / isz;
+ this.children[i].effectRangeRght = range_rhs / isz;
+
+ //dojo.debug('effect range for '+i+' is '+range_lhs+'/'+range_rhs);
+ }
+
+ //
+ // create the bar
+ //
+ this.domNode.style.width = this.barWidth + 'px';
+ this.domNode.style.height = this.barHeight + 'px';
+
+ //
+ // position the items
+ //
+ for(i=0; i<this.children.length; i++){
+ var itm = this.children[i];
+ var elm = itm.domNode;
+ elm.style.left = itm.posX + 'px';
+ elm.style.top = itm.posY + 'px';
+ elm.style.width = this.itemWidth + 'px';
+ elm.style.height = this.itemHeight + 'px';
+
+ itm.imgNode.style.left = this.itemPadding+'%';
+ itm.imgNode.style.top = this.itemPadding+'%';
+ itm.imgNode.style.width = (100 - 2 * this.itemPadding) + '%';
+ itm.imgNode.style.height = (100 - 2 * this.itemPadding) + '%';
+ }
+
+ //
+ // calc the grid
+ //
+ this._calcHitGrid();
+ },
+
+ _overElement: function(/* DomNode|String */node, /* Event */e){
+ // summary:
+ // Returns whether the mouse is over the passed element.
+ // Node: Must must be display:block (ie, not a <span>)
+ node = dojo.byId(node);
+ var mouse = {x: e.pageX, y: e.pageY};
+ var absolute = dojo.position(node, true);
+ var top = absolute.y;
+ var bottom = top + absolute.h;
+ var left = absolute.x;
+ var right = left + absolute.w;
+
+ return (mouse.x >= left
+ && mouse.x <= right
+ && mouse.y >= top
+ && mouse.y <= bottom
+ ); // boolean
+ },
+
+ _onBodyOut: function(/*Event*/ e){
+ // clicking over an object inside of body causes this event to fire; ignore that case
+ if( this._overElement(dojo.body(), e) ){
+ return;
+ }
+ this._setDormant(e);
+ },
+
+ _setDormant: function(/*Event*/ e){
+ // summary: called when mouse moves out of menu's range
+
+ if(!this.isOver){ return; } // already dormant?
+ this.isOver = false;
+
+ if(this.conservativeTrigger){
+ // user can't re-trigger the menu expansion
+ // until he mouses over a icon again
+ dojo.disconnect(this._onMouseMoveHandle);
+ }
+ this._onGridMouseMove(-1, -1);
+ },
+
+ _setActive: function(/*Event*/ e){
+ // summary: called when mouse is moved into menu's range
+
+ if(this.isOver){ return; } // already activated?
+ this.isOver = true;
+
+ if(this.conservativeTrigger){
+ // switch event handlers so that we handle mouse events from anywhere near
+ // the menu
+ this._onMouseMoveHandle = dojo.connect(document.documentElement, "onmousemove", this, "_onMouseMove");
+
+ this.timerScale=0.0;
+
+ // call mouse handler to do some initial necessary calculations/positioning
+ this._onMouseMove(e);
+
+ // slowly expand the icon size so it isn't jumpy
+ this._expandSlowly();
+ }
+ },
+
+ _onMouseMove: function(/*Event*/ e){
+ // summary: called when mouse is moved
+ if( (e.pageX >= this.hitX1) && (e.pageX <= this.hitX2) &&
+ (e.pageY >= this.hitY1) && (e.pageY <= this.hitY2) ){
+ if(!this.isOver){
+ this._setActive(e);
+ }
+ this._onGridMouseMove(e.pageX-this.hitX1, e.pageY-this.hitY1);
+ }else{
+ if(this.isOver){
+ this._setDormant(e);
+ }
+ }
+ },
+
+ _onScroll: function(){
+ this._calcHitGrid();
+ },
+
+ onResized: function(){
+ this._calcHitGrid();
+ },
+
+ _onGridMouseMove: function(x, y){
+ // summary: called when mouse is moved in the vicinity of the menu
+ this.pos = {x:x, y:y};
+ this._paint();
+ },
+
+ _paint: function(){
+ var x=this.pos.x;
+ var y=this.pos.y;
+
+ if(this.itemCount <= 0){ return; }
+
+ //
+ // figure out our main index
+ //
+ var pos = this.isHorizontal ? x : y;
+ var prx = this.isHorizontal ? this.proximityLeft : this.proximityTop;
+ var siz = this.isHorizontal ? this.itemWidth : this.itemHeight;
+ var sim = this.isHorizontal ?
+ (1.0-this.timerScale)*this.itemWidth + this.timerScale*this.itemMaxWidth :
+ (1.0-this.timerScale)*this.itemHeight + this.timerScale*this.itemMaxHeight ;
+
+ var cen = ((pos - prx) / siz) - 0.5;
+ var max_off_cen = (sim / siz) - 0.5;
+
+ if(max_off_cen > this.effectUnits){ max_off_cen = this.effectUnits; }
+
+ //
+ // figure out our off-axis weighting
+ //
+ var off_weight = 0, cen2;
+
+ if(this.anchorEdge == this.EDGE.BOTTOM){
+ cen2 = (y - this.proximityTop) / this.itemHeight;
+ off_weight = (cen2 > 0.5) ? 1 : y / (this.proximityTop + (this.itemHeight / 2));
+ }
+ if(this.anchorEdge == this.EDGE.TOP){
+ cen2 = (y - this.proximityTop) / this.itemHeight;
+ off_weight = (cen2 < 0.5) ? 1 : (this.totalHeight - y) / (this.proximityBottom + (this.itemHeight / 2));
+ }
+ if(this.anchorEdge == this.EDGE.RIGHT){
+ cen2 = (x - this.proximityLeft) / this.itemWidth;
+ off_weight = (cen2 > 0.5) ? 1 : x / (this.proximityLeft + (this.itemWidth / 2));
+ }
+ if(this.anchorEdge == this.EDGE.LEFT){
+ cen2 = (x - this.proximityLeft) / this.itemWidth;
+ off_weight = (cen2 < 0.5) ? 1 : (this.totalWidth - x) / (this.proximityRight + (this.itemWidth / 2));
+ }
+ if(this.anchorEdge == this.EDGE.CENTER){
+ if(this.isHorizontal){
+ off_weight = y / (this.totalHeight);
+ }else{
+ off_weight = x / (this.totalWidth);
+ }
+
+ if(off_weight > 0.5){
+ off_weight = 1 - off_weight;
+ }
+
+ off_weight *= 2;
+ }
+
+ //
+ // set the sizes
+ //
+ for(var i=0; i<this.itemCount; i++){
+ var weight = this._weighAt(cen, i);
+ if(weight < 0){weight = 0;}
+ this._setItemSize(i, weight * off_weight);
+ }
+
+ //
+ // set the positions
+ //
+
+ var main_p = Math.round(cen);
+ var offset = 0;
+
+ if(cen < 0){
+
+ main_p = 0;
+
+ }else if(cen > this.itemCount - 1){
+
+ main_p = this.itemCount -1;
+
+ }else{
+
+ offset = (cen - main_p) * ((this.isHorizontal ? this.itemWidth : this.itemHeight) - this.children[main_p].sizeMain);
+ }
+
+ this._positionElementsFrom(main_p, offset);
+ },
+
+ _weighAt: function(/*Integer*/ cen, /*Integer*/ i){
+ var dist = Math.abs(cen - i);
+ var limit = ((cen - i) > 0) ? this.children[i].effectRangeRght : this.children[i].effectRangeLeft;
+ return (dist > limit) ? 0 : (1 - dist / limit); // Integer
+ },
+
+ _setItemSize: function(p, scale){
+ if(this.children[p].scale == scale){ return; }
+ this.children[p].scale = scale;
+
+ scale *= this.timerScale;
+ var w = Math.round(this.itemWidth + ((this.itemMaxWidth - this.itemWidth ) * scale));
+ var h = Math.round(this.itemHeight + ((this.itemMaxHeight - this.itemHeight) * scale));
+
+ if(this.isHorizontal){
+
+ this.children[p].sizeW = w;
+ this.children[p].sizeH = h;
+
+ this.children[p].sizeMain = w;
+ this.children[p].sizeOff = h;
+
+ var y = 0;
+ if(this.anchorEdge == this.EDGE.TOP){
+ y = (this.children[p].cenY - (this.itemHeight / 2));
+ }else if(this.anchorEdge == this.EDGE.BOTTOM){
+ y = (this.children[p].cenY - (h - (this.itemHeight / 2)));
+ }else{
+ y = (this.children[p].cenY - (h / 2));
+ }
+
+ this.children[p].usualX = Math.round(this.children[p].cenX - (w / 2));
+ this.children[p].domNode.style.top = y + 'px';
+ this.children[p].domNode.style.left = this.children[p].usualX + 'px';
+
+ }else{
+
+ this.children[p].sizeW = w;
+ this.children[p].sizeH = h;
+
+ this.children[p].sizeOff = w;
+ this.children[p].sizeMain = h;
+
+ var x = 0;
+ if(this.anchorEdge == this.EDGE.LEFT){
+ x = this.children[p].cenX - (this.itemWidth / 2);
+ }else if(this.anchorEdge == this.EDGE.RIGHT){
+ x = this.children[p].cenX - (w - (this.itemWidth / 2));
+ }else{
+ x = this.children[p].cenX - (w / 2);
+ }
+
+ this.children[p].domNode.style.left = x + 'px';
+ this.children[p].usualY = Math.round(this.children[p].cenY - (h / 2));
+
+ this.children[p].domNode.style.top = this.children[p].usualY + 'px';
+ }
+
+ this.children[p].domNode.style.width = w + 'px';
+ this.children[p].domNode.style.height = h + 'px';
+
+ if(this.children[p].svgNode){
+ this.children[p].svgNode.setSize(w, h);
+ }
+ },
+
+ _positionElementsFrom: function(p, offset){
+ var pos = 0;
+
+ var usual, start;
+ if(this.isHorizontal){
+ usual = "usualX";
+ start = "left";
+ }else{
+ usual = "usualY";
+ start = "top";
+ }
+ pos = Math.round(this.children[p][usual] + offset);
+ if(this.children[p].domNode.style[start] != (pos + 'px')){
+ this.children[p].domNode.style[start] = pos + 'px';
+ this._positionLabel(this.children[p]);
+ }
+
+ // position before
+ var bpos = pos;
+ for(var i=p-1; i>=0; i--){
+ bpos -= this.children[i].sizeMain;
+
+ if(this.children[p].domNode.style[start] != (bpos + 'px')){
+ this.children[i].domNode.style[start] = bpos + 'px';
+ this._positionLabel(this.children[i]);
+ }
+ }
+
+ // position after
+ var apos = pos;
+ for(i=p+1; i<this.itemCount; i++){
+ apos += this.children[i-1].sizeMain;
+ if(this.children[p].domNode.style[start] != (apos + 'px')){
+ this.children[i].domNode.style[start] = apos + 'px';
+ this._positionLabel(this.children[i]);
+ }
+ }
+
+ },
+
+ _positionLabel: function(itm){
+ var x = 0;
+ var y = 0;
+
+ var mb = dojo.marginBox(itm.lblNode);
+
+ if(this.labelEdge == this.EDGE.TOP){
+ x = Math.round((itm.sizeW / 2) - (mb.w / 2));
+ y = -mb.h;
+ }
+
+ if(this.labelEdge == this.EDGE.BOTTOM){
+ x = Math.round((itm.sizeW / 2) - (mb.w / 2));
+ y = itm.sizeH;
+ }
+
+ if(this.labelEdge == this.EDGE.LEFT){
+ x = -mb.w;
+ y = Math.round((itm.sizeH / 2) - (mb.h / 2));
+ }
+
+ if(this.labelEdge == this.EDGE.RIGHT){
+ x = itm.sizeW;
+ y = Math.round((itm.sizeH / 2) - (mb.h / 2));
+ }
+
+ itm.lblNode.style.left = x + 'px';
+ itm.lblNode.style.top = y + 'px';
+ },
+
+ _calcHitGrid: function(){
+
+ var pos = dojo.coords(this.domNode, true);
+
+ this.hitX1 = pos.x - this.proximityLeft;
+ this.hitY1 = pos.y - this.proximityTop;
+ this.hitX2 = this.hitX1 + this.totalWidth;
+ this.hitY2 = this.hitY1 + this.totalHeight;
+
+ },
+
+ _toEdge: function(inp, def){
+ return this.EDGE[inp.toUpperCase()] || def;
+ },
+
+ _expandSlowly: function(){
+ // summary: slowly expand the image to user specified max size
+ if(!this.isOver){ return; }
+ this.timerScale += 0.2;
+ this._paint();
+ if(this.timerScale<1.0){
+ setTimeout(dojo.hitch(this, "_expandSlowly"), 10);
+ }
+ },
+
+ destroyRecursive: function(){
+ // need to disconnect when we destroy
+ dojo.disconnect(this._onMouseOutHandle);
+ dojo.disconnect(this._onMouseMoveHandle);
+ dojo.disconnect(this._addChildHandle);
+ if(this.isFixed){ dojo.disconnect(this._onScrollHandle); }
+ dojo.disconnect(this._onResizeHandle);
+ this.inherited("destroyRecursive",arguments);
+ }
+});
+
+dojo.declare("dojox.widget.FisheyeListItem", [dijit._Widget, dijit._Templated, dijit._Contained], {
+ /*
+ * summary
+ * Menu item inside of a FisheyeList.
+ * See FisheyeList documentation for details on usage.
+ */
+
+ // iconSrc: String
+ // pathname to image file (jpg, gif, png, etc.) of icon for this menu item
+ iconSrc: "",
+
+ // label: String
+ // label to print next to the icon, when it is moused-over
+ label: "",
+
+ // id: String
+ // will be set to the id of the orginal div element
+ id: "",
+
+ templateString:
+ '<div class="dojoxFisheyeListItem">' +
+ ' <img class="dojoxFisheyeListItemImage" dojoAttachPoint="imgNode" dojoAttachEvent="onmouseover:onMouseOver,onmouseout:onMouseOut,onclick:onClick">' +
+ ' <div class="dojoxFisheyeListItemLabel" dojoAttachPoint="lblNode"></div>' +
+ '</div>',
+
+ _isNode: function(/* object */wh){
+ // summary:
+ // checks to see if wh is actually a node.
+ if(typeof Element == "function"){
+ try{
+ return wh instanceof Element; // boolean
+ }catch(e){}
+ }else{
+ // best-guess
+ return wh && !isNaN(wh.nodeType); // boolean
+ }
+ return false;
+ },
+
+ _hasParent: function(/*Node*/node){
+ // summary:
+ // returns whether or not node is a child of another node.
+ return Boolean(node && node.parentNode && this._isNode(node.parentNode)); // boolean
+ },
+
+ postCreate: function(){
+
+ // set image
+ var parent;
+ if((this.iconSrc.toLowerCase().substring(this.iconSrc.length-4)==".png") && dojo.isIE < 7){
+ /* we set the id of the new fisheyeListItem to the id of the div defined in the HTML */
+ if(this._hasParent(this.imgNode) && this.id != ""){
+ parent = this.imgNode.parentNode;
+ parent.setAttribute("id", this.id);
+ }
+ this.imgNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.iconSrc+"', sizingMethod='scale')";
+ this.imgNode.src = this._blankGif.toString();
+ }else{
+ if(this._hasParent(this.imgNode) && this.id != ""){
+ parent = this.imgNode.parentNode;
+ parent.setAttribute("id", this.id);
+ }
+ this.imgNode.src = this.iconSrc;
+ }
+
+ // Label
+ if(this.lblNode){
+ this.lblNode.appendChild(document.createTextNode(this.label));
+ }
+ dojo.setSelectable(this.domNode, false);
+ this.startup();
+ },
+
+ startup: function(){
+ this.parent = this.getParent();
+ },
+
+ onMouseOver: function(/*Event*/ e){
+ // summary: callback when user moves mouse over this menu item
+ // in conservative mode, don't activate the menu until user mouses over an icon
+ if(!this.parent.isOver){
+ this.parent._setActive(e);
+ }
+ if(this.label != "" ){
+ dojo.addClass(this.lblNode, "dojoxFishSelected");
+ this.parent._positionLabel(this);
+ }
+ },
+
+ onMouseOut: function(/*Event*/ e){
+ // summary: callback when user moves mouse off of this menu item
+ dojo.removeClass(this.lblNode, "dojoxFishSelected");
+ },
+
+ onClick: function(/*Event*/ e){
+ // summary: user overridable callback when user clicks this menu item
+ }
+});
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/FisheyeList/FisheyeList.css b/js/dojo-1.7.2/dojox/widget/FisheyeList/FisheyeList.css
new file mode 100644
index 0000000..82469d8
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FisheyeList/FisheyeList.css
@@ -0,0 +1,28 @@
+.dojoxFisheyeListItemLabel {
+ font-family: Arial, Helvetica, sans-serif;
+ background-color: #eee;
+ border: 2px solid #666;
+ padding: 2px;
+ text-align: center;
+ position: absolute;
+ display: none;
+ white-space:pre;
+}
+
+.dojoxFisheyeListItemLabel.dojoxFishSelected {
+ display: block;
+}
+
+.dojoxFisheyeListItemImage {
+ border: 0px;
+ position: absolute;
+}
+
+.dojoxFisheyeListItem {
+ position: absolute;
+ z-index: 2;
+}
+
+.dojoxFisheyeListBar {
+ position: relative;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/FisheyeLite.js b/js/dojo-1.7.2/dojox/widget/FisheyeLite.js
new file mode 100644
index 0000000..90305c3
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/FisheyeLite.js
@@ -0,0 +1,151 @@
+//>>built
+define("dojox/widget/FisheyeLite", ["dojo", "dojox", "dijit/_Widget", "dojo/fx/easing"], function(dojo, dojox, widget, easing){
+
+ dojo.getObject("widget", true, dojox);
+ dojo.experimental("dojox.widget.FisheyeLite");
+
+ return dojo.declare("dojox.widget.FisheyeLite",
+ dijit._Widget,
+ {
+ // summary: A Light-weight Fisheye Component, or an exhanced version
+ // of dojo.fx.Toggler ...
+ //
+ // description:
+ // A Simple FisheyeList-like widget which (in the interest of
+ // performance) relies on well-styled content for positioning,
+ // and natural page layout for rendering.
+ //
+ // use position:absolute/relative nodes to prevent layout
+ // changes, and use caution when seleting properties to
+ // scale. Negative scaling works, but some properties
+ // react poorly to being set to negative values, IE being
+ // particularly annoying in that regard.
+ //
+ // quirk: uses the domNode as the target of the animation
+ // unless it finds a node class="fisheyeTarget" in the container
+ // being turned into a FisheyeLite instance
+ //
+ // example:
+ // | // make all the LI's in a node Fisheye's:
+ // | dojo.query("#node li").forEach(function(n){
+ // | new dojox.widget.FisheyeLite({},n);
+ // | });
+ //
+ //
+ // example:
+ // | new dojox.widget.FisheyeLite({
+ // | properties:{
+ // | // height is literal, width is multiplied
+ // | height:{ end: 200 }, width:2.3
+ // | }
+ // | }, "someNode");
+ //
+ // duationIn: Integer
+ // The time (in ms) the run the show animation
+ durationIn: 350,
+
+ // easeIn: Function
+ // An easing function to use for the show animation
+ easeIn: easing.backOut,
+
+ // durationOut: Integer
+ // The Time (in ms) to run the hide animation
+ durationOut: 1420,
+
+ // easeOut: Function
+ // An easing function to use for the hide animation
+ easeOut: easing.elasticOut,
+
+ // properties: Object
+ // An object of "property":scale pairs, or "property":{} pairs.
+ // defaults to font-size with a scale of 2.75
+ // If a named property is an integer or float, the "scale multiplier"
+ // is used. If the named property is an object, that object is mixed
+ // into the animation directly. eg: height:{ end:20, units:"em" }
+ properties: null,
+
+ // units: String
+ // Sometimes, you need to specify a unit. Should be part of
+ // properties attrib, but was trying to shorthand the logic there
+ units:"px",
+
+ constructor: function(props, node){
+ this.properties = props.properties || {
+ fontSize: 2.75
+ }
+ },
+
+ postCreate: function(){
+
+ this.inherited(arguments);
+ this._target = dojo.query(".fisheyeTarget", this.domNode)[0] || this.domNode;
+ this._makeAnims();
+
+ this.connect(this.domNode, "onmouseover", "show");
+ this.connect(this.domNode, "onmouseout", "hide");
+ this.connect(this._target, "onclick", "onClick");
+
+ },
+
+ show: function(){
+ // summary:
+ // Show this Fisheye item.
+ this._runningOut.stop();
+ this._runningIn.play();
+ },
+
+ hide: function(){
+ // summary:
+ // Hide this fisheye item on mouse leave
+ this._runningIn.stop();
+ this._runningOut.play();
+ },
+
+ _makeAnims: function(){
+ // summary:
+ // Pre-generate the animations
+
+ // create two properties: objects, one for each "state"
+ var _in = {}, _out = {}, cs = dojo.getComputedStyle(this._target);
+ for(var p in this.properties){
+ var prop = this.properties[p],
+ deep = dojo.isObject(prop),
+ v = parseInt(cs[p])
+ ;
+ // note: do not set negative scale for [a list of properties] for IE support
+ // note: filter:'s are your own issue, too ;)
+ // FIXME: this.unit here is bad, likely. d._toPixelValue ?
+ _out[p] = { end: v, units:this.units };
+ _in[p] = deep ? prop : { end: prop * v, units:this.units };
+ }
+
+ this._runningIn = dojo.animateProperty({
+ node: this._target,
+ easing: this.easeIn,
+ duration: this.durationIn,
+ properties: _in
+ });
+
+ this._runningOut = dojo.animateProperty({
+ node: this._target,
+ duration: this.durationOut,
+ easing: this.easeOut,
+ properties: _out
+ });
+
+ this.connect(this._runningIn, "onEnd", dojo.hitch(this, "onSelected", this));
+ },
+
+ onClick: function(/* Event */e){
+ // summary: stub function fired when target is clicked
+ // connect or override to use.
+ },
+
+ onSelected: function(/* Object */e){
+ // summary: stub function fired when Fisheye Item is fully visible and
+ // hovered. connect or override use.
+ }
+
+ });
+
+}); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/Iterator.js b/js/dojo-1.7.2/dojox/widget/Iterator.js
new file mode 100644
index 0000000..f9142bf
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Iterator.js
@@ -0,0 +1,178 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/Iterator", ["dijit","dojo","dojox","dojo/require!dijit/Declaration"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.Iterator");
+dojo.require("dijit.Declaration");
+
+dojo.experimental("dojox.widget.Iterator"); // level: prototype, designed for dijit.chat.demo
+
+/*
+ example:
+ from markup:
+ | <span dojoType="dojo.data.ItemFileReadStore"
+ | jsId="cstore" url="countries.json"></span>
+ |
+ | <div>
+ | <div dojoType="dojox.widget.Iterator" store="cstore"
+ | query="{ name: 'A*'}">
+ | ${name} is a ${type}
+ | </div>
+ | </div>
+
+ example:
+ programmatic:
+ | var store = new dojo.data.ItemFileReadStore({ url: "countries.json" });
+ |
+ | var iter = new dojox.widget.Iterator({
+ | store: store,
+ | template: ""
+ | });
+ |
+
+ example:
+ programmatic from an array of objects:
+ | var dataArr = [
+ | { name: "foo", valueAttr: "bar" },
+ | { name: "thinger", valueAttr: "blah" }
+ | ];
+ |
+ | var iter = new dojox.widget.Iterator({
+ | data: dataArr,
+ | template: ""
+ | });
+
+ example:
+ programmatic from an array of strings:
+ | var dataArr = [
+ | { name: "foo", valueAttr: "bar" },
+ | { name: "thinger", valueAttr: "blah" }
+ | ];
+ |
+ | var iter = new dojox.widget.Iterator({
+ | data: dataArr,
+ | template: ""
+ | });
+
+*/
+
+
+dojo.declare("dojox.widget.Iterator",
+ [ dijit.Declaration ],
+ {
+
+ constructor: (function(){
+ var ctr = 0;
+ return function(){
+ this.attrs = [];
+ this.children = [];
+ this.widgetClass = "dojox.widget.Iterator._classes._"+(ctr++);
+ }
+ })(),
+
+ start: 0,
+ fetchMax: 1000,
+ query: { name: "*" },
+ attrs: [],
+ defaultValue: "",
+ widgetCtor: null,
+ dataValues: [], // an array of strings
+ data: null, // should be a reference to an Array
+ store: null,
+ _srcIndex: 0,
+ _srcParent: null,
+
+ _setSrcIndex: function(s){
+ this._srcIndex = 0;
+ this._srcParent = s.parentNode;
+ var ts = s;
+ while(ts.previousSibling){
+ this._srcIndex++;
+ ts = ts.previousSibling;
+ };
+ },
+
+ postscript: function(p, s){
+ // figure out the position of the source node in it's parent
+ this._setSrcIndex(s);
+ // this._srcIndex = dojo.query(">", this._srcParent).indexOf(s);
+
+ this.inherited("postscript", arguments);
+ var wc = this.widgetCtor = dojo.getObject(this.widgetClass);
+
+ this.attrs = dojo.map(
+ wc.prototype.templateString.match(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g),
+ function(s){ return s.slice(2, -1); }
+ );
+ dojo.forEach(
+ this.attrs,
+ function(m){ wc.prototype[m] = ""; }
+ );
+ this.update();
+ },
+
+ clear: function(){
+ if(this.children.length){
+ this._setSrcIndex(this.children[0].domNode);
+ }
+ dojo.forEach(this.children, "item.destroy();");
+ this.children = [];
+ },
+
+ update: function(){
+ if(this.store){
+ // we're executing a query
+ this.fetch();
+ }else{
+ // we came from an array of objects. Easier!
+ this.onDataAvailable(this.data||this.dataValues);
+ }
+ },
+
+ _addItem: function(/*Object*/config, idx){
+ if(dojo.isString(config)){
+ config = { value: config };
+ }
+ var widget = new this.widgetCtor(config);
+ this.children.push(widget);
+ dojo.place(widget.domNode, this._srcParent, this._srcIndex+idx);
+ },
+
+ getAttrValuesObj: function(item){
+ var obj = {};
+ if(dojo.isString(item)){
+ dojo.forEach(this.attrs, function(attr){
+ obj[attr] = (attr == "value") ? item : this.defaultValue;
+ }, this);
+ }else{
+ dojo.forEach(this.attrs, function(attr){
+ if(this.store){
+ obj[attr] = this.store.getValue(item, attr)||this.defaultValue;
+ }else{
+ obj[attr] = item[attr]||this.defaultValue;
+ }
+ }, this);
+ }
+ return obj;
+ },
+
+ onDataAvailable: function(data){
+ this.clear();
+ // console.debug(data);
+ dojo.forEach(data, function(item, idx){
+ this._addItem(this.getAttrValuesObj(item), idx);
+ }, this);
+ },
+
+ fetch: function(query, start, end){
+ this.store.fetch({
+ query: query||this.query,
+ start: start||this.start,
+ count: end||this.fetchMax,
+ onComplete: dojo.hitch(this,"onDataAvailable")
+ });
+ }
+});
+
+dojox.widget.Iterator._classes = {};
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Loader.js b/js/dojo-1.7.2/dojox/widget/Loader.js
new file mode 100644
index 0000000..dd939c1
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Loader.js
@@ -0,0 +1,111 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/Loader", ["dijit","dojo","dojox","dojo/require!dijit/_Widget,dijit/_Templated"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.Loader");
+dojo.deprecated("dojox.widget.Loader", "", "2.0");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dojox.widget.Loader", [dijit._Widget,dijit._Templated], {
+ // summary: a configurable global xhr-listener to display
+ // a loading message during running xhr's or to simply provide
+ // base-level topic to subscribe to for custom loading messages
+ //
+ // loadIcon: String
+ // location to the icon used.
+ loadIcon: dojo.moduleUrl("dojox.widget.Loader","icons/loading.gif"),
+
+ // loadMessage: String
+ // string to use for progress loading
+ loadMessage: 'Loading ...',
+
+ // hasVisuals: Boolean
+ // true to display a fixed loading message in TR cornder, false to unly provide
+ // "Loader" topic to subscribe to for your own custom loading message.
+ hasVisuals: true,
+
+ // attachToPointer
+ // true to use visual indicator where cursor is
+ attachToPointer: true,
+
+ // duration: Integer
+ // time in ms to toggle in/out the visual load indicator
+ duration: 125,
+
+ // _offset: Integer
+ // distance in px from the mouse pointer to show attachToPointer avatar
+ _offset: 16,
+
+ // holder for mousemove connection
+ _pointerConnect: null,
+ _xhrStart: null,
+ _xhrEnd: null,
+
+ templateString: '<div dojoAttachPoint="loadNode" class="dojoxLoader">'
+ +'<img src="${loadIcon}" class="dojoxLoaderIcon"> <span dojoAttachPoint="loadMessageNode" class="dojoxLoaderMessage"></span>'
+ +'</div>',
+
+ postCreate: function(){
+ // summary: setup the loader
+
+ if(!this.hasVisuals){
+ this.loadNode.style.display = "none"; // _destroy()?
+ }else{
+ if(this.attachToPointer){
+ dojo.removeClass(this.loadNode,"dojoxLoader");
+ dojo.addClass(this.loadNode,"dojoxLoaderPointer");
+ }
+ this._hide();
+ }
+ this._setMessage(this.loadMessage);
+
+ // FIXME: create our connections. would be easier, and this might be redundant
+ // if Deferred published something. XHR published stuff. FIXME to use that.
+ this._xhrStart = this.connect(dojo,"_ioSetArgs","_show");
+ this._xhrEnd = this.connect(dojo.Deferred.prototype,"_fire","_hide");
+
+ },
+
+ _setMessage: function(/* String */ message){
+ // summary: set's the message in the loader
+ this.loadMessageNode.innerHTML = message;
+ },
+
+ _putLoader: function(/* Event */ e){
+ // summary: place the floating loading element based on mousemove connection position
+ dijit.placeOnScreen(this.loadNode,{ x: e.clientX+this._offset, y:e.clientY+this._offset }, ["TL","BR"]);
+ },
+
+ _show: function(){
+ // summary: publish and show progress indicator
+ dojo.publish("Loader",[{ message: 'started' }]);
+ if(this.hasVisuals){
+ if(this.attachToPointer){
+ this._pointerConnect = this.connect(document,"onmousemove","_putLoader");
+ }
+ dojo.style(this.loadNode, {
+ opacity:0, display:""
+ });
+ dojo.fadeIn({ node: this.loadNode, duration:this.duration }).play();
+ }
+ },
+
+ _hide: function(){
+ // summary: publish "xhr ended" and hide progress indicator
+ dojo.publish("Loader",[{ message: 'ended' }]);
+ if(this.hasVisuals){
+ if(this.attachToPointer){
+ this.disconnect(this._pointerConnect);
+ }
+ dojo.fadeOut({
+ node: this.loadNode,
+ duration:this.duration,
+ onEnd: dojo.partial(dojo.style, this.loadNode, "display", "none")
+ }).play();
+ }
+ }
+
+});
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Loader/Loader.css b/js/dojo-1.7.2/dojox/widget/Loader/Loader.css
new file mode 100644
index 0000000..4b2d19c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Loader/Loader.css
@@ -0,0 +1,27 @@
+.dojoxLoaderPointer {
+ position:absolute;
+ z-index:999;
+}
+
+.dojoxLoader {
+ float:right;
+ position:fixed;
+ height:25px;
+ width:100px;
+ top:0;
+ right:0;
+ padding:3px;
+ border:1px solid #ccc;
+ background:#fff;
+ min-width:42px;
+}
+
+.dojoxLoaderIcon {
+ height:22px; width:22px;
+ vertical-align:middle;
+}
+
+.dojoxLoaderMessage {
+ font:8pt Arial,san-serif;
+ color:#666;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/Loader/icons/loading.gif b/js/dojo-1.7.2/dojox/widget/Loader/icons/loading.gif
new file mode 100644
index 0000000..6e7c8e5
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Loader/icons/loading.gif
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/MultiSelectCalendar.js b/js/dojo-1.7.2/dojox/widget/MultiSelectCalendar.js
new file mode 100644
index 0000000..36fd7a1
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/MultiSelectCalendar.js
@@ -0,0 +1,977 @@
+//>>built
+require({cache:{
+'url:dojox/widget/MultiSelectCalendar/MultiSelectCalendar.html':"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" dojoAttachEvent=\"onkeypress: _onKeyPress\" aria-labelledby=\"${id}_year\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset dijitCalendarArrow' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" role=\"presentation\"/>\n\t\t\t\t<span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow\">-</span>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div dojoType=\"dijit.form.DropDownButton\" dojoAttachPoint=\"monthDropDownButton\"\n\t\t\t\t\tid=\"${id}_mddb\" tabIndex=\"-1\">\n\t\t\t\t</div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset dijitCalendarArrow' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarIncrease\" role=\"presentation\"/>\n\t\t\t\t<span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow\">+</span>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\" role=\"columnheader\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick, onmouseover: _onDayMouseOver, onmouseout: _onDayMouseOut, onmousedown: _onDayMouseDown, onmouseup: _onDayMouseUp\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\" role=\"row\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\" role=\"gridcell\"><span class=\"dijitCalendarDateLabel\"></span></td>\n\t\t</tr>\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\">\n\t\t\t\t<h3 class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span dojoAttachPoint=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\" id=\"${id}_year\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\"></span>\n\t\t\t\t</h3>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>"}});
+define("dojox/widget/MultiSelectCalendar", [
+ "dojo/main", "dijit",
+ "dojo/text!./MultiSelectCalendar/MultiSelectCalendar.html",
+ "dojo/cldr/supplemental",
+ "dojo/date",
+ "dojo/date/locale",
+ "dijit/_Widget", "dijit/_Templated", "dijit/_CssStateMixin", "dijit/form/DropDownButton", "dijit/typematic"],
+ function(dojo, dijit, template) {
+
+dojo.experimental("dojox.widget.MultiSelectCalendar");
+
+dojo.declare(
+ "dojox.widget.MultiSelectCalendar",
+ [dijit._Widget, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin, dijit._CssStateMixin],
+ {
+ // summary:
+ // A simple GUI for choosing several dates in the context of a monthly calendar.
+ //
+ // description:
+ // A simple GUI for choosing several dates in the context of a monthly calendar.
+ // This widget serialises its selected dates to ISO dates or ISO ranges of dates,
+ // depending on developer selection
+ // Note that it accepts an Array of ISO dates as its input
+ //
+ // example:
+ // | var calendar = new dojox.widget.MultiSelectCalendar({value: ['2011-05-07,'2011-05-08',2011-05-09','2011-05-23']}, dojo.byId("calendarNode"));
+ //
+ // example:
+ // | <div dojoType="dojox.widget.MultiSelectCalendar"></div>
+
+ templateString: template,
+ widgetsInTemplate: true,
+
+ // value: Date
+ // The currently selected Dates, initially set to an empty object to indicate no selection.
+ value: {},
+
+ // 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",
+
+ // if returnIsoRanges is true, the selected dates will be returned as ISO ranges
+ // else each selected date will be returned sequentially
+ returnIsoRanges : false,
+
+ // currentFocus: Date
+ // Date object containing the currently focused date, or the date which would be focused
+ // if the calendar itself was focused. Also indicates which year and month to display,
+ // i.e. the current "page" the calendar is on.
+ currentFocus: new Date(),
+
+ baseClass:"dijitCalendar",
+
+ cssStateNodes: {
+ "decrementMonth": "dijitCalendarArrow",
+ "incrementMonth": "dijitCalendarArrow",
+ "previousYearLabelNode": "dijitCalendarPreviousYear",
+ "nextYearLabelNode": "dijitCalendarNextYear"
+ },
+
+ _areValidDates: function(/*Date*/ value){
+ // summary:
+ // Runs various tests on each selected date, checking that they're a valid date, rather
+ // than blank or NaN.
+ // tags:
+ // private
+ for (var selDate in this.value){
+ valid = (selDate && !isNaN(selDate) && typeof value == "object" && selDate.toString() != this.constructor.prototype.value.toString());
+ if(!valid){ return false; }
+ }
+ return true;
+ },
+
+ _getValueAttr: function(){
+ // summary: this method returns the list of selected dates in an array structure
+ if(this.returnIsoRanges){
+ datesWithRanges = this._returnDatesWithIsoRanges(this._sort());
+ return datesWithRanges;
+ }else{
+ return this._sort();
+ }
+ },
+
+ _setValueAttr: function(/*Date|Number|array*/ value, /*Boolean*/ priorityChange){
+ // summary:
+ // Support set("value", ...)
+ // description:
+ // Set the passed dates to the selected date and updates the value of this widget
+ // to reflect that
+ // value:
+ // Can be a Date, the number of milliseconds since 1970 or an array of ISO dates (['2011-07-01', '2001-06-01']).
+ // tags:
+ // protected
+
+ //If we are passed an array of ISO dates, we are going to mark each date in the list as selected
+ //We perform the normalization of the passed date
+ this.value = {};
+ if(dojo.isArray(value)) {
+ dojo.forEach(value,function(element, i){
+ //Each element of the array could be a date or a date range
+ var slashPosition = element.indexOf("/");
+ if(slashPosition == -1){
+ //The element is a single date
+ this.value[element] = 1;
+ }else{
+ //We have a slash somewhere in the string so this is an ISO date range
+ var dateA=new dojo.date.stamp.fromISOString(element.substr(0,10));
+ var dateB=new dojo.date.stamp.fromISOString(element.substr(11,10));
+
+ this.toggleDate(dateA,[],[]);
+ if((dateA - dateB) > 0){
+ //We select the first date then the rest is handled as if we had selected a range
+ this._addToRangeRTL(dateA, dateB, [], []);
+ }else{
+ //We select the first date then the rest is handled as if we had selected a range
+ this._addToRangeLTR(dateA, dateB, [], []);
+ }
+ }
+ },this);
+ if(value.length > 0){
+ this.focusOnLastDate(value[value.length-1]);
+ }
+ }else{
+ if(value){
+ // convert from Number to Date, or make copy of Date object so that setHours() call below
+ // doesn't affect original value
+ value = new this.dateClassObj(value);
+ }
+ if(this._isValidDate(value)){
+ value.setHours(1, 0, 0, 0); // round to nearest day (1am to avoid issues when DST shift occurs at midnight, see #8521, #9366)
+
+ if(!this.isDisabledDate(value, this.lang)){
+ dateIndex = dojo.date.stamp.toISOString(value).substring(0,10);
+
+ this.value[dateIndex] = 1;
+
+ // Set focus cell to the new value. Arguably this should only happen when there isn't a current
+ // focus point. This will also repopulate the grid, showing the new selected value (and possibly
+ // new month/year).
+ this.set("currentFocus", value);
+
+ if(priorityChange || typeof priorityChange == "undefined"){
+ this.onChange(this.get('value'));
+ this.onValueSelected(this.get('value')); // remove in 2.0
+ }
+ }
+ }
+ }
+ this._populateGrid();
+ },
+ focusOnLastDate : function(lastElement){
+ //We put the focus on the last date so that when the user re-clicks on the calendar it will be
+ //on the proper month
+ var slashPositionLastDate = lastElement.indexOf("/");
+ var dateA,dateB;
+ if(slashPositionLastDate == -1){
+ //This is a singleDate
+ lastDate = lastElement;
+ }else{
+ dateA=new dojo.date.stamp.fromISOString(lastElement.substr(0,10));
+ dateB=new dojo.date.stamp.fromISOString(lastElement.substr(11,10));
+ if((dateA - dateB) > 0){
+ lastDate = dateA;
+ }else{
+ lastDate = dateB;
+ }
+ }
+ this.set("currentFocus", lastDate);
+ },
+ _isValidDate: function(/*Date*/ value){
+ // summary:
+ // Runs various tests on the value, checking that it's a valid date, rather
+ // than blank or NaN.
+ // tags:
+ // private
+ return value && !isNaN(value) && typeof value == "object" &&
+ value.toString() != this.constructor.prototype.value.toString();
+ },
+ _setText: function(node, text){
+ // summary:
+ // This just sets the content of node to the specified text.
+ // Can't do "node.innerHTML=text" because of an IE bug w/tables, see #3434.
+ // tags:
+ // private
+ while(node.firstChild){
+ node.removeChild(node.firstChild);
+ }
+ node.appendChild(dojo.doc.createTextNode(text));
+ },
+
+ _populateGrid: function(){
+ // summary:
+ // Fills in the calendar grid with each day (1-31)
+ // tags:
+ // private
+
+ var month = new this.dateClassObj(this.currentFocus);
+ month.setDate(1);
+
+ var firstDay = month.getDay(),
+ daysInMonth = this.dateFuncObj.getDaysInMonth(month),
+ daysInPreviousMonth = this.dateFuncObj.getDaysInMonth(this.dateFuncObj.add(month, "month", -1)),
+ today = new this.dateClassObj(),
+ dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+ if(dayOffset > firstDay){ dayOffset -= 7; }
+
+ //List of all 42 displayed days in the calendar
+ this.listOfNodes = dojo.query(".dijitCalendarDateTemplate", this.domNode);
+
+ // Iterate through dates in the calendar and fill in date numbers and style info
+ this.listOfNodes.forEach(function(template, i){
+ i += dayOffset;
+ var date = new this.dateClassObj(month),
+ number, clazz = "dijitCalendar", adj = 0;
+
+ if(i < firstDay){
+ number = daysInPreviousMonth - firstDay + i + 1;
+ adj = -1;
+ clazz += "Previous";
+ }else if(i >= (firstDay + daysInMonth)){
+ number = i - firstDay - daysInMonth + 1;
+ adj = 1;
+ clazz += "Next";
+ }else{
+ number = i - firstDay + 1;
+ clazz += "Current";
+ }
+
+ if(adj){
+ date = this.dateFuncObj.add(date, "month", adj);
+ }
+ date.setDate(number);
+
+ if(!this.dateFuncObj.compare(date, today, "date")){
+ clazz = "dijitCalendarCurrentDate " + clazz;
+ }
+
+ //If the date falls outside of the min or max constraints, we do nothing
+ dateIndex = dojo.date.stamp.toISOString(date).substring(0,10);
+
+ if(!this.isDisabledDate(date, this.lang)){
+ //If the node is already selected, the user clicking on it once more will deselect it
+ //so we will destroy it in the value object. If the date was not previously selected
+ //The user wants to select it so we add it to the value object
+ if(this._isSelectedDate(date, this.lang)){
+ if(this.value[dateIndex]){
+ clazz = "dijitCalendarSelectedDate " + clazz;
+ }else{
+ clazz = clazz.replace("dijitCalendarSelectedDate ","");
+ }
+ }
+ }
+ if(this._isSelectedDate(date, this.lang)){
+ clazz = "dijitCalendarBrowsingDate " + clazz;
+ }
+
+ if(this.isDisabledDate(date, this.lang)){
+ clazz = "dijitCalendarDisabledDate " + clazz;
+ }
+
+ var clazz2 = this.getClassForDate(date, this.lang);
+ if(clazz2){
+ clazz = clazz2 + " " + clazz;
+ }
+
+ template.className = clazz + "Month dijitCalendarDateTemplate";
+ template.dijitDateValue = date.valueOf(); // original code
+ dojo.attr(template, "dijitDateValue", date.valueOf()); // so I can dojo.query() it
+ var label = dojo.query(".dijitCalendarDateLabel", template)[0],
+ text = date.getDateLocalized ? date.getDateLocalized(this.lang) : date.getDate();
+ this._setText(label, text);
+ }, this);
+
+ // Repopulate month drop down list based on current year.
+ // Need to do this to hide leap months in Hebrew calendar.
+ var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, month);
+ this.monthDropDownButton.dropDown.set("months", monthNames);
+
+ // Set name of current month and also fill in spacer element with all the month names
+ // (invisible) so that the maximum width will affect layout. But not on IE6 because then
+ // the center <TH> overlaps the right <TH> (due to a browser bug).
+ this.monthDropDownButton.containerNode.innerHTML =
+ (dojo.isIE == 6 ? "" : "<div class='dijitSpacer'>" + this.monthDropDownButton.dropDown.domNode.innerHTML + "</div>") +
+ "<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>" + monthNames[month.getMonth()] + "</div>";
+
+ // Fill in localized prev/current/next years
+ var y = month.getFullYear() - 1;
+ var d = new this.dateClassObj();
+ dojo.forEach(["previous", "current", "next"], function(name){
+ d.setFullYear(y++);
+ this._setText(this[name+"YearLabelNode"],
+ this.dateLocaleModule.format(d, {selector:'year', locale:this.lang}));
+ }, this);
+ },
+
+ goToToday: function(){
+ // summary:
+ // We go to today but we do no select it
+ this.set('currentFocus', new this.dateClassObj(), false);
+ },
+
+ 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);
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ dojo.setSelectable(this.domNode, false);
+
+ var cloneClass = dojo.hitch(this, function(clazz, n){
+ var template = dojo.query(clazz, this.domNode)[0];
+ for(var i=0; i<n; i++){
+ template.parentNode.appendChild(template.cloneNode(true));
+ }
+ });
+
+ // clone the day label and calendar day templates 6 times to make 7 columns
+ cloneClass(".dijitCalendarDayLabelTemplate", 6);
+ cloneClass(".dijitCalendarDateTemplate", 6);
+
+ // now make 6 week rows
+ cloneClass(".dijitCalendarWeekTemplate", 5);
+
+ // insert localized day names in the header
+ var dayNames = this.dateLocaleModule.getNames('days', this.dayWidth, 'standAlone', this.lang);
+ var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+ dojo.query(".dijitCalendarDayLabel", this.domNode).forEach(function(label, i){
+ this._setText(label, dayNames[(i + dayOffset) % 7]);
+ }, this);
+
+ var dateObj = new this.dateClassObj(this.currentFocus);
+
+ this.monthDropDownButton.dropDown = new dojox.widget._MonthDropDown({
+ id: this.id + "_mdd",
+ onChange: dojo.hitch(this, "_onMonthSelect")
+ });
+
+ this.set('currentFocus', dateObj, false); // draw the grid to the month specified by currentFocus
+
+ // Set up repeating mouse behavior for increment/decrement of months/years
+ var _this = this;
+ var typematic = function(nodeProp, dateProp, adj){
+ _this._connects.push(
+ dijit.typematic.addMouseListener(_this[nodeProp], _this, function(count){
+ if(count >= 0){ _this._adjustDisplay(dateProp, adj); }
+ }, 0.8, 500)
+ );
+ };
+ typematic("incrementMonth", "month", 1);
+ typematic("decrementMonth", "month", -1);
+ typematic("nextYearLabelNode", "year", 1);
+ typematic("previousYearLabelNode", "year", -1);
+ },
+
+ _adjustDisplay: function(/*String*/ part, /*int*/ amount){
+ // summary:
+ // Moves calendar forwards or backwards by months or years
+ // part:
+ // "month" or "year"
+ // amount:
+ // Number of months or years
+ // tags:
+ // private
+ this._setCurrentFocusAttr(this.dateFuncObj.add(this.currentFocus, part, amount));
+ },
+
+ _setCurrentFocusAttr: function(/*Date*/ date, /*Boolean*/ forceFocus){
+ // summary:
+ // If the calendar currently has focus, then focuses specified date,
+ // changing the currently displayed month/year if necessary.
+ // If the calendar doesn't have focus, updates currently
+ // displayed month/year, and sets the cell that will get focus.
+ // forceFocus:
+ // If true, will focus() the cell even if calendar itself doesn't have focus
+
+ var oldFocus = this.currentFocus,
+ oldCell = oldFocus ? dojo.query("[dijitDateValue=" + oldFocus.valueOf() + "]", this.domNode)[0] : null;
+
+ // round specified value to nearest day (1am to avoid issues when DST shift occurs at midnight, see #8521, #9366)
+ date = new this.dateClassObj(date);
+ date.setHours(1, 0, 0, 0);
+
+ this._set("currentFocus", date);
+ var currentMonth = dojo.date.stamp.toISOString(date).substring(0,7);
+ //We only redraw the grid if we're in a new month
+ if(currentMonth != this.previousMonth){
+ this._populateGrid();
+ this.previousMonth = currentMonth;
+ }
+
+ // set tabIndex=0 on new cell, and focus it (but only if Calendar itself is focused)
+ var newCell = dojo.query("[dijitDateValue=" + date.valueOf() + "]", this.domNode)[0];
+ newCell.setAttribute("tabIndex", this.tabIndex);
+ if(this._focused || forceFocus){
+ newCell.focus();
+ }
+
+ // set tabIndex=-1 on old focusable cell
+ if(oldCell && oldCell != newCell){
+ if(dojo.isWebKit){ // see #11064 about webkit bug
+ oldCell.setAttribute("tabIndex", "-1");
+ }else{
+ oldCell.removeAttribute("tabIndex");
+ }
+ }
+ },
+
+ focus: function(){
+ // summary:
+ // Focus the calendar by focusing one of the calendar cells
+ this._setCurrentFocusAttr(this.currentFocus, true);
+ },
+
+ _onMonthSelect: function(/*Number*/ newMonth){
+ // summary:
+ // Handler for when user selects a month from the drop down list
+ // tags:
+ // protected
+
+ // move to selected month, bounding by the number of days in the month
+ // (ex: dec 31 --> jan 28, not jan 31)
+ this.currentFocus = this.dateFuncObj.add(this.currentFocus, "month",
+ newMonth - this.currentFocus.getMonth());
+ this._populateGrid();
+ },
+
+ toggleDate : function(/*date*/ dateToToggle, /*array of dates*/ selectedDates, /*array of dates*/ unselectedDates){
+
+ //Obtain CSS class before toggling if necessary
+ var dateIndex = dojo.date.stamp.toISOString(dateToToggle).substring(0,10);
+ //If previously selected we unselect and vice-versa
+ if(this.value[dateIndex]){
+ this.unselectDate(dateToToggle, unselectedDates);
+ }else{
+ this.selectDate(dateToToggle, selectedDates);
+ }
+ },
+
+ selectDate : function(/*date*/ dateToSelect, /*array of dates*/ selectedDates){
+ //Selects the passed iso date, changes its class and records it in the selected dates array
+ var node = this._getNodeByDate(dateToSelect);
+ var clazz = node.className;
+ var dateIndex = dojo.date.stamp.toISOString(dateToSelect).substring(0,10);
+ this.value[dateIndex] = 1;
+ selectedDates.push(dateIndex);
+ clazz = "dijitCalendarSelectedDate " + clazz;
+ //We update CSS class
+ node.className = clazz;
+ },
+
+ unselectDate : function(/*date*/ dateToUnselect, /*array of dates*/ unselectedDates){
+ //Unselects the passed iso date, changes its class and records it in the unselected dates array
+ var node = this._getNodeByDate(dateToUnselect);
+ var clazz = node.className;
+ var dateIndex = dojo.date.stamp.toISOString(dateToUnselect).substring(0,10);
+ delete(this.value[dateIndex]);
+ unselectedDates.push(dateIndex);
+ clazz = clazz.replace("dijitCalendarSelectedDate ","");
+ //We update CSS class
+ node.className = clazz;
+ },
+
+ _getNodeByDate : function(/*ISO date*/ dateNode){
+ //return the node that corresponds to the passed ISO date
+ var firstDate = new this.dateClassObj(this.listOfNodes[0].dijitDateValue);
+ var difference = Math.abs(dojo.date.difference(firstDate, dateNode, "day"));
+ return this.listOfNodes[difference];
+ },
+
+ _onDayClick: function(/*Event*/ evt){
+ // summary:
+ // Handler for day clicks, selects the date if appropriate
+ // tags:
+ // protected
+
+ //If we coming out of selecting a range, we need to skip this onDayClick or else we
+ //are going to deselect a date that has just been selected or deselect one that just was
+ //selected
+ dojo.stopEvent(evt);
+ for(var node = evt.target; node && !node.dijitDateValue; node = node.parentNode);
+ if(node && !dojo.hasClass(node, "dijitCalendarDisabledDate")){
+ value = new this.dateClassObj(node.dijitDateValue);
+ if(!this.rangeJustSelected){
+ this.toggleDate(value,[],[]);
+ //To record the date that was selected prior to the one currently selected
+ //needed in the event we are selecting a range of dates
+ this.previouslySelectedDay = value;
+ this.set("currentFocus", value);
+ this.onValueSelected([dojo.date.stamp.toISOString(value).substring(0,10)]);
+
+ }else{
+ this.rangeJustSelected = false;
+ this.set("currentFocus", value);
+ }
+ }
+ },
+
+ _onDayMouseOver: function(/*Event*/ evt){
+ // summary:
+ // Handler for mouse over events on days, sets hovered style
+ // tags:
+ // protected
+
+ // event can occur on <td> or the <span> inside the td,
+ // set node to the <td>.
+ var node =
+ dojo.hasClass(evt.target, "dijitCalendarDateLabel") ?
+ evt.target.parentNode :
+ evt.target;
+
+ if(node && (node.dijitDateValue || node == this.previousYearLabelNode || node == this.nextYearLabelNode) ){
+ dojo.addClass(node, "dijitCalendarHoveredDate");
+ this._currentNode = node;
+ }
+ },
+ _setEndRangeAttr: function(/*Date*/ value){
+ // description:
+ // records the end of a date range
+ // tags:
+ // protected
+ value = new this.dateClassObj(value);
+ value.setHours(1); // to avoid issues when DST shift occurs at midnight, see #8521, #9366
+ this.endRange = value;
+ },
+ _getEndRangeAttr: function(){
+ // Returns the EndRange date that is set when selecting a range
+ var value = new this.dateClassObj(this.endRange);
+ value.setHours(0, 0, 0, 0); // return midnight, local time for back-compat
+
+ // If daylight savings pushes midnight to the previous date, fix the Date
+ // object to point at 1am so it will represent the correct day. See #9366
+ if(value.getDate() < this.endRange.getDate()){
+ value = this.dateFuncObj.add(value, "hour", 1);
+ }
+ return value;
+ },
+
+ _onDayMouseOut: function(/*Event*/ evt){
+ // summary:
+ // Handler for mouse out events on days, clears hovered style
+ // tags:
+ // protected
+
+ if(!this._currentNode){ return; }
+
+ // if mouse out occurs moving from <td> to <span> inside <td>, ignore it
+ if(evt.relatedTarget && evt.relatedTarget.parentNode == this._currentNode){ return; }
+ var cls = "dijitCalendarHoveredDate";
+ if(dojo.hasClass(this._currentNode, "dijitCalendarActiveDate")) {
+ cls += " dijitCalendarActiveDate";
+ }
+ dojo.removeClass(this._currentNode, cls);
+ this._currentNode = null;
+ },
+ _onDayMouseDown: function(/*Event*/ evt){
+ var node = evt.target.parentNode;
+ if(node && node.dijitDateValue){
+ dojo.addClass(node, "dijitCalendarActiveDate");
+ this._currentNode = node;
+ }
+ //if shift is pressed, we know the user is selecting a range,
+ //in which case we are going to select a range of date
+ if(evt.shiftKey && this.previouslySelectedDay){
+ //necessary to know whether or not we are in the process of selecting a range of dates
+ this.selectingRange = true;
+ this.set('endRange', node.dijitDateValue);
+ this._selectRange();
+ }else{
+ this.selectingRange = false;
+ this.previousRangeStart = null;
+ this.previousRangeEnd = null;
+ }
+ },
+
+ _onDayMouseUp: function(/*Event*/ evt){
+ var node = evt.target.parentNode;
+ if(node && node.dijitDateValue){
+ dojo.removeClass(node, "dijitCalendarActiveDate");
+ }
+ },
+
+//TODO: use typematic
+ handleKey: function(/*Event*/ evt){
+ // summary:
+ // Provides keyboard navigation of calendar.
+ // description:
+ // Called from _onKeyPress() to handle keypress on a stand alone Calendar,
+ // and also from `dijit.form._DateTimeTextBox` to pass a keypress event
+ // from the `dijit.form.DateTextBox` to be handled in this widget
+ // returns:
+ // False if the key was recognized as a navigation key,
+ // to indicate that the event was handled by Calendar and shouldn't be propogated
+ // tags:
+ // protected
+ var dk = dojo.keys,
+ increment = -1,
+ interval,
+ newValue = this.currentFocus;
+ switch(evt.keyCode){
+ case dk.RIGHT_ARROW:
+ increment = 1;
+ //fallthrough...
+ case dk.LEFT_ARROW:
+ interval = "day";
+ if(!this.isLeftToRight()){ increment *= -1; }
+ break;
+ case dk.DOWN_ARROW:
+ increment = 1;
+ //fallthrough...
+ case dk.UP_ARROW:
+ interval = "week";
+ break;
+ case dk.PAGE_DOWN:
+ increment = 1;
+ //fallthrough...
+ case dk.PAGE_UP:
+ interval = evt.ctrlKey || evt.altKey ? "year" : "month";
+ break;
+ case dk.END:
+ // go to the next month
+ newValue = this.dateFuncObj.add(newValue, "month", 1);
+ // subtract a day from the result when we're done
+ interval = "day";
+ //fallthrough...
+ case dk.HOME:
+ newValue = new this.dateClassObj(newValue);
+ newValue.setDate(1);
+ break;
+ case dk.ENTER:
+ case dk.SPACE:
+ if(evt.shiftKey && this.previouslySelectedDay){
+ this.selectingRange = true;
+ this.set('endRange', newValue);
+ this._selectRange();
+ }else{
+ this.selectingRange = false;
+ this.toggleDate(newValue,[],[]);
+ //We record the selected date as the previous one
+ //In case we are selecting the first date of a range
+ this.previouslySelectedDay = newValue;
+ this.previousRangeStart = null;
+ this.previousRangeEnd = null;
+ this.onValueSelected([dojo.date.stamp.toISOString(newValue).substring(0,10)]);
+
+ }
+ break;
+ default:
+ return true;
+ }
+
+ if(interval){
+ newValue = this.dateFuncObj.add(newValue, interval, increment);
+ }
+
+ this.set("currentFocus", newValue);
+
+ return false;
+ },
+
+ _onKeyPress: function(/*Event*/ evt){
+ // summary:
+ // For handling keypress events on a stand alone calendar
+ if(!this.handleKey(evt)){
+ dojo.stopEvent(evt);
+ }
+ },
+
+ _removeFromRangeLTR : function(/*date*/ beginning, /*date*/ end, /*array*/selectedDates, /*array*/unselectedDates){
+ //In this method we remove some dates from a range from left to right
+ difference = Math.abs(dojo.date.difference(beginning, end, "day"));
+ for(var i = 0; i <= difference; i++){
+ var nextDay = dojo.date.add(beginning, 'day',i);
+ this.toggleDate(nextDay, selectedDates, unselectedDates);
+ }
+ if(this.previousRangeEnd == null){
+ //necessary to keep track of the previous range's end date
+ this.previousRangeEnd = end;
+ }else{
+ if(dojo.date.compare(end, this.previousRangeEnd, 'date') > 0 )
+ this.previousRangeEnd = end;
+ }
+ if(this.previousRangeStart == null){
+ //necessary to keep track of the previous range's start date
+ this.previousRangeStart = end;
+ }else{
+ if(dojo.date.compare(end, this.previousRangeStart, 'date') > 0 )
+ this.previousRangeStart = end;
+ }
+ this.previouslySelectedDay = dojo.date.add(nextDay, 'day',1);
+ },
+ _removeFromRangeRTL : function(/*date*/ beginning, /*date*/ end, /*array*/selectedDates, /*array*/unselectedDates){
+ //If the end of the range is earlier than the beginning (back in time),
+ //we are going to start from the end and move backward
+
+ difference = Math.abs(dojo.date.difference(beginning, end, "day"));
+ for(var i = 0; i <= difference; i++){
+ var nextDay = dojo.date.add(beginning, 'day',-i);
+ this.toggleDate(nextDay, selectedDates, unselectedDates);
+ }
+ if(this.previousRangeEnd == null){
+ this.previousRangeEnd = end;
+ }else{
+ if(dojo.date.compare(end, this.previousRangeEnd, 'date') < 0 ){
+ this.previousRangeEnd = end;
+ }
+ }
+ if(this.previousRangeStart == null){
+ this.previousRangeStart = end;
+ }else{
+ if(dojo.date.compare(end, this.previousRangeStart, 'date') < 0 ){
+ this.previousRangeStart = end;
+ }
+ }
+ this.previouslySelectedDay = dojo.date.add(nextDay, 'day',-1);
+ },
+ _addToRangeRTL : function(/*date*/ beginning, /*date*/ end, /*array*/selectedDates, /*array*/unselectedDates){
+
+ difference = Math.abs(dojo.date.difference(beginning, end, "day"));
+ //If the end of the range is earlier than the beginning (back in time),
+ //we are going to start from the end and move backward
+ for(var i = 1; i <= difference; i++){
+ var nextDay = dojo.date.add(beginning, 'day',-i);
+ this.toggleDate(nextDay, selectedDates, unselectedDates);
+ }
+
+ if(this.previousRangeStart == null){
+ this.previousRangeStart = end;
+ }else{
+ if(dojo.date.compare(end, this.previousRangeStart, 'date') < 0 ){
+ this.previousRangeStart = end;
+ }
+ }
+ if(this.previousRangeEnd == null){
+ this.previousRangeEnd = beginning;
+ }else{
+ if(dojo.date.compare(beginning, this.previousRangeEnd, 'date') > 0 ){
+ this.previousRangeEnd = beginning;
+ }
+ }
+ this.previouslySelectedDay = nextDay;
+ },
+ _addToRangeLTR : function(/*date*/ beginning, /*date*/ end, /*array*/selectedDates, /*array*/unselectedDates){
+ //If the end of the range is later than the beginning,
+ //adding dates from left to right
+ difference = Math.abs(dojo.date.difference(beginning, end, "day"));
+ for(var i = 1; i <= difference; i++){
+ var nextDay = dojo.date.add(beginning, 'day',i);
+ this.toggleDate(nextDay, selectedDates, unselectedDates);
+ }
+ if(this.previousRangeStart == null){
+ this.previousRangeStart = beginning;
+ }else{
+ if(dojo.date.compare(beginning, this.previousRangeStart, 'date') < 0 ){
+ this.previousRangeStart = beginning;
+ }
+ }
+ if(this.previousRangeEnd == null){
+ this.previousRangeEnd = end;
+ }else{
+ if(dojo.date.compare(end, this.previousRangeEnd, 'date') > 0 ){
+ this.previousRangeEnd = end;
+ }
+ }
+ this.previouslySelectedDay = nextDay;
+ },
+ _selectRange : function(){
+ //This method will toggle the dates in the selected range.
+ var selectedDates = []; //Will gather the list of ISO dates that are selected
+ var unselectedDates = []; //Will gather the list of ISO dates that are unselected
+ var beginning = this.previouslySelectedDay;
+ var end = this.get('endRange');
+
+ if(!this.previousRangeStart && !this.previousRangeEnd){
+ removingFromRange = false;
+ }else{
+ if((dojo.date.compare(end, this.previousRangeStart, 'date') < 0) || (dojo.date.compare(end, this.previousRangeEnd, 'date') > 0)){
+ //We are adding to range
+ removingFromRange = false;
+ }else{// Otherwise we are removing from the range
+ removingFromRange = true;
+ }
+ }
+ if(removingFromRange == true){
+ if(dojo.date.compare(end, beginning, 'date') < 0){
+ //We are removing from the range, starting from the end (Right to left)
+ this._removeFromRangeRTL(beginning, end, selectedDates, unselectedDates);
+ }else{
+ //The end of the range is later in time than the beginning: We go from left to right
+ this._removeFromRangeLTR(beginning, end, selectedDates, unselectedDates);
+ }
+ }else{
+ //We are adding to the range
+ if(dojo.date.compare(end, beginning, 'date') < 0){
+ this._addToRangeRTL(beginning, end, selectedDates, unselectedDates);
+ }else{
+ this._addToRangeLTR(beginning, end, selectedDates, unselectedDates);
+ }
+ }
+ //We call the extension point with the changed dates
+ if(selectedDates.length > 0){
+ this.onValueSelected(selectedDates);
+ }
+ if(unselectedDates.length > 0){
+ this.onValueUnselected(unselectedDates);
+ }
+ this.rangeJustSelected = true; //Indicates that we just selected a range.
+ },
+
+ onValueSelected: function(/*array of ISO dates*/ dates){
+ // summary:
+ // Notification that a date cell or more were selected.
+ // description:
+ // Passes on the list of ISO dates that are selected
+ // tags:
+ // protected
+ },
+
+ onValueUnselected: function(/*array of ISO dates*/ dates){
+ // summary:
+ // Notification that a date cell or more were unselected.
+ // description:
+ // Passes on the list of ISO dates that are unselected
+ // tags:
+ // protected
+ },
+ onChange: function(/*Date*/ date){
+ // summary:
+ // Called only when the selected date has changed
+ },
+
+ _isSelectedDate: function(/*Date*/ dateObject, /*String?*/ locale){
+ // summary:
+ // Returns true if the passed date is part of the selected dates of the calendar
+
+ dateIndex = dojo.date.stamp.toISOString(dateObject).substring(0,10);
+ return this.value[dateIndex];
+ },
+
+ isDisabledDate: function(/*Date*/ dateObject, /*String?*/ locale){
+ // summary:
+ // May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+ // tags:
+ // extension
+/*=====
+ return false; // Boolean
+=====*/
+ },
+
+ getClassForDate: function(/*Date*/ dateObject, /*String?*/ locale){
+ // summary:
+ // May be overridden to return CSS classes to associate with the date entry for the given dateObject,
+ // for example to indicate a holiday in specified locale.
+ // tags:
+ // extension
+
+/*=====
+ return ""; // String
+=====*/
+ },
+ _sort : function(){
+ //This function returns a sorted version of the value array that represents the selected dates.
+ if(this.value == {}){return [];}
+ //We create an array of date objects with the dates that were selected by the user.
+ var selectedDates = [];
+ for (var selDate in this.value){
+ selectedDates.push(selDate);
+ }
+ //Actual sorting
+ selectedDates.sort(function(a, b){
+ var dateA=new Date(a), dateB=new Date(b);
+ return dateA-dateB;
+ });
+ return selectedDates;
+ },
+ _returnDatesWithIsoRanges : function(selectedDates /*Array of sorted ISO dates*/){
+ //this method receives a sorted array of dates and returns an array of dates and date ranges where
+ //such range exist. For instance when passed with selectedDates = ['2010-06-14', '2010-06-15', '2010-12-25']
+ //it would return [2010-06-14/2010-06-15, '2010-12-25']
+ var returnDates = [];
+ if(selectedDates.length > 1){
+ //initialisation
+ var weHaveRange = false,
+ rangeCount = 0,
+ startRange = null,
+ lastDayRange = null,
+ previousDate = dojo.date.stamp.fromISOString(selectedDates[0]);
+
+ for(var i = 1; i < selectedDates.length+1; i++){
+ currentDate = dojo.date.stamp.fromISOString(selectedDates[i]);
+ if(weHaveRange){
+ //We are in the middle of a range
+ difference = Math.abs(dojo.date.difference(previousDate, currentDate, "day"));
+ if(difference == 1){
+ //we continue with the range
+ lastDayRange = currentDate;
+ }else{
+ //end of the range, reset variables for maybe the next range..
+ range = dojo.date.stamp.toISOString(startRange).substring(0,10)
+ + "/" + dojo.date.stamp.toISOString(lastDayRange).substring(0,10);
+ returnDates.push(range);
+ weHaveRange = false;
+ }
+ }else{
+ //We are not in a range to begin with
+ difference = Math.abs(dojo.date.difference(previousDate, currentDate, "day"));
+ if(difference == 1){
+ //These are two consecutive dates: This is a range!
+ weHaveRange = true;
+ startRange = previousDate;
+ lastDayRange = currentDate;
+ }else{
+ //this is a standalone date
+ returnDates.push(dojo.date.stamp.toISOString(previousDate).substring(0,10));
+ }
+ }
+ previousDate = currentDate;
+ }
+ return returnDates;
+ }else{
+ //If there's only one selected date we return only it
+ return selectedDates;
+ }
+ }
+ }
+);
+
+//FIXME: can we use dijit.Calendar._MonthDropDown directly?
+dojo.declare("dojox.widget._MonthDropDown", [dijit._Widget, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin], {
+ // summary:
+ // The month drop down
+
+ // months: String[]
+ // List of names of months, possibly w/some undefined entries for Hebrew leap months
+ // (ex: ["January", "February", undefined, "April", ...])
+ months: [],
+
+ templateString: "<div class='dijitCalendarMonthMenu dijitMenu' " +
+ "dojoAttachEvent='onclick:_onClick,onmouseover:_onMenuHover,onmouseout:_onMenuHover'></div>",
+
+ _setMonthsAttr: function(/*String[]*/ months){
+ this.domNode.innerHTML = dojo.map(months, function(month, idx){
+ return month ? "<div class='dijitCalendarMonthLabel' month='" + idx +"'>" + month + "</div>" : "";
+ }).join("");
+ },
+
+ _onClick: function(/*Event*/ evt){
+ this.onChange(dojo.attr(evt.target, "month"));
+ },
+
+ onChange: function(/*Number*/ month){
+ // summary:
+ // Callback when month is selected from drop down
+ },
+
+ _onMenuHover: function(evt){
+ dojo.toggleClass(evt.target, "dijitCalendarMonthLabelHover", evt.type == "mouseover");
+ }
+});
+
+return dojox.widget.MultiSelectCalendar;
+});
diff --git a/js/dojo-1.7.2/dojox/widget/MultiSelectCalendar/MultiSelectCalendar.html b/js/dojo-1.7.2/dojox/widget/MultiSelectCalendar/MultiSelectCalendar.html
new file mode 100644
index 0000000..15294bd
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/MultiSelectCalendar/MultiSelectCalendar.html
@@ -0,0 +1,38 @@
+<table cellspacing="0" cellpadding="0" class="dijitCalendarContainer" role="grid" dojoAttachEvent="onkeypress: _onKeyPress" aria-labelledby="${id}_year">
+ <thead>
+ <tr class="dijitReset dijitCalendarMonthContainer" valign="top">
+ <th class='dijitReset dijitCalendarArrow' dojoAttachPoint="decrementMonth">
+ <img src="${_blankGif}" alt="" class="dijitCalendarIncrementControl dijitCalendarDecrease" role="presentation"/>
+ <span dojoAttachPoint="decreaseArrowNode" class="dijitA11ySideArrow">-</span>
+ </th>
+ <th class='dijitReset' colspan="5">
+ <div dojoType="dijit.form.DropDownButton" dojoAttachPoint="monthDropDownButton"
+ id="${id}_mddb" tabIndex="-1">
+ </div>
+ </th>
+ <th class='dijitReset dijitCalendarArrow' dojoAttachPoint="incrementMonth">
+ <img src="${_blankGif}" alt="" class="dijitCalendarIncrementControl dijitCalendarIncrease" role="presentation"/>
+ <span dojoAttachPoint="increaseArrowNode" class="dijitA11ySideArrow">+</span>
+ </th>
+ </tr>
+ <tr>
+ <th class="dijitReset dijitCalendarDayLabelTemplate" role="columnheader"><span class="dijitCalendarDayLabel"></span></th>
+ </tr>
+ </thead>
+ <tbody dojoAttachEvent="onclick: _onDayClick, onmouseover: _onDayMouseOver, onmouseout: _onDayMouseOut, onmousedown: _onDayMouseDown, onmouseup: _onDayMouseUp" class="dijitReset dijitCalendarBodyContainer">
+ <tr class="dijitReset dijitCalendarWeekTemplate" role="row">
+ <td class="dijitReset dijitCalendarDateTemplate" role="gridcell"><span class="dijitCalendarDateLabel"></span></td>
+ </tr>
+ </tbody>
+ <tfoot class="dijitReset dijitCalendarYearContainer">
+ <tr>
+ <td class='dijitReset' valign="top" colspan="7">
+ <h3 class="dijitCalendarYearLabel">
+ <span dojoAttachPoint="previousYearLabelNode" class="dijitInline dijitCalendarPreviousYear"></span>
+ <span dojoAttachPoint="currentYearLabelNode" class="dijitInline dijitCalendarSelectedYear" id="${id}_year"></span>
+ <span dojoAttachPoint="nextYearLabelNode" class="dijitInline dijitCalendarNextYear"></span>
+ </h3>
+ </td>
+ </tr>
+ </tfoot>
+</table> \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/Pager.js b/js/dojo-1.7.2/dojox/widget/Pager.js
new file mode 100644
index 0000000..1a2a291
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager.js
@@ -0,0 +1,555 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/Pager", ["dijit","dojo","dojox","dojo/require!dijit/_Widget,dijit/_Templated,dojo/fx"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.Pager");
+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],
+ {
+ // summary: A Pager, displaying a list of sized nodes
+
+
+ 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=\"${orientation}PagerView\">\n\t\t <div dojoAttachPoint=\"pagerItemContainer\"><ul dojoAttachPoint=\"pagerItems\" class=\"pagerItems\"></ul></div>\n\t\t</div>\n\t\t<div dojoAttachPoint=\"pagerContainerPager\" class=\"${orientation}PagerPager\">\n\t\t\t<div tabIndex=\"0\" dojoAttachPoint=\"pagerNext\" class=\"pagerIconContainer\" dojoAttachEvent=\"onclick: _pagerNext\"><img dojoAttachPoint=\"pagerIconNext\" src=\"${iconNext}\" alt=\"Next\" /></div>\n\t\t\t<div tabIndex=\"0\" dojoAttachPoint=\"pagerPrevious\" class=\"pagerIconContainer\" dojoAttachEvent=\"onclick: _pagerPrevious\"><img dojoAttachPoint=\"pagerIconPrevious\" src=\"${iconPrevious}\" alt=\"Previous\" /></div>\n\t\t</div>\n </div>\n\t<div dojoAttachPoint=\"containerNode\" style=\"display:none\"></div>\n</div>"),
+
+/*=====
+ // iconPrevious: String?
+ // The url of the previous page icon
+ iconPrevious: "",
+
+ // iconNext: String?
+ // The url of the next page icon
+ iconNext: "",
+=====*/
+
+ iconPage: dojo.moduleUrl("dojox.widget", "Pager/images/pageInactive.png"),
+ iconPageActive: dojo.moduleUrl("dojox.widget", "Pager/images/pageActive.png"),
+
+ // store: Object
+ // A dojo.data Data store
+ store: null, // data store for items
+
+ // orientation: String
+ // Either "horizontal or "vertical" to define the direction the pages will slide
+ orientation: "horizontal", // or vertical
+
+ // statusPos: String
+ // A string describing where to put the Pager "current page" indicator. Options are
+ // "leading" or "trailing". In the case of horiztonal orientation, "leading" indicates
+ // positioned above the PageItems. In the case of vertical, "leading" indicates "before".
+ statusPos: "leading",
+
+ // pagerPos: String
+ // TODOC
+ pagerPos: "center",
+
+ // duration: Integer
+ // Time in milliseconds to transition the pages
+ duration: 500,
+
+ // itemSpace: Integer
+ // Spacing between items? TODOC
+ itemSpace: 2,
+
+ // resizeChildren: Boolean
+ // TODOC
+ resizeChildren: true,
+
+ // itemClass: String
+ // The full dotted named of a Class to use for the internal Pager Items.
+ itemClass: "dojox.widget._PagerItem",
+
+ // itemsPage: Integer
+ // The numbers of items to display in each "Page"
+ itemsPage: 3,
+
+ postMixInProperties: function(){
+ 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(){
+ this.inherited(arguments);
+ //this.connect(this.domNode,"onkeypress","_handleKey");
+ this.store.fetch({
+ onComplete: dojo.hitch(this, "_init")
+ });
+
+ },
+
+ _a11yStyle: function(e){
+ // summary: top level onfocus/onblur listen to set a class "pagerFocus" on some node
+ // and remove it onblur
+ dojo[(e.type == "focus" ? "addClass" : "removeClass")](e.target,"pagerFocus");
+ },
+
+ _handleKey: function(e){
+ // summary: Handle keyboard navigation internally
+
+ var dk = dojo.keys;
+ var key = (e.charCode == dk.SPACE ? dk.SPACE : e.keyCode);
+ switch(key){
+
+ case dk.UP_ARROW:
+ case dk.RIGHT_ARROW:
+ case 110:
+ case 78: // key "n"
+ e.preventDefault();
+ this._pagerNext();
+ break;
+
+ case dk.DOWN_ARROW:
+ case dk.LEFT_ARROW:
+ case 112:
+ case 80: // key "p"
+ e.preventDefault();
+ this._pagerPrevious();
+ break;
+
+ case dk.ENTER:
+ switch(e.target){
+ case this.pagerNext : this._pagerNext(); break;
+ case this.pagerPrevious : this._pagerPrevious(); break;
+ }
+ break;
+ }
+ },
+
+ _init: function(items) {
+ this.items = items;
+ this._renderPages();
+ this._renderStatus();
+ this._renderPager();
+ },
+
+ _renderPages: function(){
+ var pcv = this.pagerContainerView;
+ var _h = (this.orientation == "horizontal");
+ var style = dojo.style;
+ if(_h){
+
+ var pagerH = dojo.marginBox(this.pagerContainerPager).h;
+ var statusH = dojo.marginBox(this.pagerContainerStatus).h;
+ if (this.pagerPos != 'center'){
+ var addonHeight = pagerH+statusH;
+ }else{
+ var addonHeight = statusH;
+ var widthSub = this.pagerIconNext.width;
+ var containerWidth = style(pcv, 'width');
+ var newWidth = containerWidth-(2*widthSub);
+ style(pcv, {
+ width: newWidth+'px',
+ marginLeft: this.pagerIconNext.width+'px',
+ marginRight: this.pagerIconNext.width+'px'
+ });
+ }
+ var totalH = style(this.pagerContainer, 'height') - addonHeight;
+ style(this.pagerContainerView, 'height', totalH+'px');
+
+ var itemSpace = Math.floor(style(pcv, 'width') / this.itemsPage);
+ if(this.statusPos == 'trailing'){
+ if(this.pagerPos != 'center'){
+ style(pcv, 'marginTop', pagerH+'px');
+ }
+ style(pcv, 'marginBottom', statusH+'px');
+ }else{
+ style(pcv, 'marginTop', statusH+'px');
+ if (this.pagerPos != 'center'){
+ style(pcv, 'marginTop', pagerH+'px');
+ }
+ }
+
+ }else{
+
+ var pagerW = dojo.marginBox(this.pagerContainerPager).w;
+ var statusW = dojo.marginBox(this.pagerContainerStatus).w;
+ var containerW = style(this.pagerContainer, 'width');
+ if(this.pagerPos != 'center'){
+ var addonWidth = pagerW + statusW;
+ }else{
+ var addonWidth = statusW;
+ var heightSub = this.pagerIconNext.height;
+ var containerHeight = style(pcv, 'height');
+ var newHeight = containerHeight - (2 * heightSub);
+ style(pcv,{
+ height: newHeight+'px',
+ marginTop: this.pagerIconNext.height+'px',
+ marginBottom: this.pagerIconNext.height+'px'
+ });
+ }
+ var totalW = style(this.pagerContainer, 'width') - addonWidth;
+ style(pcv, 'width', totalW+'px');
+
+ var itemSpace = Math.floor(style(pcv, 'height') / this.itemsPage);
+ if(this.statusPos == 'trailing'){
+ if (this.pagerPos != 'center'){
+ style(pcv, 'marginLeft', pagerW + 'px');
+ }
+ style(pcv, 'marginRight', statusW + 'px');
+ }else{
+ style(pcv, 'marginLeft', statusW + 'px');
+ if(this.pagerPos != 'center'){
+ style(pcv, 'marginRight', pagerW+'px');
+ }
+ }
+ }
+
+ var _PagerItem = dojo.getObject(this.itemClass);
+ var paddingLead = "padding" + (_h ? "Left" : "Top");
+ var paddingTrail = "padding" + (_h ? "Right" : "Bottom");
+
+ dojo.forEach(this.items, function(item, cnt){
+
+ var contentContainer = dojo.create('div', {
+ innerHTML: item.content
+ });
+
+ var pagerItem = new _PagerItem({
+ id: this.id + '-item-' + (cnt + 1)
+ }, contentContainer);
+
+ this.pagerItems.appendChild(pagerItem.domNode);
+
+ var containerProps = {};
+ containerProps[(_h ? "width" : "height")] = (itemSpace - this.itemSpace) + "px";
+ var p = (_h ? "height" : "width");
+ containerProps[p] = style(pcv, p) + "px";
+ style(pagerItem.containerNode, containerProps);
+
+ if(this.resizeChildren){
+ pagerItem.resizeChildren();
+ }
+ pagerItem.parseChildren();
+
+ // only display amount of items as defined in itemsPage
+ style(pagerItem.domNode, "position", "absolute");
+
+ if (cnt < this.itemsPage){
+ var pos = (cnt) * itemSpace;
+ var trailingDir = (_h ? "left" : "top");
+ var dir = (_h ? "top" : "left");
+ style(pagerItem.domNode, dir, "0px");
+ style(pagerItem.domNode, trailingDir, pos+"px");
+ }else{
+ style(pagerItem.domNode, "top", "-1000px");
+ style(pagerItem.domNode, "left", "-1000px");
+ }
+
+ style(pagerItem.domNode, paddingTrail, (this.itemSpace/2)+"px");
+ style(pagerItem.domNode, paddingLead, (this.itemSpace/2)+"px");
+
+ }, this);
+ },
+
+ _renderPager: function() {
+ var tcp = this.pagerContainerPager;
+ var zero = "0px";
+ var _h = (this.orientation == "horizontal");
+ if(_h){
+
+ if(this.statusPos == 'center'){
+
+ }else if (this.statusPos == 'trailing'){
+ dojo.style(tcp, 'top', zero);
+ }else{
+ dojo.style(tcp, 'bottom', zero);
+ }
+ dojo.style(this.pagerNext, 'right', zero);
+ dojo.style(this.pagerPrevious, 'left', zero);
+
+ }else{
+
+ if (this.statusPos == 'trailing'){
+ dojo.style(tcp, 'left', zero);
+ }else{
+ dojo.style(tcp, 'right', zero);
+ }
+ dojo.style(this.pagerNext, 'bottom', zero);
+ dojo.style(this.pagerPrevious, 'top', zero);
+ }
+
+ },
+
+ _renderStatus: function() {
+ this._totalPages = Math.ceil(this.items.length / this.itemsPage);
+ // FIXME!!
+ this.iconWidth = 0;
+ this.iconHeight = 0;
+ this.iconsLoaded = 0;
+ this._iconConnects = [];
+
+ for (var i = 1; i <= this._totalPages; i++){
+ var icon = new Image();
+
+ var pointer = i;
+ dojo.connect(icon, 'onclick', dojo.hitch(this, function(pointer) {
+ this._pagerSkip(pointer);
+ }, pointer));
+
+ this._iconConnects[pointer] = dojo.connect(icon, 'onload', dojo.hitch(this,function(pointer){
+ this.iconWidth += icon.width;
+ this.iconHeight += icon.height;
+ this.iconsLoaded++;
+
+ if (this._totalPages == this.iconsLoaded){
+ if (this.orientation == "horizontal"){
+ if (this.statusPos == 'trailing'){
+ if (this.pagerPos == 'center'){
+ var containerHeight = dojo.style(this.pagerContainer, 'height');
+ var statusHeight = dojo.style(this.pagerContainerStatus, 'height');
+ dojo.style(this.pagerContainerPager, 'top', ((containerHeight/2)-(statusHeight/2))+'px');
+ }
+ dojo.style(this.pagerContainerStatus, 'bottom', '0px');
+ }else{
+ if (this.pagerPos == 'center'){
+ var containerHeight = dojo.style(this.pagerContainer, 'height');
+ var statusHeight = dojo.style(this.pagerContainerStatus, 'height');
+ dojo.style(this.pagerContainerPager, 'bottom', ((containerHeight/2)-(statusHeight/2))+'px');
+ }
+ dojo.style(this.pagerContainerStatus, 'top', '0px');
+ }
+
+ var position = (dojo.style(this.pagerContainer, 'width')/2)-(this.iconWidth/2);
+ dojo.style(this.pagerContainerStatus, 'paddingLeft', position+'px');
+ }else{
+ if (this.statusPos == 'trailing'){
+ if (this.pagerPos == 'center'){
+ var containerWidth = dojo.style(this.pagerContainer, 'width');
+ var statusWidth = dojo.style(this.pagerContainerStatus, 'width');
+ dojo.style(this.pagerContainerPager, 'left', ((containerWidth/2)-(statusWidth/2))+'px');
+ }
+ dojo.style(this.pagerContainerStatus, 'right', '0px');
+ }else{
+ if (this.pagerPos == 'center'){
+ var containerWidth = dojo.style(this.pagerContainer, 'width');
+ var statusWidth = dojo.style(this.pagerContainerStatus, 'width');
+ dojo.style(this.pagerContainerPager, 'right', ((containerWidth/2)-(statusWidth/2))+'px');
+ }
+ dojo.style(this.pagerContainerStatus, 'left', '0px');
+ }
+ var position = (dojo.style(this.pagerContainer, 'height')/2)-(this.iconHeight/2);
+ dojo.style(this.pagerContainerStatus, 'paddingTop', position+'px');
+ }
+ }
+ dojo.disconnect(this._iconConnects[pointer]);
+ }, pointer));
+
+ if (i==this._currentPage){
+ icon.src=this.iconPageActive;
+ }else{
+ icon.src=this.iconPage;
+ }
+ var pointer = i;
+
+ dojo.addClass(icon, this.orientation+'PagerIcon');
+ dojo.attr(icon, 'id', this.id+'-status-'+i);
+ this.pagerContainerStatus.appendChild(icon);
+
+ if (this.orientation == "vertical"){
+ dojo.style(icon, 'display', 'block');
+ }
+ }
+ },
+
+ _pagerSkip: function(page){
+ if (this._currentPage == page){
+ return;
+ }else{
+ // calculate whether to go left or right, take shortest way
+ var distanceP; var distanceN;
+ if (page < this._currentPage){
+ distanceP = this._currentPage - page;
+ distanceN = (this._totalPages + page) - this._currentPage;
+ }else{
+ distanceP = (this._totalPages + this._currentPage) - page;
+ distanceN = page - this._currentPage;
+ }
+
+ var b = (distanceN > distanceP);
+ this._toScroll = (b ? distanceP : distanceN);
+ var cmd = (b ? "_pagerPrevious" : "_pagerNext");
+ var connect = this.connect(this, "onScrollEnd", function(){
+ this._toScroll--;
+ if(this._toScroll < 1){
+ this.disconnect(connect);
+ }else{
+ this[cmd]();
+ }
+ });
+ this[cmd]();
+
+ }
+ },
+
+ _pagerNext: function(){
+ if(this._anim) return;
+
+ /**
+ * fade slide out current items
+ * make sure that next items are ligned up nicely before sliding them in
+ */
+ var _anims = [];
+ for (var i = this._currentPage * this.itemsPage; i > (this._currentPage - 1) * this.itemsPage; i--){
+ if (!dojo.byId(this.id+'-item-'+i)) continue;
+
+ var currentItem = dojo.byId(this.id+'-item-'+i);
+ var marginBox = dojo.marginBox(currentItem);
+ if (this.orientation == "horizontal") {
+ var move = marginBox.l - (this.itemsPage * marginBox.w);
+ _anims.push(dojo.fx.slideTo({node: currentItem, left: move, duration: this.duration}));
+ }else{
+ var move = marginBox.t - (this.itemsPage * marginBox.h);
+ _anims.push(dojo.fx.slideTo({node: currentItem, top: move, duration: this.duration}));
+ }
+
+ }
+ var previousPage = this._currentPage;
+ if (this._currentPage == this._totalPages){
+ this._currentPage = 1;
+ }else{
+ 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 currentItem = dojo.byId(this.id+'-item-'+i);
+ var marginBox = dojo.marginBox(currentItem);
+ if (this.orientation == "horizontal") {
+ var newPos = (dojo.style(this.pagerContainerView, 'width')+((cnt-1)*marginBox.w))-1;
+ dojo.style(currentItem, 'left', newPos+'px');
+ dojo.style(currentItem, 'top', '0px');
+
+ var move = newPos-(this.itemsPage*marginBox.w);
+ _anims.push(dojo.fx.slideTo({node: currentItem, left: move, duration: this.duration}));
+ }else{
+ newPos = (dojo.style(this.pagerContainerView, 'height')+((cnt-1)*marginBox.h))-1;
+ dojo.style(currentItem, 'top', newPos+'px');
+ dojo.style(currentItem, 'left', '0px');
+
+ var move = newPos-(this.itemsPage*marginBox.h);
+ _anims.push(dojo.fx.slideTo({ node: currentItem, top: move, duration: this.duration}));
+ }
+ }
+ cnt--;
+ }
+
+ this._anim = dojo.fx.combine(_anims);
+ var animConnect = this.connect(this._anim, "onEnd", function(){
+ delete this._anim;
+ this.onScrollEnd();
+ this.disconnect(animConnect);
+ });
+ this._anim.play();
+
+ // set pager icons
+ dojo.byId(this.id+'-status-'+previousPage).src = this.iconPage;
+ dojo.byId(this.id+'-status-'+this._currentPage).src = this.iconPageActive;
+ },
+
+ _pagerPrevious: function(){
+ if(this._anim) return;
+
+ var _anims = [];
+ for (var i=this._currentPage*this.itemsPage; i>(this._currentPage-1)*this.itemsPage; i--){
+ if (!dojo.byId(this.id+'-item-'+i)) continue;
+
+ var currentItem = dojo.byId(this.id+'-item-'+i);
+ var marginBox = dojo.marginBox(currentItem);
+ if (this.orientation == "horizontal") {
+ var move = dojo.style(currentItem, 'left')+(this.itemsPage*marginBox.w);
+ _anims.push(dojo.fx.slideTo({node: currentItem, left: move, duration: this.duration}));
+ }else{
+ var move = dojo.style(currentItem, 'top')+(this.itemsPage*marginBox.h);
+ _anims.push(dojo.fx.slideTo({node: currentItem, top: move, duration: this.duration}));
+ }
+ }
+
+ var previousPage = this._currentPage;
+ if (this._currentPage == 1){
+ this._currentPage = this._totalPages;
+ }else{
+ this._currentPage--;
+ }
+
+ 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 currentItem = dojo.byId(this.id+'-item-'+i);
+ var marginBox = dojo.marginBox(currentItem);
+
+ if (this.orientation == "horizontal") {
+ var newPos = -(j * marginBox.w) + 1;
+ dojo.style(currentItem, 'left', newPos+'px');
+ dojo.style(currentItem, 'top', '0px');
+
+ var move = ((cnt - 1) * marginBox.w);
+ _anims.push(dojo.fx.slideTo({node: currentItem, left: move, duration: this.duration}));
+
+ var move = newPos+(this.itemsPage * marginBox.w);
+ _anims.push(dojo.fx.slideTo({node: currentItem, left: move, duration: this.duration}));
+ }else{
+ newPos = -((j * marginBox.h) + 1);
+ dojo.style(currentItem, 'top', newPos+'px');
+ dojo.style(currentItem, 'left', '0px');
+
+ var move = ((cnt - 1) * marginBox.h);
+ _anims.push(dojo.fx.slideTo({node: currentItem, top: move, duration: this.duration}));
+ }
+
+ }
+ cnt--;
+ j++;
+ }
+
+ this._anim = dojo.fx.combine(_anims);
+ var animConnect = dojo.connect(this._anim, "onEnd", dojo.hitch(this, function(){
+ delete this._anim;
+ this.onScrollEnd();
+ dojo.disconnect(animConnect);
+ }));
+ this._anim.play();
+
+ // set pager icons
+ dojo.byId(this.id + '-status-' + previousPage).src = this.iconPage;
+ dojo.byId(this.id + '-status-' + this._currentPage).src = this.iconPageActive;
+
+ },
+
+ onScrollEnd: function(){
+ // summary: Stub Function. Fired after the slide is complete. Override or connect.
+ }
+
+});
+
+dojo.declare("dojox.widget._PagerItem",
+ [dijit._Widget, dijit._Templated],
+ {
+
+ templateString: '<li class="pagerItem" dojoAttachPoint="containerNode"></li>',
+
+ resizeChildren: function(){
+ var box = dojo.marginBox(this.containerNode);
+ dojo.style(this.containerNode.firstChild, {
+ width: box.w +'px',
+ height: box.h + 'px'
+ });
+ },
+
+ parseChildren: function(){
+ dojo.parser.parse(this.containerNode);
+ }
+});
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Pager/Pager.css b/js/dojo-1.7.2/dojox/widget/Pager/Pager.css
new file mode 100644
index 0000000..e6bb23b
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager/Pager.css
@@ -0,0 +1,92 @@
+.pagerContainer {
+ position: relative;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+ /* FIXME: need basline styles for tundra, soria, and nihilo */
+ border:1px solid #ccc;
+ -moz-border-radius:6pt;
+ -webkit-border-radius:7pt;
+}
+
+/* Horizontal classes */
+
+.horizontalPagerPager {
+ position: absolute;
+ height: 12px;
+ width: 100%;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+
+.horizontalPagerStatus {
+ position: absolute;
+ height: 10px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ width: 100%;
+}
+
+.horizontalPagerView {
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+}
+
+.horizontalPagerIcon {
+ cursor: pointer;
+}
+
+/* Vertical classes */
+
+.verticalPagerPager {
+ position: absolute;
+ width: 12px;
+ height: 100%;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.verticalPagerStatus {
+ position: absolute;
+ width: 10px;
+ padding-left: 5px;
+ padding-right: 5px;
+ height: 100%;
+}
+
+.verticalPagerView {
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+}
+
+.verticalPagerIcon {
+ cursor: pointer;
+}
+
+/* Misc. */
+
+.pagerIconContainer {
+ position: absolute;
+}
+
+.pagerIconContainer img {
+ cursor: pointer;
+}
+
+/* Items */
+
+.pagerItems {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.pagerItem {
+ overflow: hidden;
+ padding: 0;
+ margin: 0;
+} \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/Pager/Pager.html b/js/dojo-1.7.2/dojox/widget/Pager/Pager.html
new file mode 100644
index 0000000..3a7b3c7
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager/Pager.html
@@ -0,0 +1,13 @@
+<div dojoAttachPoint="pagerContainer" tabIndex="0" dojoAttachEvent="onkeypress: _handleKey, onfocus: _a11yStyle, onblur:_a11yStyle" class="${orientation}PagerContainer">
+ <div class="pagerContainer">
+ <div dojoAttachPoint="pagerContainerStatus" class="${orientation}PagerStatus"></div>
+ <div dojoAttachPoint="pagerContainerView" class="${orientation}PagerView">
+ <div dojoAttachPoint="pagerItemContainer"><ul dojoAttachPoint="pagerItems" class="pagerItems"></ul></div>
+ </div>
+ <div dojoAttachPoint="pagerContainerPager" class="${orientation}PagerPager">
+ <div tabIndex="0" dojoAttachPoint="pagerNext" class="pagerIconContainer" dojoAttachEvent="onclick: _pagerNext"><img dojoAttachPoint="pagerIconNext" src="${iconNext}" alt="Next" /></div>
+ <div tabIndex="0" dojoAttachPoint="pagerPrevious" class="pagerIconContainer" dojoAttachEvent="onclick: _pagerPrevious"><img dojoAttachPoint="pagerIconPrevious" src="${iconPrevious}" alt="Previous" /></div>
+ </div>
+ </div>
+ <div dojoAttachPoint="containerNode" style="display:none"></div>
+</div> \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/Pager/images/hNext.png b/js/dojo-1.7.2/dojox/widget/Pager/images/hNext.png
new file mode 100644
index 0000000..037503f
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager/images/hNext.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/Pager/images/hPrevious.png b/js/dojo-1.7.2/dojox/widget/Pager/images/hPrevious.png
new file mode 100644
index 0000000..3d4768a
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager/images/hPrevious.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/Pager/images/pageActive.png b/js/dojo-1.7.2/dojox/widget/Pager/images/pageActive.png
new file mode 100644
index 0000000..087d5bc
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager/images/pageActive.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/Pager/images/pageInactive.png b/js/dojo-1.7.2/dojox/widget/Pager/images/pageInactive.png
new file mode 100644
index 0000000..66ff3f4
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager/images/pageInactive.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/Pager/images/vNext.png b/js/dojo-1.7.2/dojox/widget/Pager/images/vNext.png
new file mode 100644
index 0000000..7a373b8
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager/images/vNext.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/Pager/images/vPrevious.png b/js/dojo-1.7.2/dojox/widget/Pager/images/vPrevious.png
new file mode 100644
index 0000000..8c497af
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Pager/images/vPrevious.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/PlaceholderMenuItem.js b/js/dojo-1.7.2/dojox/widget/PlaceholderMenuItem.js
new file mode 100644
index 0000000..66e724e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/PlaceholderMenuItem.js
@@ -0,0 +1,108 @@
+//>>built
+define("dojox/widget/PlaceholderMenuItem", ["dojo", "dijit", "dojox", "dijit/Menu","dijit/MenuItem"], function(dojo, dijit, dojox){
+dojo.experimental("dojox.widget.PlaceholderMenuItem");
+
+dojo.declare("dojox.widget.PlaceholderMenuItem", dijit.MenuItem, {
+ // summary:
+ // A menu item that can be used as a placeholder. Set the label
+ // of this item to a unique key and you can then use it to add new
+ // items at that location. This item is not displayed.
+
+ _replaced: false,
+ _replacedWith: null,
+ _isPlaceholder: true,
+
+ postCreate: function(){
+ this.domNode.style.display = "none";
+ this._replacedWith = [];
+ if(!this.label){
+ this.label = this.containerNode.innerHTML;
+ }
+ this.inherited(arguments);
+ },
+
+ replace: function(/*dijit.MenuItem[]*/ menuItems){
+ // summary:
+ // replaces this menu item with the given menuItems. The original
+ // menu item is not actually removed from the menu - so if you want
+ // it removed, you must do that explicitly.
+ // returns:
+ // true if the replace happened, false if not
+ if(this._replaced){ return false; }
+
+ var index = this.getIndexInParent();
+ if(index < 0){ return false; }
+
+ var p = this.getParent();
+
+ dojo.forEach(menuItems, function(item){
+ p.addChild(item, index++);
+ });
+ this._replacedWith = menuItems;
+
+ this._replaced = true;
+ return true;
+ },
+
+ unReplace: function(/*Boolean?*/ destroy){
+ // summary:
+ // Removes menu items added by calling replace(). It returns the
+ // array of items that were actually removed (in case you want to
+ // clean them up later)
+ // destroy:
+ // Also call destroy on any removed items.
+ // returns:
+ // The array of items that were actually removed
+
+ if(!this._replaced){ return []; }
+
+ var p = this.getParent();
+ if(!p){ return []; }
+
+ var r = this._replacedWith;
+ dojo.forEach(this._replacedWith, function(item){
+ p.removeChild(item);
+ if(destroy){
+ item.destroyRecursive();
+ }
+ });
+ this._replacedWith = [];
+ this._replaced = false;
+
+ return r; // dijit.MenuItem[]
+ }
+});
+
+// Se need to extend dijit.Menu so that we have a getPlaceholders function.
+dojo.extend(dijit.Menu, {
+ getPlaceholders: function(/*String?*/ label){
+ // summary:
+ // Returns an array of placeholders with the given label. There
+ // can be multiples.
+ // label:
+ // Label to search for - if not specified, then all placeholders
+ // are returned
+ // returns:
+ // An array of placeholders that match the given label
+ var r = [];
+
+ var children = this.getChildren();
+ dojo.forEach(children, function(child){
+ if(child._isPlaceholder && (!label || child.label == label)){
+ r.push(child);
+ }else if(child._started && child.popup && child.popup.getPlaceholders){
+ r = r.concat(child.popup.getPlaceholders(label));
+ }else if(!child._started && child.dropDownContainer){
+ var node = dojo.query("[widgetId]", child.dropDownContainer)[0];
+ var menu = dijit.byNode(node);
+ if(menu.getPlaceholders){
+ r = r.concat(menu.getPlaceholders(label));
+ }
+ }
+ }, this);
+ return r; // dojox.widget.PlaceholderMenuItem[]
+ }
+});
+
+return dojox.widget.PlaceholderMenuItem;
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Portlet.js b/js/dojo-1.7.2/dojox/widget/Portlet.js
new file mode 100644
index 0000000..dd6acfe
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Portlet.js
@@ -0,0 +1,435 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/Portlet", ["dijit","dojo","dojox","dojo/require!dijit/TitlePane,dojo/fx"], function(dijit,dojo,dojox){
+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],{
+ // summary: A container widget that is designed to be contained
+ // in a dojox.layout.GridContainer. Child widgets can insert
+ // an icon into the title bar of the Portlet, which when
+ // clicked, executes the "toggle" method of the child widget.
+ // A child widget must specify the attribute
+ // "portletIconClass", and the optional class
+ // "portletIconHoverClass", as well as the
+ // "toggle" function.
+
+ // resizeChildren: Boolean
+ // If true, when the Portlet is resized, any child widgets
+ // with a 'resize' method have that method called.
+ resizeChildren: true,
+
+ // closable: Boolean
+ // If true, a close button is placed in the title bar,
+ // and the Portlet can be hidden. If false, the Portlet
+ // cannot be closed.
+ closable: true,
+
+ // _parents: Array
+ // An array of all the StackContainer widgets that this Portlet
+ // is contained in. These are used to determine if the portlet
+ // is visible or not.
+ _parents: null,
+
+ // _size: Object
+ // Cache of the previous size of the portlet, used to determine
+ // if the size has changed and if the child widgets should be
+ // resized.
+ _size: null,
+
+ // dragRestriction: Boolean
+ // To remove the drag capability.
+ dragRestriction : false,
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ // Hide the portlet until it is fully constructed.
+ dojo.style(this.domNode, "visibility", "hidden");
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // Add the portlet classes
+ 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");
+
+ // Choose the class to add depending on if the portlet is draggable or not.
+ dojo.addClass(this.domNode, "dojoxPortlet-" + (!this.dragRestriction ? "movable" : "nonmovable"));
+
+ var _this = this;
+ if(this.resizeChildren){
+ // If children should be resized when the portlet size changes,
+ // listen for items being dropped, when the window is resized,
+ // or when another portlet's size changes.
+
+ this.subscribe("/dnd/drop", function(){_this._updateSize();});
+
+ this.subscribe("/Portlet/sizechange", function(widget){_this.onSizeChange(widget);});
+ this.connect(window, "onresize", function(){_this._updateSize();});
+
+ // Subscribe to all possible child-selection events that could affect this
+ // portlet
+ var doSelectSubscribe = dojo.hitch(this, function(id, lastId){
+ var widget = dijit.byId(id);
+ if(widget.selectChild){
+ var s = this.subscribe(id + "-selectChild", function(child){
+ var n = _this.domNode.parentNode;
+
+ while(n){
+ if(n == child.domNode){
+
+ // Only fire this once, as the widget is now visible
+ // at least once, so child measurements should be accurate.
+ _this.unsubscribe(s);
+ _this._updateSize();
+ break;
+ }
+ n = n.parentNode;
+ }
+ });
+
+ // Record the StackContainer and child widget that this portlet
+ // is in, so it can figure out whether or not it is visible.
+ // If it is not visible, it will not update it's size dynamically.
+ var child = dijit.byId(lastId);
+ if(widget && child){
+ _this._parents.push({parent: widget, child: child});
+ }
+ }
+ });
+ var lastId;
+ this._parents = [];
+
+ // Find all parent widgets, and if they are StackContainers,
+ // subscribe to their selectChild method calls.
+ for(var p = this.domNode.parentNode; p != null; p = p.parentNode){
+ var id = p.getAttribute ? p.getAttribute("widgetId") : null;
+ if(id){
+ doSelectSubscribe(id, lastId);
+ lastId = id;
+ }
+ }
+ }
+
+ // Prevent clicks on icons from causing a drag to start.
+ this.connect(this.titleBarNode, "onmousedown", function(evt){
+ if (dojo.hasClass(evt.target, "dojoxPortletIcon")) {
+ dojo.stopEvent(evt);
+ return false;
+ }
+ return true;
+ });
+
+ // Inform all portlets that the size of this one has changed,
+ // and therefore perhaps they have too
+ this.connect(this._wipeOut, "onEnd", function(){_this._publish();});
+ this.connect(this._wipeIn, "onEnd", function(){_this._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 children = this.getChildren();
+ this._placeSettingsWidgets();
+
+ // Start up the children
+ dojo.forEach(children, function(child){
+ try{
+ if(!child.started && !child._started){
+ child.startup()
+ }
+ }
+ catch(e){
+ console.log(this.id + ":" + this.declaredClass, e);
+ }
+ });
+
+ this.inherited(arguments);
+
+ //this._updateSize();
+ dojo.style(this.domNode, "visibility", "visible");
+ },
+
+ _placeSettingsWidgets: function(){
+ // summary: Checks all the children to see if they are instances
+ // of dojox.widget.PortletSettings. If they are,
+ // create an icon for them in the title bar which when clicked,
+ // calls their toggle() method.
+
+ dojo.forEach(this.getChildren(), dojo.hitch(this, function(child){
+ if(child.portletIconClass && child.toggle && !child.attr("portlet")){
+ this._createIcon(child.portletIconClass, child.portletIconHoverClass, dojo.hitch(child, "toggle"));
+ dojo.place(child.domNode, this.containerNode, "before");
+ child.attr("portlet", this);
+ this._settingsWidget = child;
+ }
+ }));
+ },
+
+ _createIcon: function(clazz, hoverClazz, fn){
+ // summary:
+ // creates an icon in the title bar.
+
+ var icon = dojo.create("div",{
+ "class": "dojoxPortletIcon " + clazz,
+ "waiRole": "presentation"
+ });
+ dojo.place(icon, this.arrowNode, "before");
+
+ this.connect(icon, "onclick", fn);
+
+ if(hoverClazz){
+ this.connect(icon, "onmouseover", function(){
+ dojo.addClass(icon, hoverClazz);
+ });
+ this.connect(icon, "onmouseout", function(){
+ dojo.removeClass(icon, hoverClazz);
+ });
+ }
+ return icon;
+ },
+
+ onClose: function(evt){
+ // summary:
+ // Hides the portlet. Note that it does not
+ // persist this, so it is up to the client to
+ // listen to this method and persist the closed state
+ // in their own way.
+ dojo.style(this.domNode, "display", "none");
+ },
+
+ onSizeChange: function(widget){
+ // summary:
+ // Updates the Portlet size if any other Portlet
+ // changes its size.
+ if(widget == this){
+ return;
+ }
+ this._updateSize();
+ },
+
+ _updateSize: function(){
+ // summary:
+ // Updates the size of all child widgets.
+ if(!this.open || !this._started || !this.resizeChildren){
+ return;
+ }
+
+ if(this._timer){
+ clearTimeout(this._timer);
+ }
+ // Delay applying the size change in case the size
+ // changes very frequently, for performance reasons.
+ this._timer = setTimeout(dojo.hitch(this, function(){
+ var size ={
+ w: dojo.style(this.domNode, "width"),
+ h: dojo.style(this.domNode, "height")
+ };
+
+ // If the Portlet is in a StackWidget, and it is not
+ // visible, do not update the size, as it could
+ // make child widgets miscalculate.
+ 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 the size of the portlet hasn't changed, don't
+ // resize the children, as this can be expensive
+ if(this._size.w == size.w && this._size.h == size.h){
+ return;
+ }
+ }
+ this._size = size;
+
+ var fns = ["resize", "layout"];
+ this._timer = null;
+ var kids = this.getChildren();
+
+ dojo.forEach(kids, function(child){
+ for(var i = 0; i < fns.length; i++){
+ if(dojo.isFunction(child[fns[i]])){
+ try{
+ child[fns[i]]();
+ } catch(e){
+ console.log(e);
+ }
+ break;
+ }
+ }
+ });
+ this.onUpdateSize();
+ }), 100);
+ },
+
+ onUpdateSize: function(){
+ // summary:
+ // Stub function called when the size is changed.
+ },
+
+ _publish: function(){
+ // summary: Publishes an event that all other portlets listen to.
+ // This causes them to update their child widgets if their
+ // size has changed.
+ dojo.publish("/Portlet/sizechange",[this]);
+ },
+
+ _onTitleClick: function(evt){
+ if(evt.target == this.arrowNode){
+ this.inherited(arguments);
+ }
+ },
+
+ addChild: function(child){
+ // summary:
+ // Adds a child widget to the portlet.
+ this._size = null;
+ this.inherited(arguments);
+
+ if(this._started){
+ this._placeSettingsWidgets();
+ this._updateSize();
+ }
+ if(this._started && !child.started && !child._started){
+ child.startup();
+ }
+ },
+
+ destroyDescendants: function(/*Boolean*/ preserveDom){
+ this.inherited(arguments);
+ if(this._settingsWidget){
+ this._settingsWidget.destroyRecursive(preserveDom);
+ }
+ },
+
+ destroy: function(){
+ if(this._timer){
+ clearTimeout(this._timer);
+ }
+ this.inherited(arguments);
+ },
+
+ _setCss: function(){
+ this.inherited(arguments);
+ dojo.style(this.arrowNode, "display", this.toggleable ? "":"none");
+ }
+});
+
+dojo.declare("dojox.widget.PortletSettings", [dijit._Container, dijit.layout.ContentPane],{
+ // summary:
+ // A settings widget to be used with a dojox.widget.Portlet.
+ // description:
+ // This widget should be placed inside a dojox.widget.Portlet widget.
+ // It is used to set some preferences for that Portlet. It is essentially
+ // a ContentPane, and should contain other widgets and DOM nodes that
+ // do the real work of setting preferences for the portlet.
+
+ // portletIconClass: String
+ // The CSS class to apply to the icon in the Portlet title bar that is used
+ // to toggle the visibility of this widget.
+ portletIconClass: "dojoxPortletSettingsIcon",
+
+ // portletIconHoverClass: String
+ // The CSS class to apply to the icon in the Portlet title bar that is used
+ // to toggle the visibility of this widget when the mouse hovers over it.
+ portletIconHoverClass: "dojoxPortletSettingsIconHover",
+
+ postCreate: function(){
+ // summary:
+ // Sets the require CSS classes on the widget.
+
+ // Start the PortletSettings widget hidden, always.
+ dojo.style(this.domNode, "display", "none");
+ dojo.addClass(this.domNode, "dojoxPortletSettingsContainer");
+
+ // Remove the unwanted content pane class.
+ dojo.removeClass(this.domNode, "dijitContentPane");
+ },
+
+ _setPortletAttr: function(portlet){
+ // summary:
+ // Sets the portlet that encloses this widget.
+ this.portlet = portlet;
+ },
+
+ toggle: function(){
+ // summary:
+ // Toggles the visibility of this widget.
+ 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,{
+ // summary:
+ // A settings widget to be used with a dojox.widget.Portlet, which displays
+ // the contents of this widget in a dijit.Dialog box.
+
+ // dimensions: Array
+ // The size of the dialog to display. This defaults to [300, 300]
+ dimensions: null,
+
+ constructor: function(props, node){
+ this.dimensions = props.dimensions || [300, 100];
+ },
+
+ toggle: function(){
+ // summary:
+ // Shows and hides the Dialog box.
+ if(!this.dialog){
+ dojo["require"]("dijit.Dialog");
+ this.dialog = new dijit.Dialog({title: this.title});
+
+ dojo.body().appendChild(this.dialog.domNode);
+
+ // Move this widget inside the dialog
+ 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/js/dojo-1.7.2/dojox/widget/Portlet/Portlet.css b/js/dojo-1.7.2/dojox/widget/Portlet/Portlet.css
new file mode 100644
index 0000000..d249355
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Portlet/Portlet.css
@@ -0,0 +1,161 @@
+.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");
+}
+.claro .dojoxPortlet .dojoxPortletIcon {
+ background-image: url("../../../dijit/themes/tundra/images/spriteRoundedIconsSmall.gif");
+}
+.dojoxPortlet .dojoxCloseNode {
+ background-position: right 0px;
+}
+.dojoxPortlet .dojoxCloseNodeHover {
+ background-position: right -15px;
+}
+
+.tundra .dojoxPortlet .dijitOpen .dojoxArrowDown,
+.soria .dojoxPortlet .dijitOpen .dojoxArrowDown,
+.nihilo .dojoxPortlet .dijitOpen .dojoxArrowDown,
+.claro .dojoxPortlet .dijitOpen .dojoxArrowDown{
+ background-position: -15px top;
+}
+.tundra .dojoxPortlet .dijitClosed .dojoxArrowDown,
+.soria .dojoxPortlet .dijitClosed .dojoxArrowDown,
+.nihilo .dojoxPortlet .dijitClosed .dojoxArrowDown,
+.claro .dojoxPortlet .dijitClosed .dojoxArrowDown {
+ background-position: 0 top;
+}
+
+.tundra .dojoxPortlet .dojoxPortletSettingsIcon,
+.soria .dojoxPortlet .dojoxPortletSettingsIcon,
+.nihilo .dojoxPortlet .dojoxPortletSettingsIcon,
+.claro .dojoxPortlet .dojoxPortletSettingsIcon {
+ background-image: url(images/icons.png);
+ background-position: 0 1px;
+}
+.tundra .dojoxPortletSettingsContainer,
+.soria .dojoxPortletSettingsContainer,
+.nihilo .dojoxPortletSettingsContainer,
+.claro .dojoxPortletSettingsContainer {
+ border-bottom: 1px solid #BFBFBF;
+ padding: 4px;
+}
+.tundra .dijitDialogPaneContent .dojoxPortletSettingsContainer,
+.soria .dijitDialogPaneContent .dojoxPortletSettingsContainer,
+.nihilo .dijitDialogPaneContent .dojoxPortletSettingsContainer,
+.claro .dijitDialogPaneContent .dojoxPortletSettingsContainer {
+ border-bottom: none;
+}
+
+.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: #fff 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/js/dojo-1.7.2/dojox/widget/Portlet/images/icons.gif b/js/dojo-1.7.2/dojox/widget/Portlet/images/icons.gif
new file mode 100644
index 0000000..cafca8d
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Portlet/images/icons.gif
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/Portlet/images/icons.png b/js/dojo-1.7.2/dojox/widget/Portlet/images/icons.png
new file mode 100644
index 0000000..d5cbcf5
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Portlet/images/icons.png
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/README b/js/dojo-1.7.2/dojox/widget/README
new file mode 100644
index 0000000..d211a8e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/README
@@ -0,0 +1,186 @@
+-------------------------------------------------------------------------------
+dojox.widget Collection
+-------------------------------------------------------------------------------
+Version 1.0
+Release date: 10/31/2007
+-------------------------------------------------------------------------------
+Project state:
+
+[Calendar] experimental
+[CalendarFx] experimental
+[ColorPicker] beta
+[Dialog] experimental
+[DialogSimple] beta
+[FeedPortlet] experimental
+[FilePicker] experimental
+[FisheyeList] experimental
+[FisheyeLite] beta
+[Iterator] experimental
+[Loader] experimental
+[Pager] experimental
+[Portlet] experimental
+[PlaceholderMenuItem] experimental
+[Roller] experimental
+[RollingList] experimental
+[SortList] experimental
+[TitleGroup] beta
+[Toaster] experimental
+[Wizard] experimental
+[AnalogGauge] experimental
+[BarGauge] experimental
+[Standby] experimental
+
+-------------------------------------------------------------------------------
+Credits:
+
+[Calendar] Shane O'Sullivan
+[CalendarFx] Shane O'Sullivan
+[ColorPicker] Peter Higgins (dante)
+[Dialog] Peter Higgins (dante)
+[DialogSimple] Peter Higgins (dante)
+[FeedPortlet] Shane O'Sullivan
+[FilePicker] Nathan Toone (toonetown)
+[FisheyeList] Karl Tiedt (kteidt)
+[FisheyeLite] Peter Higgins (dante)
+[Iterator] Alex Russell (slightlyoff)
+[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)
+[TitleGroup] Peter Higgins (dante)
+[Toaster] Adam Peller (peller)
+[Wizard] Peter Higgins (dante)
+[AnalogGauge] Benjamin Schell (bmschell) CCLA
+[BarGauge] Benjamin Schell (bmschell) CCLA
+[Standby] Jared Jurkiewicz (jaredj) CCLA
+[UpgradeBar] Mike Wilcox (mwilcox), Revin Guillen
+
+-------------------------------------------------------------------------------
+Project description
+
+ This is a collection of standalone widgets for use in
+ your website. Each individual widget is independent
+ of the others.
+
+-------------------------------------------------------------------------------
+Dependencies:
+
+ Each widget has it's own requirements and dependencies.
+ Most inherit from dijit base-classes such as dijit._Widget,
+ dijit._Templated, etc ... So we will assume the availablility
+ of dojo (core), and dijit packages.
+
+ Each individual component stores resources in a folder that shares
+ a name with the Widget. For instance:
+
+ the Dialog lives in
+ dojox/widget/Dialog.js ...
+
+ and the folder:
+ dojox/widget/Dialog/ contains a 'Dialog.css', the required
+ styles for that particular widget. All required templates and
+ images reside in the folder.
+
+ This differs slightly from the rest of DojoX in that each other
+ project uses a shared resources/ folder in the project folder,
+ though uses the same naming convention for stylesheets and templates.
+
+ eg:
+ dojox/layout/resources/ExpandoPane.css
+ dojox.layout.ExpandoPane
+
+-------------------------------------------------------------------------------
+Documentation
+
+ Please refer to the API-tool, or in-line documentation. All of these
+ widgets are of varying use, quality, and documentation completion.
+
+-------------------------------------------------------------------------------
+Installation instructions
+
+ These are standalone Widgets, so putting the [widget].js file
+ in your dojox/widget folder, and copying any files in the
+ /dojox/widget/[widget]/ folder as supplements/templates/etc
+ should be all you need to do.
+
+ eg: FisheyeList:
+ /dojox/widget/FisheyeList.js
+ /dojox/widget/FisheyeList/FisheyeList.css
+
+ should be all you need to use the Fisheye widget.
+
+ you can safely import the whole widget project into your
+ dojox/ root directory from the following SVN url:
+
+ http://svn.dojotoolkit.org/src/dojox/trunk/widget
+
+-------------------------------------------------------------------------------
+Other Notes (Brief widget list):
+
+ * ColorPicker - An HSV ColorPicker intended to be a drop down
+
+ * Calendar - An extension on the dijit._Calendar providing a different UI
+ * CalendarFx - additional mixable FX for transitions in dojox.widget.Calendar
+
+ * Dialog - An extended version of dijit.Dialog with man options and transition.
+
+ * DialogSimple - A simple Dijit Dialog providing `dojox.layout.ContentPane` integration
+
+ * FilePicker - a widget for browsing server-side file systems (can use
+ dojox.data.FileStore as backend store)
+
+ * FisheyeList - the classic FishEye Picker (abandoned)
+
+ * FisheyeLite - A partial replacement for the FisheyeList - serious performance
+ gains, and entirely more extensible in that it simply animates defined
+ properties, relying on the natural styling as a foundation.
+
+ * Iterator - Basic array and data store iterator class
+
+ * Loader - an experimental Class that listens to XHR
+ connections in the background, and displays
+ a loading indicator. Loader will be removed in 1.3, and is (abandoned).
+
+ * PlaceholderMenuItem - a menu item that can be used to inject other menu
+ items at a given location. Extends dijit.Menu directly.
+
+ * Roller - A component to show many lines of text in a single area, rotating
+ through the options available. Also provides RollerSlide, an extension
+ to the stock fading roller to add a slide animation to the transition.
+
+ * RollingList - A component of the FilePicker widget
+
+ * SortList - a degradable UL with a fixed header, scrolling,
+ and sorting. Can be the direct descendant of a
+ LayoutContainer and will size to fit.
+
+ * TitleGroup - A container offering variable height TitlePane access, though
+ behaves like an AccordionContainer
+
+ * Toaster - a messaging system to display unobtrusive
+ alerts on screen.
+
+ * Wizard - a StackContainer with built-in navigation to
+ ease in the creation of 'step-based' content.
+ Requires dojo >= 1.1
+
+ * AnalogGauge - an analog style customizable gauge for displaying values in an
+ animated fashion and with multiple indicators. Supports easings for
+ indicator animations, transparent overlays, etc. Very flexible.
+ Requires dojo >= 1.3
+
+ * BarGauge - a bar style gauge for displaying values in an animated fashion
+ and with multiple indicators. Supports easings for indicator animations,
+ etc. Very flexible.
+ Requires dojo >= 1.3
+
+ * Standby - a 'blocker' style widget to overlay a translucent div + image over a DOM node/widget
+ to indicate busy. 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/js/dojo-1.7.2/dojox/widget/Roller.js b/js/dojo-1.7.2/dojox/widget/Roller.js
new file mode 100644
index 0000000..41743ef
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Roller.js
@@ -0,0 +1,232 @@
+//>>built
+define("dojox/widget/Roller", ["dojo", "dijit", "dijit/_Widget"], function(dojo, dijit){
+
+ dojo.declare("dojox.widget.Roller", dijit._Widget, {
+ // summary: A simple widget to take an unordered-list of Text and roll through them
+ //
+ // description:
+ // The Roller widget takes an unordered-list of items, and converts
+ // them to a single-area (the size of one list-item, however you so choose
+ // to style it) and loops continually, fading between items.
+ //
+ // In it's current state, it requires it be created from an unordered (or ordered)
+ // list, though can contain complex markup.
+ //
+ // You can manipulate the `items` array at any point during the cycle with
+ // standard array manipulation techniques.
+ //
+ // The class "dojoxRoller" is added to the UL element for styling purposes.
+ //
+ // example:
+ // | // create a scroller from a unordered list with id="lister"
+ // | var thinger = new dojox.widget.Roller.Roller({},"lister");
+ //
+ // example:
+ // | // create a scroller from a fixed array, and place in the DOM:
+ // | new dojox.widget.Roller({ items:["one","two","three"] }).placeAt(dojo.body());
+ //
+ // example:
+ // | // add an item:
+ // | dijit.byId("roller").items.push("I am a new Label");
+ //
+ // example:
+ // | // stop a roller from rolling:
+ // | dijit.byId("roller").stop();
+ //
+ // delay: Integer
+ // Interval between rolls
+ delay: 2000,
+
+ // autoStart: Boolean
+ // Toggle to control starup behavior. Call .start() manually
+ // if set to `false`
+ autoStart: true,
+
+ // itemSelector: String
+ // A CSS selector to be used by `dojo.query` to find the children
+ // items in this widget. Defaults to "> li", finding only first-children
+ // list-items in the list, allowing for embedded lists to occur.
+ itemSelector: "> li",
+
+ // durationIn: Integer
+ // Speed (in ms) to apply to the "in" animation (show the node)
+ durationIn: 400,
+
+ // durationOut: Integer
+ // Speed (in ms) to apply to the "out" animation (hide the showing node)
+ durationOut: 275,
+ /*=====
+ // items: Array
+ // If populated prior to instantiation, is used as the Items over the children
+ items: [],
+ =====*/
+
+ // _idx: Integer
+ // Index of the the currently visible item in the list of items[]
+ _idx: -1,
+
+ postCreate: function(){
+
+ // add some instance vars:
+ if(!this["items"]){
+ this.items = [];
+ }
+
+ dojo.addClass(this.domNode,"dojoxRoller");
+
+ // find all the items in this list, and popuplate
+ dojo.query(this.itemSelector, this.domNode).forEach(function(item, i){
+ this.items.push(item.innerHTML);
+ // reuse the first match, destroy the rest
+ if(i == 0){
+ this._roller = item;
+ this._idx = 0;
+ }else{ dojo.destroy(item); }
+ }, this);
+
+ // handle the case where items[] were passed, and no srcNodeRef exists
+ if(!this._roller){
+ this._roller = dojo.create('li', null, this.domNode);
+ }
+ // stub out animation creation (for overloading maybe later)
+ this.makeAnims();
+
+ // and start, if true:
+ if(this.autoStart){ this.start(); }
+
+ },
+
+ makeAnims: function(){
+ // summary: Animation creator function. Need to create an 'in' and 'out'
+ // Animation stored in _anim Object, which the rest of the widget
+ // will reuse.
+ 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(){
+ // summary: setup the loop connection logic
+ var anim = this._anim;
+
+ this.connect(anim["out"], "onEnd", function(){
+ // onEnd of the `out` animation, select the next items and play `in` animation
+ this._setIndex(this._idx + 1);
+ anim["in"].play(15);
+ });
+
+ this.connect(anim["in"], "onEnd", function(){
+ // onEnd of the `in` animation, call `start` again after some delay:
+ this._timeout = setTimeout(dojo.hitch(this, "_run"), this.delay);
+ });
+ },
+
+ start: function(){
+ // summary: Starts to Roller looping
+ if(!this.rolling){
+ this.rolling = true;
+ this._run();
+ }
+ },
+
+ _run: function(){
+ this._anim["out"].gotoPercent(0, true);
+ },
+
+ stop: function(){
+ // summary: Stops the Roller from looping anymore.
+ this.rolling = false;
+
+ var m = this._anim,
+ t = this._timeout;
+
+ if(t){ clearTimeout(t); }
+ m["in"].stop();
+ m["out"].stop();
+ },
+
+ _setIndex: function(i){
+ // summary: Set the Roller to some passed index. If beyond range, go to first.
+ var l = this.items.length - 1;
+ if(i < 0){ i = l; }
+ if(i > l){ i = 0; }
+ this._roller.innerHTML = this.items[i] || "error!";
+ this._idx = i;
+ }
+
+ });
+
+ dojo.declare("dojox.widget.RollerSlide", dojox.widget.Roller, {
+ // summary: An add-on to the Roller to modify animations. This produces
+ // a slide-from-bottom like effect. See `dojox.widget.Roller` for
+ // full API information.
+
+ durationOut: 175, // slightly faster than default
+
+ makeAnims: function(){
+ // summary: Animation creator function. Need to create an 'in' and 'out'
+ // Animation stored in _anim Object, which the rest of the widget
+ // will reuse.
+
+ var n = this.domNode, pos = "position",
+ props = {
+ top: { end: 0, start: 25 },
+ opacity: 1
+ }
+ ;
+
+ dojo.style(n, pos, "relative");
+ dojo.style(this._roller, pos, "absolute");
+
+ dojo.mixin(this, {
+ _anim: {
+
+ "in": dojo.animateProperty({
+ node: n,
+ duration: this.durationIn,
+ properties: props
+ }),
+
+ "out": dojo.fadeOut({ node: n, duration: this.durationOut })
+ }
+ });
+ // don't forget to do this in the class. override if necessary.
+ this._setupConnects();
+ }
+
+ });
+
+ dojo.declare("dojox.widget._RollerHover", null, {
+ // summary: A mixin class to provide a way to automate the "stop on hover" functionality.
+ //
+ // description:
+ // A mixin class used to provide a way to automate a "stop on hover" behavior,
+ // while still allowing for ambigious subclassing for custom animations.
+ // Simply mix this class into a `dojox.widget.Roller` variant, and instantiate
+ // as you would. The hover connection is done automatically.
+ //
+ // The "hover" functionality is as such: Stop rotation while the mouse is over the
+ // instance, and resume again once leaving. Even if autoStart is disabled, the widget
+ // will start if a mouse enters and leaves the node in this case.
+ //
+ // example:
+ // | dojo.declare("my.Roller", [dojox.widget.RollerSlide, dojox.widget._RollerHover], {});
+ // | new my.Roller({}, "myList");
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this.connect(this.domNode, "onmouseenter", "stop");
+ this.connect(this.domNode, "onmouseleave", "start");
+ }
+
+ });
+
+ return dojox.widget.Roller;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/RollingList.js b/js/dojo-1.7.2/dojox/widget/RollingList.js
new file mode 100644
index 0000000..8b87de1
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/RollingList.js
@@ -0,0 +1,1210 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/RollingList", ["dijit","dojo","dojox","dojo/i18n!dijit/nls/common","dojo/require!dojo/window,dijit/layout/ContentPane,dijit/_Templated,dijit/_Contained,dijit/layout/_LayoutWidget,dijit/Menu,dijit/form/Button,dijit/focus,dijit/_base/focus,dojox/html/metrics,dojo/i18n"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.RollingList");
+dojo.experimental("dojox.widget.RollingList");
+
+dojo.require("dojo.window");
+
+dojo.require("dijit.layout.ContentPane");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Contained");
+dojo.require("dijit.layout._LayoutWidget");
+dojo.require("dijit.Menu");
+dojo.require("dijit.form.Button");
+dojo.require("dijit.focus"); // dijit.focus()
+dojo.require("dijit._base.focus"); // dijit.getFocus()
+
+dojo.require("dojox.html.metrics");
+
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit", "common");
+
+dojo.declare("dojox.widget._RollingListPane",
+ [dijit.layout.ContentPane, dijit._Templated, dijit._Contained], {
+ // summary: a core pane that can be attached to a RollingList. All panes
+ // should extend this one
+
+ // templateString: string
+ // our template
+ templateString: '<div class="dojoxRollingListPane"><table><tbody><tr><td dojoAttachPoint="containerNode"></td></tr></tbody></div>',
+
+ // parentWidget: dojox.widget.RollingList
+ // Our rolling list widget
+ parentWidget: null,
+
+ // parentPane: dojox.widget._RollingListPane
+ // The pane that immediately precedes ours
+ parentPane: null,
+
+ // store: store
+ // the store we must use
+ store: null,
+
+ // items: item[]
+ // an array of (possibly not-yet-loaded) items to display in this.
+ // If this array is null, then the query and query options are used to
+ // get the top-level items to use. This array is also used to watch and
+ // see if the pane needs to be reloaded (store notifications are handled)
+ // by the pane
+ items: null,
+
+ // query: object
+ // a query to pass to the datastore. This is only used if items are null
+ query: null,
+
+ // queryOptions: object
+ // query options to be passed to the datastore
+ queryOptions: null,
+
+ // focusByNode: boolean
+ // set to false if the subclass will handle its own node focusing
+ _focusByNode: true,
+
+ // minWidth: integer
+ // the width (in px) for this pane
+ minWidth: 0,
+
+ _setContentAndScroll: function(/*String|DomNode|Nodelist*/cont, /*Boolean?*/isFakeContent){
+ // summary: sets the value of the content and scrolls it into view
+ this._setContent(cont, isFakeContent);
+ this.parentWidget.scrollIntoView(this);
+ },
+
+ _updateNodeWidth: function(n, min){
+ // summary: updates the min width of the pane to be minPaneWidth
+ n.style.width = "";
+ var nWidth = dojo.marginBox(n).w;
+ if(nWidth < min){
+ dojo.marginBox(n, {w: min});
+ }
+ },
+
+ _onMinWidthChange: function(v){
+ // Called when the min width of a pane has changed
+ this._updateNodeWidth(this.domNode, v);
+ },
+
+ _setMinWidthAttr: function(v){
+ if(v !== this.minWidth){
+ this.minWidth = v;
+ this._onMinWidthChange(v);
+ }
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ if(this.store && this.store.getFeatures()["dojo.data.api.Notification"]){
+ window.setTimeout(dojo.hitch(this, function(){
+ // Set connections after a slight timeout to avoid getting in the
+ // condition where we are setting them while events are still
+ // being fired
+ this.connect(this.store, "onSet", "_onSetItem");
+ this.connect(this.store, "onNew", "_onNewItem");
+ this.connect(this.store, "onDelete", "_onDeleteItem");
+ }), 1);
+ }
+ this.connect(this.focusNode||this.domNode, "onkeypress", "_focusKey");
+ this.parentWidget._updateClass(this.domNode, "Pane");
+ this.inherited(arguments);
+ this._onMinWidthChange(this.minWidth);
+ },
+
+ _focusKey: function(/*Event*/e){
+ // summary: called when a keypress happens on the widget
+ if(e.charOrCode == dojo.keys.BACKSPACE){
+ dojo.stopEvent(e);
+ return;
+ }else if(e.charOrCode == dojo.keys.LEFT_ARROW && this.parentPane){
+ this.parentPane.focus();
+ this.parentWidget.scrollIntoView(this.parentPane);
+ }else if(e.charOrCode == dojo.keys.ENTER){
+ this.parentWidget._onExecute();
+ }
+ },
+
+ focus: function(/*boolean*/force){
+ // summary: sets the focus to this current widget
+ if(this.parentWidget._focusedPane != this){
+ this.parentWidget._focusedPane = this;
+ this.parentWidget.scrollIntoView(this);
+ if(this._focusByNode && (!this.parentWidget._savedFocus || force)){
+ try{(this.focusNode||this.domNode).focus();}catch(e){}
+ }
+ }
+ },
+
+ _onShow: function(){
+ // summary: checks that the store is loaded
+ if((this.store || this.items) && ((this.refreshOnShow && this.domNode) || (!this.isLoaded && this.domNode))){
+ this.refresh();
+ }
+ },
+
+ _load: function(){
+ // summary: sets the "loading" message and then kicks off a query asyncronously
+ this.isLoaded = false;
+ if(this.items){
+ this._setContentAndScroll(this.onLoadStart(), true);
+ window.setTimeout(dojo.hitch(this, "_doQuery"), 1);
+ }else{
+ this._doQuery();
+ }
+ },
+
+ _doLoadItems: function(/*item[]*/items, /*function*/callback){
+ // summary: loads the given items, and then calls the callback when they
+ // are finished.
+ var _waitCount = 0, store = this.store;
+ dojo.forEach(items, function(item){
+ if(!store.isItemLoaded(item)){ _waitCount++; }
+ });
+ if(_waitCount === 0){
+ callback();
+ }else{
+ var onItem = function(item){
+ _waitCount--;
+ if((_waitCount) === 0){
+ callback();
+ }
+ };
+ dojo.forEach(items, function(item){
+ if(!store.isItemLoaded(item)){
+ store.loadItem({item: item, onItem: onItem});
+ }
+ });
+ }
+ },
+
+ _doQuery: function(){
+ // summary: either runs the query or loads potentially not-yet-loaded items.
+ if(!this.domNode){return;}
+ var preload = this.parentWidget.preloadItems;
+ preload = (preload === true || (this.items && this.items.length <= Number(preload)));
+ if(this.items && preload){
+ 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(items){
+ this.items = items;
+ this.onItems();
+ },
+ onError: function(e){
+ this._onError("Fetch", e);
+ },
+ scope: this});
+ }
+ },
+
+ _hasItem: function(/* item */ item){
+ // summary: returns whether or not the given item is handled by this
+ // pane
+ var items = this.items || [];
+ for(var i = 0, myItem; (myItem = items[i]); i++){
+ if(this.parentWidget._itemsMatch(myItem, item)){
+ return true;
+ }
+ }
+ return false;
+ },
+
+ _onSetItem: function(/* item */ item,
+ /* attribute-name-string */ attribute,
+ /* object | array */ oldValue,
+ /* object | array */ newValue){
+ // Summary: called when an item in the store has changed
+ if(this._hasItem(item)){
+ this.refresh();
+ }
+ },
+
+ _onNewItem: function(/* item */ newItem, /*object?*/ parentInfo){
+ // Summary: called when an item is added to the store
+ var sel;
+ if((!parentInfo && !this.parentPane) ||
+ (parentInfo && this.parentPane && this.parentPane._hasItem(parentInfo.item) &&
+ (sel = this.parentPane._getSelected()) && this.parentWidget._itemsMatch(sel.item, parentInfo.item))){
+ this.items.push(newItem);
+ this.refresh();
+ }else if(parentInfo && this.parentPane && this._hasItem(parentInfo.item)){
+ this.refresh();
+ }
+ },
+
+ _onDeleteItem: function(/* item */ deletedItem){
+ // Summary: called when an item is removed from the store
+ if(this._hasItem(deletedItem)){
+ this.items = dojo.filter(this.items, function(i){
+ return (i != deletedItem);
+ });
+ this.refresh();
+ }
+ },
+
+ onFetchStart: function(){
+ // summary:
+ // called before a fetch starts
+ return this.loadingMessage;
+ },
+
+ onFetchError: function(/*Error*/ error){
+ // summary:
+ // called when a fetch error occurs.
+ return this.errorMessage;
+ },
+
+ onLoadStart: function(){
+ // summary:
+ // called before a load starts
+ return this.loadingMessage;
+ },
+
+ onLoadError: function(/*Error*/ error){
+ // summary:
+ // called when a load error occurs.
+ return this.errorMessage;
+ },
+
+ onItems: function(){
+ // summary:
+ // called after a fetch or load - at this point, this.items should be
+ // set and loaded. Override this function to "do your stuff"
+ if(!this.onLoadDeferred){
+ this.cancel();
+ this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel"));
+ }
+ this._onLoadHandler();
+ }
+
+});
+
+dojo.declare("dojox.widget._RollingListGroupPane",
+ [dojox.widget._RollingListPane], {
+ // summary: a pane that will handle groups (treats them as menu items)
+
+ // templateString: string
+ // our template
+ templateString: '<div><div dojoAttachPoint="containerNode"></div>' +
+ '<div dojoAttachPoint="menuContainer">' +
+ '<div dojoAttachPoint="menuNode"></div>' +
+ '</div></div>',
+
+ // _menu: dijit.Menu
+ // The menu that we will call addChild() on for adding items
+ _menu: null,
+
+ _setContent: function(/*String|DomNode|Nodelist*/cont){
+ if(!this._menu){
+ // Only set the content if we don't already have a menu
+ this.inherited(arguments);
+ }
+ },
+
+ _onMinWidthChange: function(v){
+ // override and resize the menu instead
+ if(!this._menu){ return; }
+ var dWidth = dojo.marginBox(this.domNode).w;
+ var mWidth = dojo.marginBox(this._menu.domNode).w;
+ this._updateNodeWidth(this._menu.domNode, v - (dWidth - mWidth));
+ },
+
+ onItems: function(){
+ // summary:
+ // called after a fetch or load
+ var selectItem, hadChildren = false;
+ if(this._menu){
+ selectItem = this._getSelected();
+ this._menu.destroyRecursive();
+ }
+ this._menu = this._getMenu();
+ var child, selectMenuItem;
+ if(this.items.length){
+ dojo.forEach(this.items, function(item){
+ child = this.parentWidget._getMenuItemForItem(item, this);
+ if(child){
+ if(selectItem && this.parentWidget._itemsMatch(child.item, selectItem.item)){
+ selectMenuItem = child;
+ }
+ this._menu.addChild(child);
+ }
+ }, this);
+ }else{
+ child = this.parentWidget._getMenuItemForItem(null, this);
+ if(child){
+ this._menu.addChild(child);
+ }
+ }
+ if(selectMenuItem){
+ this._setSelected(selectMenuItem);
+ if((selectItem && !selectItem.children && selectMenuItem.children) ||
+ (selectItem && selectItem.children && !selectMenuItem.children)){
+ var itemPane = this.parentWidget._getPaneForItem(selectMenuItem.item, this, selectMenuItem.children);
+ if(itemPane){
+ this.parentWidget.addChild(itemPane, this.getIndexInParent() + 1);
+ }else{
+ this.parentWidget._removeAfter(this);
+ this.parentWidget._onItemClick(null, this, selectMenuItem.item, selectMenuItem.children);
+ }
+ }
+ }else if(selectItem){
+ this.parentWidget._removeAfter(this);
+ }
+ this.containerNode.innerHTML = "";
+ this.containerNode.appendChild(this._menu.domNode);
+ this.parentWidget.scrollIntoView(this);
+ this._checkScrollConnection(true);
+ this.inherited(arguments);
+ this._onMinWidthChange(this.minWidth);
+ },
+
+ _checkScrollConnection: function(doLoad){
+ // summary: checks whether or not we need to connect to our onscroll
+ // function
+ var store = this.store
+ if(this._scrollConn){
+ this.disconnect(this._scrollConn);
+ }
+ delete this._scrollConn;
+ if(!dojo.every(this.items, function(i){return store.isItemLoaded(i);})){
+ if(doLoad){
+ this._loadVisibleItems();
+ }
+ this._scrollConn = this.connect(this.domNode, "onscroll", "_onScrollPane");
+ }
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+ this.parentWidget._updateClass(this.domNode, "GroupPane");
+ },
+
+ focus: function(/*boolean*/force){
+ // summary: sets the focus to this current widget
+ if(this._menu){
+ if(this._pendingFocus){
+ this.disconnect(this._pendingFocus);
+ }
+ delete this._pendingFocus;
+
+ // We focus the right widget - either the focusedChild, the
+ // selected node, the first menu item, or the menu itself
+ var focusWidget = this._menu.focusedChild;
+ if(!focusWidget){
+ var focusNode = dojo.query(".dojoxRollingListItemSelected", this.domNode)[0];
+ if(focusNode){
+ focusWidget = dijit.byNode(focusNode);
+ }
+ }
+ if(!focusWidget){
+ focusWidget = this._menu.getChildren()[0] || this._menu;
+ }
+ this._focusByNode = false;
+ if(focusWidget.focusNode){
+ if(!this.parentWidget._savedFocus || force){
+ try{focusWidget.focusNode.focus();}catch(e){}
+ }
+ window.setTimeout(function(){
+ try{
+ dojo.window.scrollIntoView(focusWidget.focusNode);
+ }catch(e){}
+ }, 1);
+ }else if(focusWidget.focus){
+ if(!this.parentWidget._savedFocus || force){
+ focusWidget.focus();
+ }
+ }else{
+ this._focusByNode = true;
+ }
+ this.inherited(arguments);
+ }else if(!this._pendingFocus){
+ this._pendingFocus = this.connect(this, "onItems", "focus");
+ }
+ },
+
+ _getMenu: function(){
+ // summary: returns a widget to be used for the container widget.
+ var self = this;
+ var menu = new dijit.Menu({
+ parentMenu: this.parentPane ? this.parentPane._menu : null,
+ onCancel: function(/*Boolean*/ closeAll){
+ if(self.parentPane){
+ self.parentPane.focus(true);
+ }
+ },
+ _moveToPopup: function(/*Event*/ evt){
+ if(this.focusedChild && !this.focusedChild.disabled){
+ this.focusedChild._onClick(evt);
+ }
+ }
+ }, this.menuNode);
+ this.connect(menu, "onItemClick", function(/*dijit.MenuItem*/ item, /*Event*/ evt){
+ if(item.disabled){ return; }
+ evt.alreadySelected = dojo.hasClass(item.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){
+ p.focus(true);
+ this.parentWidget.scrollIntoView(p);
+ }
+ }else{
+ this._setSelected(item, menu);
+ this.parentWidget._onItemClick(evt, this, item.item, item.children);
+ if(evt.type == "keypress" && evt.charOrCode == dojo.keys.ENTER){
+ this.parentWidget._onExecute();
+ }
+ }
+ });
+ if(!menu._started){
+ menu.startup();
+ }
+ return menu;
+ },
+
+ _onScrollPane: function(){
+ // summary: called when the pane has been scrolled - it sets a timeout
+ // so that we don't try and load our visible items too often during
+ // a scroll
+ if(this._visibleLoadPending){
+ window.clearTimeout(this._visibleLoadPending);
+ }
+ this._visibleLoadPending = window.setTimeout(dojo.hitch(this, "_loadVisibleItems"), 500);
+ },
+
+ _loadVisibleItems: function(){
+ // summary: loads the items that are currently visible in the pane
+ delete this._visibleLoadPending
+ var menu = this._menu;
+ if(!menu){ return; }
+ var children = menu.getChildren();
+ if(!children || !children.length){ return; }
+ var gpbme = function(n, m, pb){
+ var s = dojo.getComputedStyle(n);
+ var r = 0;
+ if(m){ r += dojo._getMarginExtents(n, s).t; }
+ if(pb){ r += dojo._getPadBorderExtents(n, s).t; }
+ return r;
+ };
+ var topOffset = gpbme(this.domNode, false, true) +
+ gpbme(this.containerNode, true, true) +
+ gpbme(menu.domNode, true, true) +
+ gpbme(children[0].domNode, true, false);
+ var h = dojo.contentBox(this.domNode).h;
+ var minOffset = this.domNode.scrollTop - topOffset - (h/2);
+ var maxOffset = minOffset + (3*h/2);
+ var menuItemsToLoad = dojo.filter(children, function(c){
+ var cnt = c.domNode.offsetTop;
+ var s = c.store;
+ var i = c.item;
+ return (cnt >= minOffset && cnt <= maxOffset && !s.isItemLoaded(i));
+ })
+ var itemsToLoad = dojo.map(menuItemsToLoad, function(c){
+ return c.item;
+ });
+ var onItems = dojo.hitch(this, function(){
+ var selectItem = this._getSelected();
+ var selectMenuItem;
+ dojo.forEach(itemsToLoad, function(item, idx){
+ var newItem = this.parentWidget._getMenuItemForItem(item, this);
+ var oItem = menuItemsToLoad[idx];
+ var oIdx = oItem.getIndexInParent();
+ menu.removeChild(oItem);
+ if(newItem){
+ if(selectItem && this.parentWidget._itemsMatch(newItem.item, selectItem.item)){
+ selectMenuItem = newItem;
+ }
+ menu.addChild(newItem, oIdx);
+ if(menu.focusedChild == oItem){
+ menu.focusChild(newItem);
+ }
+ }
+ oItem.destroy();
+ }, this);
+ this._checkScrollConnection(false);
+ });
+ this._doLoadItems(itemsToLoad, onItems);
+ },
+
+ _getSelected: function(/*dijit.Menu?*/ menu){
+ // summary:
+ // returns the selected menu item - or null if none are selected
+ if(!menu){ menu = this._menu; }
+ if(menu){
+ var children = this._menu.getChildren();
+ for(var i = 0, item; (item = children[i]); i++){
+ if(dojo.hasClass(item.domNode, "dojoxRollingListItemSelected")){
+ return item;
+ }
+ }
+ }
+ return null;
+ },
+
+ _setSelected: function(/*dijit.MenuItem?*/ item, /*dijit.Menu?*/ menu){
+ // summary:
+ // selectes the given item in the given menu (defaults to pane's menu)
+ if(!menu){ menu = this._menu;}
+ if(menu){
+ dojo.forEach(menu.getChildren(), function(i){
+ this.parentWidget._updateClass(i.domNode, "Item", {"Selected": (item && (i == item && !i.disabled))});
+ }, this);
+ }
+ }
+});
+
+dojo.declare("dojox.widget.RollingList",
+ [dijit._Widget, dijit._Templated, dijit._Container], {
+ // summary: a rolling list that can be tied to a data store with children
+
+ // templateString: String
+ // The template to be used to construct the widget.
+ 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\t\t\tdojoAttachEvent=\"onClick:_onExecute\">${okButtonLabel}</button\n ><button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"cancelButton\"\n\t\t\t\tdojoAttachEvent=\"onClick:_onCancel\">${cancelButtonLabel}</button\n\t></div\n></div>\n"),
+ widgetsInTemplate: true,
+
+ // className: string
+ // an additional class (or space-separated classes) to add for our widget
+ className: "",
+
+ // store: store
+ // the store we must use
+ store: null,
+
+ // query: object
+ // a query to pass to the datastore. This is only used if items are null
+ query: null,
+
+ // queryOptions: object
+ // query options to be passed to the datastore
+ queryOptions: null,
+
+ // childrenAttrs: String[]
+ // one ore more attributes that holds children of a node
+ childrenAttrs: ["children"],
+
+ // parentAttr: string
+ // the attribute to read for finding our parent item (if any)
+ parentAttr: "",
+
+ // value: item
+ // The value that has been selected
+ value: null,
+
+ // executeOnDblClick: boolean
+ // Set to true if you want to call onExecute when an item is
+ // double-clicked, false if you want to call onExecute yourself. (mainly
+ // used for popups to control how they want to be handled)
+ executeOnDblClick: true,
+
+ // preloadItems: boolean or int
+ // if set to true, then onItems will be called only *after* all items have
+ // been loaded (ie store.isLoaded will return true for all of them). If
+ // false, then no preloading will occur. If set to an integer, preloading
+ // will occur if the number of items is less than or equal to the value
+ // of the integer. The onItems function will need to be aware of handling
+ // items that may not be loaded
+ preloadItems: false,
+
+ // showButtons: boolean
+ // if set to true, then buttons for "OK" and "Cancel" will be provided
+ showButtons: false,
+
+ // okButtonLabel: string
+ // The string to use for the OK button - will use dijit's common "OK" string
+ // if not set
+ okButtonLabel: "",
+
+ // cancelButtonLabel: string
+ // The string to use for the Cancel button - will use dijit's common
+ // "Cancel" string if not set
+ cancelButtonLabel: "",
+
+ // minPaneWidth: integer
+ // the minimum pane width (in px) for all child panes. If they are narrower,
+ // the width will be increased to this value.
+ minPaneWidth: 0,
+
+ postMixInProperties: function(){
+ // summary: Mix in our labels, if they are not set
+ this.inherited(arguments);
+ var loc = dojo.i18n.getLocalization("dijit", "common");
+ this.okButtonLabel = this.okButtonLabel || loc.buttonOk;
+ this.cancelButtonLabel = this.cancelButtonLabel || loc.buttonCancel;
+ },
+
+ _setShowButtonsAttr: function(doShow){
+ // summary: Sets the visibility of the buttons for the widget
+ var needsLayout = false;
+ if((this.showButtons != doShow && this._started) ||
+ (this.showButtons == doShow && !this.started)){
+ needsLayout = true;
+ }
+ dojo.toggleClass(this.domNode, "dojoxRollingListButtonsHidden", !doShow);
+ this.showButtons = doShow;
+ if(needsLayout){
+ if(this._started){
+ this.layout();
+ }else{
+ window.setTimeout(dojo.hitch(this, "layout"), 0);
+ }
+ }
+ },
+
+ _itemsMatch: function(/*item*/ item1, /*item*/ item2){
+ // Summary: returns whether or not the two items match - checks ID if
+ // they aren't the exact same object
+ if(!item1 && !item2){
+ return true;
+ }else if(!item1 || !item2){
+ return false;
+ }
+ return (item1 == item2 ||
+ (this._isIdentity && this.store.getIdentity(item1) == this.store.getIdentity(item2)));
+ },
+
+ _removeAfter: function(/*Widget or int*/ idx){
+ // summary: removes all widgets after the given widget (or index)
+ if(typeof idx != "number"){
+ idx = this.getIndexOfChild(idx);
+ }
+ if(idx >= 0){
+ dojo.forEach(this.getChildren(), function(c, i){
+ if(i > idx){
+ this.removeChild(c);
+ c.destroyRecursive();
+ }
+ }, this);
+ }
+ var children = this.getChildren(), child = children[children.length - 1];
+ var selItem = null;
+ while(child && !selItem){
+ var val = child._getSelected ? child._getSelected() : null;
+ if(val){
+ selItem = val.item;
+ }
+ child = child.parentPane;
+ }
+ if(!this._setInProgress){
+ this._setValue(selItem);
+ }
+ },
+
+ addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){
+ // summary: adds a child to this rolling list - if passed an insertIndex,
+ // then all children from that index on will be removed and destroyed
+ // before adding the child.
+ if(insertIndex > 0){
+ this._removeAfter(insertIndex - 1);
+ }
+ this.inherited(arguments);
+ if(!widget._started){
+ widget.startup();
+ }
+ widget.attr("minWidth", this.minPaneWidth);
+ this.layout();
+ if(!this._savedFocus){
+ widget.focus();
+ }
+ },
+
+ _setMinPaneWidthAttr: function(value){
+ // summary:
+ // Sets the min pane width of all children
+ if(value !== this.minPaneWidth){
+ this.minPaneWidth = value;
+ dojo.forEach(this.getChildren(), function(c){
+ c.attr("minWidth", value);
+ });
+ }
+ },
+
+ _updateClass: function(/* Node */ node, /* String */ type, /* Object? */ options){
+ // summary:
+ // sets the state of the given node with the given type and options
+ // options:
+ // an object with key-value-pairs. The values are boolean, if true,
+ // the key is added as a class, if false, it is removed.
+ if(!this._declaredClasses){
+ this._declaredClasses = ("dojoxRollingList " + this.className).split(" ");
+ }
+ dojo.forEach(this._declaredClasses, function(c){
+ if(c){
+ dojo.addClass(node, c + type);
+ for(var k in options||{}){
+ dojo.toggleClass(node, c + type + k, options[k]);
+ }
+ dojo.toggleClass(node, c + type + "FocusSelected",
+ (dojo.hasClass(node, c + type + "Focus") && dojo.hasClass(node, c + type + "Selected")));
+ dojo.toggleClass(node, c + type + "HoverSelected",
+ (dojo.hasClass(node, c + type + "Hover") && dojo.hasClass(node, c + type + "Selected")));
+ }
+ });
+ },
+
+ scrollIntoView: function(/*dijit._Widget*/ childWidget){
+ // summary: scrolls the given widget into view
+ if(this._scrollingTimeout){
+ window.clearTimeout(this._scrollingTimeout);
+ }
+ delete this._scrollingTimeout;
+ this._scrollingTimeout = window.setTimeout(dojo.hitch(this, function(){
+ if(childWidget.domNode){
+ dojo.window.scrollIntoView(childWidget.domNode);
+ }
+ delete this._scrollingTimeout;
+ return;
+ }), 1);
+ },
+
+ resize: function(args){
+ dijit.layout._LayoutWidget.prototype.resize.call(this, args);
+ },
+
+ layout: function(){
+ var children = this.getChildren();
+ if(this._contentBox){
+ var bn = this.buttonsNode;
+ var height = this._contentBox.h - dojo.marginBox(bn).h -
+ dojox.html.metrics.getScrollbar().h;
+ dojo.forEach(children, function(c){
+ dojo.marginBox(c.domNode, {h: height});
+ });
+ }
+ if(this._focusedPane){
+ var foc = this._focusedPane;
+ delete this._focusedPane;
+ if(!this._savedFocus){
+ foc.focus();
+ }
+ }else if(children && children.length){
+ if(!this._savedFocus){
+ children[0].focus();
+ }
+ }
+ },
+
+ _onChange: function(/*item*/ value){
+ this.onChange(value);
+ },
+
+ _setValue: function(/* item */ value){
+ // summary: internally sets the value and fires onchange
+ delete this._setInProgress;
+ if(!this._itemsMatch(this.value, value)){
+ this.value = value;
+ this._onChange(value);
+ }
+ },
+
+ _setValueAttr: function(/* item */ value){
+ // summary: sets the value of this widget to the given store item
+ if(this._itemsMatch(this.value, value) && !value){ return; }
+ if(this._setInProgress && this._setInProgress === value){ return; }
+ this._setInProgress = value;
+ if(!value || !this.store.isItem(value)){
+ var pane = this.getChildren()[0];
+ pane._setSelected(null);
+ this._onItemClick(null, pane, null, null);
+ return;
+ }
+
+ var fetchParentItems = dojo.hitch(this, function(/*item*/ item, /*function*/callback){
+ // Summary: Fetchs the parent items for the given item
+ var store = this.store, id;
+ if(this.parentAttr && store.getFeatures()["dojo.data.api.Identity"] &&
+ ((id = this.store.getValue(item, this.parentAttr)) || id === "")){
+ // Fetch by parent attribute
+ var cb = function(i){
+ if(store.getIdentity(i) == store.getIdentity(item)){
+ callback(null);
+ }else{
+ callback([i]);
+ }
+ };
+ if(id === ""){
+ callback(null);
+ }else if(typeof id == "string"){
+ store.fetchItemByIdentity({identity: id, onItem: cb});
+ }else if(store.isItem(id)){
+ cb(id);
+ }
+ }else{
+ // Fetch by finding children
+ var numCheck = this.childrenAttrs.length;
+ var parents = [];
+ dojo.forEach(this.childrenAttrs, function(attr){
+ var q = {};
+ q[attr] = item;
+ store.fetch({query: q, scope: this,
+ onComplete: function(items){
+ if(this._setInProgress !== value){
+ return;
+ }
+ parents = parents.concat(items);
+ numCheck--;
+ if(numCheck === 0){
+ callback(parents);
+ }
+ }
+ });
+ }, this);
+ }
+ });
+
+ var setFromChain = dojo.hitch(this, function(/*item[]*/itemChain, /*integer*/idx){
+ // Summary: Sets the value of the widget at the given index in the chain - onchanges are not
+ // fired here
+ var set = itemChain[idx];
+ var child = this.getChildren()[idx];
+ var conn;
+ if(set && child){
+ var fx = dojo.hitch(this, function(){
+ if(conn){
+ this.disconnect(conn);
+ }
+ delete conn;
+ if(this._setInProgress !== value){
+ return;
+ }
+ var selOpt = dojo.filter(child._menu.getChildren(), function(i){
+ return this._itemsMatch(i.item, set);
+ }, this)[0];
+ if(selOpt){
+ idx++;
+ child._menu.onItemClick(selOpt, {type: "internal",
+ stopPropagation: function(){},
+ preventDefault: function(){}});
+ if(itemChain[idx]){
+ setFromChain(itemChain, idx);
+ }else{
+ this._setValue(set);
+ this.onItemClick(set, child, this.getChildItems(set));
+ }
+ }
+ });
+ if(!child.isLoaded){
+ conn = this.connect(child, "onLoad", fx);
+ }else{
+ fx();
+ }
+ }else if(idx === 0){
+ this.set("value", null);
+ }
+ });
+
+ var parentChain = [];
+ var onParents = dojo.hitch(this, function(/*item[]*/ parents){
+ // Summary: recursively grabs the parents - only the first one is followed
+ if(parents && parents.length){
+ parentChain.push(parents[0]);
+ fetchParentItems(parents[0], onParents);
+ }else{
+ if(!parents){
+ parentChain.pop();
+ }
+ parentChain.reverse();
+ setFromChain(parentChain, 0);
+ }
+ });
+
+ // Only set the value in display if we are shown - if we are in a dropdown,
+ // and are hidden, don't actually do the scrolling in the display (it can
+ // mess up layouts)
+ var ns = this.domNode.style;
+ if(ns.display == "none" || ns.visibility == "hidden"){
+ this._setValue(value);
+ }else if(!this._itemsMatch(value, this._visibleItem)){
+ onParents([value]);
+ }
+ },
+
+ _onItemClick: function(/* Event */ evt, /* dijit._Contained */ pane, /* item */ item, /* item[]? */ children){
+ // summary: internally called when a widget should pop up its child
+
+ if(evt){
+ var itemPane = this._getPaneForItem(item, pane, children);
+ var alreadySelected = (evt.type == "click" && evt.alreadySelected);
+
+ if(alreadySelected && itemPane){
+ this._removeAfter(pane.getIndexInParent() + 1);
+ var next = pane.getNextSibling();
+ if(next && next._setSelected){
+ next._setSelected(null);
+ }
+ this.scrollIntoView(next);
+ }else if(itemPane){
+ this.addChild(itemPane, pane.getIndexInParent() + 1);
+ if(this._savedFocus){
+ itemPane.focus(true);
+ }
+ }else{
+ this._removeAfter(pane);
+ this.scrollIntoView(pane);
+ }
+ }else if(pane){
+ this._removeAfter(pane);
+ this.scrollIntoView(pane);
+ }
+ if(!evt || evt.type != "internal"){
+ this._setValue(item);
+ this.onItemClick(item, pane, children);
+ }
+ this._visibleItem = item;
+ },
+
+ _getPaneForItem: function(/* item? */ item, /* dijit._Contained? */ parentPane, /* item[]? */ children){ // summary: gets the pane for the given item, and mixes in our needed parts
+ // Returns the pane for the given item (null if the root pane) - after mixing in
+ // its stuff.
+ var ret = this.getPaneForItem(item, parentPane, children);
+ ret.store = this.store;
+ ret.parentWidget = this;
+ ret.parentPane = parentPane||null;
+ if(!item){
+ ret.query = this.query;
+ ret.queryOptions = this.queryOptions;
+ }else if(children){
+ ret.items = children;
+ }else{
+ ret.items = [item];
+ }
+ return ret;
+ },
+
+ _getMenuItemForItem: function(/*item*/ item, /* dijit._Contained */ parentPane){
+ // summary: returns a widget for the given store item. The returned
+ // item will be added to this widget's container widget. null will
+ // be passed in for an "empty" item.
+ var store = this.store;
+ if(!item || !store || !store.isItem(item)){
+ var i = new dijit.MenuItem({
+ label: "---",
+ disabled: true,
+ iconClass: "dojoxEmpty",
+ focus: function(){
+ // Do nothing on focus of this guy...
+ }
+ });
+ this._updateClass(i.domNode, "Item");
+ return i;
+ }else{
+ var itemLoaded = store.isItemLoaded(item);
+ var childItems = itemLoaded ? this.getChildItems(item) : undefined;
+ var widgetItem;
+ if(childItems){
+ widgetItem = this.getMenuItemForItem(item, parentPane, childItems);
+ widgetItem.children = childItems;
+ this._updateClass(widgetItem.domNode, "Item", {"Expanding": true});
+ if(!widgetItem._started){
+ var c = widgetItem.connect(widgetItem, "startup", function(){
+ this.disconnect(c);
+ dojo.style(this.arrowWrapper, "display", "");
+ });
+ }else{
+ dojo.style(widgetItem.arrowWrapper, "display", "");
+ }
+ }else{
+ widgetItem = this.getMenuItemForItem(item, parentPane, null);
+ if(itemLoaded){
+ this._updateClass(widgetItem.domNode, "Item", {"Single": true});
+ }else{
+ this._updateClass(widgetItem.domNode, "Item", {"Unloaded": true});
+ widgetItem.attr("disabled", true);
+ }
+ }
+ widgetItem.store = this.store;
+ widgetItem.item = item;
+ if(!widgetItem.label){
+ widgetItem.attr("label", this.store.getLabel(item).replace(/</,"&lt;"));
+ }
+ if(widgetItem.focusNode){
+ var self = this;
+ widgetItem.focus = function(){
+ // Don't set our class
+ if(!this.disabled){try{this.focusNode.focus();}catch(e){}}
+ };
+ widgetItem.connect(widgetItem.focusNode, "onmouseenter", function(){
+ if(!this.disabled){
+ self._updateClass(this.domNode, "Item", {"Hover": true});
+ }
+ });
+ widgetItem.connect(widgetItem.focusNode, "onmouseleave", function(){
+ if(!this.disabled){
+ self._updateClass(this.domNode, "Item", {"Hover": false});
+ }
+ });
+ widgetItem.connect(widgetItem.focusNode, "blur", function(){
+ self._updateClass(this.domNode, "Item", {"Focus": false, "Hover": false});
+ });
+ widgetItem.connect(widgetItem.focusNode, "focus", function(){
+ self._updateClass(this.domNode, "Item", {"Focus": true});
+ self._focusedPane = parentPane;
+ });
+ if(this.executeOnDblClick){
+ widgetItem.connect(widgetItem.focusNode, "ondblclick", function(){
+ self._onExecute();
+ });
+ }
+ }
+ return widgetItem;
+ }
+ },
+
+ _setStore: function(/* dojo.data.api.Read */ store){
+ // summary: sets the store for this widget */
+ if(store === this.store && this._started){ return; }
+ this.store = store;
+ this._isIdentity = store.getFeatures()["dojo.data.api.Identity"];
+ var rootPane = this._getPaneForItem();
+ this.addChild(rootPane, 0);
+ },
+
+ _onKey: function(/*Event*/ e){
+ // summary: called when a keypress event happens on this widget
+ if(e.charOrCode == dojo.keys.BACKSPACE){
+ dojo.stopEvent(e);
+ return;
+ }else if(e.charOrCode == dojo.keys.ESCAPE && this._savedFocus){
+ try{dijit.focus(this._savedFocus);}catch(e){}
+ dojo.stopEvent(e);
+ return;
+ }else if(e.charOrCode == dojo.keys.LEFT_ARROW ||
+ e.charOrCode == dojo.keys.RIGHT_ARROW){
+ dojo.stopEvent(e);
+ return;
+ }
+ },
+
+ _resetValue: function(){
+ // Summary: function called when the value is reset.
+ this.set("value", this._lastExecutedValue);
+ },
+
+ _onCancel: function(){
+ // Summary: function called when the cancel button is clicked. It
+ // resets its value to whatever was last executed and then cancels
+ this._resetValue();
+ this.onCancel();
+ },
+
+ _onExecute: function(){
+ // Summary: function called when the OK button is clicked or when an
+ // item is selected (double-clicked or "enter" pressed on it)
+ this._lastExecutedValue = this.get("value");
+ this.onExecute();
+ },
+
+ focus: function(){
+ // summary: sets the focus state of this widget
+ var wasSaved = this._savedFocus;
+ this._savedFocus = dijit.getFocus(this);
+ if(!this._savedFocus.node){
+ delete this._savedFocus;
+ }
+ if(!this._focusedPane){
+ var child = this.getChildren()[0];
+ if(child && !wasSaved){
+ child.focus(true);
+ }
+ }else{
+ this._savedFocus = dijit.getFocus(this);
+ var foc = this._focusedPane;
+ delete this._focusedPane;
+ if(!wasSaved){
+ foc.focus(true);
+ }
+ }
+ },
+
+ handleKey:function(/*Event*/e){
+ // summary: handle the key for the given event - called by dropdown
+ // widgets
+ if(e.charOrCode == dojo.keys.DOWN_ARROW){
+ delete this._savedFocus;
+ this.focus();
+ return false;
+ }else if(e.charOrCode == dojo.keys.ESCAPE){
+ this._onCancel();
+ return false;
+ }
+ return true;
+ },
+
+ _updateChildClasses: function(){
+ // summary: Called when a child is added or removed - so that we can
+ // update the classes for styling the "current" one differently than
+ // the others
+ var children = this.getChildren();
+ var length = children.length;
+ dojo.forEach(children, function(c, idx){
+ dojo.toggleClass(c.domNode, "dojoxRollingListPaneCurrentChild", (idx == (length - 1)));
+ dojo.toggleClass(c.domNode, "dojoxRollingListPaneCurrentSelected", (idx == (length - 2)));
+ });
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ if(!this.getParent || !this.getParent()){
+ this.resize();
+ this.connect(dojo.global, "onresize", "resize");
+ }
+ this.connect(this, "addChild", "_updateChildClasses");
+ this.connect(this, "removeChild", "_updateChildClasses");
+ this._setStore(this.store);
+ this.set("showButtons", this.showButtons);
+ this.inherited(arguments);
+ this._lastExecutedValue = this.get("value");
+ },
+
+ getChildItems: function(/*item*/ item){
+ // summary: Returns the child items for the given store item
+ var childItems, store = this.store;
+ dojo.forEach(this.childrenAttrs, function(attr){
+ var vals = store.getValues(item, attr);
+ if(vals && vals.length){
+ childItems = (childItems||[]).concat(vals);
+ }
+ });
+ return childItems;
+ },
+
+ getMenuItemForItem: function(/*item*/ item, /* dijit._Contained */ parentPane, /* item[]? */ children){
+ // summary: user overridable function to return a widget for the given item
+ // and its children.
+ return new dijit.MenuItem({});
+ },
+
+ getPaneForItem: function(/* item? */ item, /* dijit._Contained? */ parentPane, /* item[]? */ children){
+ // summary: user-overridable function to return a pane that corresponds
+ // to the given item in the store. It can return null to not add a new pane
+ // (ie, you are planning on doing something else with it in onItemClick)
+ //
+ // Item is undefined for the root pane, children is undefined for non-group panes
+ if(!item || children){
+ return new dojox.widget._RollingListGroupPane({});
+ }else{
+ return null;
+ }
+ },
+
+ onItemClick: function(/* item */ item, /* dijit._Contained */ pane, /* item[]? */ children){
+ // summary: called when an item is clicked - it receives the store item
+ },
+
+ onExecute: function(){
+ // summary: exists so that popups don't disappear too soon
+ },
+
+ onCancel: function(){
+ // summary: exists so that we can close ourselves if we wish
+ },
+
+ onChange: function(/* item */ value){
+ // summary: called when the value of this widget has changed
+ }
+
+});
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/RollingList/RollingList.css b/js/dojo-1.7.2/dojox/widget/RollingList/RollingList.css
new file mode 100644
index 0000000..31649e7
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/RollingList/RollingList.css
@@ -0,0 +1,156 @@
+.dojoxRollingList {
+ border: 1px solid #000;
+ height: 20em;
+ background-color: #FFF;
+ position: relative;
+}
+
+.dijitPopup .dojoxRollingList {
+ position: static;
+}
+
+.dojoxRollingListContainer {
+ overflow: scroll;
+ overflow-y: hidden;
+ overflow-x: scroll;
+ white-space: nowrap;
+}
+
+.dojoxRollingListButtons {
+ position: absolute;
+ right: 5px;
+ padding: 5px 0px;
+}
+
+.dojoxRollingListButtonsHidden .dojoxRollingListButtons {
+ display: none;
+}
+
+.dojoxRollingListPane {
+ overflow: scroll;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ display:-moz-inline-box; /* FF2 */
+ display:inline-block; /* webkit and FF3 */
+ #zoom: 1; /* set hasLayout:true to mimic inline-block */
+ #display:inline; /* don't use .dj_ie since that increases the priority */
+ border:0;
+ padding:0;
+ vertical-align:middle;
+ #vertical-align: auto; /* makes TextBox,Button line up w/native counterparts on IE6 */
+}
+
+.dojoxRollingListPane .dijitMenuItem td {
+ width: 1px;
+}
+.dojoxRollingListPane .dijitMenuItem td.dijitMenuItemLabel {
+ width: auto;
+}
+
+.dojoxRollingListPane .dijitMenuItemLabel,
+.dojoxRollingListPane .dijitMenuItemIcon {
+ position: static !important;
+}
+
+.dj_webkit .dojoxRollingListPane,
+.dj_ie .dojoxRollingListPane {
+ padding-right: 15px; /* Account for scroll bar */
+}
+
+.dojoxRollingListPane .dijitMenu {
+ border: none !important;
+}
+
+.dojoxRollingListItem {
+ cursor: default;
+}
+
+/* Background colors to match menus */
+.tundra .dojoxRollingList {
+ border-color: #b3b3b3;
+}
+.tundra .dijitPopup .dojoxRollingList {
+ border-color: #406b9b;
+}
+.tundra .dojoxRollingListPane {
+ background-color: #f7f7f7;
+}
+.tundra .dojoxRollingListPane .dojoxRollingListItemHover,
+.tundra .dojoxRollingListPane .dojoxRollingListItemFocus {
+ background-color: #e3e3e3;
+}
+.tundra .dojoxRollingListPane .dojoxRollingListItemSelected {
+ color: #fff;
+ background-color: #999;
+ font-weight: bold;
+}
+.tundra .dojoxRollingListPaneCurrentSelected .dojoxRollingListItemSelected {
+ background-color: #3559ac;
+}
+.tundra .dojoxRollingListPane .dojoxRollingListItemHoverSelected,
+.tundra .dojoxRollingListPane .dojoxRollingListItemFocusSelected {
+ background-color: #9aacd6;
+}
+.tundra .dojoxRollingListItem {
+ font-family: inherit;
+}
+
+.soria .dojoxRollingList {
+ border-color: #8ba0bd;
+}
+.soria .dijitPopup .dojoxRollingList {
+ border-color: #406b9b;
+}
+.soria .dojoxRollingListPane {
+ background-color: #fff;
+}
+.soria .dojoxRollingListPane .dojoxRollingListItemHover,
+.soria .dojoxRollingListPane .dojoxRollingListItemFocus {
+ background-color: #e3e3e3;
+}
+.soria .dojoxRollingListPane .dojoxRollingListItemSelected {
+ color: #243C5F;
+ background-color: #ccc;
+ font-weight: bold;
+}
+.soria .dojoxRollingListPaneCurrentSelected .dojoxRollingListItemSelected {
+ background-color: #d9e6f9;
+}
+.soria .dojoxRollingListPane .dojoxRollingListItemHoverSelected,
+.soria .dojoxRollingListPane .dojoxRollingListItemFocusSelected {
+ background-color: #ecf3fc;
+}
+.soria .dojoxRollingListItem {
+ font-family: inherit;
+}
+
+
+.nihilo .dojoxRollingList {
+ border-color: #d3d3d3;
+}
+.nihilo .dijitPopup .dojoxRollingList {
+ border-color: #b3b3b3;
+}
+.nihilo .dojoxRollingListPane {
+ background-color: #fff;
+}
+.nihilo .dojoxRollingListPane .dojoxRollingListItemHover,
+.nihilo .dojoxRollingListPane .dojoxRollingListItemFocus {
+ background-color: #e3e3e3;
+}
+.nihilo .dojoxRollingListPane .dojoxRollingListItemSelected {
+ color: #243C5F;
+ background-color: #ccc;
+ font-weight: bold;
+}
+.nihilo .dojoxRollingListPaneCurrentSelected .dojoxRollingListItemSelected {
+ background-color: #ffe284;
+}
+.nihilo .dojoxRollingListPane .dojoxRollingListItemHoverSelected,
+.nihilo .dojoxRollingListPane .dojoxRollingListItemFocusSelected {
+ background-color: #fff1c2;
+}
+.nihilo .dojoxRollingListItem {
+ font-family: inherit;
+}
+
diff --git a/js/dojo-1.7.2/dojox/widget/RollingList/RollingList.html b/js/dojo-1.7.2/dojox/widget/RollingList/RollingList.html
new file mode 100644
index 0000000..ec26ebb
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/RollingList/RollingList.html
@@ -0,0 +1,10 @@
+<div class="dojoxRollingList ${className}"
+ ><div class="dojoxRollingListContainer" dojoAttachPoint="containerNode" dojoAttachEvent="onkeypress:_onKey"
+ ></div
+ ><div class="dojoxRollingListButtons" dojoAttachPoint="buttonsNode"
+ ><button dojoType="dijit.form.Button" dojoAttachPoint="okButton"
+ dojoAttachEvent="onClick:_onExecute">${okButtonLabel}</button
+ ><button dojoType="dijit.form.Button" dojoAttachPoint="cancelButton"
+ dojoAttachEvent="onClick:_onCancel">${cancelButtonLabel}</button
+ ></div
+></div>
diff --git a/js/dojo-1.7.2/dojox/widget/Rotator.js b/js/dojo-1.7.2/dojox/widget/Rotator.js
new file mode 100644
index 0000000..00ba6f7
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Rotator.js
@@ -0,0 +1,368 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/Rotator", ["dijit","dojo","dojox","dojo/require!dojo/parser"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.Rotator");
+dojo.require("dojo.parser");
+
+(function(d){
+
+ // build friendly strings
+ var _defaultTransition = "dojox.widget.rotator.swap", // please do NOT change
+ _defaultTransitionDuration = 500,
+ _displayStr = "display",
+ _noneStr = "none",
+ _zIndex = "zIndex";
+
+ d.declare("dojox.widget.Rotator", null, {
+ // summary:
+ // A widget for rotating through child nodes using transitions.
+ //
+ // description:
+ // A small, fast, extensible, awesome rotator that cycles, with transitions,
+ // through panes (child nodes) displaying only one at a time and ties into
+ // controllers used to change state.
+ //
+ // The Rotator does not rely on dijit. It is designed to be as lightweight
+ // as possible. Controllers and transitions have been externalized
+ // so builds can be as optimized with only the components you want to use.
+ //
+ // For best results, each rotator pane should be the same height and width as
+ // the Rotator container node and consider setting overflow to hidden.
+ // While the Rotator will accept any DOM node for a rotator pane, a block
+ // element or element with display:block is recommended.
+ //
+ // Note: When the Rotator begins, it does not transition the first pane.
+ //
+ // subscribed topics:
+ // [id]/rotator/control - Controls the Rotator
+ // Parameters:
+ // /*string*/ action - The name of a method of the Rotator to run
+ // /*anything?*/ args - One or more arguments to pass to the action
+ //
+ // published topics:
+ // [id]/rotator/update - Notifies controllers that a pane or state has changed.
+ // Parameters:
+ // /*string*/ type - the type of notification
+ // /*dojox.widget.Rotator*/ rotator
+ // - the rotator instance
+ // /*object?*/ params - params
+ //
+ // declarative dojo/method events (per pane):
+ // onBeforeIn - Fired before the transition in starts.
+ // onAfterIn - Fired after the transition in ends.
+ // onBeforeOut - Fired before the transition out starts.
+ // onAfterOut - Fired after the transition out ends.
+ //
+ // example:
+ // | <div dojoType="dojox.widget.Rotator">
+ // | <div>Pane 1!</div>
+ // | <div>Pane 2!</div>
+ // | </div>
+ //
+ // example:
+ // | <script type="text/javascript">
+ // | dojo.require("dojox.widget.rotator.Fade");
+ // | </script>
+ // | <div dojoType="dojox.widget.Rotator" transition="dojox.widget.rotator.crossFade">
+ // | <div>Pane 1!</div>
+ // | <div>Pane 2!</div>
+ // | </div>
+
+ // transition: string
+ // The name of a function that is passed two panes nodes and a duration,
+ // then returns a dojo.Animation object. The default value is
+ // "dojox.widget.rotator.swap".
+ transition: _defaultTransition,
+
+ // transitionParams: string
+ // Parameters for the transition. The string is read in and eval'd as an
+ // object. If the duration is absent, the default value will be used.
+ transitionParams: "duration:" + _defaultTransitionDuration,
+
+ // panes: array
+ // Array of panes to be created in the Rotator. Each array element
+ // will be passed as attributes to a dojo.create() call.
+ panes: null,
+
+ constructor: function(/*Object*/params, /*DomNode|string*/node){
+ // summary:
+ // Initializes the panes and events.
+ d.mixin(this, params);
+
+ var _t = this,
+ t = _t.transition,
+ tt = _t._transitions = {},
+ idm = _t._idMap = {},
+ tp = _t.transitionParams = eval("({ " + _t.transitionParams + " })"),
+ node = _t._domNode = dojo.byId(node),
+ cb = _t._domNodeContentBox = d.contentBox(node), // we are going to assume the rotator will not be changing size
+
+ // default styles to apply to all the container node and rotator's panes
+ p = {
+ left: 0,
+ top: 0
+ },
+
+ warn = function(bt, dt){
+ console.warn(_t.declaredClass, ' - Unable to find transition "', bt, '", defaulting to "', dt, '".');
+ };
+
+ // if we don't have an id, then generate one
+ _t.id = node.id || (new Date()).getTime();
+
+ // force the rotator DOM node to a relative position and attach the container node to it
+ if(d.style(node, "position") == "static"){
+ d.style(node, "position", "relative");
+ }
+
+ // create our object for caching transition objects
+ tt[t] = d.getObject(t);
+ if(!tt[t]){
+ warn(t, _defaultTransition);
+ tt[_t.transition = _defaultTransition] = d.getObject(_defaultTransition);
+ }
+
+ // clean up the transition params
+ if(!tp.duration){
+ tp.duration = _defaultTransitionDuration;
+ }
+
+ // if there are any panes being passed in, add them to this node
+ d.forEach(_t.panes, function(p){
+ d.create("div", p, node);
+ });
+
+ // zero out our panes array to store the real pane instance
+ var pp = _t.panes = [];
+
+ // find and initialize the panes
+ d.query(">", node).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") || _t.transition;
+
+ // cache each pane's title, duration, and waitForEvent attributes
+ d.forEach(["id", "title", "duration", "waitForEvent"], function(a){
+ q[a] = d.attr(n, a);
+ });
+
+ if(q.id){
+ idm[q.id] = i;
+ }
+
+ // cache the transition function
+ if(!tt[r] && !(tt[r] = d.getObject(r))){
+ warn(r, q.trans = _t.transition);
+ }
+
+ p.position = "absolute";
+ p.display = _noneStr;
+
+ // find the selected pane and initialize styles
+ if(_t.idx == null || d.attr(n, "selected")){
+ if(_t.idx != null){
+ d.style(pp[_t.idx].node, _displayStr, _noneStr);
+ }
+ _t.idx = i;
+ p.display = "";
+ }
+ d.style(n, p);
+
+ // check for any declarative script blocks
+ 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);
+ }
+ });
+
+ // add this pane to the array of panes
+ pp.push(q);
+ });
+
+ _t._controlSub = d.subscribe(_t.id + "/rotator/control", _t, "control");
+ },
+
+ destroy: function(){
+ // summary:
+ // Destroys the Rotator and its DOM node.
+ d.forEach([this._controlSub, this.wfe], d.unsubscribe);
+ d.destroy(this._domNode);
+ },
+
+ next: function(){
+ // summary:
+ // Transitions the Rotator to the next pane.
+ return this.go(this.idx + 1);
+ },
+
+ prev: function(){
+ // summary:
+ // Transitions the Rotator to the previous pane.
+ return this.go(this.idx - 1);
+ },
+
+ go: function(/*int|string?*/p){
+ // summary:
+ // Transitions the Rotator to the specified pane index.
+ var _t = this,
+ i = _t.idx,
+ pp = _t.panes,
+ len = pp.length,
+ idm = _t._idMap[p];
+
+ // we gotta move on, so if the current pane is waiting for an event, just
+ // ignore it and clean up
+ _t._resetWaitForEvent();
+
+ // determine the next index and set it to idx for the next go to
+ p = idm != null ? idm : (p || 0);
+ p = p < len ? (p < 0 ? len-1 : p) : 0;
+
+ // if we're already on the requested pane or still transitioning, then return
+ if(p == i || _t.anim){
+ return null;
+ }
+
+ // get the current and next panes
+ var current = pp[i],
+ next = pp[p];
+
+ // adjust the zIndexes so our animations look good... this must be done before
+ // the animation is created so the animation could override it if necessary
+ d.style(current.node, _zIndex, 2);
+ d.style(next.node, _zIndex, 1);
+
+ // info object passed to animations and onIn/Out events
+ var info = {
+ current: current,
+ next: next,
+ rotator: _t
+ },
+
+ // get the transition
+ anim = _t.anim = _t._transitions[next.trans](d.mixin({
+ rotatorBox: _t._domNodeContentBox
+ }, info, next.params));
+
+ if(anim){
+ // create the deferred that we'll be returning
+ var def = new d.Deferred(),
+ ev = next.waitForEvent,
+
+ h = d.connect(anim, "onEnd", function(){
+ // reset the node styles
+ d.style(current.node, {
+ display: _noneStr,
+ left: 0,
+ opacity: 1,
+ top: 0,
+ zIndex: 0
+ });
+
+ d.disconnect(h);
+ _t.anim = null;
+ _t.idx = p;
+
+ // fire end events
+ if(current.onAfterOut){ current.onAfterOut(info); }
+ if(next.onAfterIn){ next.onAfterIn(info); }
+
+ _t.onUpdate("onAfterTransition");
+
+ if(!ev){
+ // if there is a previous waitForEvent, then we need to make
+ // sure it gets unsubscribed
+ _t._resetWaitForEvent();
+
+ // animation is all done, fire the deferred callback.
+ def.callback();
+ }
+ });
+
+ // if we're waiting for an event, subscribe to it so we know when to continue
+ _t.wfe = ev ? d.subscribe(ev, function(){
+ _t._resetWaitForEvent();
+ def.callback(true);
+ }) : null;
+
+ _t.onUpdate("onBeforeTransition");
+
+ // fire start events
+ if(current.onBeforeOut){ current.onBeforeOut(info); }
+ if(next.onBeforeIn){ next.onBeforeIn(info); }
+
+ // play the animation
+ anim.play();
+
+ // return the deferred
+ return def; /*Deferred*/
+ }
+ },
+
+ onUpdate: function(/*string*/type, /*object?*/params){
+ // summary:
+ // Send a notification to all controllers with the state of the rotator.
+ d.publish(this.id + "/rotator/update", [type, this, params || {}]);
+ },
+
+ _resetWaitForEvent: function(){
+ // summary:
+ // If there is a waitForEvent pending, kill it.
+ if(this.wfe){
+ d.unsubscribe(this.wfe);
+ this.wfe = null;
+ }
+ },
+
+ control: function(/*string*/action){
+ // summary:
+ // Dispatches an action, first to this engine, then to the Rotator.
+ var args = d._toArray(arguments),
+ _t = this;
+ args.shift();
+
+ _t._resetWaitForEvent();
+
+ if(_t[action]){
+ // action exists, so call it and fire deferred if applicable
+ var def = _t[action].apply(_t, args);
+ if(def){
+ def.addCallback(function(){
+ _t.onUpdate(action);
+ });
+ }
+
+ // since this action was triggered by a controller, we assume this was a
+ // manual action, so check if we should pause
+ _t.onManualChange(action);
+ }else{
+ console.warn(_t.declaredClass, ' - Unsupported action "', action, '".');
+ }
+ },
+
+ resize: function(/*int*/width, /*int*/height){
+ var b = this._domNodeContentBox = { w: width, h: height };
+ d.contentBox(this._domNode, b);
+ d.forEach(this.panes, function(p){ d.contentBox(p.node, b); });
+ },
+
+ onManualChange: function(){
+ // summary:
+ // Stub function that can be overriden or connected to.
+ }
+ });
+
+ d.setObject(_defaultTransition, function(/*Object*/args){
+ // summary:
+ // The default rotator transition which swaps two panes.
+ return new d._Animation({ // dojo.Animation
+ play: function(){
+ d.style(args.current.node, _displayStr, _noneStr);
+ d.style(args.next.node, _displayStr, "");
+ this._fire("onEnd");
+ }
+ });
+ });
+
+})(dojo);
+});
diff --git a/js/dojo-1.7.2/dojox/widget/SortList.js b/js/dojo-1.7.2/dojox/widget/SortList.js
new file mode 100644
index 0000000..76765cb
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/SortList.js
@@ -0,0 +1,155 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/SortList", ["dijit","dojo","dojox","dojo/require!dijit/layout/_LayoutWidget,dijit/_Templated"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.SortList");
+dojo.experimental("dojox.widget.SortList"); // level: prototype, designed for dijit.chat.demo
+
+dojo.require("dijit.layout._LayoutWidget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dojox.widget.SortList",
+ [dijit.layout._LayoutWidget, dijit._Templated],
+ {
+ // summary: A sortable unordered-list with a fixed header for use in dijit.demos.chat
+ // for demonstration purposes only for now. feel free to make API suggestions
+ // or fixes.
+ //
+ // title: String
+ // The title in the header
+ title: "",
+
+ // heading: String
+ // In the event a parent container is expecting a title="" attribute, set it for the parent
+ // via title, and the title of this widget via heading="" ... assuming you want different
+ // titles for each. eg: TabContainer, AccordionContainer, etc.
+ heading: "",
+
+ // descending: Boolean
+ // Toggle sort order based on this value.
+ descending: true,
+
+ // selected: Array
+ // A list of the selected <li> nodes at any given time.
+ selected: null,
+
+ // sortable: Boolean
+ // toggle to enable/disable sorting
+ sortable: true,
+
+ // FIXME: this is really simple store support
+ store: "",
+ key: "name",
+
+ 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\">&thinsp;</div>\n\t\t<span dojoAttachPoint=\"focusNode\">${title}</span>\n\t\t</div>\n\t\t<div class=\"sortListBodyWrapper\" dojoAttachEvent=\"onmouseover: _set, onmouseout: _unset, onclick:_handleClick\" dojoAttachPoint=\"bodyWrapper\">\n\t\t<ul dojoAttachPoint=\"containerNode\" class=\"sortListBody\"></ul>\n\t</div>\n</div>"),
+
+ _addItem: function(item){
+ dojo.create("li", {
+ innerHTML: this.store.getValue(item, this.key).replace(/</g, "&lt;")
+ }, this.containerNode);
+ },
+
+ postCreate: function(){
+ if(this.store){
+ this.store = dojo.getObject(this.store);
+ var props = {
+ onItem: dojo.hitch(this, "_addItem"),
+ onComplete: dojo.hitch(this, "onSort")
+ };
+ this.store.fetch(props);
+ }else{ this.onSort(); }
+ this.inherited(arguments);
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+ if(this.heading){
+ this.setTitle(this.heading);
+ this.title = this.heading;
+ }
+ // we cheat, and give the browser just enough time so we know our height
+ setTimeout(dojo.hitch(this,"resize"), 5);
+ if(this.sortable){ this.connect(this.titleNode,"onclick", "onSort"); }
+ },
+
+ resize: function(){
+ // summary: do our additional calculations when resize() is called by or in a parent
+ this.inherited(arguments);
+ // FIXME:
+ // the 10 comes from the difference between the contentBox and calculated height
+ // because of badding and border extents. this shouldn't be done this way, a theme change will
+ // break it: but we also don't want to run getComputedStyle or dojo.coords() every time resize()
+ // is fired.
+ var offset = ((this._contentBox.h) - (dojo.style(this.titleNode,"height")))-10;
+ this.bodyWrapper.style.height = Math.abs(offset) + "px";
+ },
+
+ onSort: function(/* Event */e){
+ // summary: sort the data, and style the nodes.
+
+ var arr = dojo.query("li",this.domNode);
+ if (this.sortable){
+ this.descending = !this.descending;
+ dojo.addClass(this.titleNode,((this.descending)?"sortListDesc":"sortListAsc"));
+ dojo.removeClass(this.titleNode,((this.descending)?"sortListAsc":"sortListDesc"));
+ arr.sort(this._sorter);
+ if(this.descending){ arr.reverse(); }
+ }
+ var i=0;
+ dojo.forEach(arr,function(item){
+ dojo[(i++) % 2 === 0 ? "addClass" : "removeClass"](item,"sortListItemOdd");
+ this.containerNode.appendChild(item);
+ },this);
+ },
+
+ _set: function(/* Event */e){
+ // summary: set hover state
+ if(e.target !== this.bodyWrapper){
+ dojo.addClass(e.target,"sortListItemHover");
+ }
+ },
+
+ _unset: function(/* Event */e){
+ // summary: remove hover state (FIXME: combine with _set?)
+ dojo.removeClass(e.target,"sortListItemHover");
+ },
+
+ _handleClick: function(/* Event */e){
+ // summary: click listener for data portion of widget. toggle selected state
+ // of node, and update this.selected array accordingly
+ dojo.toggleClass(e.target,"sortListItemSelected");
+ e.target.focus();
+ this._updateValues(e.target.innerHTML);
+ },
+
+ _updateValues: function(){
+ this._selected = dojo.query("li.sortListItemSelected", this.containerNode);
+ this.selected = [];
+ dojo.forEach(this._selected, function(node){
+ this.selected.push(node.innerHTML);
+ }, this);
+ this.onChanged(arguments);
+ },
+
+ _sorter: function(a,b){
+ // summary: a basic sort function, use query sort, or keep this?
+ var aStr = a.innerHTML;
+ var bStr = b.innerHTML;
+ if(aStr>bStr){ return 1; }
+ if(aStr<bStr){ return -1; }
+ return 0;
+ },
+
+ setTitle: function(/* String */title){
+ // summary: Sets the widget title to a String
+ this.focusNode.innerHTML = this.title = title;
+ },
+
+ onChanged: function(){
+ // summary: stub function, passes the last changed item, and is fired after current state
+ }
+
+});
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/SortList/SortList.css b/js/dojo-1.7.2/dojox/widget/SortList/SortList.css
new file mode 100644
index 0000000..a3eb54e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/SortList/SortList.css
@@ -0,0 +1,68 @@
+.sortListBody { margin:0; padding:0; background:#fff; }
+
+.soria .sortListBody li,
+.tundra .sortListBody li {
+ border-bottom:1px solid #b7b7b7;
+ padding:2px 2px 2px 5px;
+}
+.sortListTitle {
+ cursor:pointer;
+ padding:4px 4px 3px 4px;
+}
+
+.sortList { height:100%; width:100%; }
+
+/* for nested layout elements */
+.dijitBorderContainer .dojoxSortList { width: auto; height: auto;}
+
+.sortListBodyWrapper {
+ border:1px solid #b7b7b7;
+ overflow:auto;
+ height:100%;
+ cursor:pointer;
+}
+
+.soria .sortListBodyWrapper {
+ border:1px solid #333;
+}
+
+.soria .sortListItemOdd,
+.tundra .sortListItemOdd { background:#f2f5f9; }
+.tundra .sortListTitle {
+ background:#fafafa url('../../../dijit/themes/tundra/images/titleBarBg.gif') repeat-x top left;
+ border:1px solid #bfbfbf;
+ border-bottom:0;
+}
+.soria .sortListTitle {
+ background:#4f8ce5 url('../../../dijit/themes/soria/images/titleBar.png') repeat-x top left;
+ background-position:0px -1px;
+ border:1px solid #333;
+ border-bottom:0;
+ font-weight:bold;
+ color:#fff;
+}
+
+.sortListItemSelected { background:#b7cdee !important; }
+.sortListItemHover { background:#ff6 !important; }
+
+.soria .sortListIcon,
+.tundra .sortListIcon {
+ float:right;
+ background:url('../../../dijit/themes/tundra/images/spriteArrows.png') no-repeat;
+ width: 7px;
+}
+.tundra .sortListDesc .sortListIcon {
+ background-position: 0px center;
+}
+.tundra .sortListAsc .sortListIcon {
+ background-position: -21px center;
+}
+
+.soria .sortListDesc .sortListIcon,
+.soria .sortListAsc .sortListIcon {
+ background:url('../../../dijit/themes/soria/images/spriteRoundedIconsSmall.png') no-repeat -15px top;
+}
+
+.soria .sortListDesc .sortListIcon {
+ background-position:-45px 0px;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/SortList/SortList.html b/js/dojo-1.7.2/dojox/widget/SortList/SortList.html
new file mode 100644
index 0000000..2cc16eb
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/SortList/SortList.html
@@ -0,0 +1,9 @@
+<div class="sortList" id="${id}">
+ <div class="sortListTitle" dojoAttachPoint="titleNode">
+ <div class="dijitInline sortListIcon">&thinsp;</div>
+ <span dojoAttachPoint="focusNode">${title}</span>
+ </div>
+ <div class="sortListBodyWrapper" dojoAttachEvent="onmouseover: _set, onmouseout: _unset, onclick:_handleClick" dojoAttachPoint="bodyWrapper">
+ <ul dojoAttachPoint="containerNode" class="sortListBody"></ul>
+ </div>
+</div> \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/Standby.js b/js/dojo-1.7.2/dojox/widget/Standby.js
new file mode 100644
index 0000000..a21bec6
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Standby.js
@@ -0,0 +1,777 @@
+//>>built
+define("dojox/widget/Standby", ["dojo/_base/kernel",
+ "dojo/_base/declare",
+ "dojo/_base/array",
+ "dojo/_base/event",
+ "dojo/_base/sniff",
+ "dojo/dom",
+ "dojo/dom-attr",
+ "dojo/dom-construct",
+ "dojo/dom-geometry",
+ "dojo/dom-style",
+ "dojo/window",
+ "dojo/_base/window",
+ "dojo/_base/fx",
+ "dojo/fx",
+ "dijit/_Widget",
+ "dijit/_TemplatedMixin",
+ "dijit/registry"],
+
+function(kernel,
+ declare,
+ array,
+ event,
+ has,
+ dom,
+ attr,
+ construct,
+ geometry,
+ domStyle,
+ window,
+ baseWindow,
+ baseFx,
+ fx,
+ _Widget,
+ _TemplatedMixin,
+ registry) {
+
+kernel.experimental("dojox.widget.Standby");
+
+return declare("dojox.widget.Standby", [_Widget, _TemplatedMixin],{
+ // summary:
+ // A widget designed to act as a Standby/Busy/Disable/Blocking widget to indicate a
+ // particular DOM node is processing and cannot be clicked on at this time.
+ // This widget uses absolute positioning to apply the overlay and image.
+ //
+ // image:
+ // A URL to an image to center within the blocking overlay.
+ // The default is a basic spinner.
+ //
+ // imageText:
+ // Text to set on the ALT tag of the image.
+ // The default is 'Please wait...'
+ //
+ // text:
+ // Text to display in the center instead of an image.
+ // Defaults to 'Please Wait...'
+ //
+ // centerIndicator:
+ // Which to use as the center info, the text or the image.
+ // Defaults to image.
+ //
+ // color:
+ // The color to use for the translucent overlay.
+ // Text string such as: darkblue, #FE02FD, etc.
+ //
+ // duration:
+ // How long the fade in and out effects should run in milliseconds.
+ // Default is 500ms
+ //
+ // zIndex:
+ // Control that lets you specify if the zIndex for the overlay
+ // should be auto-computed based off parent zIndex, or should be set
+ // to a particular value. This is useful when you want to overlay
+ // things in digit.Dialogs, you can specify a base zIndex to append from.
+ // Default is 'auto'.
+
+ // templateString: [protected] String
+ // The template string defining out the basics of the widget. No need for an external
+ // file.
+ 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;\" dojoAttachPoint=\"_textNode\"></div>" +
+ "</div>",
+
+ // _underlayNode: [private] DOMNode
+ // The node that is the translucent underlay for the
+ // image that blocks access to the target.
+ _underlayNode: null,
+
+ // _imageNode: [private] DOMNode
+ // The image node where we attach and define the image to display.
+ _imageNode: null,
+
+ // _textNode: [private] DOMNode
+ // The div to attach text/HTML in the overlay center item.
+ _textNode: null,
+
+ // _centerNode: [private] DOMNode
+ // Which node to use as the center node, the image or the text node.
+ _centerNode: null,
+
+ // image: String
+ // The URL to the image to center in the overlay.
+ image: require.toUrl("dojox/widget/Standby/images/loading.gif").toString(),
+
+ // imageText: String
+ // Text for the ALT tag.
+ imageText: "Please Wait...", // TODO: i18n
+
+ // text: String
+ // Text/HTML to display in the center of the overlay
+ // This is used if image center is disabled.
+ text: "Please wait...",
+
+ // centerIndicator: String
+ // Property to define if the image and its alt text should be used, or
+ // a simple Text/HTML node should be used. Allowable values are 'image'
+ // and 'text'.
+ // Default is 'image'.
+ centerIndicator: "image",
+
+ // _displayed: [private] Boolean
+ // Flag to indicate if the overlay is displayed or not.
+ _displayed: false,
+
+ // _resizeCheck: [private] Object
+ // Handle to interval function that checks the target for changes.
+ _resizeCheck: null,
+
+ // target: DOMNode||DOMID(String)||WidgetID(String)
+ // The target to overlay when active. Can be a widget id, a
+ // dom id, or a direct node reference.
+ target: "",
+
+ // color: String
+ // The color to set the overlay. Should be in #XXXXXX form.
+ // Default color for the translucent overlay is light gray.
+ color: "#C0C0C0",
+
+ // duration: integer
+ // Integer defining how long the show and hide effects should take.
+ duration: 500,
+
+ // _started: [private] Boolean
+ // Trap flag to ensure startup only processes once.
+ _started: false,
+
+ // _parent: [private] DOMNode
+ // Wrapping div for the widget, also used for IE 7 in dealing with the
+ // zoom issue.
+ _parent: null,
+
+ // zIndex: String
+ // Control that lets you specify if the zIndex for the overlay
+ // should be auto-computed based off parent zIndex, or should be set
+ // to a particular value. This is useful when you want to overlay
+ // things in digit.Dialogs, you can specify a base zIndex to append from.
+ zIndex: "auto",
+
+ startup: function(args){
+ // summary:
+ // Over-ride of the basic widget startup function.
+ // Configures the target node and sets the image to use.
+ if(!this._started){
+ if(typeof this.target === "string"){
+ var w = registry.byId(this.target);
+ this.target = w ? w.domNode : dom.byId(this.target);
+ }
+
+ if(this.text){
+ this._textNode.innerHTML = this.text;
+ }
+ if(this.centerIndicator === "image"){
+ this._centerNode = this._imageNode;
+ attr.set(this._imageNode, "src", this.image);
+ attr.set(this._imageNode, "alt", this.imageText);
+ }else{
+ this._centerNode = this._textNode;
+ }
+ domStyle.set(this._underlayNode, {
+ display: "none",
+ backgroundColor: this.color
+ });
+ domStyle.set(this._centerNode, "display", "none");
+ this.connect(this._underlayNode, "onclick", "_ignore");
+
+ //Last thing to do is move the widgets parent, if any, to the current document body.
+ //Avoids having to deal with parent relative/absolute mess. Otherwise positioning
+ //tends to go goofy.
+ if(this.domNode.parentNode && this.domNode.parentNode != baseWindow.body()){
+ baseWindow.body().appendChild(this.domNode);
+ }
+
+ //IE 7 has a horrible bug with zoom, so we have to create this node
+ //to cross-check later. Sigh.
+ if(has("ie") == 7){
+ this._ieFixNode = construct.create("div");
+ domStyle.set(this._ieFixNode, {
+ opacity: "0",
+ zIndex: "-1000",
+ position: "absolute",
+ top: "-1000px"
+ });
+ baseWindow.body().appendChild(this._ieFixNode);
+ }
+ this.inherited(arguments);
+ }
+ },
+
+ show: function(){
+ // summary:
+ // Function to display the blocking overlay and busy/status icon or text.
+ if(!this._displayed){
+ if(this._anim){
+ this._anim.stop();
+ delete this._anim;
+ }
+ this._displayed = true;
+ this._size();
+ this._disableOverflow();
+ this._fadeIn();
+ }
+ },
+
+ hide: function(){
+ // summary:
+ // Function to hide the blocking overlay and status icon or text.
+ if(this._displayed){
+ if(this._anim){
+ this._anim.stop();
+ delete this._anim;
+ }
+ this._size();
+ this._fadeOut();
+ this._displayed = false;
+ if(this._resizeCheck !== null){
+ clearInterval(this._resizeCheck);
+ this._resizeCheck = null;
+ }
+ }
+ },
+
+ isVisible: function(){
+ // summary:
+ // Helper function so you can test if the widget is already visible or not.
+ // returns:
+ // boolean indicating if the widget is in 'show' state or not.
+ return this._displayed; // boolean
+ },
+
+ onShow: function(){
+ // summary:
+ // Event that fires when the display of the Standby completes.
+ },
+
+ onHide: function(){
+ // summary:
+ // Event that fires when the display of the Standby completes.
+ },
+
+ uninitialize: function(){
+ // summary:
+ // Over-ride to hide the widget, which clears intervals, before cleanup.
+ this._displayed = false;
+ if(this._resizeCheck){
+ clearInterval(this._resizeCheck);
+ }
+ domStyle.set(this._centerNode, "display", "none");
+ domStyle.set(this._underlayNode, "display", "none");
+ if(has("ie") == 7 && this._ieFixNode){
+ baseWindow.body().removeChild(this._ieFixNode);
+ delete this._ieFixNode;
+ }
+ if(this._anim){
+ this._anim.stop();
+ delete this._anim;
+ }
+ this.target = null;
+ this._imageNode = null;
+ this._textNode = null;
+ this._centerNode = null;
+ this.inherited(arguments);
+ },
+
+ _size: function(){
+ // summary:
+ // Internal function that handles resizing the overlay and
+ // centering of the image on window resizing.
+ // tags:
+ // private
+ if(this._displayed){
+ var dir = attr.get(baseWindow.body(), "dir");
+ if(dir){dir = dir.toLowerCase();}
+ var _ie7zoom;
+ var scrollers = this._scrollerWidths();
+
+ var target = this.target;
+
+ //Show the image and make sure the zIndex is set high.
+ var curStyle = domStyle.get(this._centerNode, "display");
+ domStyle.set(this._centerNode, "display", "block");
+ var box = geometry.position(target, true);
+ if(target === baseWindow.body() || target === baseWindow.doc){
+ // Target is the whole doc, so scale to viewport.
+ box = window.getBox();
+ box.x = box.l;
+ box.y = box.t;
+ }
+
+ var cntrIndicator = geometry.getMarginBox(this._centerNode);
+ domStyle.set(this._centerNode, "display", curStyle);
+
+ //IE has a horrible zoom bug. So, we have to try and account for
+ //it and fix up the scaling.
+ if(this._ieFixNode){
+ _ie7zoom = -this._ieFixNode.offsetTop / 1000;
+ box.x = Math.floor((box.x + 0.9) / _ie7zoom);
+ box.y = Math.floor((box.y + 0.9) / _ie7zoom);
+ box.w = Math.floor((box.w + 0.9) / _ie7zoom);
+ box.h = Math.floor((box.h + 0.9) / _ie7zoom);
+ }
+
+ //Figure out how to zIndex this thing over the target.
+ var zi = domStyle.get(target, "zIndex");
+ var ziUl = zi;
+ var ziIn = zi;
+
+ if(this.zIndex === "auto"){
+ if(zi != "auto"){
+ ziUl = parseInt(ziUl, 10) + 1;
+ ziIn = parseInt(ziIn, 10) + 2;
+ }else{
+ //We need to search up the chain to see if there
+ //are any parent zIndexs to overlay.
+ var cNode = target.parentNode;
+ var oldZi = -100000;
+ while(cNode && cNode !== baseWindow.body()){
+ zi = domStyle.get(cNode, "zIndex");
+ if(!zi || zi === "auto"){
+ cNode = cNode.parentNode;
+ }else{
+ var newZi = parseInt(zi, 10);
+ if(oldZi < newZi){
+ oldZi = newZi;
+ ziUl = newZi + 1;
+ ziIn = newZi + 2;
+ }
+ // Keep looking until we run out, we want the highest zIndex.
+ cNode = cNode.parentNode;
+ }
+ }
+ }
+ }else{
+ ziUl = parseInt(this.zIndex, 10) + 1;
+ ziIn = parseInt(this.zIndex, 10) + 2;
+ }
+
+ domStyle.set(this._centerNode, "zIndex", ziIn);
+ domStyle.set(this._underlayNode, "zIndex", ziUl);
+
+
+ var pn = target.parentNode;
+ if(pn && pn !== baseWindow.body() &&
+ target !== baseWindow.body() &&
+ target !== baseWindow.doc){
+
+ // If the parent is the body tag itself,
+ // we can avoid all this, the body takes
+ // care of overflow for me. Besides, browser
+ // weirdness with height and width on body causes
+ // problems with this sort of intersect testing
+ // anyway.
+ var obh = box.h;
+ var obw = box.w;
+ var pnBox = geometry.position(pn, true);
+
+ //More IE zoom corrections. Grr.
+ if(this._ieFixNode){
+ _ie7zoom = -this._ieFixNode.offsetTop / 1000;
+ pnBox.x = Math.floor((pnBox.x + 0.9) / _ie7zoom);
+ pnBox.y = Math.floor((pnBox.y + 0.9) / _ie7zoom);
+ pnBox.w = Math.floor((pnBox.w + 0.9) / _ie7zoom);
+ pnBox.h = Math.floor((pnBox.h + 0.9) / _ie7zoom);
+ }
+
+ //Shift the parent width/height a bit if scollers are present.
+ pnBox.w -= pn.scrollHeight > pn.clientHeight &&
+ pn.clientHeight > 0 ? scrollers.v: 0;
+ pnBox.h -= pn.scrollWidth > pn.clientWidth &&
+ pn.clientWidth > 0 ? scrollers.h: 0;
+
+ //RTL requires a bit of massaging in some cases
+ //(and differently depending on browser, ugh!)
+ //WebKit and others still need work.
+ if(dir === "rtl"){
+ if(has("opera")){
+ box.x += pn.scrollHeight > pn.clientHeight &&
+ pn.clientHeight > 0 ? scrollers.v: 0;
+ pnBox.x += pn.scrollHeight > pn.clientHeight &&
+ pn.clientHeight > 0 ? scrollers.v: 0;
+ }else if(has("ie")){
+ pnBox.x += pn.scrollHeight > pn.clientHeight &&
+ pn.clientHeight > 0 ? scrollers.v: 0;
+ }else if(has("webkit")){
+ //TODO: FIX THIS!
+ }
+ }
+
+ //Figure out if we need to adjust the overlay to fit a viewable
+ //area, then resize it, we saved the original height/width above.
+ //This is causing issues on IE. Argh!
+ if(pnBox.w < box.w){
+ //Scale down the width if necessary.
+ box.w = box.w - pnBox.w;
+ }
+ if(pnBox.h < box.h){
+ //Scale down the width if necessary.
+ box.h = box.h - pnBox.h;
+ }
+
+ //Look at the y positions and see if we intersect with the
+ //viewport borders. Will have to do computations off it.
+ var vpTop = pnBox.y;
+ var vpBottom = pnBox.y + pnBox.h;
+ var bTop = box.y;
+ var bBottom = box.y + obh;
+ var vpLeft = pnBox.x;
+ var vpRight = pnBox.x + pnBox.w;
+ var bLeft = box.x;
+ var bRight = box.x + obw;
+ var delta;
+ //Adjust the height now
+ if(bBottom > vpTop &&
+ bTop < vpTop){
+ box.y = pnBox.y;
+ //intersecting top, need to do some shifting.
+ delta = vpTop - bTop;
+ var visHeight = obh - delta;
+ //If the visible height < viewport height,
+ //We need to shift it.
+ if(visHeight < pnBox.h){
+ box.h = visHeight;
+ }else{
+ //Deal with horizontal scrollbars if necessary.
+ box.h -= 2*(pn.scrollWidth > pn.clientWidth &&
+ pn.clientWidth > 0? scrollers.h: 0);
+ }
+ }else if(bTop < vpBottom && bBottom > vpBottom){
+ //Intersecting bottom, just figure out how much
+ //overlay to show.
+ box.h = vpBottom - bTop;
+ }else if(bBottom <= vpTop || bTop >= vpBottom){
+ //Outside view, hide it.
+ box.h = 0;
+ }
+
+ //adjust width
+ if(bRight > vpLeft && bLeft < vpLeft){
+ box.x = pnBox.x;
+ //intersecting left, need to do some shifting.
+ delta = vpLeft - bLeft;
+ var visWidth = obw - delta;
+ //If the visible width < viewport width,
+ //We need to shift it.
+ if(visWidth < pnBox.w){
+ box.w = visWidth;
+ }else{
+ //Deal with horizontal scrollbars if necessary.
+ box.w -= 2*(pn.scrollHeight > pn.clientHeight &&
+ pn.clientHeight > 0? scrollers.w:0);
+ }
+ }else if(bLeft < vpRight && bRight > vpRight){
+ //Intersecting right, just figure out how much
+ //overlay to show.
+ box.w = vpRight - bLeft;
+ }else if(bRight <= vpLeft || bLeft >= vpRight){
+ //Outside view, hide it.
+ box.w = 0;
+ }
+ }
+
+ if(box.h > 0 && box.w > 0){
+ //Set position and size of the blocking div overlay.
+ domStyle.set(this._underlayNode, {
+ display: "block",
+ width: box.w + "px",
+ height: box.h + "px",
+ top: box.y + "px",
+ left: box.x + "px"
+ });
+
+ var styles = ["borderRadius", "borderTopLeftRadius",
+ "borderTopRightRadius","borderBottomLeftRadius",
+ "borderBottomRightRadius"];
+ this._cloneStyles(styles);
+ if(!has("ie")){
+ //Browser specific styles to try and clone if non-IE.
+ styles = ["MozBorderRadius", "MozBorderRadiusTopleft",
+ "MozBorderRadiusTopright","MozBorderRadiusBottomleft",
+ "MozBorderRadiusBottomright","WebkitBorderRadius",
+ "WebkitBorderTopLeftRadius", "WebkitBorderTopRightRadius",
+ "WebkitBorderBottomLeftRadius","WebkitBorderBottomRightRadius"
+ ];
+ this._cloneStyles(styles, this);
+ }
+ var cntrIndicatorTop = (box.h/2) - (cntrIndicator.h/2);
+ var cntrIndicatorLeft = (box.w/2) - (cntrIndicator.w/2);
+ //Only show the image if there is height and width room.
+ if(box.h >= cntrIndicator.h && box.w >= cntrIndicator.w){
+ domStyle.set(this._centerNode, {
+ top: (cntrIndicatorTop + box.y) + "px",
+ left: (cntrIndicatorLeft + box.x) + "px",
+ display: "block"
+ });
+ }else{
+ domStyle.set(this._centerNode, "display", "none");
+ }
+ }else{
+ //Target has no size, display nothing on it!
+ domStyle.set(this._underlayNode, "display", "none");
+ domStyle.set(this._centerNode, "display", "none");
+ }
+ if(this._resizeCheck === null){
+ //Set an interval timer that checks the target size and scales as needed.
+ //Checking every 10th of a second seems to generate a fairly smooth update.
+ var self = this;
+ this._resizeCheck = setInterval(function(){self._size();}, 100);
+ }
+ }
+ },
+
+ _cloneStyles: function(list){
+ // summary:
+ // Internal function to clone a set of styles from the target to
+ // the underlay.
+ // list: Array
+ // An array of style names to clone.
+ //
+ // tags:
+ // private
+ array.forEach(list, function(s){
+ domStyle.set(this._underlayNode, s, domStyle.get(this.target, s));
+ }, this);
+ },
+
+ _fadeIn: function(){
+ // summary:
+ // Internal function that does the opacity style fade in animation.
+ // tags:
+ // private
+ var self = this;
+ var underlayNodeAnim = baseFx.animateProperty({
+ duration: self.duration,
+ node: self._underlayNode,
+ properties: {opacity: {start: 0, end: 0.75}}
+ });
+ var imageAnim = baseFx.animateProperty({
+ duration: self.duration,
+ node: self._centerNode,
+ properties: {opacity: {start: 0, end: 1}},
+ onEnd: function(){
+ self.onShow();
+ delete self._anim;
+ }
+ });
+ this._anim = fx.combine([underlayNodeAnim,imageAnim]);
+ this._anim.play();
+ },
+
+ _fadeOut: function(){
+ // summary:
+ // Internal function that does the opacity style fade out animation.
+ // tags:
+ // private
+ var self = this;
+ var underlayNodeAnim = baseFx.animateProperty({
+ duration: self.duration,
+ node: self._underlayNode,
+ properties: {opacity: {start: 0.75, end: 0}},
+ onEnd: function(){
+ domStyle.set(this.node,{"display":"none", "zIndex": "-1000"});
+ }
+ });
+ var imageAnim = baseFx.animateProperty({
+ duration: self.duration,
+ node: self._centerNode,
+ properties: {opacity: {start: 1, end: 0}},
+ onEnd: function(){
+ domStyle.set(this.node,{"display":"none", "zIndex": "-1000"});
+ self.onHide();
+ self._enableOverflow();
+ delete self._anim;
+ }
+ });
+ this._anim = fx.combine([underlayNodeAnim,imageAnim]);
+ this._anim.play();
+ },
+
+ _ignore: function(e){
+ // summary:
+ // Function to ignore events that occur on the overlay.
+ // event: Event
+ // The event to halt
+ // tags:
+ // private
+ if(e){
+ event.stop(e);
+ }
+ },
+
+ _scrollerWidths: function(){
+ // summary:
+ // This function will calculate the size of the vertical and
+ // horizontaol scrollbars.
+ // returns:
+ // Object of form: {v: Number, h: Number} where v is vertical scrollbar width
+ // and h is horizontal scrollbar width.
+ // tags:
+ // private
+ var div = construct.create("div");
+ domStyle.set(div, {
+ position: "absolute",
+ opacity: 0,
+ overflow: "hidden",
+ width: "50px",
+ height: "50px",
+ zIndex: "-100",
+ top: "-200px",
+ padding: "0px",
+ margin: "0px"
+ });
+ var iDiv = construct.create("div");
+ domStyle.set(iDiv, {
+ width: "200px",
+ height: "10px"
+ });
+ div.appendChild(iDiv);
+ baseWindow.body().appendChild(div);
+
+ //Figure out content size before and after
+ //scrollbars are there, then just subtract to
+ //get width.
+ var b = geometry.getContentBox(div);
+ domStyle.set(div, "overflow", "scroll");
+ var a = geometry.getContentBox(div);
+ baseWindow.body().removeChild(div);
+ return { v: b.w - a.w, h: b.h - a.h };
+ },
+
+ /* The following are functions that tie into _Widget.attr() */
+
+ _setTextAttr: function(text){
+ // summary:
+ // Function to allow widget.attr to set the text displayed in center
+ // if using text display.
+ // text: String
+ // The text to set.
+ this._textNode.innerHTML = text;
+ this.text = text;
+ },
+
+ _setColorAttr: function(c){
+ // summary:
+ // Function to allow widget.attr to set the color used for the translucent
+ // div overlay.
+ // c: String
+ // The color to set the background underlay to in #XXXXXX format..
+ domStyle.set(this._underlayNode, "backgroundColor", c);
+ this.color = c;
+ },
+
+ _setImageTextAttr: function(text){
+ // summary:
+ // Function to allow widget.attr to set the ALT text text displayed for
+ // the image (if using image center display).
+ // text: String
+ // The text to set.
+ attr.set(this._imageNode, "alt", text);
+ this.imageText = text;
+ },
+
+ _setImageAttr: function(url){
+ // summary:
+ // Function to allow widget.attr to set the url source for the center image
+ // text: String
+ // The url to set for the image.
+ attr.set(this._imageNode, "src", url);
+ this.image = url;
+ },
+
+ _setCenterIndicatorAttr: function(indicator){
+ // summary:
+ // Function to allow widget.attr to set the node used for the center indicator,
+ // either the image or the text.
+ // indicator: String
+ // The indicator to use, either 'image' or 'text'.
+ this.centerIndicator = indicator;
+ if(indicator === "image"){
+ this._centerNode = this._imageNode;
+ domStyle.set(this._textNode, "display", "none");
+ }else{
+ this._centerNode = this._textNode;
+ domStyle.set(this._imageNode, "display", "none");
+ }
+ },
+
+ _disableOverflow: function(){
+ // summary:
+ // Function to disable scrollbars on the body. Only used if the overlay
+ // targets the body or the document.
+ if(this.target === baseWindow.body() || this.target === baseWindow.doc){
+ // Store the overflow state we have to restore later.
+ // IE had issues, so have to check that it's defined. Ugh.
+ this._overflowDisabled = true;
+ var body = baseWindow.body();
+ if(body.style && body.style.overflow){
+ this._oldOverflow = domStyle.set(body, "overflow");
+ }else{
+ this._oldOverflow = "";
+ }
+ if(has("ie") && !has("quirks")){
+ // IE will put scrollbars in anyway, html (parent of body)
+ // also controls them in standards mode, so we have to
+ // remove them, argh.
+ if(body.parentNode &&
+ body.parentNode.style &&
+ body.parentNode.style.overflow){
+ this._oldBodyParentOverflow = body.parentNode.style.overflow;
+ }else{
+ try{
+ this._oldBodyParentOverflow = domStyle.set(body.parentNode, "overflow");
+ }catch(e){
+ this._oldBodyParentOverflow = "scroll";
+ }
+ }
+ domStyle.set(body.parentNode, "overflow", "hidden");
+ }
+ domStyle.set(body, "overflow", "hidden");
+ }
+ },
+
+ _enableOverflow: function(){
+ // summary:
+ // Function to restore scrollbars on the body. Only used if the overlay
+ // targets the body or the document.
+ if(this._overflowDisabled){
+ delete this._overflowDisabled;
+ var body = baseWindow.body();
+ // Restore all the overflow.
+ if(has("ie") && !has("quirks")){
+ body.parentNode.style.overflow = this._oldBodyParentOverflow;
+ delete this._oldBodyParentOverflow;
+ }
+ domStyle.set(body, "overflow", this._oldOverflow);
+ if(has("webkit")){
+ //Gotta poke WebKit, or scrollers don't come back. :-(
+ var div = construct.create("div", { style: {
+ height: "2px"
+ }
+ });
+ body.appendChild(div);
+ setTimeout(function(){
+ body.removeChild(div);
+ }, 0);
+ }
+ delete this._oldOverflow;
+ }
+ }
+});
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Standby/images/loading.gif b/js/dojo-1.7.2/dojox/widget/Standby/images/loading.gif
new file mode 100644
index 0000000..e4ab783
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Standby/images/loading.gif
Binary files differ
diff --git a/js/dojo-1.7.2/dojox/widget/TitleGroup.js b/js/dojo-1.7.2/dojox/widget/TitleGroup.js
new file mode 100644
index 0000000..e7a9e52
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/TitleGroup.js
@@ -0,0 +1,83 @@
+//>>built
+define("dojox/widget/TitleGroup", ["dojo", "dijit/registry", "dijit/_Widget", "dijit/TitlePane"], function(dojo, registry, widget, titlepane){
+
+ var tp = titlepane.prototype,
+ lookup = function(){
+ // generic handler function for click and keypress
+ var parent = this._dxfindParent && this._dxfindParent();
+ parent && parent.selectChild(this);
+ }
+ ;
+
+ // this might hide this uberprivate function from the docparser.
+ tp._dxfindParent = function(){
+ // summary: TitlePane's MUST be first-children of a TitleGroup. only used by
+ // `dojox.widget.TitleGroup`. Finds a possible parent TitleGroup of a TitlePane
+ var n = this.domNode.parentNode;
+ if(n){
+ n = registry.getEnclosingWidget(n);
+ return n && n instanceof dojox.widget.TitleGroup && n;
+ }
+ return n;
+ };
+
+ // if we click our own title, hide everyone
+ dojo.connect(tp, "_onTitleClick", lookup);
+ dojo.connect(tp, "_onTitleKey", function(e){
+ // if we're tabbing through the items in a group, don't do toggles.
+ // if we hit enter, let it happen.
+ if(!(e && e.type && e.type == "keypress" && e.charOrCode == dojo.keys.TAB)){
+ lookup.apply(this, arguments);
+ }
+ });
+
+ return dojo.declare("dojox.widget.TitleGroup", dijit._Widget, {
+ // summary: A container which controls a series of `dijit.TitlePane`s,
+ // allowing one to be visible and hiding siblings
+ //
+ // description:
+ // A container which controls a series of `dijit.TitlePane`s,
+ // allowing one to be visible and hiding siblings. Behaves similarly
+ // to a `dijit.layout.AccordionContainer` in that the children
+ // are all stacked, though merges the TitlePane behavior of
+ // variable height
+ //
+ // example:
+ // | var group = new dojox.widget.TitleGroup().placeAt(dojo.body());
+ // | new dijit.TitlePane({ title:"One" }, "fromsource").placeAt(group);
+ // | new dijit.TitlePane({ title:"Remote", href:"foo.html" }).placeAt(group);
+
+ "class":"dojoxTitleGroup",
+
+ addChild: function(widget, position){
+ // summary: Add a passed widget reference to this container at an optional
+ // position index.
+ //
+ // widget: dijit.TitlePane
+ // A widget reference to add
+ // position: String?|Int?
+ // An optional index or position to pass. defaults to "last"
+ return widget.placeAt(this.domNode, position); // dijit.TitlePane
+ },
+
+ removeChild: function(widget){
+ // summary: Remove the passed widget from this container. Does not destroy
+ // child.
+
+ this.domNode.removeChild(widget.domNode);
+ return widget;
+ },
+
+ selectChild: function(widget){
+ // summary: close all found titlePanes within this group, excluding
+ // the one the we pass to select
+ widget && dojo.query("> .dijitTitlePane", this.domNode).forEach(function(n){
+ var tp = registry.byNode(n);
+ tp && tp !== widget && tp.open && tp.toggle(); // could race if open is set onEnd of slide
+ });
+ return widget; // dijit.TitlePane
+ }
+
+ });
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/TitleGroup/TitleGroup.css b/js/dojo-1.7.2/dojox/widget/TitleGroup/TitleGroup.css
new file mode 100644
index 0000000..e8c3fb3
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/TitleGroup/TitleGroup.css
@@ -0,0 +1,28 @@
+/* tundra doesn't appear to need any special css rules */
+
+.claro .dojoxTitleGroup .dijitTitlePaneContentOuter {
+ border-bottom:none;
+}
+
+.claro .dojoxTitleGroup .dijitTitlePaneContentOuter .dijitTitlePaneContentOuter,
+.claro .dojoxTitleGroup {
+ border-bottom:1px solid #B5BCC7;
+}
+
+.soria .dojoxTitleGroup .dijitTitlePaneContentOuter {
+ border-bottom:none;
+}
+
+.soria .dojoxTitleGroup .dijitTitlePaneContentOuter .dijitTitlePaneContentOuter,
+.soria .dojoxTitleGroup {
+ border-bottom:1px solid #BFBFBF;
+}
+
+.nihilo .dojoxTitleGroup .dijitTitlePaneContentOuter {
+ border-bottom:none;
+}
+
+.nihilo .dojoxTitleGroup .dijitTitlePaneContentOuter .dijitTitlePaneContentOuter,
+.nihilo .dojoxTitleGroup {
+ border-bottom:1px solid #BFBFBF;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/Toaster.js b/js/dojo-1.7.2/dojox/widget/Toaster.js
new file mode 100644
index 0000000..de81a7f
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Toaster.js
@@ -0,0 +1,290 @@
+//>>built
+define("dojox/widget/Toaster", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.getObject...
+ "dojo/_base/connect", // connect.connect, connect.subscribe
+ "dojo/_base/fx", // fx.fadeOut
+ "dojo/dom-style", // domStyle.set
+ "dojo/dom-class", // domClass.add
+ "dojo/dom-geometry", // domGeometry.getMarginBox
+ "dijit/registry", // registry.getUniqueId()
+ "dijit/_WidgetBase",
+ "dijit/_TemplatedMixin",
+ "dijit/BackgroundIframe",
+ "dojo/fx",
+ "dojo/has",
+ "dojo/_base/window",
+ "dojo/window"
+], function(declare, lang, connect, baseFx, domStyle, domClass, domGeometry, registry, WidgetBase, Templated, BackgroundIframe, coreFx, has, baseWindow, window){
+
+ lang.getObject("dojox.widget", true);
+
+ var capitalize = function(/* String */w){
+ return w.substring(0,1).toUpperCase() + w.substring(1);
+ };
+
+ return declare("dojox.widget.Toaster", [WidgetBase, Templated], {
+ // summary:
+ // Message that slides in from the corner of the screen, used for notifications
+ // like "new email".
+
+ templateString: '<div class="dijitToasterClip" dojoAttachPoint="clipNode"><div class="dijitToasterContainer" dojoAttachPoint="containerNode" dojoAttachEvent="onclick:onSelect"><div class="dijitToasterContent" dojoAttachPoint="contentNode"></div></div></div>',
+
+ // messageTopic: String
+ // Name of topic; anything published to this topic will be displayed as a message.
+ // Message format is either String or an object like
+ // {message: "hello word", type: "error", duration: 500}
+ messageTopic: "",
+
+ // messageTypes: Enumeration
+ // Possible message types.
+ messageTypes: {
+ MESSAGE: "message",
+ WARNING: "warning",
+ ERROR: "error",
+ FATAL: "fatal"
+ },
+
+ // defaultType: String
+ // If message type isn't specified (see "messageTopic" parameter),
+ // then display message as this type.
+ // Possible values in messageTypes enumeration ("message", "warning", "error", "fatal")
+ defaultType: "message",
+
+ // positionDirection: String
+ // Position from which message slides into screen, one of
+ // ["br-up", "br-left", "bl-up", "bl-right", "tr-down", "tr-left", "tl-down", "tl-right"]
+ positionDirection: "br-up",
+
+ // positionDirectionTypes: Array
+ // Possible values for positionDirection parameter
+ positionDirectionTypes: ["br-up", "br-left", "bl-up", "bl-right", "tr-down", "tr-left", "tl-down", "tl-right"],
+
+ // duration: Integer
+ // Number of milliseconds to show message
+ duration: 2000,
+
+ // slideDuration: Integer
+ // Number of milliseconds for the slide animation, increasing will cause the Toaster
+ // to slide in more slowly.
+ slideDuration: 500,
+
+ //separator: String
+ // String used to separate messages if consecutive calls are made to setContent before previous messages go away
+ separator: "<hr></hr>",
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this.hide();
+
+ // place node as a child of body for positioning
+ baseWindow.body().appendChild(this.domNode);
+
+ if(this.messageTopic){
+ connect.subscribe(this.messageTopic, this, "_handleMessage");
+ }
+ },
+
+ _handleMessage: function(/*String|Object*/message){
+ if(lang.isString(message)){
+ this.setContent(message);
+ }else{
+ this.setContent(message.message, message.type, message.duration);
+ }
+ },
+
+ setContent: function(/*String|Function*/message, /*String*/messageType, /*int?*/duration){
+ // summary:
+ // sets and displays the given message and show duration
+ // message:
+ // the message. If this is a function, it will be called with this toaster widget as the only argument.
+ // messageType:
+ // type of message; possible values in messageTypes enumeration ("message", "warning", "error", "fatal")
+ // duration:
+ // duration in milliseconds to display message before removing it. Widget has default value.
+ duration = duration||this.duration;
+ // sync animations so there are no ghosted fades and such
+ if(this.slideAnim){
+ if(this.slideAnim.status() != "playing"){
+ this.slideAnim.stop();
+ }
+ if(this.slideAnim.status() == "playing" || (this.fadeAnim && this.fadeAnim.status() == "playing")){
+ setTimeout(lang.hitch(this, function(){
+ this.setContent(message, messageType, duration);
+ }), 50);
+ return;
+ }
+ }
+
+ // determine type of content and apply appropriately
+ for(var type in this.messageTypes){
+ domClass.remove(this.containerNode, "dijitToaster" + capitalize(this.messageTypes[type]));
+ }
+
+ domStyle.set(this.containerNode, "opacity", 1);
+
+ this._setContent(message);
+
+ domClass.add(this.containerNode, "dijitToaster" + capitalize(messageType || this.defaultType));
+
+ // now do funky animation of widget appearing from
+ // bottom right of page and up
+ this.show();
+ var nodeSize = domGeometry.getMarginBox(this.containerNode);
+ this._cancelHideTimer();
+ if(this.isVisible){
+ this._placeClip();
+ //update hide timer if no sticky message in stack
+ if(!this._stickyMessage) {
+ this._setHideTimer(duration);
+ }
+ }else{
+ var style = this.containerNode.style;
+ var pd = this.positionDirection;
+ // sets up initial position of container node and slide-out direction
+ if(pd.indexOf("-up") >= 0){
+ style.left=0+"px";
+ style.top=nodeSize.h + 10 + "px";
+ }else if(pd.indexOf("-left") >= 0){
+ style.left=nodeSize.w + 10 +"px";
+ style.top=0+"px";
+ }else if(pd.indexOf("-right") >= 0){
+ style.left = 0 - nodeSize.w - 10 + "px";
+ style.top = 0+"px";
+ }else if(pd.indexOf("-down") >= 0){
+ style.left = 0+"px";
+ style.top = 0 - nodeSize.h - 10 + "px";
+ }else{
+ throw new Error(this.id + ".positionDirection is invalid: " + pd);
+ }
+ this.slideAnim = coreFx.slideTo({
+ node: this.containerNode,
+ top: 0, left: 0,
+ duration: this.slideDuration});
+ this.connect(this.slideAnim, "onEnd", function(nodes, anim){
+ //we build the fadeAnim here so we dont have to duplicate it later
+ // can't do a fadeHide because we're fading the
+ // inner node rather than the clipping node
+ this.fadeAnim = baseFx.fadeOut({
+ node: this.containerNode,
+ duration: 1000});
+ this.connect(this.fadeAnim, "onEnd", function(evt){
+ this.isVisible = false;
+ this.hide();
+ });
+ this._setHideTimer(duration);
+ this.connect(this, 'onSelect', function(evt){
+ this._cancelHideTimer();
+ //force clear sticky message
+ this._stickyMessage=false;
+ this.fadeAnim.play();
+ });
+
+ this.isVisible = true;
+ });
+ this.slideAnim.play();
+ }
+ },
+
+ _setContent: function(message){
+ if(lang.isFunction(message)){
+ message(this);
+ return;
+ }
+ if(message && this.isVisible){
+ message = this.contentNode.innerHTML + this.separator + message;
+ }
+ this.contentNode.innerHTML = message;
+ },
+ _cancelHideTimer:function(){
+ if (this._hideTimer){
+ clearTimeout(this._hideTimer);
+ this._hideTimer=null;
+ }
+ },
+
+ _setHideTimer:function(duration){
+ this._cancelHideTimer();
+ //if duration == 0 we keep the message displayed until clicked
+ if(duration>0){
+ this._cancelHideTimer();
+ this._hideTimer=setTimeout(lang.hitch(this, function(evt){
+ // we must hide the iframe in order to fade
+ // TODO: figure out how to fade with a BackgroundIframe
+ if(this.bgIframe && this.bgIframe.iframe){
+ this.bgIframe.iframe.style.display="none";
+ }
+ this._hideTimer=null;
+ //force clear sticky message
+ this._stickyMessage=false;
+ this.fadeAnim.play();
+ }), duration);
+ }
+ else
+ this._stickyMessage=true;
+ },
+
+ _placeClip: function(){
+ var view = window.getBox();
+
+ var nodeSize = domGeometry.getMarginBox(this.containerNode);
+
+ var style = this.clipNode.style;
+ // sets up the size of the clipping node
+ style.height = nodeSize.h+"px";
+ style.width = nodeSize.w+"px";
+
+ // sets up the position of the clipping node
+ var pd = this.positionDirection;
+ if(pd.match(/^t/)){
+ style.top = view.t+"px";
+ }else if(pd.match(/^b/)){
+ style.top = (view.h - nodeSize.h - 2 + view.t)+"px";
+ }
+ if(pd.match(/^[tb]r-/)){
+ style.left = (view.w - nodeSize.w - 1 - view.l)+"px";
+ }else if(pd.match(/^[tb]l-/)){
+ style.left = 0 + "px";
+ }
+
+ style.clip = "rect(0px, " + nodeSize.w + "px, " + nodeSize.h + "px, 0px)";
+ if(has("ie")){
+ if(!this.bgIframe){
+ this.clipNode.id = registry.getUniqueId("dojox_widget_Toaster_clipNode");
+ this.bgIframe = new BackgroundIframe(this.clipNode);
+ }
+ var iframe = this.bgIframe.iframe;
+ if(iframe){ iframe.style.display="block"; }
+ }
+ },
+
+ onSelect: function(/*Event*/e){
+ // summary: callback for when user clicks the message
+ },
+
+ show: function(){
+ // summary: show the Toaster
+ domStyle.set(this.domNode, 'display', 'block');
+
+ this._placeClip();
+
+ if(!this._scrollConnected){
+ this._scrollConnected = connect.connect(window, "onscroll", this, this._placeClip);
+ }
+ },
+
+ hide: function(){
+ // summary: hide the Toaster
+
+ domStyle.set(this.domNode, 'display', 'none');
+
+ if(this._scrollConnected){
+ connect.disconnect(this._scrollConnected);
+ this._scrollConnected = false;
+ }
+
+ domStyle.set(this.containerNode, "opacity", 1);
+ }
+ });
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Toaster/Toaster.css b/js/dojo-1.7.2/dojox/widget/Toaster/Toaster.css
new file mode 100644
index 0000000..5ac90b5
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Toaster/Toaster.css
@@ -0,0 +1,42 @@
+/* main classes for dojox.widget.Toaster */
+
+.dijitToasterContent {
+ padding:1em;
+ padding-top:0.25em;
+ background:#73c74a;
+}
+
+.dijitToasterMessage{
+ color:#fff;
+}
+
+.dijitToasterWarning{ }
+.dijitToasterError,
+.dijitToasterFatal{
+ font-weight:bold;
+ color:#fff;
+}
+
+.dijitToasterWarning .dijitToasterContent{
+ background:#d4d943;
+}
+
+.dijitToasterError .dijitToasterContent{
+ background:#c46600;
+}
+
+/* imported from dijit.css */
+
+.dijitToasterClip {
+ position: absolute;
+ z-index: 5000;
+ overflow: hidden;
+}
+
+.dijitToasterContainer {
+ display: block;
+ position: absolute;
+ width: 17.5em;
+ margin: 0px;
+ font:0.75em;
+}
diff --git a/js/dojo-1.7.2/dojox/widget/UpgradeBar.js b/js/dojo-1.7.2/dojox/widget/UpgradeBar.js
new file mode 100644
index 0000000..ccc615c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/UpgradeBar.js
@@ -0,0 +1,228 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/UpgradeBar", ["dijit","dojo","dojox","dojo/require!dojo/window,dojo/fx,dojo/cookie,dijit/_Widget,dijit/_Templated"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.UpgradeBar");
+
+dojo.require("dojo.window");
+dojo.require("dojo.fx");
+dojo.require("dojo.cookie");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.experimental("dojox.widget.UpgradeBar");
+
+
+dojo.declare("dojox.widget.UpgradeBar", [dijit._Widget, dijit._Templated], {
+ // summary:
+ // Shows a bar at the top of the screen when the user is to
+ // be notified that they should upgrade their browser or a
+ // plugin.
+ //
+ // description:
+ // You can insert custom validations to trigger the UpgradeBar
+ // to display. An evaluation of 'true' shows the bar (as this
+ // version *is* less than it should be). Multiple validations
+ // may be checked, although only the first in the list will be
+ // displayed.
+ // Markup and programmatic are supported. Markup is a little
+ // cleaner, since a majority of the parameters are the HTML
+ // snippets to be displayed. In markup, the validate code should
+ // be an expression that will evaluate to true or false. This
+ // expression is wrapped in a try/catch, so if it blows up, it
+ // is assumed to be true and trigger the bar.
+ // In programmtic, a function should be used that returns true
+ // or false. You would need to use your own try/catch in that.
+ //
+ // example: See tests for examples.
+ //
+ // notifications: Array
+ // An array of objects that hold the criteria for upgrades.
+ // message: String
+ // The message to display in the bar. Can be HTML.
+ // validate:Function
+ // The expression to evaluate to determine if the
+ // bar should show or not. Should be a simple expression
+ // if used in HTML:
+ // | <div validate="!google.gears">
+ // | <div validate="dojo.isIE<8">
+ notifications:[],
+ //
+ // buttonCancel:String
+ // The HTML tip show when hovering over the close button.
+ buttonCancel:"Close for now",
+ //
+ // noRemindButton:String
+ // The text link shown that when clicked, permanently dismisses
+ // the message (sets a cookie). If this string is blank, this
+ // link is not displayed.
+ 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\">${noRemindButton}</div>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dojoxUpgradeBarCloseIcon\" dojoAttachEvent=\"onclick: hide, onmouseenter: _onCloseEnter, onmouseleave: _onCloseLeave\" title=\"${buttonCancel}\"></span>\n</div>"),
+
+ constructor: function(props, node){
+
+ if(!props.notifications && node){
+ // From markup. Create the notifications Array from the
+ // srcRefNode children.
+ dojo.forEach(node.childNodes, function(n){
+ if(n.nodeType==1){
+ var val = dojo.attr(n, "validate");
+ this.notifications.push({
+ message:n.innerHTML,
+ validate:function(){
+ // the function that fires to determine if the
+ // bar shows or not.
+ var evals = true;
+ try{
+ evals = dojo.eval(val);
+ }catch(e){ /* squelch. it's true.*/ }
+ return evals;
+ }
+ });
+ }
+ }, this);
+ }
+
+ },
+
+ checkNotifications: function(){
+ // summary:
+ // Internal. Go through the notifications Array
+ // and check for any that evaluate to true.
+ // tags:
+ // private
+ //
+ if(!this.notifications.length){
+ // odd. why use the bar but not set any notifications?
+ return;
+ }
+
+ for(var i=0;i<this.notifications.length;i++){
+ var evals = this.notifications[i].validate();
+ if(evals){
+ this.notify(this.notifications[i].message);
+ // Validation resulted in true, meaning a feature is missing
+ // Don't check any other messages. One at a time.
+ 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){
+ // IE6 is challenged when it comes to 100% width.
+ // It thinks the body has more padding and more
+ // margin than it really does. It would work to
+ // set the body pad and margin to 0, but we can't
+ // set that and disturb a potential layout.
+ //
+ var self = this;
+ var setWidth = function(){
+ var v = dojo.window.getBox();
+ dojo.style(self.domNode, "width", v.w+"px");
+ }
+ this.connect(window, "resize", function(){
+ setWidth();
+ });
+
+ setWidth();
+ }
+ dojo.addOnLoad(this, "checkNotifications");
+ //this.checkNotifications();
+ },
+
+ notify: function(msg){
+ // summary:
+ // Triggers the bar to display. An internal function,
+ // but could ne called externally for fun.
+ // tags:
+ // protected
+ //
+ if(dojo.cookie("disableUpgradeReminders")){
+ return;
+ }
+ if(!this.domNode.parentNode || !this.domNode.parentNode.innerHTML){
+ document.body.appendChild(this.domNode);
+ }
+ dojo.style(this.domNode, "display", "");
+ if(msg){
+ this.set("message", msg);
+ }
+
+ },
+
+ show: function(){
+ // summary:
+ // Internal. Shows the bar. Do not call directly.
+ // Use notify();
+ // tags:
+ // private
+ //
+ 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(){
+ // summary:
+ // Hides the bar. May be called externally.
+ //
+ 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(){
+ // summary:
+ // Called when user clicks the "do not remind" link.
+ // tags:
+ // private
+ dojo.cookie("disableUpgradeReminders", true, { expires:3650 });
+ this.hide();
+ },
+
+ _onCloseEnter: function(){
+ // summary:
+ // Called when user hovers over close icon
+ // tags:
+ // private
+ dojo.addClass(this.closeButtonNode, "dojoxUpgradeBarCloseIcon-hover");
+ },
+
+ _onCloseLeave: function(){
+ // summary:
+ // Called when user stops hovering over close icon
+ // tags:
+ // private
+ dojo.removeClass(this.closeButtonNode, "dojoxUpgradeBarCloseIcon-hover");
+ }
+
+});
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/UpgradeBar/UpgradeBar.css b/js/dojo-1.7.2/dojox/widget/UpgradeBar/UpgradeBar.css
new file mode 100644
index 0000000..dea4e7f
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/UpgradeBar/UpgradeBar.css
@@ -0,0 +1,73 @@
+
+.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;
+}
+/*
+.dojoxUpgradeBarControls {
+ position:absolute;
+ right:35px;
+ top:0;
+ bottom:0;
+ width:140px;
+ text-align:right;
+}
+*/
+.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/js/dojo-1.7.2/dojox/widget/UpgradeBar/UpgradeBar.html b/js/dojo-1.7.2/dojox/widget/UpgradeBar/UpgradeBar.html
new file mode 100644
index 0000000..70c1aee
--- /dev/null
+++ b/js/dojo-1.7.2/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/js/dojo-1.7.2/dojox/widget/Wizard.js b/js/dojo-1.7.2/dojox/widget/Wizard.js
new file mode 100644
index 0000000..5421958
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Wizard.js
@@ -0,0 +1,210 @@
+//>>built
+require({cache:{
+'url: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\">${previousButtonLabel}</button>\n <button dojoType=\"dijit.form.Button\" type=\"button\" dojoAttachPoint=\"nextButton\">${nextButtonLabel}</button>\n <button dojoType=\"dijit.form.Button\" type=\"button\" dojoAttachPoint=\"doneButton\" style=\"display:none\">${doneButtonLabel}</button>\n <button dojoType=\"dijit.form.Button\" type=\"button\" dojoAttachPoint=\"cancelButton\">${cancelButtonLabel}</button>\n </div>\n</div>\n"}});
+define("dojox/widget/Wizard", [
+ "dojo/_base/lang",
+ "dojo/_base/declare",
+ "dojo/_base/connect",
+ "dijit/layout/StackContainer",
+ "dijit/layout/ContentPane",
+ "dijit/form/Button",
+ "dijit/_TemplatedMixin",
+ "dijit/_WidgetsInTemplateMixin",
+ "dojo/i18n",
+ "dojo/text!./Wizard/Wizard.html",
+ "dojo/i18n!dijit/nls/common",
+ "dojo/i18n!./nls/Wizard"
+], function (lang, declare, connect, StackContainer, ContentPane, Button, _TemplatedMixin, _WidgetsInTemplateMixin, i18n, template) {
+
+var Wizard = declare("dojox.widget.Wizard", [StackContainer, _TemplatedMixin, _WidgetsInTemplateMixin], {
+ // summary:
+ // A set of panels that display sequentially, typically notating a step-by-step
+ // procedure like an install
+ //
+
+ templateString: template,
+
+ // nextButtonLabel: String
+ // Label override for the "Next" button.
+ nextButtonLabel: "",
+
+ // previousButtonLabel: String
+ // Label override for the "Previous" button.
+ previousButtonLabel: "",
+
+ // cancelButtonLabel: String
+ // Label override for the "Cancel" button.
+ cancelButtonLabel: "",
+
+ // doneButtonLabel: String
+ // Label override for the "Done" button.
+ doneButtonLabel: "",
+
+ // cancelFunction: Function|String
+ // Name of function to call if user presses cancel button.
+ // Cancel button is not displayed if function is not specified.
+ cancelFunction: null,
+
+ // hideDisabled: Boolean
+ // If true, disabled buttons are hidden; otherwise, they are assigned the
+ // "WizardButtonDisabled" CSS class
+ hideDisabled: false,
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ var labels = lang.mixin({cancel: i18n.getLocalization("dijit", "common", this.lang).buttonCancel},
+ i18n.getLocalization("dojox.widget", "Wizard", this.lang));
+ var prop;
+ for(prop in labels){
+ if(!this[prop + "ButtonLabel"]){
+ this[prop + "ButtonLabel"] = labels[prop];
+ }
+ }
+ },
+
+ startup: function(){
+ if(this._started){
+ //console.log('started');
+ return;
+ }
+ this.inherited(arguments);
+
+ this.connect(this.nextButton, "onClick", "_forward");
+ this.connect(this.previousButton, "onClick", "back");
+
+ if(this.cancelFunction){
+ if(lang.isString(this.cancelFunction)){
+ this.cancelFunction = lang.getObject(this.cancelFunction);
+ }
+ this.connect(this.cancelButton, "onClick", this.cancelFunction);
+ }else{
+ this.cancelButton.domNode.style.display = "none";
+ }
+ this.connect(this.doneButton, "onClick", "done");
+
+ this._subscription = connect.subscribe(this.id + "-selectChild", lang.hitch(this,"_checkButtons"));
+ this._started = true;
+
+ },
+
+ resize: function(){
+ this.inherited(arguments);
+ this._checkButtons();
+ },
+
+ _checkButtons: function(){
+
+ var sw = this.selectedChildWidget;
+
+ var lastStep = sw.isLastChild;
+ this.nextButton.set("disabled", lastStep);
+ this._setButtonClass(this.nextButton);
+ if(sw.doneFunction){
+ //console.log(sw.doneFunction);
+ this.doneButton.domNode.style.display = "";
+ if(lastStep){
+ this.nextButton.domNode.style.display = "none";
+ }
+ }else{
+ // #1438 issue here.
+ this.doneButton.domNode.style.display = "none";
+ }
+ this.previousButton.set("disabled", !this.selectedChildWidget.canGoBack);
+ this._setButtonClass(this.previousButton);
+ },
+
+ _setButtonClass: function(button){
+ button.domNode.style.display = (this.hideDisabled && button.disabled) ? "none" : "";
+ },
+
+ _forward: function(){
+ // summary: callback when next button is clicked
+ if(this.selectedChildWidget._checkPass()){
+ this.forward();
+ }
+ },
+
+ done: function(){
+ // summary: Finish the wizard's operation
+ this.selectedChildWidget.done();
+ },
+
+ destroy: function(){
+ connect.unsubscribe(this._subscription);
+ this.inherited(arguments);
+ }
+
+});
+
+declare("dojox.widget.WizardPane", ContentPane, {
+ // summary: A panel in a `dojox.widget.Wizard`
+ //
+ // description:
+ // An extended ContentPane with additional hooks for passing named
+ // functions to prevent the pane from going either forward or
+ // backwards.
+ //
+ // canGoBack: Boolean
+ // If true, then can move back to a previous panel (by clicking the "Previous" button)
+ canGoBack: true,
+
+ // passFunction: String
+ // Name of function that checks if it's OK to advance to the next panel.
+ // If it's not OK (for example, mandatory field hasn't been entered), then
+ // returns an error message (String) explaining the reason. Can return null (pass)
+ // or a Boolean (true == pass)
+ passFunction: null,
+
+ // doneFunction: String
+ // Name of function that is run if you press the "Done" button from this panel
+ doneFunction: null,
+
+ startup: function(){
+ this.inherited(arguments);
+ if(this.isFirstChild){ this.canGoBack = false; }
+ if(lang.isString(this.passFunction)){
+ this.passFunction = lang.getObject(this.passFunction);
+ }
+ if(lang.isString(this.doneFunction) && this.doneFunction){
+ this.doneFunction = lang.getObject(this.doneFunction);
+ }
+ },
+
+ _onShow: function(){
+ if(this.isFirstChild){ this.canGoBack = false; }
+ this.inherited(arguments);
+ },
+
+ _checkPass: function(){
+ // summary:
+ // Called when the user presses the "next" button.
+ // Calls passFunction to see if it's OK to advance to next panel, and
+ // if it isn't, then display error.
+ // Returns true to advance, false to not advance. If passFunction
+ // returns a string, it is assumed to be a custom error message, and
+ // is alert()'ed
+ var r = true;
+ if(this.passFunction && lang.isFunction(this.passFunction)){
+ var failMessage = this.passFunction();
+ switch(typeof failMessage){
+ case "boolean":
+ r = failMessage;
+ break;
+ case "string":
+ alert(failMessage);
+ r = false;
+ break;
+ }
+ }
+ return r; // Boolean
+ },
+
+ done: function(){
+ if(this.doneFunction && lang.isFunction(this.doneFunction)){ this.doneFunction(); }
+ }
+
+});
+
+return Wizard;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/Wizard/Wizard.css b/js/dojo-1.7.2/dojox/widget/Wizard/Wizard.css
new file mode 100644
index 0000000..cf354a7
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Wizard/Wizard.css
@@ -0,0 +1,57 @@
+.dojoxWizard {
+ position:relative;
+}
+
+.dojoxWizardButtons {
+ position:absolute;
+ bottom:5px;
+ right:5px;
+}
+
+/* allot room for the buttons. never let a child overlap */
+.dojoxWizardContainer > * {
+ margin-bottom:39px;
+}
+
+.tundra .dojoxWizard {
+ background: #eeeeee;
+ border: #b7b7b7 1px solid;
+ padding: 2px;
+ border-radius:3pt;
+ -moz-border-radius:3pt;
+ -webkit-border-radius:4pt;
+ -o-border-radius:4pt;
+ -ms-border-radius:4pt;
+}
+
+.soria .dojoxWizard {
+ border:1px solid #b7b7b7;
+ padding:2px;
+ border-radius:3pt;
+ -moz-border-radius:3pt;
+ -webkit-border-radius:4pt;
+ -o-border-radius:4pt;
+ -ms-border-radius:4pt;
+}
+
+.claro .dojoxWizard {
+ border:1px solid #b5bcc7;
+ padding:2px;
+ border-radius:3pt;
+ -moz-border-radius:3pt;
+ -webkit-border-radius:4pt;
+ -o-border-radius:4pt;
+ -ms-border-radius:4pt;
+}
+
+/* remove the border and padding when we're in a dialog, it wraps us */
+.tundra .dijitDialogSingleChild .dojoxWizard,
+.soria .dijitDialogSingleChild .dojoxWizard,
+.claro .dijitDialogSingleChild .dojoxWizard {
+ border:none;
+ padding:0;
+}
+
+.claro .dijitDialogSingleChild .dojoxWizardButtons {
+ bottom:1px;
+} \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/Wizard/Wizard.html b/js/dojo-1.7.2/dojox/widget/Wizard/Wizard.html
new file mode 100644
index 0000000..a91e677
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/Wizard/Wizard.html
@@ -0,0 +1,9 @@
+<div class="dojoxWizard" dojoAttachPoint="wizardNode">
+ <div class="dojoxWizardContainer" dojoAttachPoint="containerNode"></div>
+ <div class="dojoxWizardButtons" dojoAttachPoint="wizardNav">
+ <button dojoType="dijit.form.Button" 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/js/dojo-1.7.2/dojox/widget/gauge/AnalogArcIndicator.js b/js/dojo-1.7.2/dojox/widget/gauge/AnalogArcIndicator.js
new file mode 100644
index 0000000..fdad5bb
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/gauge/AnalogArcIndicator.js
@@ -0,0 +1,9 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/gauge/AnalogArcIndicator", ["dijit","dojo","dojox","dojo/require!dojox/gauges/AnalogArcIndicator"], function(dijit,dojo,dojox){
+dojo.provide('dojox.widget.gauge.AnalogArcIndicator');
+dojo.require("dojox.gauges.AnalogArcIndicator");
+
+dojox.widget.gauge.AnalogArcIndicator = dojox.gauges.AnalogArcIndicator;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/gauge/AnalogArrowIndicator.js b/js/dojo-1.7.2/dojox/widget/gauge/AnalogArrowIndicator.js
new file mode 100644
index 0000000..71fc358
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/gauge/AnalogArrowIndicator.js
@@ -0,0 +1,9 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/gauge/AnalogArrowIndicator", ["dijit","dojo","dojox","dojo/require!dojox/gauges/AnalogArrowIndicator"], function(dijit,dojo,dojox){
+dojo.provide('dojox.widget.gauge.AnalogArrowIndicator');
+dojo.require("dojox.gauges.AnalogArrowIndicator");
+
+dojox.widget.gauge.AnalogArrowIndicator = dojox.gauges.AnalogArrowIndicator;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/gauge/AnalogNeedleIndicator.js b/js/dojo-1.7.2/dojox/widget/gauge/AnalogNeedleIndicator.js
new file mode 100644
index 0000000..b8c1c20
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/gauge/AnalogNeedleIndicator.js
@@ -0,0 +1,9 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/gauge/AnalogNeedleIndicator", ["dijit","dojo","dojox","dojo/require!dojox/gauges/AnalogNeedleIndicator"], function(dijit,dojo,dojox){
+dojo.provide('dojox.widget.gauge.AnalogNeedleIndicator');
+dojo.require('dojox.gauges.AnalogNeedleIndicator');
+
+dojox.widget.gauge.AnalogNeedleIndicator = dojox.gauges.AnalogNeedleIndicator;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/gauge/BarIndicator.js b/js/dojo-1.7.2/dojox/widget/gauge/BarIndicator.js
new file mode 100644
index 0000000..a6e203b
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/gauge/BarIndicator.js
@@ -0,0 +1,9 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/gauge/BarIndicator", ["dijit","dojo","dojox","dojo/require!dojox/gauges/BarIndicator"], function(dijit,dojo,dojox){
+dojo.provide('dojox.widget.gauge.BarIndicator');
+dojo.require('dojox.gauges.BarIndicator');
+
+dojox.widget.gauge.BarIndicator = dojox.gauges.BarIndicator;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/gauge/_Gauge.js b/js/dojo-1.7.2/dojox/widget/gauge/_Gauge.js
new file mode 100644
index 0000000..ff3237d
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/gauge/_Gauge.js
@@ -0,0 +1,11 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/gauge/_Gauge", ["dijit","dojo","dojox","dojo/require!dojox/gauges/_Gauge"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.gauge._Gauge");
+dojo.require("dojox.gauges._Gauge");
+
+dojox.widget.gauge._Gauge = dojox.gauges._Gauge;
+dojox.widget.gauge.Range = dojox.gauges.Range;
+dojox.widget.gauge._indicator = dojox.gauges._indicator;
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/ColorPicker.js
new file mode 100644
index 0000000..00f0e2b
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ColorPicker.js
@@ -0,0 +1,49 @@
+//>>built
+define("dojox/widget/nls/ColorPicker", { root:
+//begin v1.x content
+({
+redLabel: "r",
+greenLabel: "g",
+blueLabel: "b",
+hueLabel: "h",
+saturationLabel: "s",
+valueLabel: "v", /* aka intensity or brightness */
+degLabel: "\u00B0",
+hexLabel: "hex",
+huePickerTitle: "Hue Selector",
+saturationPickerTitle: "Saturation Selector"
+})
+//end v1.x content
+,
+"zh": true,
+"zh-tw": true,
+"tr": true,
+"th": true,
+"sv": true,
+"sl": true,
+"sk": true,
+"ru": true,
+"ro": true,
+"pt": true,
+"pt-pt": true,
+"pl": true,
+"nl": true,
+"nb": true,
+"ko": true,
+"kk": true,
+"ja": true,
+"it": true,
+"hu": true,
+"hr": true,
+"he": true,
+"fr": true,
+"fi": true,
+"es": true,
+"el": true,
+"de": true,
+"da": true,
+"cs": true,
+"ca": true,
+"az": true,
+"ar": true
+});
diff --git a/js/dojo-1.7.2/dojox/widget/nls/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/FilePicker.js
new file mode 100644
index 0000000..de82eaa
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/FilePicker.js
@@ -0,0 +1,42 @@
+//>>built
+define("dojox/widget/nls/FilePicker", { root:
+//begin v1.x content
+({
+ name: "Name",
+ path: "Path",
+ size: "Size (in bytes)"
+})
+//end v1.x content
+,
+"zh": true,
+"zh-tw": true,
+"tr": true,
+"th": true,
+"sv": true,
+"sl": true,
+"sk": true,
+"ru": true,
+"ro": true,
+"pt": true,
+"pt-pt": true,
+"pl": true,
+"nl": true,
+"nb": true,
+"ko": true,
+"kk": true,
+"ja": true,
+"it": true,
+"hu": true,
+"hr": true,
+"he": true,
+"fr": true,
+"fi": true,
+"es": true,
+"el": true,
+"de": true,
+"da": true,
+"cs": true,
+"ca": true,
+"az": true,
+"ar": true
+});
diff --git a/js/dojo-1.7.2/dojox/widget/nls/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/Wizard.js
new file mode 100644
index 0000000..29ebeac
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/Wizard.js
@@ -0,0 +1,42 @@
+//>>built
+define("dojox/widget/nls/Wizard", { root:
+//begin v1.x content
+({
+next: "Next",
+previous: "Previous",
+done: "Done"
+})
+//end v1.x content
+,
+"zh": true,
+"zh-tw": true,
+"tr": true,
+"th": true,
+"sv": true,
+"sl": true,
+"sk": true,
+"ru": true,
+"ro": true,
+"pt": true,
+"pt-pt": true,
+"pl": true,
+"nl": true,
+"nb": true,
+"ko": true,
+"kk": true,
+"ja": true,
+"it": true,
+"hu": true,
+"hr": true,
+"he": true,
+"fr": true,
+"fi": true,
+"es": true,
+"el": true,
+"de": true,
+"da": true,
+"cs": true,
+"ca": true,
+"az": true,
+"ar": true
+});
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ar/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/ar/ColorPicker.js
new file mode 100644
index 0000000..8da690c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ar/ColorPicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/ar/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "محدد تدرج اللون",
+saturationPickerTitle: "محدد درجة التشبع"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ar/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/ar/FilePicker.js
new file mode 100644
index 0000000..9352983
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ar/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ar/FilePicker", ({
+name: "الاسم",
+path: "‏المسار‏",
+size: "الحجم (بالبايت)"
+})
+
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ar/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/ar/Wizard.js
new file mode 100644
index 0000000..b80dc25
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ar/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ar/Wizard", //begin v1.x content
+({
+next: "تالي",
+previous: "‏سابق‏",
+done: "اتمام"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/az/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/az/ColorPicker.js
new file mode 100644
index 0000000..fe6f1a1
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/az/ColorPicker.js
@@ -0,0 +1,17 @@
+//>>built
+define(
+"dojox/widget/nls/az/ColorPicker", //begin v1.x content
+({
+ "redLabel" : "q",
+ "valueLabel" : "d",
+ "hexLabel" : "onaltılıq",
+ "hueLabel" : "ç",
+ "saturationLabel" : "d",
+ "greenLabel" : "y",
+ "blueLabel" : "m",
+ "saturationPickerTitle" : "Doldurmaq seçimi",
+ "huePickerTitle" : "Çalar seçimi",
+ "degLabel" : "°"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/az/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/az/FilePicker.js
new file mode 100644
index 0000000..e702a57
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/az/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/az/FilePicker", //begin v1.x content
+({
+ "name" : "Ad",
+ "size" : "Həcmi (bayt cinsindən)",
+ "path" : "Yol"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/az/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/az/Wizard.js
new file mode 100644
index 0000000..f0ef82f
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/az/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/az/Wizard", //begin v1.x content
+({
+ "next" : "Irəli",
+ "done" : "Qurtardı",
+ "previous" : "Geri"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ca/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/ca/ColorPicker.js
new file mode 100644
index 0000000..8df1d0e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ca/ColorPicker.js
@@ -0,0 +1,11 @@
+//>>built
+define(
+"dojox/widget/nls/ca/ColorPicker", //begin v1.x content
+({
+redLabel: "v",
+greenLabel: "e",
+hueLabel: "m",
+huePickerTitle: "Selector de matís",
+saturationPickerTitle: "Selector de saturació"
+})
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ca/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/ca/FilePicker.js
new file mode 100644
index 0000000..9ad02a8
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ca/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ca/FilePicker", ({
+name: "Nom",
+path: "Camí d'accés",
+size: "Mida (en bytes)"
+})
+
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ca/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/ca/Wizard.js
new file mode 100644
index 0000000..5d79c7d
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ca/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ca/Wizard", //begin v1.x content
+({
+next: "Següent",
+previous: "Anterior",
+done: "Fet"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/cs/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/cs/ColorPicker.js
new file mode 100644
index 0000000..dd4a21e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/cs/ColorPicker.js
@@ -0,0 +1,14 @@
+//>>built
+define(
+"dojox/widget/nls/cs/ColorPicker", //begin v1.x content
+({
+redLabel: "č",
+greenLabel: "z",
+blueLabel: "m",
+hueLabel: "o",
+saturationLabel: "n",
+valueLabel: "j", /* aka intensity or brightness */
+huePickerTitle: "Selektor odstínu",
+saturationPickerTitle: "Selektor sytosti"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/cs/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/cs/FilePicker.js
new file mode 100644
index 0000000..23a3e26
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/cs/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/cs/FilePicker", ({
+name: "Název",
+path: "Cesta",
+size: "Velikost (v bajtech)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/cs/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/cs/Wizard.js
new file mode 100644
index 0000000..26e5c11
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/cs/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/cs/Wizard", //begin v1.x content
+({
+next: "Další",
+previous: "Předchozí",
+done: "Hotovo"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/da/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/da/ColorPicker.js
new file mode 100644
index 0000000..7fcb956
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/da/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/da/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Vælg nuance",
+saturationPickerTitle: "Vælg mætning"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/da/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/da/FilePicker.js
new file mode 100644
index 0000000..abe594c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/da/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/da/FilePicker", ({
+name: "Navn",
+path: "Sti",
+size: "Størrelse (i byte)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/da/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/da/Wizard.js
new file mode 100644
index 0000000..0c72cf2
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/da/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/da/Wizard", //begin v1.x content
+({
+next: "Næste",
+previous: "Forrige",
+done: "Udført"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/de/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/de/ColorPicker.js
new file mode 100644
index 0000000..a775bb6
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/de/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/de/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Farbtonauswahl",
+saturationPickerTitle: "Sättigungsauswahl"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/de/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/de/FilePicker.js
new file mode 100644
index 0000000..d999162
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/de/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/de/FilePicker", ({
+name: "Name",
+path: "Pfad",
+size: "Größe (in Byte)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/de/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/de/Wizard.js
new file mode 100644
index 0000000..704b033
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/de/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/de/Wizard", //begin v1.x content
+({
+next: "Weiter",
+previous: "Zurück",
+done: "Fertig"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/el/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/el/ColorPicker.js
new file mode 100644
index 0000000..3b974cc
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/el/ColorPicker.js
@@ -0,0 +1,15 @@
+//>>built
+define(
+"dojox/widget/nls/el/ColorPicker", //begin v1.x content
+({
+redLabel: "κ",
+greenLabel: "π",
+blueLabel: "μ",
+hueLabel: "α",
+saturationLabel: "κ",
+valueLabel: "τ", /* aka intensity or brightness */
+hexLabel: "16-αδικό",
+huePickerTitle: "Επιλογή απόχρωσης",
+saturationPickerTitle: "Επιλογή κορεσμού"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/el/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/el/FilePicker.js
new file mode 100644
index 0000000..da7859b
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/el/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/el/FilePicker", ({
+name: "Όνομα",
+path: "Διαδρομή",
+size: "Μέγεθος (σε bytes)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/el/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/el/Wizard.js
new file mode 100644
index 0000000..e9e646e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/el/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/el/Wizard", //begin v1.x content
+({
+next: "Επόμενο",
+previous: "Προηγούμενο",
+done: "Ολοκλήρωση"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/es/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/es/ColorPicker.js
new file mode 100644
index 0000000..17672e6
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/es/ColorPicker.js
@@ -0,0 +1,11 @@
+//>>built
+define(
+"dojox/widget/nls/es/ColorPicker", //begin v1.x content
+({
+greenLabel: "v",
+blueLabel: "a",
+hueLabel: "m",
+huePickerTitle: "Selector de tono",
+saturationPickerTitle: "Selector de saturación"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/es/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/es/FilePicker.js
new file mode 100644
index 0000000..8f67e11
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/es/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/es/FilePicker", ({
+name: "Nombre",
+path: "Vía de acceso",
+size: "Tamaño (en bytes)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/es/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/es/Wizard.js
new file mode 100644
index 0000000..b6c095e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/es/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/es/Wizard", //begin v1.x content
+({
+next: "Siguiente",
+previous: "Anterior",
+done: "Terminado"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/fi/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/fi/ColorPicker.js
new file mode 100644
index 0000000..d61a8de
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/fi/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/fi/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Sävyn valitsin",
+saturationPickerTitle: "Kylläisyyden valitsin"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/fi/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/fi/FilePicker.js
new file mode 100644
index 0000000..df98b86
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/fi/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/fi/FilePicker", ({
+name: "Nimi",
+path: "Polku",
+size: "Koko (tavuina)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/fi/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/fi/Wizard.js
new file mode 100644
index 0000000..afcec2f
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/fi/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/fi/Wizard", //begin v1.x content
+({
+next: "Seuraava",
+previous: "Edellinen",
+done: "Valmis"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/fr/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/fr/ColorPicker.js
new file mode 100644
index 0000000..b99175a
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/fr/ColorPicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/fr/ColorPicker", //begin v1.x content
+({
+greenLabel: "v",
+hueLabel: "t",
+huePickerTitle: "Sélecteur de teinte",
+saturationPickerTitle: "Sélecteur de saturation"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/fr/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/fr/FilePicker.js
new file mode 100644
index 0000000..48fb4ba
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/fr/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/fr/FilePicker", ({
+name: "Nom",
+path: "Chemin",
+size: "Taille (en octets)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/fr/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/fr/Wizard.js
new file mode 100644
index 0000000..78d2e43
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/fr/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/fr/Wizard", //begin v1.x content
+({
+next: "Suivant",
+previous: "Précédent",
+done: "Terminé"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/he/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/he/ColorPicker.js
new file mode 100644
index 0000000..8c28303
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/he/ColorPicker.js
@@ -0,0 +1,16 @@
+//>>built
+define(
+"dojox/widget/nls/he/ColorPicker", //begin v1.x content
+({
+redLabel: "א",
+greenLabel: "י",
+blueLabel: "כ",
+hueLabel: "ג",
+saturationLabel: "ר",
+valueLabel: "ע", /* aka intensity or brightness */
+degLabel: "\u00B0",
+hexLabel: "הקס",
+huePickerTitle: "בורר גוון",
+saturationPickerTitle: "בורר רוויה"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/he/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/he/FilePicker.js
new file mode 100644
index 0000000..0021dda
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/he/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/he/FilePicker", ({
+name: "שם",
+path: "נתיב",
+size: "גודל (בבתים)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/he/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/he/Wizard.js
new file mode 100644
index 0000000..df2bd60
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/he/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/he/Wizard", //begin v1.x content
+({
+next: "הבא",
+previous: "הקודם",
+done: "סיום"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/hr/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/hr/ColorPicker.js
new file mode 100644
index 0000000..b31dd5a
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/hr/ColorPicker.js
@@ -0,0 +1,15 @@
+//>>built
+define(
+"dojox/widget/nls/hr/ColorPicker", ({
+redLabel: "r",
+greenLabel: "g",
+blueLabel: "b",
+hueLabel: "h",
+saturationLabel: "s",
+valueLabel: "v", /* aka intensity or brightness */
+degLabel: "\u00B0",
+hexLabel: "hex",
+huePickerTitle: "Izbornik nijanse boje",
+saturationPickerTitle: "Izbornik zasićenosti"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/hr/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/hr/FilePicker.js
new file mode 100644
index 0000000..a232a52
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/hr/FilePicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/hr/FilePicker", ({
+ name: "Ime",
+ path: "Staza",
+ size: "Veličina (u bajtovima)"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/hr/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/hr/Wizard.js
new file mode 100644
index 0000000..646e009
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/hr/Wizard.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/hr/Wizard", ({
+next: "Sljedeće",
+previous: "Prethodno",
+done: "Gotovo"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/hu/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/hu/ColorPicker.js
new file mode 100644
index 0000000..806d486
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/hu/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/hu/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Árnyalat kiválasztó",
+saturationPickerTitle: "Telítettség kiválasztó"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/hu/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/hu/FilePicker.js
new file mode 100644
index 0000000..91ee565
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/hu/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/hu/FilePicker", ({
+name: "Név",
+path: "Elérési út",
+size: "Méret (byte)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/hu/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/hu/Wizard.js
new file mode 100644
index 0000000..bce4814
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/hu/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/hu/Wizard", //begin v1.x content
+({
+next: "Következő",
+previous: "Előző",
+done: "Kész"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/it/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/it/ColorPicker.js
new file mode 100644
index 0000000..016c4ca
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/it/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/it/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Selettore tonalità",
+saturationPickerTitle: "Selettore saturazione"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/it/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/it/FilePicker.js
new file mode 100644
index 0000000..d79c6cd
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/it/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/it/FilePicker", ({
+name: "Nome",
+path: "Percorso",
+size: "Dimensione (in byte)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/it/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/it/Wizard.js
new file mode 100644
index 0000000..ad5277e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/it/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/it/Wizard", //begin v1.x content
+({
+next: "Successivo",
+previous: "Precedente",
+done: "Eseguito"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ja/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/ja/ColorPicker.js
new file mode 100644
index 0000000..6e823df
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ja/ColorPicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/ja/ColorPicker", //begin v1.x content
+({
+hexLabel: "16 進",
+huePickerTitle: "色調セレクター",
+saturationPickerTitle: "彩度セレクター"
+})
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ja/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/ja/FilePicker.js
new file mode 100644
index 0000000..f8c8faa
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ja/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/ja/FilePicker", ({
+name: "名前",
+path: "パス",
+size: "サイズ (バイト単位)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ja/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/ja/Wizard.js
new file mode 100644
index 0000000..d8f752f
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ja/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ja/Wizard", //begin v1.x content
+({
+next: "次へ",
+previous: "前へ",
+done: "完了"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/kk/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/kk/ColorPicker.js
new file mode 100644
index 0000000..51e6b44
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/kk/ColorPicker.js
@@ -0,0 +1,15 @@
+//>>built
+define(
+"dojox/widget/nls/kk/ColorPicker", //begin v1.x content
+({
+redLabel: "r",
+greenLabel: "д",
+blueLabel: "ә",
+hueLabel: "е",
+saturationLabel: "ң",
+valueLabel: "п", /* aka intensity or brightness */
+hexLabel: "алтылық",
+huePickerTitle: "Реңкті іріктеу",
+saturationPickerTitle: "Қанықтықты іріктеу"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/kk/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/kk/FilePicker.js
new file mode 100644
index 0000000..79993fe
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/kk/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/kk/FilePicker", ({
+name: "Атауы",
+path: "Жол",
+size: "Өлшемі (байт)"
+})
+
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/kk/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/kk/Wizard.js
new file mode 100644
index 0000000..12f8aaa
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/kk/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/kk/Wizard", //begin v1.x content
+({
+next: "Келесі",
+previous: "Алдыңғы",
+done: "Орындалған"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ko/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/ko/ColorPicker.js
new file mode 100644
index 0000000..ccdd82a
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ko/ColorPicker.js
@@ -0,0 +1,15 @@
+//>>built
+define(
+"dojox/widget/nls/ko/ColorPicker", //begin v1.x content
+({
+redLabel: "R",
+greenLabel: "G",
+blueLabel: "B",
+hueLabel: "H",
+saturationLabel: "S",
+valueLabel: "V", /* aka intensity or brightness */
+hexLabel: "16진",
+huePickerTitle: "색상 선택자",
+saturationPickerTitle: "채도 선택자"
+})
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ko/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/ko/FilePicker.js
new file mode 100644
index 0000000..6c04f10
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ko/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/ko/FilePicker", ({
+name: "이름",
+path: "경로",
+size: "크기(바이트)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ko/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/ko/Wizard.js
new file mode 100644
index 0000000..98c4e4c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ko/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ko/Wizard", //begin v1.x content
+({
+next: "다음",
+previous: "이전",
+done: "완료"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/nb/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/nb/ColorPicker.js
new file mode 100644
index 0000000..d00a8cd
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/nb/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/nb/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Nyansevelger",
+saturationPickerTitle: "Metningsvelger"
+})
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/nb/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/nb/FilePicker.js
new file mode 100644
index 0000000..7178150
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/nb/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/nb/FilePicker", ({
+name: "Navn",
+path: "Bane",
+size: "Størrelse (i byte)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/nb/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/nb/Wizard.js
new file mode 100644
index 0000000..9c05db7
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/nb/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/nb/Wizard", //begin v1.x content
+({
+next: "Neste",
+previous: "Forrige",
+done: "Ferdig"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/nl/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/nl/ColorPicker.js
new file mode 100644
index 0000000..2342691
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/nl/ColorPicker.js
@@ -0,0 +1,11 @@
+//>>built
+define(
+"dojox/widget/nls/nl/ColorPicker", //begin v1.x content
+({
+hueLabel: "t",
+saturationLabel: "i",
+valueLabel: "h", /* aka intensity or brightness */
+huePickerTitle: "Tint selecteren",
+saturationPickerTitle: "Intensiteit selecteren"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/nl/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/nl/FilePicker.js
new file mode 100644
index 0000000..3b9509e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/nl/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/nl/FilePicker", ({
+name: "Naam",
+path: "Pad",
+size: "Grootte (in bytes)"
+})
+
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/nl/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/nl/Wizard.js
new file mode 100644
index 0000000..49fd5c7
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/nl/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/nl/Wizard", //begin v1.x content
+({
+next: "Volgende",
+previous: "Vorige",
+done: "Klaar"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pl/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/pl/ColorPicker.js
new file mode 100644
index 0000000..522db6d
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pl/ColorPicker.js
@@ -0,0 +1,15 @@
+//>>built
+define(
+"dojox/widget/nls/pl/ColorPicker", //begin v1.x content
+({
+redLabel: "c",
+greenLabel: "z",
+blueLabel: "n",
+hueLabel: "barwa",
+saturationLabel: "nas.",
+valueLabel: "jas.", /* aka intensity or brightness */
+hexLabel: "szesnastkowe",
+huePickerTitle: "Selektor barwy",
+saturationPickerTitle: "Selektor nasycenia"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pl/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/pl/FilePicker.js
new file mode 100644
index 0000000..96ca0ae
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pl/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/pl/FilePicker", ({
+name: "Nazwa",
+path: "Ścieżka",
+size: "Wielkość (w bajtach)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pl/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/pl/Wizard.js
new file mode 100644
index 0000000..d6dc31a
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pl/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/pl/Wizard", //begin v1.x content
+({
+next: "Dalej",
+previous: "Wstecz",
+done: "Gotowe"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pt-pt/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/pt-pt/ColorPicker.js
new file mode 100644
index 0000000..196150a
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pt-pt/ColorPicker.js
@@ -0,0 +1,13 @@
+//>>built
+define(
+"dojox/widget/nls/pt-pt/ColorPicker", //begin v1.x content
+({
+redLabel: "e",
+greenLabel: "v",
+blueLabel: "a",
+hueLabel: "t",
+valueLabel: "val", /* aka intensity or brightness */
+huePickerTitle: "Selector de tonalidade",
+saturationPickerTitle: "Selector de saturação"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pt-pt/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/pt-pt/FilePicker.js
new file mode 100644
index 0000000..0de6756
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pt-pt/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/pt-pt/FilePicker", ({
+name: "Nome",
+path: "Caminho",
+size: "Tamanho (em bytes)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pt-pt/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/pt-pt/Wizard.js
new file mode 100644
index 0000000..4c4efc1
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pt-pt/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/pt-pt/Wizard", //begin v1.x content
+({
+next: "Seguinte",
+previous: "Anterior",
+done: "Concluído"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pt/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/pt/ColorPicker.js
new file mode 100644
index 0000000..5810fea
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pt/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/pt/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Seletor de Matiz",
+saturationPickerTitle: "Seletor de Saturação"
+})
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pt/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/pt/FilePicker.js
new file mode 100644
index 0000000..8a90073
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pt/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/pt/FilePicker", ({
+name: "Nome",
+path: "Caminho",
+size: "Tamanho (em bytes)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/pt/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/pt/Wizard.js
new file mode 100644
index 0000000..1c5384d
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/pt/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/pt/Wizard", //begin v1.x content
+({
+next: "Próximo",
+previous: "Anterior",
+done: "Concluído"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ro/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/ro/ColorPicker.js
new file mode 100644
index 0000000..eff40fc
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ro/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/ro/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Selector nuanţă",
+saturationPickerTitle: "Selector saturaţie"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ro/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/ro/FilePicker.js
new file mode 100644
index 0000000..703f1e1
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ro/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ro/FilePicker", ({
+name: "Nume",
+path: "Cale ",
+size: "Dimensiune (în octeţi)"
+})
+
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ro/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/ro/Wizard.js
new file mode 100644
index 0000000..7729319
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ro/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ro/Wizard", //begin v1.x content
+({
+next: "Următor",
+previous: "Anterior",
+done: "Gata"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ru/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/ru/ColorPicker.js
new file mode 100644
index 0000000..9066a8d
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ru/ColorPicker.js
@@ -0,0 +1,15 @@
+//>>built
+define(
+"dojox/widget/nls/ru/ColorPicker", //begin v1.x content
+({
+redLabel: "к",
+greenLabel: "з",
+blueLabel: "с",
+hueLabel: "о",
+saturationLabel: "н",
+valueLabel: "з", /* aka intensity or brightness */
+hexLabel: "шест",
+huePickerTitle: "Выбор оттенка",
+saturationPickerTitle: "Выбор насыщенности"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ru/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/ru/FilePicker.js
new file mode 100644
index 0000000..e966b39
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ru/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/ru/FilePicker", ({
+name: "Имя",
+path: "Путь",
+size: "Размер (байт)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/ru/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/ru/Wizard.js
new file mode 100644
index 0000000..61186e0
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/ru/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/ru/Wizard", //begin v1.x content
+({
+next: "Далее",
+previous: "Назад",
+done: "Готово"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sk/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/sk/ColorPicker.js
new file mode 100644
index 0000000..4bbe9b2
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sk/ColorPicker.js
@@ -0,0 +1,6 @@
+//>>built
+define(
+"dojox/widget/nls/sk/ColorPicker", //begin v1.x content
+({
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sk/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/sk/FilePicker.js
new file mode 100644
index 0000000..aa90b56
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sk/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/sk/FilePicker", ({
+name: "Názov",
+path: "Cesta",
+size: "Veľkosť (v bajtoch)"
+})
+
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sk/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/sk/Wizard.js
new file mode 100644
index 0000000..5c29e4c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sk/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/sk/Wizard", //begin v1.x content
+({
+next: "Ďalej",
+previous: "Späť",
+done: "Hotovo"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sl/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/sl/ColorPicker.js
new file mode 100644
index 0000000..c5a0da1
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sl/ColorPicker.js
@@ -0,0 +1,8 @@
+//>>built
+define(
+"dojox/widget/nls/sl/ColorPicker", //begin v1.x content
+({
+huePickerTitle: "Izbirnik odtenka ",
+saturationPickerTitle: "Izbirnik nasičenosti"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sl/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/sl/FilePicker.js
new file mode 100644
index 0000000..0a90463
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sl/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/sl/FilePicker", ({
+name: "Ime",
+path: "Pot",
+size: "Velikost (v bajtih)"
+})
+
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sl/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/sl/Wizard.js
new file mode 100644
index 0000000..6b2ac74
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sl/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/sl/Wizard", //begin v1.x content
+({
+next: "Naprej",
+previous: "Nazaj",
+done: "Opravljeno"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sv/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/sv/ColorPicker.js
new file mode 100644
index 0000000..cdee575
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sv/ColorPicker.js
@@ -0,0 +1,11 @@
+//>>built
+define(
+"dojox/widget/nls/sv/ColorPicker", //begin v1.x content
+({
+hueLabel: "n",
+saturationLabel: "m",
+valueLabel: "l", /* aka intensity or brightness */
+huePickerTitle: "Välj färgton",
+saturationPickerTitle: "Välj mättnad"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sv/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/sv/FilePicker.js
new file mode 100644
index 0000000..02d727e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sv/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/sv/FilePicker", ({
+name: "Namn",
+path: "Sökväg",
+size: "Storlek (byte)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/sv/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/sv/Wizard.js
new file mode 100644
index 0000000..9481858
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/sv/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/sv/Wizard", //begin v1.x content
+({
+next: "Nästa",
+previous: "Föregående",
+done: "Stäng"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/th/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/th/ColorPicker.js
new file mode 100644
index 0000000..c3f8417
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/th/ColorPicker.js
@@ -0,0 +1,14 @@
+//>>built
+define(
+"dojox/widget/nls/th/ColorPicker", //begin v1.x content
+({
+redLabel: "อาร์",
+greenLabel: "จี",
+blueLabel: "บี",
+hueLabel: "เอช",
+saturationLabel: "เอส",
+valueLabel: "วี", /* aka intensity or brightness */
+huePickerTitle: "ตัวเลือกสี",
+saturationPickerTitle: "ตัวเลือกความอิ่มของสี"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/th/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/th/FilePicker.js
new file mode 100644
index 0000000..11b530c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/th/FilePicker.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/th/FilePicker", ({
+name: "ชื่อ",
+path: "พาธ",
+size: "ขนาด (ไบต์)"
+})
+
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/th/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/th/Wizard.js
new file mode 100644
index 0000000..ad6262c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/th/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/th/Wizard", //begin v1.x content
+({
+next: "ถัดไป",
+previous: "ก่อนหน้า",
+done: "เสร็จสิ้น"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/tr/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/tr/ColorPicker.js
new file mode 100644
index 0000000..a49ad82
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/tr/ColorPicker.js
@@ -0,0 +1,15 @@
+//>>built
+define(
+"dojox/widget/nls/tr/ColorPicker", //begin v1.x content
+({
+redLabel: "k",
+greenLabel: "y",
+blueLabel: "m",
+hueLabel: "t",
+saturationLabel: "d",
+valueLabel: "d", /* aka intensity or brightness */
+hexLabel: "onaltılı",
+huePickerTitle: "Ton Seçici",
+saturationPickerTitle: "Doygunluk Seçici"
+})
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/tr/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/tr/FilePicker.js
new file mode 100644
index 0000000..b1be786
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/tr/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/tr/FilePicker", ({
+name: "Ad",
+path: "Yol",
+size: "Boyut (bayt cinsinden)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/tr/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/tr/Wizard.js
new file mode 100644
index 0000000..2b9294a
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/tr/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/tr/Wizard", //begin v1.x content
+({
+next: "İleri",
+previous: "Geri",
+done: "Bitti"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/zh-tw/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/zh-tw/ColorPicker.js
new file mode 100644
index 0000000..e64cd73
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/zh-tw/ColorPicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/zh-tw/ColorPicker", //begin v1.x content
+({
+hexLabel: "十六進位",
+huePickerTitle: "色調選取元",
+saturationPickerTitle: "飽和度選取元"
+})
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/zh-tw/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/zh-tw/FilePicker.js
new file mode 100644
index 0000000..70456d8
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/zh-tw/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/zh-tw/FilePicker", ({
+name: "名稱",
+path: "路徑",
+size: "大小 (以位元組為單位)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/zh-tw/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/zh-tw/Wizard.js
new file mode 100644
index 0000000..c51f829
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/zh-tw/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/zh-tw/Wizard", //begin v1.x content
+({
+next: "下一步",
+previous: "上一步",
+done: "完成"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/nls/zh/ColorPicker.js b/js/dojo-1.7.2/dojox/widget/nls/zh/ColorPicker.js
new file mode 100644
index 0000000..bd0c281
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/zh/ColorPicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/zh/ColorPicker", //begin v1.x content
+({
+hexLabel: "十六进制",
+huePickerTitle: "色彩选择器",
+saturationPickerTitle: "饱和度选择器"
+})
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/zh/FilePicker.js b/js/dojo-1.7.2/dojox/widget/nls/zh/FilePicker.js
new file mode 100644
index 0000000..931b07e
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/zh/FilePicker.js
@@ -0,0 +1,9 @@
+//>>built
+define(
+"dojox/widget/nls/zh/FilePicker", ({
+name: "名称",
+path: "路径",
+size: "大小(字节)"
+})
+
+); \ No newline at end of file
diff --git a/js/dojo-1.7.2/dojox/widget/nls/zh/Wizard.js b/js/dojo-1.7.2/dojox/widget/nls/zh/Wizard.js
new file mode 100644
index 0000000..688813c
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/nls/zh/Wizard.js
@@ -0,0 +1,10 @@
+//>>built
+define(
+"dojox/widget/nls/zh/Wizard", //begin v1.x content
+({
+next: "下一步",
+previous: "上一步",
+done: "完成"
+})
+//end v1.x content
+);
diff --git a/js/dojo-1.7.2/dojox/widget/rotator/Controller.js b/js/dojo-1.7.2/dojox/widget/rotator/Controller.js
new file mode 100644
index 0000000..8fc5aed
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/rotator/Controller.js
@@ -0,0 +1,196 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/rotator/Controller", ["dijit","dojo","dojox"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.rotator.Controller");
+
+(function(d){
+
+ var _dojoxRotator = "dojoxRotator",
+ _play = _dojoxRotator + "Play",
+ _pause = _dojoxRotator + "Pause",
+ _number = _dojoxRotator + "Number",
+ _tab = _dojoxRotator + "Tab",
+ _selected = _dojoxRotator + "Selected";
+
+ d.declare("dojox.widget.rotator.Controller", null, {
+ // summary:
+ // A controller that manipulates a Rotator or AutoRotator.
+ //
+ // description:
+ // Displays a series of controls that send actions to a Rotator or
+ // AutoRotator. The Controller supports the following controls:
+ //
+ // * Next pane
+ // * Previous pane
+ // * Play/Pause toggler
+ // * Numbered tabs
+ // * Titled tabs
+ // * Information
+ //
+ // You may specify any of these controls in any order. You may also
+ // have multiple Controllers tied to a single Rotator instance.
+ //
+ // The Controller's DOM node may also be styled for positioning or
+ // other styled preferences.
+ //
+ // example:
+ // | <div dojoType="dojox.widget.rotator.Controller"
+ // | rotator="myRotator"
+ // | ></div>
+ //
+ // example:
+ // | <div dojoType="dojox.widget.rotator.Controller"
+ // | rotator="myRotator"
+ // | controls="prev,#,next"
+ // | class="myCtrl"
+ // | ></div>
+ //
+ // example:
+ // | <div dojoType="dojox.widget.rotator.Controller"
+ // | rotator="myRotator"
+ // | controls="titles"
+ // | class="myCtrl"
+ // | ></div>s
+
+ // rotator: dojox.widget.Rotator
+ // An instance of a Rotator widget.
+ rotator: null,
+
+ // commands: string
+ // A comma-separated list of commands. Valid commands are:
+ // prev An icon button to go to the previous pane.
+ // next An icon button to go to the next pane.
+ // play/pause A play and pause toggle icon button.
+ // info Displays the current and total panes. (ie "1 / 4")
+ // # Displays a number button for each pane. (ie "1 2 3 4")
+ // titles Displays each pane's title as a tab. (ie "Home Services Contact Blog")
+ commands: "prev,play/pause,info,next",
+
+ constructor: function(/*Object*/params, /*DomNode|string*/node){
+ // summary:
+ // Initializes the pager and connect to the rotator.
+
+ d.mixin(this, params);
+
+ // check if we have a valid rotator
+ var r = this.rotator;
+ if(r){
+ // remove all of the controller's child nodes just in case
+ while(node.firstChild){
+ node.removeChild(node.firstChild);
+ }
+
+ var ul = this._domNode = d.create("ul", null, node),
+ icon = " " + _dojoxRotator + "Icon",
+
+ // helper function for creating a button
+ cb = function(/*string*/label, /*string*/css, /*array*/action){
+ d.create("li", {
+ className: css,
+ innerHTML: '<a href="#"><span>' + label + '</span></a>',
+ onclick: function(/*event*/e){
+ d.stopEvent(e);
+ if(r){
+ r.control.apply(r, action);
+ }
+ }
+ }, ul);
+ };
+
+ // build out the commands
+ d.forEach(this.commands.split(','), function(b, i){
+ switch(b){
+ case "prev":
+ cb("Prev", _dojoxRotator + "Prev" + icon, ["prev"]);
+ break;
+ case "play/pause":
+ cb("Play", _play + icon, ["play"]);
+ cb("Pause", _pause + icon, ["pause"]);
+ break;
+ case "info":
+ this._info = d.create("li", {
+ className: _dojoxRotator + "Info",
+ innerHTML: this._buildInfo(r)
+ }, ul);
+ break;
+ case "next":
+ cb("Next", _dojoxRotator + "Next" + icon, ["next"]);
+ break;
+ case "#":
+ case "titles":
+ for(var j=0; j<r.panes.length; j++){
+ cb(
+ /*label*/ b == '#' ? j+1 : r.panes[j].title || "Tab " + (j+1),
+ /*css*/ (b == '#' ? _number : _tab) + ' ' + (j == r.idx ? _selected : "") + ' ' + _dojoxRotator + "Pane" + j,
+ /*action*/ ["go", j]
+ );
+ }
+ break;
+ }
+ }, this);
+
+ // add the first/last classes for styling
+ d.query("li:first-child", ul).addClass(_dojoxRotator + "First");
+ d.query("li:last-child", ul).addClass(_dojoxRotator + "Last");
+
+ // set the initial state of the play/pause toggle button
+ this._togglePlay();
+
+ this._con = d.connect(r, "onUpdate", this, "_onUpdate");
+ }
+ },
+
+ destroy: function(){
+ // summary:
+ // Disconnect from the rotator.
+ d.disconnect(this._con);
+ d.destroy(this._domNode);
+ },
+
+ _togglePlay: function(/*boolean*/playing){
+ // summary:
+ // Toggles the play/pause button, if it exists.
+
+ var p = this.rotator.playing;
+ d.query('.'+_play, this._domNode).style("display", p ? "none" : "");
+ d.query('.'+_pause, this._domNode).style("display", p ? "" : "none");
+ },
+
+ _buildInfo: function(/*dojox.widget.Rotator*/r){
+ // summary:
+ // Return a string containing the current pane number and the total number of panes.
+ return '<span>' + (r.idx+1) + ' / ' + r.panes.length + '</span>'; /*string*/
+ },
+
+ _onUpdate: function(/*string*/type){
+ // summary:
+ // Updates various pager controls when the rotator updates.
+
+ var r = this.rotator; // no need to test if this is null since _onUpdate is only fired by the rotator
+
+ switch(type){
+ case "play":
+ case "pause":
+ this._togglePlay();
+ break;
+ case "onAfterTransition":
+ if(this._info){
+ this._info.innerHTML = this._buildInfo(r);
+ }
+
+ // helper function for selecting the current tab
+ var s = function(/*NodeList*/n){
+ if(r.idx < n.length){
+ d.addClass(n[r.idx], _selected);
+ }
+ };
+
+ s(d.query('.' + _number, this._domNode).removeClass(_selected));
+ s(d.query('.' + _tab, this._domNode).removeClass(_selected));
+ break;
+ }
+ }
+ });
+
+})(dojo);
+});
diff --git a/js/dojo-1.7.2/dojox/widget/rotator/Fade.js b/js/dojo-1.7.2/dojox/widget/rotator/Fade.js
new file mode 100644
index 0000000..26a9c03
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/rotator/Fade.js
@@ -0,0 +1,44 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/rotator/Fade", ["dijit","dojo","dojox","dojo/require!dojo/fx"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.rotator.Fade");
+dojo.require("dojo.fx");
+
+(function(d){
+
+ function _fade(/*Object*/args, /*string*/action){
+ // summary:
+ // Returns an animation of a fade out and fade in of the current and next
+ // panes. It will either chain (fade) or combine (crossFade) the fade
+ // animations.
+ var n = args.next.node;
+ d.style(n, {
+ display: "",
+ opacity: 0
+ });
+
+ args.node = args.current.node;
+
+ return d.fx[action]([ /*dojo.Animation*/
+ d.fadeOut(args),
+ d.fadeIn(d.mixin(args, { node: n }))
+ ]);
+ }
+
+ d.mixin(dojox.widget.rotator, {
+ fade: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that fades out the current pane, then fades in
+ // the next pane.
+ return _fade(args, "chain"); /*dojo.Animation*/
+ },
+
+ crossFade: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that cross fades two rotator panes.
+ return _fade(args, "combine"); /*dojo.Animation*/
+ }
+ });
+
+})(dojo);
+});
diff --git a/js/dojo-1.7.2/dojox/widget/rotator/Pan.js b/js/dojo-1.7.2/dojox/widget/rotator/Pan.js
new file mode 100644
index 0000000..92723b8
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/rotator/Pan.js
@@ -0,0 +1,212 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/rotator/Pan", ["dijit","dojo","dojox","dojo/require!dojo/fx"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.rotator.Pan");
+dojo.require("dojo.fx");
+
+(function(d){
+
+ // Constants used to identify which edge the pane pans in from.
+ var DOWN = 0,
+ RIGHT = 1,
+ UP = 2,
+ LEFT = 3;
+
+ function _pan(/*int*/type, /*Object*/args){
+ // summary:
+ // Handles the preparation of the dom node and creates the dojo.Animation object.
+ var n = args.next.node,
+ r = args.rotatorBox,
+ m = type % 2,
+ a = m ? "left" : "top",
+ s = (m ? r.w : r.h) * (type < 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([ /*dojo.Animation*/
+ d.animateProperty({
+ node: args.current.node,
+ duration: args.duration,
+ properties: p,
+ easing: args.easing
+ }),
+ d.animateProperty({
+ node: n,
+ duration: args.duration,
+ properties: q,
+ easing: args.easing
+ })
+ ]);
+ }
+
+ function _setZindex(/*DomNode*/n, /*int*/z){
+ // summary:
+ // Helper function for continuously panning.
+ d.style(n, "zIndex", z);
+ }
+
+ d.mixin(dojox.widget.rotator, {
+ pan: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that either pans left or right to the next pane.
+ // The actual direction depends on the order of the panes.
+ //
+ // If panning forward from index 1 to 3, it will perform a pan left. If panning
+ // backwards from 5 to 1, then it will perform a pan right.
+ //
+ // If the parameter "continuous" is set to true, it will return an animation
+ // chain of several pan animations of each intermediate pane panning. For
+ // example, if you pan forward from 1 to 3, it will return an animation panning
+ // left from 1 to 2 and then 2 to 3.
+ //
+ // If an easing is specified, it will be applied to each pan transition. For
+ // example, if you are panning from pane 1 to pane 5 and you set the easing to
+ // "dojo.fx.easing.elasticInOut", then it will "wobble" 5 times, once for each
+ // pan transition.
+ //
+ // If the parameter "wrap" is set to true, it will pan to the next pane using
+ // the shortest distance in the array of panes. For example, if there are 6
+ // panes, then panning from 5 to 1 will pan forward (left) from pane 5 to 6 and
+ // 6 to 1. If the distance is the same either going forward or backwards, then
+ // it will always pan forward (left).
+ //
+ // A continuous pan will use the target pane's duration to pan all intermediate
+ // panes. To use the target's pane duration for each intermediate pane, then
+ // set the "quick" parameter to "false".
+
+ var w = args.wrap,
+ p = args.rotator.panes,
+ len = p.length,
+ z = len,
+ j = args.current.idx,
+ k = args.next.idx,
+ nw = Math.abs(k - j),
+ ww = Math.abs((len - Math.max(j, k)) + Math.min(j, k)) % len,
+ _forward = j < k,
+ _dir = LEFT,
+ _pans = [],
+ _nodes = [],
+ _duration = args.duration;
+
+ // default to pan left, but check if we should pan right.
+ // need to take into account wrapping.
+ if((!w && !_forward) || (w && (_forward && nw > ww || !_forward && nw < ww))){
+ _dir = RIGHT;
+ }
+
+ if(args.continuous){
+ // if continuous pans are quick, then divide the duration by the number of panes
+ if(args.quick){
+ _duration = Math.round(_duration / (w ? Math.min(ww, nw) : nw));
+ }
+
+ // set the current pane's z-index
+ _setZindex(p[j].node, z--);
+
+ var f = (_dir == LEFT);
+
+ // loop and set z-indexes and get all pan animations
+ while(1){
+ // set the current pane
+ var i = j;
+
+ // increment/decrement the next pane's index
+ if(f){
+ if(++j >= len){
+ j = 0;
+ }
+ }else{
+ if(--j < 0){
+ j = len - 1;
+ }
+ }
+
+ var x = p[i],
+ y = p[j];
+
+ // set next pane's z-index
+ _setZindex(y.node, z--);
+
+ // build the pan animation
+ _pans.push(_pan(_dir, d.mixin({
+ easing: function(m){ return m; } // continuous gets a linear easing by default
+ }, args, {
+ current: x,
+ next: y,
+ duration: _duration
+ })));
+
+ // if we're done, then break out of the loop
+ if((f && j == k) || (!f && j == k)){
+ break;
+ }
+
+ // this must come after the break... we don't want the last pane to get it's
+ // styles reset.
+ _nodes.push(y.node);
+ }
+
+ // build the chained animation of all pan animations
+ var _anim = d.fx.chain(_pans),
+
+ // clean up styles when the chained animation finishes
+ h = d.connect(_anim, "onEnd", function(){
+ d.disconnect(h);
+ d.forEach(_nodes, function(q){
+ d.style(q, {
+ display: "none",
+ left: 0,
+ opacity: 1,
+ top: 0,
+ zIndex: 0
+ });
+ });
+ });
+
+ return _anim;
+ }
+
+ // we're not continuous, so just return a normal pan animation
+ return _pan(_dir, args); /*dojo.Animation*/
+ },
+
+ panDown: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that pans in the next rotator pane from the top.
+ return _pan(DOWN, args); /*dojo.Animation*/
+ },
+
+ panRight: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that pans in the next rotator pane from the right.
+ return _pan(RIGHT, args); /*dojo.Animation*/
+ },
+
+ panUp: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that pans in the next rotator pane from the bottom.
+ return _pan(UP, args); /*dojo.Animation*/
+ },
+
+ panLeft: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that pans in the next rotator pane from the left.
+ return _pan(LEFT, args); /*dojo.Animation*/
+ }
+ });
+
+})(dojo);
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/rotator/PanFade.js b/js/dojo-1.7.2/dojox/widget/rotator/PanFade.js
new file mode 100644
index 0000000..f84da21
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/rotator/PanFade.js
@@ -0,0 +1,216 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/rotator/PanFade", ["dijit","dojo","dojox","dojo/require!dojo/fx"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.rotator.PanFade");
+dojo.require("dojo.fx");
+
+(function(d){
+
+ // Constants used to identify which edge the pane pans in from.
+ var DOWN = 0,
+ RIGHT = 1,
+ UP = 2,
+ LEFT = 3;
+
+ function _pan(/*int*/type, /*Object*/args){
+ // summary:
+ // Handles the preparation of the dom node and creates the dojo.Animation object.
+ var j = {
+ node: args.current.node,
+ duration: args.duration,
+ easing: args.easing
+ },
+ k = {
+ node: args.next.node,
+ duration: args.duration,
+ easing: args.easing
+ },
+ r = args.rotatorBox,
+ m = type % 2,
+ a = m ? "left" : "top",
+ s = (m ? r.w : r.h) * (type < 2 ? -1 : 1),
+ p = {},
+ q = {};
+
+ d.style(k.node, {
+ display: "",
+ opacity: 0
+ });
+
+ p[a] = {
+ start: 0,
+ end: -s
+ };
+
+ q[a] = {
+ start: s,
+ end: 0
+ };
+
+ return d.fx.combine([ /*dojo.Animation*/
+ d.animateProperty(d.mixin({ properties: p }, j)),
+ d.fadeOut(j),
+ d.animateProperty(d.mixin({ properties: q }, k)),
+ d.fadeIn(k)
+ ]);
+ }
+
+ function _setZindex(/*DomNode*/n, /*int*/z){
+ // summary:
+ // Helper function for continuously panning.
+ d.style(n, "zIndex", z);
+ }
+
+ d.mixin(dojox.widget.rotator, {
+ panFade: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that either pans left or right to the next pane.
+ // The actual direction depends on the order of the panes.
+ //
+ // If panning forward from index 1 to 3, it will perform a pan left. If panning
+ // backwards from 5 to 1, then it will perform a pan right.
+ //
+ // If the parameter "continuous" is set to true, it will return an animation
+ // chain of several pan animations of each intermediate pane panning. For
+ // example, if you pan forward from 1 to 3, it will return an animation panning
+ // left from 1 to 2 and then 2 to 3.
+ //
+ // If an easing is specified, it will be applied to each pan transition. For
+ // example, if you are panning from pane 1 to pane 5 and you set the easing to
+ // "dojo.fx.easing.elasticInOut", then it will "wobble" 5 times, once for each
+ // pan transition.
+ //
+ // If the parameter "wrap" is set to true, it will pan to the next pane using
+ // the shortest distance in the array of panes. For example, if there are 6
+ // panes, then panning from 5 to 1 will pan forward (left) from pane 5 to 6 and
+ // 6 to 1. If the distance is the same either going forward or backwards, then
+ // it will always pan forward (left).
+ //
+ // A continuous pan will use the target pane's duration to pan all intermediate
+ // panes. To use the target's pane duration for each intermediate pane, then
+ // set the "quick" parameter to "false".
+
+ var w = args.wrap,
+ p = args.rotator.panes,
+ len = p.length,
+ z = len,
+ j = args.current.idx,
+ k = args.next.idx,
+ nw = Math.abs(k - j),
+ ww = Math.abs((len - Math.max(j, k)) + Math.min(j, k)) % len,
+ _forward = j < k,
+ _dir = LEFT,
+ _pans = [],
+ _nodes = [],
+ _duration = args.duration;
+
+ // default to pan left, but check if we should pan right.
+ // need to take into account wrapping.
+ if((!w && !_forward) || (w && (_forward && nw > ww || !_forward && nw < ww))){
+ _dir = RIGHT;
+ }
+
+ if(args.continuous){
+ // if continuous pans are quick, then divide the duration by the number of panes
+ if(args.quick){
+ _duration = Math.round(_duration / (w ? Math.min(ww, nw) : nw));
+ }
+
+ // set the current pane's z-index
+ _setZindex(p[j].node, z--);
+
+ var f = (_dir == LEFT);
+
+ // loop and set z-indexes and get all pan animations
+ while(1){
+ // set the current pane
+ var i = j;
+
+ // increment/decrement the next pane's index
+ if(f){
+ if(++j >= len){
+ j = 0;
+ }
+ }else{
+ if(--j < 0){
+ j = len - 1;
+ }
+ }
+
+ var x = p[i],
+ y = p[j];
+
+ // set next pane's z-index
+ _setZindex(y.node, z--);
+
+ // build the pan animation
+ _pans.push(_pan(_dir, d.mixin({
+ easing: function(m){ return m; } // continuous gets a linear easing by default
+ }, args, {
+ current: x,
+ next: y,
+ duration: _duration
+ })));
+
+ // if we're done, then break out of the loop
+ if((f && j == k) || (!f && j == k)){
+ break;
+ }
+
+ // this must come after the break... we don't want the last pane to get it's
+ // styles reset.
+ _nodes.push(y.node);
+ }
+
+ // build the chained animation of all pan animations
+ var _anim = d.fx.chain(_pans),
+
+ // clean up styles when the chained animation finishes
+ h = d.connect(_anim, "onEnd", function(){
+ d.disconnect(h);
+ d.forEach(_nodes, function(q){
+ d.style(q, {
+ display: "none",
+ left: 0,
+ opacity: 1,
+ top: 0,
+ zIndex: 0
+ });
+ });
+ });
+
+ return _anim;
+ }
+
+ // we're not continuous, so just return a normal pan animation
+ return _pan(_dir, args); /*dojo.Animation*/
+ },
+
+ panFadeDown: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that pans in the next rotator pane from the top.
+ return _pan(DOWN, args); /*dojo.Animation*/
+ },
+
+ panFadeRight: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that pans in the next rotator pane from the right.
+ return _pan(RIGHT, args); /*dojo.Animation*/
+ },
+
+ panFadeUp: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that pans in the next rotator pane from the bottom.
+ return _pan(UP, args); /*dojo.Animation*/
+ },
+
+ panFadeLeft: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that pans in the next rotator pane from the left.
+ return _pan(LEFT, args); /*dojo.Animation*/
+ }
+ });
+
+})(dojo);
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/rotator/Slide.js b/js/dojo-1.7.2/dojox/widget/rotator/Slide.js
new file mode 100644
index 0000000..0f13b44
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/rotator/Slide.js
@@ -0,0 +1,66 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/rotator/Slide", ["dijit","dojo","dojox"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.rotator.Slide");
+
+(function(d){
+
+ // Constants used to identify which edge the pane slides in from.
+ var DOWN = 0,
+ RIGHT = 1,
+ UP = 2,
+ LEFT = 3;
+
+ function _slide(/*int*/type, /*Object*/args){
+ // summary:
+ // Handles the preparation of the dom node and creates the dojo.Animation object.
+ var node = args.node = args.next.node,
+ r = args.rotatorBox,
+ m = type % 2,
+ s = (m ? r.w : r.h) * (type < 2 ? -1 : 1);
+
+ d.style(node, {
+ display: "",
+ zIndex: (d.style(args.current.node, "zIndex") || 1) + 1
+ });
+
+ if(!args.properties){
+ args.properties = {};
+ }
+ args.properties[m ? "left" : "top"] = {
+ start: s,
+ end: 0
+ };
+
+ return d.animateProperty(args); /*dojo.Animation*/
+ }
+
+ d.mixin(dojox.widget.rotator, {
+ slideDown: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that slides in the next rotator pane from the top.
+ return _slide(DOWN, args); /*dojo.Animation*/
+ },
+
+ slideRight: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that slides in the next rotator pane from the right.
+ return _slide(RIGHT, args); /*dojo.Animation*/
+ },
+
+ slideUp: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that slides in the next rotator pane from the bottom.
+ return _slide(UP, args); /*dojo.Animation*/
+ },
+
+ slideLeft: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that slides in the next rotator pane from the left.
+ return _slide(LEFT, args); /*dojo.Animation*/
+ }
+ });
+
+})(dojo);
+
+});
diff --git a/js/dojo-1.7.2/dojox/widget/rotator/ThumbnailController.js b/js/dojo-1.7.2/dojox/widget/rotator/ThumbnailController.js
new file mode 100644
index 0000000..d7f8d29
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/rotator/ThumbnailController.js
@@ -0,0 +1,100 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/rotator/ThumbnailController", ["dijit","dojo","dojox"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.rotator.ThumbnailController");
+
+(function(d){
+
+ var _css = "dojoxRotatorThumb",
+ _selected = _css + "Selected";
+
+ d.declare("dojox.widget.rotator.ThumbnailController", null, {
+ // summary:
+ // A rotator controller that displays thumbnails of each rotator pane.
+ //
+ // description:
+ // The ThumbnailController will look at each of the rotator's panes and
+ // only if the node is an <img> tag, then it will create an thumbnail of
+ // the pane's image using the <img> tag's "thumbsrc" or "src" attribute.
+ //
+ // The size of the thumbnails and the style of the selected thumbnail is
+ // controlled using CSS.
+ //
+ // example:
+ // | <div dojoType="dojox.widget.Rotator" jsId="myRotator">
+ // | <img src="/path/to/image1.jpg" thumbsrc="/path/to/thumb1.jpg" alt="Image 1"/>
+ // | <img src="/path/to/image2.jpg" thumbsrc="/path/to/thumb2.jpg" alt="Image 2"/>
+ // | </div>
+ // | <div dojoType="dojox.widget.rotator.ThumbnailController" rotator="myRotator"></div>
+
+ // rotator: dojox.widget.Rotator
+ // An instance of a Rotator widget.
+ rotator: null,
+
+ constructor: function(/*Object*/params, /*DomNode|string*/node){
+ // summary:
+ // Initializes the thumbnails and connect to the rotator.
+
+ d.mixin(this, params);
+
+ this._domNode = node;
+
+ // check if we have a valid rotator
+ var r = this.rotator;
+ if(r){
+ // remove all of the controller's child nodes just in case
+ while(node.firstChild){
+ node.removeChild(node.firstChild);
+ }
+
+ for(var i=0; i<r.panes.length; i++){
+ var n = r.panes[i].node,
+ s = d.attr(n, "thumbsrc") || d.attr(n, "src"),
+ t = d.attr(n, "alt") || "";
+
+ if(/img/i.test(n.tagName)){
+ (function(j){
+ d.create("a", {
+ classname: _css + ' ' + _css + j + ' ' + (j == r.idx ? _selected : ""),
+ href: s,
+ onclick: function(e){
+ d.stopEvent(e);
+ if(r){
+ r.control.apply(r, ["go", j]);
+ }
+ },
+ title: t,
+ innerHTML: '<img src="' + s + '" alt="' + t + '"/>'
+ }, node);
+ })(i);
+ }
+ }
+
+ this._con = d.connect(r, "onUpdate", this, "_onUpdate");
+ }
+ },
+
+ destroy: function(){
+ // summary:
+ // Disconnect from the rotator.
+
+ d.disconnect(this._con);
+ d.destroy(this._domNode);
+ },
+
+ _onUpdate: function(/*string*/type){
+ // summary:
+ // Updates various pager controls when the rotator updates.
+
+ var r = this.rotator; // no need to test if this is null since _onUpdate is only fired by the rotator
+ if(type == "onAfterTransition"){
+ var n = d.query('.' + _css, this._domNode).removeClass(_selected);
+ if(r.idx < n.length){
+ d.addClass(n[r.idx], _selected);
+ }
+ }
+ }
+ });
+
+})(dojo);
+});
diff --git a/js/dojo-1.7.2/dojox/widget/rotator/Wipe.js b/js/dojo-1.7.2/dojox/widget/rotator/Wipe.js
new file mode 100644
index 0000000..9377ebf
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/widget/rotator/Wipe.js
@@ -0,0 +1,92 @@
+//>>built
+// wrapped by build app
+define("dojox/widget/rotator/Wipe", ["dijit","dojo","dojox"], function(dijit,dojo,dojox){
+dojo.provide("dojox.widget.rotator.Wipe");
+
+(function(d){
+
+ // Constants used to identify which clip edge is being wiped. The values are
+ // the index of the clip array that is changed during the animation.
+ var DOWN = 2,
+ RIGHT = 3,
+ UP = 0,
+ LEFT = 1;
+
+ function _clipArray(/*int*/type, /*int*/w, /*int*/h, /*number*/x){
+ // summary:
+ // Returns an array containing the down, right, up, and
+ // left clip region based on the type. If "x" is specified,
+ // then it is applied to the appropriate clipping edge.
+ var a = [0, w, 0, 0]; // default to the top edge
+ if(type == RIGHT){
+ a = [0, w, h, w];
+ }else if(type == UP){
+ a = [h, w, h, 0];
+ }else if(type == LEFT){
+ a = [0, 0, h, 0];
+ }
+ if(x != null){
+ a[type] = type == DOWN || type == LEFT ? x : (type % 2 ? w : h) - x;
+ }
+ return a; /*Array*/
+ }
+
+ function _setClip(/*DomNode*/n, /*int*/type, /*int*/w, /*int*/h, /*number*/x){
+ // summary:
+ // Sets the clip region of the node. If a type is passed in then we
+ // return a rect(), otherwise return "auto".
+ d.style(n, "clip", type == null ? "auto" : "rect(" + _clipArray(type, w, h, x).join("px,") + "px)");
+ }
+
+ function _wipe(/*int*/type, /*Object*/args){
+ // summary:
+ // Handles the preparation of the dom node and creates the dojo.Animation object.
+ var node = args.next.node,
+ w = args.rotatorBox.w,
+ h = args.rotatorBox.h;
+
+ d.style(node, {
+ display: "",
+ zIndex: (d.style(args.current.node, "zIndex") || 1) + 1
+ });
+
+ _setClip(node, type, w, h);
+
+ return new d.Animation(d.mixin({ /*dojo.Animation*/
+ node: node,
+ curve: [0, type % 2 ? w : h],
+ onAnimate: function(x){
+ _setClip(node, type, w, h, parseInt(x));
+ }
+ }, args));
+ }
+
+ d.mixin(dojox.widget.rotator, {
+ wipeDown: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that wipes in the next rotator pane from the top.
+ return _wipe(DOWN, args); /*dojo.Animation*/
+ },
+
+ wipeRight: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that wipes in the next rotator pane from the right.
+ return _wipe(RIGHT, args); /*dojo.Animation*/
+ },
+
+ wipeUp: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that wipes in the next rotator pane from the bottom.
+ return _wipe(UP, args); /*dojo.Animation*/
+ },
+
+ wipeLeft: function(/*Object*/args){
+ // summary:
+ // Returns a dojo.Animation that wipes in the next rotator pane from the left.
+ return _wipe(LEFT, args); /*dojo.Animation*/
+ }
+ });
+
+})(dojo);
+
+});