From 50fd1b0dd594c89ebd25af5fdc80bfbe7d031410 Mon Sep 17 00:00:00 2001 From: penguinc Date: Fri, 8 Sep 2006 05:57:50 +0000 Subject: [PATCH] Initial revision --- README | 153 + Rakefile | 10 + app/controllers/activity_controller.rb | 19 + app/controllers/application.rb | 124 + app/controllers/barista_controller.rb | 79 + app/controllers/cafe_controller.rb | 121 + app/controllers/fund_controller.rb | 68 + app/helpers/activity_helper.rb | 2 + app/helpers/application_helper.rb | 21 + app/helpers/barista_helper.rb | 2 + app/helpers/cafe_helper.rb | 2 + app/helpers/fund_helper.rb | 2 + app/models/barista.rb | 37 + app/models/fund.rb | 23 + app/models/ledger.rb | 6 + app/views/activity/_purchase.rhtml | 13 + app/views/activity/index.rhtml | 26 + app/views/barista/_barista.rhtml | 11 + app/views/barista/identify.rhtml | 8 + app/views/barista/index.rhtml | 37 + app/views/cafe/index.rhtml | 91 + app/views/fund/_fund_line.rhtml | 14 + app/views/fund/index.rhtml | 35 + app/views/layouts/grindable.rhtml | 102 + app/views/shared/_menu.rhtml | 19 + config/boot.rb | 19 + config/database.yml.template | 35 + config/environment.rb | 53 + config/environments/development.rb | 19 + config/environments/production.rb | 19 + config/environments/test.rb | 19 + config/routes.rb | 9 + db/migrate/001_base_schema.rb | 28 + db/migrate/002_add_find_to_barista.rb | 10 + db/migrate/003_add_ledger_comment.rb | 9 + .../004_add_ledger_fund_relationship.rb | 11 + db/migrate/005_add_barista_create_date.rb | 9 + db/migrate/006_ledger_post_date.rb | 9 + db/schema.rb | 36 + doc/README_FOR_APP | 2 + grindable.kdevelop | 91 + grindable.kdevses | 33 + lib/tasks/create_fund.rake | 9 + lib/tasks/create_user.rake | 15 + public/.htaccess | 40 + public/404.html | 8 + public/500.html | 8 + public/dispatch.cgi | 10 + public/dispatch.fcgi | 24 + public/dispatch.rb | 10 + public/favicon.ico | 0 public/images/balance.jpg | Bin 0 -> 1785 bytes public/images/document-open-16.png | Bin 0 -> 537 bytes public/images/document-open-22.png | Bin 0 -> 1001 bytes public/images/document-open-32.png | Bin 0 -> 1437 bytes public/images/document-save-16.png | Bin 0 -> 911 bytes public/images/document-save-22.png | Bin 0 -> 1150 bytes public/images/document-save-32.png | Bin 0 -> 1971 bytes public/images/edit-delete-16.png | Bin 0 -> 680 bytes public/images/edit-delete-22.png | Bin 0 -> 1211 bytes public/images/edit-delete-32.png | Bin 0 -> 2049 bytes public/images/go-home-16.png | Bin 0 -> 606 bytes public/images/go-home-22.png | Bin 0 -> 920 bytes public/images/go-home-32.png | Bin 0 -> 1774 bytes public/images/list-add-16.png | Bin 0 -> 323 bytes public/images/list-add-22.png | Bin 0 -> 386 bytes public/images/list-add-32.png | Bin 0 -> 601 bytes public/images/milk-print.jpg | Bin 0 -> 1846 bytes public/images/rails.png | Bin 0 -> 1787 bytes public/javascripts/controls.js | 750 ++ public/javascripts/dojo/LICENSE | 195 + public/javascripts/dojo/README | 176 + public/javascripts/dojo/Storage_version6.swf | Bin 0 -> 1963 bytes public/javascripts/dojo/Storage_version8.swf | Bin 0 -> 2594 bytes public/javascripts/dojo/apis/alg.html | 12 + public/javascripts/dojo/apis/animation.html | 36 + public/javascripts/dojo/apis/dnd.html | 19 + public/javascripts/dojo/apis/dojo.html | 39 + public/javascripts/dojo/apis/event.html | 41 + public/javascripts/dojo/apis/graphics.html | 47 + public/javascripts/dojo/apis/hostenv.html | 33 + public/javascripts/dojo/apis/io.html | 57 + public/javascripts/dojo/apis/lang.html | 12 + public/javascripts/dojo/apis/log.html | 13 + public/javascripts/dojo/apis/logging.html | 41 + public/javascripts/dojo/apis/math.html | 39 + public/javascripts/dojo/apis/render.html | 48 + public/javascripts/dojo/apis/text.html | 12 + public/javascripts/dojo/apis/uri.html | 4 + public/javascripts/dojo/apis/version.html | 5 + public/javascripts/dojo/apis/widget.html | 52 + public/javascripts/dojo/apis/xml.html | 84 + public/javascripts/dojo/build.txt | 51 + public/javascripts/dojo/dojo.js | 7822 +++++++++++ .../javascripts/dojo/dojo.js.uncompressed.js | 10856 ++++++++++++++++ public/javascripts/dojo/flash6_gateway.swf | Bin 0 -> 1170 bytes public/javascripts/dojo/iframe_history.html | 54 + .../flash/resources/HelloWorld_version6.swf | Bin 0 -> 1411 bytes .../flash/resources/HelloWorld_version8.swf | Bin 0 -> 2075 bytes .../resources/UnitTestsComm_version6.swf | Bin 0 -> 1530 bytes .../resources/UnitTestsComm_version8.swf | Bin 0 -> 2177 bytes .../javascripts/dojo/src/AdapterRegistry.js | 89 + public/javascripts/dojo/src/Deferred.js | 309 + public/javascripts/dojo/src/TreeEditor.js | 65 + public/javascripts/dojo/src/animation.js | 12 + .../dojo/src/animation/Animation.js | 243 + .../dojo/src/animation/AnimationEvent.js | 63 + .../dojo/src/animation/AnimationSequence.js | 160 + .../javascripts/dojo/src/animation/Timer.js | 56 + .../dojo/src/animation/__package__.js | 18 + public/javascripts/dojo/src/behavior.js | 248 + public/javascripts/dojo/src/bootstrap1.js | 461 + public/javascripts/dojo/src/bootstrap2.js | 214 + public/javascripts/dojo/src/browser_debug.js | 176 + .../dojo/src/collections/ArrayList.js | 146 + .../dojo/src/collections/BinaryTree.js | 203 + .../dojo/src/collections/Collections.js | 125 + .../dojo/src/collections/Dictionary.js | 129 + .../javascripts/dojo/src/collections/Graph.js | 153 + .../javascripts/dojo/src/collections/Queue.js | 87 + .../javascripts/dojo/src/collections/Set.js | 94 + .../dojo/src/collections/SkipList.js | 149 + .../dojo/src/collections/SortedList.js | 211 + .../javascripts/dojo/src/collections/Stack.js | 85 + .../dojo/src/collections/__package__.js | 22 + public/javascripts/dojo/src/compat/0.2.2.js | 75 + public/javascripts/dojo/src/crypto.js | 15 + .../javascripts/dojo/src/crypto/Blowfish.js | 566 + public/javascripts/dojo/src/crypto/LICENSE | 11 + public/javascripts/dojo/src/crypto/MD5.js | 193 + .../javascripts/dojo/src/crypto/Rijndael.js | 22 + public/javascripts/dojo/src/crypto/SHA1.js | 154 + public/javascripts/dojo/src/crypto/SHA256.js | 20 + .../dojo/src/crypto/__package__.js | 17 + public/javascripts/dojo/src/data.js | 15 + public/javascripts/dojo/src/data/Attribute.js | 62 + public/javascripts/dojo/src/data/Item.js | 327 + public/javascripts/dojo/src/data/Kind.js | 28 + .../javascripts/dojo/src/data/Observable.js | 59 + public/javascripts/dojo/src/data/ResultSet.js | 70 + .../javascripts/dojo/src/data/SimpleStore.js | 196 + public/javascripts/dojo/src/data/Type.js | 25 + public/javascripts/dojo/src/data/Value.js | 55 + .../javascripts/dojo/src/data/__package__.js | 22 + .../javascripts/dojo/src/data/format/Csv.js | 112 + .../javascripts/dojo/src/data/format/Json.js | 103 + .../dojo/src/data/provider/Base.js | 183 + .../dojo/src/data/provider/Delicious.js | 85 + .../dojo/src/data/provider/FlatFile.js | 153 + .../dojo/src/data/provider/JotSpot.js | 27 + .../dojo/src/data/provider/MySql.js | 27 + public/javascripts/dojo/src/data/to_do.txt | 45 + public/javascripts/dojo/src/date.js | 624 + public/javascripts/dojo/src/debug.js | 80 + public/javascripts/dojo/src/debug/Firebug.js | 19 + .../javascripts/dojo/src/debug/arrow_hide.gif | Bin 0 -> 163 bytes .../javascripts/dojo/src/debug/arrow_show.gif | Bin 0 -> 165 bytes public/javascripts/dojo/src/debug/deep.html | 359 + public/javascripts/dojo/src/debug/spacer.gif | Bin 0 -> 820 bytes .../javascripts/dojo/src/dnd/DragAndDrop.js | 176 + .../dojo/src/dnd/HtmlDragAndDrop.js | 511 + .../dojo/src/dnd/HtmlDragManager.js | 503 + .../javascripts/dojo/src/dnd/HtmlDragMove.js | 68 + public/javascripts/dojo/src/dnd/Sortable.js | 28 + .../dojo/src/dnd/TreeDragAndDrop.js | 478 + .../dojo/src/dnd/TreeDragAndDropV3.js | 385 + .../javascripts/dojo/src/dnd/__package__.js | 16 + public/javascripts/dojo/src/docs.js | 995 ++ public/javascripts/dojo/src/dom.js | 474 + public/javascripts/dojo/src/event.js | 600 + .../javascripts/dojo/src/event/__package__.js | 16 + public/javascripts/dojo/src/event/browser.js | 278 + public/javascripts/dojo/src/event/topic.js | 99 + public/javascripts/dojo/src/experimental.js | 21 + public/javascripts/dojo/src/flash.js | 1210 ++ .../src/flash/flash6/DojoExternalInterface.as | 215 + .../dojo/src/flash/flash6/flash6_gateway.fla | Bin 0 -> 40448 bytes .../src/flash/flash8/DojoExternalInterface.as | 234 + .../dojo/src/flash/flash8/ExpressInstall.as | 81 + .../dojo/src/graphics/Colorspace.js | 944 ++ .../dojo/src/graphics/__package__.js | 15 + public/javascripts/dojo/src/graphics/color.js | 166 + .../dojo/src/graphics/color/hsl.js | 144 + .../dojo/src/graphics/color/hsv.js | 141 + .../javascripts/dojo/src/hostenv_adobesvg.js | 571 + .../javascripts/dojo/src/hostenv_browser.js | 394 + .../javascripts/dojo/src/hostenv_dashboard.js | 197 + public/javascripts/dojo/src/hostenv_jsc.js | 76 + public/javascripts/dojo/src/hostenv_rhino.js | 208 + .../dojo/src/hostenv_spidermonkey.js | 79 + public/javascripts/dojo/src/hostenv_svg.js | 223 + public/javascripts/dojo/src/hostenv_wsh.js | 46 + public/javascripts/dojo/src/html.js | 14 + .../javascripts/dojo/src/html/__package__.js | 15 + public/javascripts/dojo/src/html/color.js | 33 + public/javascripts/dojo/src/html/common.js | 214 + public/javascripts/dojo/src/html/display.js | 192 + public/javascripts/dojo/src/html/iframe.js | 122 + .../dojo/src/html/images/shadowB.png | Bin 0 -> 470 bytes .../dojo/src/html/images/shadowBL.png | Bin 0 -> 272 bytes .../dojo/src/html/images/shadowBR.png | Bin 0 -> 271 bytes .../dojo/src/html/images/shadowL.png | Bin 0 -> 148 bytes .../dojo/src/html/images/shadowR.png | Bin 0 -> 149 bytes .../dojo/src/html/images/shadowT.png | Bin 0 -> 152 bytes .../dojo/src/html/images/shadowTL.png | Bin 0 -> 271 bytes .../dojo/src/html/images/shadowTR..png | Bin 0 -> 348 bytes .../dojo/src/html/images/shadowTR.png | Bin 0 -> 287 bytes public/javascripts/dojo/src/html/layout.js | 446 + public/javascripts/dojo/src/html/selection.js | 302 + public/javascripts/dojo/src/html/shadow.js | 82 + public/javascripts/dojo/src/html/style.js | 477 + public/javascripts/dojo/src/html/util.js | 456 + .../dojo/src/i18n/calendar/GregorianNames.js | 30 + .../src/i18n/calendar/nls/en/gregorian.js | 18 + .../src/i18n/calendar/nls/fi/gregorian.js | 18 + .../dojo/src/i18n/calendar/nls/gregorian.js | 18 + .../src/i18n/calendar/nls/ja/gregorian.js | 18 + .../src/i18n/calendar/nls/nl/gregorian.js | 18 + public/javascripts/dojo/src/i18n/common.js | 55 + public/javascripts/dojo/src/i18n/currency.js | 289 + .../dojo/src/i18n/currency/common.js | 289 + .../dojo/src/i18n/currency/nls/EUR.js | 14 + .../dojo/src/i18n/currency/nls/GBP.js | 14 + .../dojo/src/i18n/currency/nls/INR.js | 14 + .../dojo/src/i18n/currency/nls/ITL.js | 14 + .../dojo/src/i18n/currency/nls/JPY.js | 14 + .../dojo/src/i18n/currency/nls/USD.js | 14 + .../dojo/src/i18n/currency/nls/en-us/USD.js | 13 + .../dojo/src/i18n/currency/nls/en/EUR.js | 13 + .../dojo/src/i18n/currency/nls/en/GBP.js | 13 + .../dojo/src/i18n/currency/nls/en/INR.js | 13 + .../dojo/src/i18n/currency/nls/en/ITL.js | 13 + .../dojo/src/i18n/currency/nls/en/JPY.js | 13 + .../dojo/src/i18n/currency/nls/en/USD.js | 14 + .../dojo/src/i18n/currency/nls/hi/EUR.js | 13 + .../dojo/src/i18n/currency/nls/hi/GBP.js | 13 + .../dojo/src/i18n/currency/nls/hi/INR.js | 14 + .../dojo/src/i18n/currency/nls/hi/ITL.js | 13 + .../dojo/src/i18n/currency/nls/hi/JPY.js | 13 + .../dojo/src/i18n/currency/nls/hi/USD.js | 13 + .../dojo/src/i18n/currency/nls/ja/EUR.js | 13 + .../dojo/src/i18n/currency/nls/ja/GBP.js | 13 + .../dojo/src/i18n/currency/nls/ja/INR.js | 14 + .../dojo/src/i18n/currency/nls/ja/ITL.js | 13 + .../dojo/src/i18n/currency/nls/ja/JPY.js | 14 + .../dojo/src/i18n/currency/nls/ja/USD.js | 13 + public/javascripts/dojo/src/i18n/number.js | 292 + public/javascripts/dojo/src/iCalendar.js | 814 ++ public/javascripts/dojo/src/io.js | 376 + public/javascripts/dojo/src/io/BrowserIO.js | 575 + public/javascripts/dojo/src/io/IframeIO.js | 246 + public/javascripts/dojo/src/io/RepubsubIO.js | 517 + public/javascripts/dojo/src/io/RhinoIO.js | 143 + public/javascripts/dojo/src/io/ScriptSrcIO.js | 452 + .../javascripts/dojo/src/io/XhrIframeProxy.js | 209 + public/javascripts/dojo/src/io/__package__.js | 17 + public/javascripts/dojo/src/io/cometd.js | 905 ++ public/javascripts/dojo/src/io/cookie.js | 108 + .../javascripts/dojo/src/io/xip_client.html | 200 + .../javascripts/dojo/src/io/xip_server.html | 267 + public/javascripts/dojo/src/json.js | 130 + public/javascripts/dojo/src/lang.js | 14 + .../javascripts/dojo/src/lang/__package__.js | 24 + public/javascripts/dojo/src/lang/array.js | 172 + public/javascripts/dojo/src/lang/assert.js | 122 + public/javascripts/dojo/src/lang/common.js | 180 + public/javascripts/dojo/src/lang/declare.js | 157 + public/javascripts/dojo/src/lang/extras.js | 126 + public/javascripts/dojo/src/lang/func.js | 148 + public/javascripts/dojo/src/lang/repr.js | 80 + public/javascripts/dojo/src/lang/type.js | 240 + public/javascripts/dojo/src/lfx/Animation.js | 508 + .../javascripts/dojo/src/lfx/__package__.js | 15 + public/javascripts/dojo/src/lfx/extras.js | 119 + public/javascripts/dojo/src/lfx/html.js | 618 + public/javascripts/dojo/src/lfx/toggle.js | 54 + public/javascripts/dojo/src/loader.js | 482 + public/javascripts/dojo/src/loader_xd.js | 414 + public/javascripts/dojo/src/logging/Logger.js | 407 + .../dojo/src/logging/__package__.js | 15 + public/javascripts/dojo/src/math.js | 134 + .../javascripts/dojo/src/math/__package__.js | 18 + public/javascripts/dojo/src/math/curves.js | 222 + public/javascripts/dojo/src/math/matrix.js | 305 + public/javascripts/dojo/src/math/points.js | 47 + public/javascripts/dojo/src/math/transform.js | 116 + public/javascripts/dojo/src/namespace.js | 78 + .../javascripts/dojo/src/namespaces/dojo.js | 114 + public/javascripts/dojo/src/profile.js | 120 + public/javascripts/dojo/src/regexp.js | 606 + public/javascripts/dojo/src/rpc/Deferred.js | 15 + public/javascripts/dojo/src/rpc/JotService.js | 41 + .../javascripts/dojo/src/rpc/JsonService.js | 105 + public/javascripts/dojo/src/rpc/RpcService.js | 116 + .../javascripts/dojo/src/rpc/YahooService.js | 55 + .../javascripts/dojo/src/rpc/__package__.js | 14 + public/javascripts/dojo/src/rpc/yahoo.smd | 263 + .../dojo/src/selection/Selection.js | 425 + public/javascripts/dojo/src/storage.js | 418 + .../javascripts/dojo/src/storage/Storage.as | 146 + .../dojo/src/storage/__package__.js | 17 + .../javascripts/dojo/src/storage/browser.js | 199 + .../javascripts/dojo/src/storage/dashboard.js | 52 + .../dojo/src/storage/storage_dialog.fla | Bin 0 -> 344064 bytes public/javascripts/dojo/src/string.js | 12 + public/javascripts/dojo/src/string/Builder.js | 116 + .../dojo/src/string/__package__.js | 19 + public/javascripts/dojo/src/string/common.js | 87 + public/javascripts/dojo/src/string/extras.js | 219 + public/javascripts/dojo/src/style.js | 15 + public/javascripts/dojo/src/svg.js | 279 + .../javascripts/dojo/src/text/__package__.js | 17 + .../dojo/src/text/textDirectory.js | 81 + public/javascripts/dojo/src/undo/Manager.js | 200 + .../javascripts/dojo/src/undo/__package__.js | 12 + public/javascripts/dojo/src/undo/browser.js | 279 + public/javascripts/dojo/src/uri/Uri.js | 114 + .../javascripts/dojo/src/uri/__package__.js | 14 + .../dojo/src/uuid/LightweightGenerator.js | 82 + .../dojo/src/uuid/NameBasedGenerator.js | 43 + .../javascripts/dojo/src/uuid/NilGenerator.js | 38 + .../dojo/src/uuid/RandomGenerator.js | 44 + .../dojo/src/uuid/TimeBasedGenerator.js | 391 + public/javascripts/dojo/src/uuid/Uuid.js | 423 + .../javascripts/dojo/src/uuid/__package__.js | 22 + public/javascripts/dojo/src/validate.js | 12 + .../dojo/src/validate/__package__.js | 21 + public/javascripts/dojo/src/validate/check.js | 257 + .../javascripts/dojo/src/validate/common.js | 231 + .../javascripts/dojo/src/validate/datetime.js | 168 + public/javascripts/dojo/src/validate/de.js | 30 + public/javascripts/dojo/src/validate/jp.js | 28 + public/javascripts/dojo/src/validate/us.js | 94 + public/javascripts/dojo/src/validate/web.js | 105 + .../dojo/src/widget/AccordionContainer.js | 70 + .../dojo/src/widget/AccordionPane.js | 94 + .../dojo/src/widget/AnimatedPng.js | 81 + public/javascripts/dojo/src/widget/Button.js | 317 + public/javascripts/dojo/src/widget/Chart.js | 199 + .../javascripts/dojo/src/widget/Checkbox.js | 86 + .../dojo/src/widget/CiviCrmDatePicker.js | 118 + .../dojo/src/widget/ColorPalette.js | 156 + .../javascripts/dojo/src/widget/ComboBox.js | 825 ++ .../dojo/src/widget/ContentPane.js | 550 + .../javascripts/dojo/src/widget/DatePicker.js | 395 + .../dojo/src/widget/DebugConsole.js | 26 + public/javascripts/dojo/src/widget/Dialog.js | 270 + public/javascripts/dojo/src/widget/DocPane.js | 382 + .../javascripts/dojo/src/widget/DomWidget.js | 627 + .../dojo/src/widget/DropdownContainer.js | 72 + .../dojo/src/widget/DropdownDatePicker.js | 65 + public/javascripts/dojo/src/widget/Editor.js | 533 + public/javascripts/dojo/src/widget/Editor2.js | 401 + .../dojo/src/widget/Editor2Toolbar.js | 326 + .../dojo/src/widget/FilteringTable.js | 883 ++ .../dojo/src/widget/FisheyeList.js | 730 ++ .../dojo/src/widget/FloatingPane.js | 341 + .../javascripts/dojo/src/widget/GoogleMap.js | 208 + .../dojo/src/widget/HslColorPicker.js | 139 + .../javascripts/dojo/src/widget/HtmlWidget.js | 164 + .../dojo/src/widget/InlineEditBox.js | 171 + .../dojo/src/widget/LayoutContainer.js | 63 + .../javascripts/dojo/src/widget/LinkPane.js | 41 + public/javascripts/dojo/src/widget/Manager.js | 340 + public/javascripts/dojo/src/widget/Menu2.js | 1057 ++ .../dojo/src/widget/MonthlyCalendar.js | 175 + public/javascripts/dojo/src/widget/Parse.js | 365 + .../dojo/src/widget/RemoteTabController.js | 181 + .../dojo/src/widget/ResizableTextarea.js | 102 + .../dojo/src/widget/ResizeHandle.js | 103 + .../javascripts/dojo/src/widget/RichText.js | 1492 +++ public/javascripts/dojo/src/widget/Rounded.js | 710 + public/javascripts/dojo/src/widget/Select.js | 76 + public/javascripts/dojo/src/widget/Show.js | 241 + .../javascripts/dojo/src/widget/ShowAction.js | 24 + .../javascripts/dojo/src/widget/ShowSlide.js | 201 + .../javascripts/dojo/src/widget/SlideShow.js | 141 + public/javascripts/dojo/src/widget/Slider.js | 874 ++ .../dojo/src/widget/SortableTable.js | 598 + public/javascripts/dojo/src/widget/Spinner.js | 595 + .../dojo/src/widget/SplitContainer.js | 567 + .../javascripts/dojo/src/widget/SvgButton.js | 141 + .../javascripts/dojo/src/widget/SvgWidget.js | 92 + .../javascripts/dojo/src/widget/SwtWidget.js | 64 + .../dojo/src/widget/TabContainer.js | 307 + public/javascripts/dojo/src/widget/TaskBar.js | 79 + .../javascripts/dojo/src/widget/TimePicker.js | 317 + .../javascripts/dojo/src/widget/TitlePane.js | 65 + public/javascripts/dojo/src/widget/Toaster.js | 235 + public/javascripts/dojo/src/widget/Toggler.js | 34 + public/javascripts/dojo/src/widget/Toolbar.js | 903 ++ public/javascripts/dojo/src/widget/Tooltip.js | 131 + public/javascripts/dojo/src/widget/Tree.js | 572 + .../dojo/src/widget/TreeBasicController.js | 294 + .../dojo/src/widget/TreeBasicControllerV3.js | 452 + .../javascripts/dojo/src/widget/TreeCommon.js | 131 + .../dojo/src/widget/TreeContextMenu.js | 214 + .../dojo/src/widget/TreeContextMenuV3.js | 159 + .../src/widget/TreeControllerExtension.js | 95 + .../javascripts/dojo/src/widget/TreeDemo.js | 76 + .../src/widget/TreeDeselectOnDblselect.js | 50 + .../dojo/src/widget/TreeDndControllerV3.js | 149 + .../dojo/src/widget/TreeDocIconExtension.js | 106 + .../dojo/src/widget/TreeEmphaseOnSelect.js | 65 + .../dojo/src/widget/TreeExtension.js | 30 + .../dojo/src/widget/TreeLinkExtension.js | 82 + .../dojo/src/widget/TreeLoadingController.js | 217 + .../src/widget/TreeLoadingControllerV3.js | 416 + .../javascripts/dojo/src/widget/TreeNode.js | 534 + .../javascripts/dojo/src/widget/TreeNodeV3.js | 713 + .../dojo/src/widget/TreeRPCController.js | 171 + .../dojo/src/widget/TreeRpcControllerV3.js | 232 + .../dojo/src/widget/TreeSelector.js | 189 + .../dojo/src/widget/TreeSelectorV3.js | 245 + .../dojo/src/widget/TreeTimeoutIterator.js | 171 + public/javascripts/dojo/src/widget/TreeV3.js | 353 + .../dojo/src/widget/TreeWithNode.js | 230 + public/javascripts/dojo/src/widget/Widget.js | 634 + public/javascripts/dojo/src/widget/Wizard.js | 197 + .../javascripts/dojo/src/widget/YahooMap.js | 169 + .../dojo/src/widget/__package__.js | 24 + .../src/widget/demoEngine/DemoContainer.js | 107 + .../dojo/src/widget/demoEngine/DemoItem.js | 71 + .../src/widget/demoEngine/DemoNavigator.js | 188 + .../dojo/src/widget/demoEngine/DemoPane.js | 44 + .../dojo/src/widget/demoEngine/SourcePane.js | 52 + .../dojo/src/widget/demoEngine/__package__.js | 20 + .../demoEngine/templates/DemoContainer.css | 39 + .../demoEngine/templates/DemoContainer.html | 25 + .../widget/demoEngine/templates/DemoItem.css | 58 + .../widget/demoEngine/templates/DemoItem.html | 21 + .../demoEngine/templates/DemoNavigator.css | 28 + .../demoEngine/templates/DemoNavigator.html | 24 + .../widget/demoEngine/templates/DemoPane.css | 18 + .../widget/demoEngine/templates/DemoPane.html | 3 + .../demoEngine/templates/SourcePane.css | 20 + .../demoEngine/templates/SourcePane.html | 3 + .../widget/demoEngine/templates/general.css | 73 + .../templates/images/test_thumb.gif | Bin 0 -> 3198 bytes .../demoEngine/templates/images/viewDemo.png | Bin 0 -> 859 bytes .../dojo/src/widget/html/layout.js | 119 + .../dojo/src/widget/html/stabile.js | 213 + .../javascripts/dojo/src/widget/svg/Chart.js | 531 + .../dojo/src/widget/templates/DemoEngine.html | 24 + .../src/widget/templates/HslColorPicker.svg | 30 + .../widget/templates/HtmlButtonTemplate.css | 59 + .../widget/templates/HtmlButtonTemplate.html | 6 + .../src/widget/templates/HtmlCheckBox.css | 30 + .../src/widget/templates/HtmlCheckBox.html | 6 + .../templates/HtmlCiviCrmDatePicker.html | 12 + .../src/widget/templates/HtmlComboBox.css | 39 + .../src/widget/templates/HtmlComboBox.html | 26 + .../templates/HtmlComboButtonTemplate.html | 18 + .../templates/HtmlContextMenuTemplate.html | 3 + .../src/widget/templates/HtmlDatePicker.css | 143 + .../src/widget/templates/HtmlDatePicker.html | 141 + .../dojo/src/widget/templates/HtmlDialog.html | 13 + .../dojo/src/widget/templates/HtmlDocPane.css | 49 + .../src/widget/templates/HtmlDocPane.html | 79 + .../templates/HtmlDropDownButtonTemplate.html | 9 + .../widget/templates/HtmlEditorToolbar.css | 138 + .../widget/templates/HtmlEditorToolbar.html | 152 + .../templates/HtmlEditorToolbarOneline.html | 274 + .../src/widget/templates/HtmlFisheyeList.css | 27 + .../src/widget/templates/HtmlFloatingPane.css | 118 + .../widget/templates/HtmlFloatingPane.html | 18 + .../widget/templates/HtmlInlineEditBox.css | 24 + .../widget/templates/HtmlInlineEditBox.html | 6 + .../dojo/src/widget/templates/HtmlMenu2.css | 179 + .../templates/HtmlMenuItemTemplate.html | 2 + .../widget/templates/HtmlMonthlyCalendar.css | 91 + .../widget/templates/HtmlMonthlyCalendar.html | 110 + .../templates/HtmlResizableTextarea.css | 15 + .../templates/HtmlResizableTextarea.html | 14 + .../src/widget/templates/HtmlResizeHandle.css | 12 + .../dojo/src/widget/templates/HtmlShow.css | 59 + .../dojo/src/widget/templates/HtmlShow.html | 11 + .../src/widget/templates/HtmlShowSlide.css | 12 + .../src/widget/templates/HtmlShowSlide.html | 6 + .../templates/HtmlSimpleDropdownButtons.css | 100 + .../src/widget/templates/HtmlSlideShow.css | 9 + .../src/widget/templates/HtmlSlideShow.html | 15 + .../dojo/src/widget/templates/HtmlSlider.css | 61 + .../dojo/src/widget/templates/HtmlSlider.html | 54 + .../templates/HtmlSliderHorizontal.html | 3 + .../widget/templates/HtmlSliderVertical.html | 3 + .../dojo/src/widget/templates/HtmlSpinner.css | 34 + .../src/widget/templates/HtmlSpinner.html | 24 + .../widget/templates/HtmlSplitContainer.css | 39 + .../src/widget/templates/HtmlTabContainer.css | 181 + .../widget/templates/HtmlTabContainer.html | 4 + .../dojo/src/widget/templates/HtmlTaskBar.css | 29 + .../templates/HtmlTaskBarItemTemplate.html | 2 + .../src/widget/templates/HtmlTimePicker.css | 179 + .../src/widget/templates/HtmlTimePicker.html | 98 + .../dojo/src/widget/templates/HtmlToaster.css | 42 + .../dojo/src/widget/templates/HtmlToolbar.css | 54 + .../widget/templates/HtmlTooltipTemplate.css | 10 + .../dojo/src/widget/templates/Menu.css | 60 + .../dojo/src/widget/templates/PopUpButton.css | 35 + .../src/widget/templates/RemoteTabControl.css | 61 + .../dojo/src/widget/templates/Textbox.html | 5 + .../dojo/src/widget/templates/TitlePane.html | 4 + .../dojo/src/widget/templates/Tree.css | 29 + .../dojo/src/widget/templates/TreeDocIcon.css | 63 + .../dojo/src/widget/templates/TreeV3.css | 79 + .../widget/templates/ValidationTextbox.html | 8 + .../dojo/src/widget/templates/Wizard.css | 72 + .../dojo/src/widget/templates/Wizard.html | 11 + .../widget/templates/buttons/aggregate.gif | Bin 0 -> 4360 bytes .../widget/templates/buttons/backcolor.gif | Bin 0 -> 585 bytes .../src/widget/templates/buttons/bg-fade.png | Bin 0 -> 177 bytes .../src/widget/templates/buttons/bold.gif | Bin 0 -> 346 bytes .../src/widget/templates/buttons/cancel.gif | Bin 0 -> 375 bytes .../src/widget/templates/buttons/copy.gif | Bin 0 -> 210 bytes .../widget/templates/buttons/createlink.gif | Bin 0 -> 1081 bytes .../dojo/src/widget/templates/buttons/cut.gif | Bin 0 -> 112 bytes .../src/widget/templates/buttons/delete.gif | Bin 0 -> 81 bytes .../widget/templates/buttons/forecolor.gif | Bin 0 -> 574 bytes .../widget/templates/buttons/hilitecolor.gif | Bin 0 -> 585 bytes .../src/widget/templates/buttons/indent.gif | Bin 0 -> 83 bytes .../buttons/inserthorizontalrule.gif | Bin 0 -> 117 bytes .../widget/templates/buttons/insertimage.gif | Bin 0 -> 595 bytes .../templates/buttons/insertorderedlist.gif | Bin 0 -> 85 bytes .../widget/templates/buttons/inserttable.gif | Bin 0 -> 233 bytes .../templates/buttons/insertunorderedlist.gif | Bin 0 -> 98 bytes .../src/widget/templates/buttons/italic.gif | Bin 0 -> 309 bytes .../templates/buttons/justifycenter.gif | Bin 0 -> 132 bytes .../widget/templates/buttons/justifyfull.gif | Bin 0 -> 294 bytes .../widget/templates/buttons/justifyleft.gif | Bin 0 -> 194 bytes .../widget/templates/buttons/justifyright.gif | Bin 0 -> 190 bytes .../templates/buttons/left_to_right.gif | Bin 0 -> 138 bytes .../templates/buttons/list_bullet_indent.gif | Bin 0 -> 98 bytes .../templates/buttons/list_bullet_outdent.gif | Bin 0 -> 99 bytes .../templates/buttons/list_num_indent.gif | Bin 0 -> 85 bytes .../templates/buttons/list_num_outdent.gif | Bin 0 -> 85 bytes .../src/widget/templates/buttons/outdent.gif | Bin 0 -> 84 bytes .../src/widget/templates/buttons/paste.gif | Bin 0 -> 241 bytes .../src/widget/templates/buttons/redo.gif | Bin 0 -> 543 bytes .../widget/templates/buttons/removeformat.gif | Bin 0 -> 101 bytes .../templates/buttons/right_to_left.gif | Bin 0 -> 142 bytes .../src/widget/templates/buttons/save.gif | Bin 0 -> 243 bytes .../dojo/src/widget/templates/buttons/sep.gif | Bin 0 -> 58 bytes .../src/widget/templates/buttons/space.gif | Bin 0 -> 43 bytes .../templates/buttons/strikethrough.gif | Bin 0 -> 329 bytes .../widget/templates/buttons/subscript.gif | Bin 0 -> 76 bytes .../widget/templates/buttons/superscript.gif | Bin 0 -> 77 bytes .../widget/templates/buttons/underline.gif | Bin 0 -> 344 bytes .../src/widget/templates/buttons/undo.gif | Bin 0 -> 541 bytes .../src/widget/templates/buttons/wikiword.gif | Bin 0 -> 386 bytes .../dojo/src/widget/templates/check.gif | Bin 0 -> 2154 bytes .../src/widget/templates/decrementMonth.gif | Bin 0 -> 166 bytes .../src/widget/templates/decrementWeek.gif | Bin 0 -> 160 bytes .../dojo/src/widget/templates/grabCorner.gif | Bin 0 -> 77 bytes .../src/widget/templates/images/Tree/Tree.css | 36 + .../widget/templates/images/Tree/blank.gif | Bin 0 -> 55 bytes .../widget/templates/images/Tree/closed.gif | Bin 0 -> 1078 bytes .../widget/templates/images/Tree/document.gif | Bin 0 -> 240 bytes .../widget/templates/images/Tree/minus.gif | Bin 0 -> 545 bytes .../src/widget/templates/images/Tree/plus.gif | Bin 0 -> 539 bytes .../templates/images/Tree/transparent.gif | Bin 0 -> 870 bytes .../templates/images/Tree/treenode_blank.gif | Bin 0 -> 834 bytes .../templates/images/Tree/treenode_child.gif | Bin 0 -> 73 bytes .../images/Tree/treenode_expand_minus.gif | Bin 0 -> 547 bytes .../images/Tree/treenode_expand_plus.gif | Bin 0 -> 542 bytes .../templates/images/Tree/treenode_grid_c.gif | Bin 0 -> 60 bytes .../templates/images/Tree/treenode_grid_l.gif | Bin 0 -> 68 bytes .../templates/images/Tree/treenode_grid_p.gif | Bin 0 -> 63 bytes .../templates/images/Tree/treenode_grid_t.gif | Bin 0 -> 74 bytes .../templates/images/Tree/treenode_grid_v.gif | Bin 0 -> 71 bytes .../templates/images/Tree/treenode_grid_x.gif | Bin 0 -> 60 bytes .../templates/images/Tree/treenode_grid_y.gif | Bin 0 -> 67 bytes .../templates/images/Tree/treenode_grid_z.gif | Bin 0 -> 60 bytes .../images/Tree/treenode_loading.gif | Bin 0 -> 1089 bytes .../images/Tree/treenode_loading.jpg | Bin 0 -> 1390 bytes .../widget/templates/images/TreeV3/closed.gif | Bin 0 -> 162 bytes .../templates/images/TreeV3/document.gif | Bin 0 -> 220 bytes .../templates/images/TreeV3/expand_leaf.gif | Bin 0 -> 49 bytes .../images/TreeV3/expand_loading.gif | Bin 0 -> 1089 bytes .../templates/images/TreeV3/expand_minus.gif | Bin 0 -> 539 bytes .../templates/images/TreeV3/expand_plus.gif | Bin 0 -> 539 bytes .../src/widget/templates/images/TreeV3/i.gif | Bin 0 -> 71 bytes .../templates/images/TreeV3/i_bhalf.gif | Bin 0 -> 60 bytes .../widget/templates/images/TreeV3/i_half.gif | Bin 0 -> 65 bytes .../widget/templates/images/TreeV3/i_long.gif | Bin 0 -> 2107 bytes .../src/widget/templates/images/TreeV3/l.gif | Bin 0 -> 58 bytes .../widget/templates/images/TreeV3/minus.gif | Bin 0 -> 512 bytes .../widget/templates/images/TreeV3/open.gif | Bin 0 -> 139 bytes .../widget/templates/images/TreeV3/plus.gif | Bin 0 -> 512 bytes .../src/widget/templates/images/TreeV3/t.gif | Bin 0 -> 67 bytes .../src/widget/templates/images/TreeV3/x.gif | Bin 0 -> 49 bytes .../widget/templates/images/bdYearBg.1.gif | 0 .../src/widget/templates/images/bdYearBg.gif | Bin 0 -> 74 bytes .../src/widget/templates/images/blank.gif | Bin 0 -> 43 bytes .../templates/images/combo_box_arrow.png | Bin 0 -> 336 bytes .../src/widget/templates/images/dateIcon.gif | Bin 0 -> 392 bytes .../templates/images/decrementMonth.gif | Bin 0 -> 167 bytes .../templates/images/decrementMonth.png | Bin 0 -> 194 bytes .../dojo/src/widget/templates/images/dpBg.gif | Bin 0 -> 522 bytes .../src/widget/templates/images/dpCurveBL.png | Bin 0 -> 280 bytes .../src/widget/templates/images/dpCurveBR.png | Bin 0 -> 275 bytes .../src/widget/templates/images/dpCurveTL.png | Bin 0 -> 305 bytes .../src/widget/templates/images/dpCurveTR.png | Bin 0 -> 295 bytes .../widget/templates/images/dpHorizLine.gif | Bin 0 -> 43 bytes .../templates/images/dpHorizLineFoot.gif | Bin 0 -> 43 bytes .../src/widget/templates/images/dpMonthBg.gif | Bin 0 -> 107 bytes .../src/widget/templates/images/dpMonthBg.png | Bin 0 -> 169 bytes .../widget/templates/images/dpMonthBg2.png | Bin 0 -> 169 bytes .../widget/templates/images/dpVertLine.gif | Bin 0 -> 43 bytes .../src/widget/templates/images/dpYearBg.gif | Bin 0 -> 74 bytes .../src/widget/templates/images/dpYearBg.png | Bin 0 -> 142 bytes .../images/dropdownButtonsArrow-disabled.gif | Bin 0 -> 816 bytes .../templates/images/dropdownButtonsArrow.gif | Bin 0 -> 46 bytes .../templates/images/floatingPaneClose.gif | Bin 0 -> 752 bytes .../templates/images/floatingPaneMaximize.gif | Bin 0 -> 704 bytes .../templates/images/floatingPaneMinimize.gif | Bin 0 -> 692 bytes .../templates/images/floatingPaneRestore.gif | Bin 0 -> 701 bytes .../dojo/src/widget/templates/images/hue.png | Bin 0 -> 590 bytes .../templates/images/incrementMonth.gif | Bin 0 -> 168 bytes .../templates/images/incrementMonth.png | Bin 0 -> 205 bytes .../dojo/src/widget/templates/images/no.gif | Bin 0 -> 179 bytes .../dojo/src/widget/templates/images/no.svg | 11 + .../widget/templates/images/scBackground.gif | Bin 0 -> 715 bytes .../images/slider-bg-progress-vert.gif | Bin 0 -> 1899 bytes .../templates/images/slider-bg-vert.gif | Bin 0 -> 1899 bytes .../src/widget/templates/images/slider-bg.gif | Bin 0 -> 1102 bytes .../templates/images/slider-button-horz.png | Bin 0 -> 439 bytes .../templates/images/slider-button-vert.png | Bin 0 -> 432 bytes .../widget/templates/images/slider-button.png | Bin 0 -> 381 bytes .../src/widget/templates/images/slider.gif | Bin 0 -> 865 bytes .../templates/images/slider_down_arrow.png | Bin 0 -> 382 bytes .../templates/images/slider_left_arrow.png | Bin 0 -> 343 bytes .../templates/images/slider_right_arrow.png | Bin 0 -> 366 bytes .../templates/images/slider_up_arrow.png | Bin 0 -> 378 bytes .../widget/templates/images/soriaActive-c.gif | Bin 0 -> 1694 bytes .../widget/templates/images/soriaActive-l.gif | Bin 0 -> 2892 bytes .../widget/templates/images/soriaActive-r.gif | Bin 0 -> 2849 bytes .../widget/templates/images/soriaBarBg.gif | Bin 0 -> 155 bytes .../widget/templates/images/soriaButton-c.gif | Bin 0 -> 1662 bytes .../widget/templates/images/soriaButton-l.gif | Bin 0 -> 2716 bytes .../widget/templates/images/soriaButton-r.gif | Bin 0 -> 2683 bytes .../templates/images/soriaDisabled-c.gif | Bin 0 -> 625 bytes .../templates/images/soriaDisabled-l.gif | Bin 0 -> 1206 bytes .../templates/images/soriaDisabled-r.gif | Bin 0 -> 1105 bytes .../widget/templates/images/soriaMenuBg.gif | Bin 0 -> 155 bytes .../templates/images/soriaPressed-c.gif | Bin 0 -> 1397 bytes .../templates/images/soriaPressed-l.gif | Bin 0 -> 2624 bytes .../templates/images/soriaPressed-r.gif | Bin 0 -> 2631 bytes .../templates/images/spinnerDecrement.gif | Bin 0 -> 120 bytes .../templates/images/spinnerIncrement.gif | Bin 0 -> 119 bytes .../widget/templates/images/submenu_off.gif | Bin 0 -> 161 bytes .../widget/templates/images/submenu_on.gif | Bin 0 -> 106 bytes .../widget/templates/images/tab_bot_left.gif | Bin 0 -> 296 bytes .../templates/images/tab_bot_left_curr.gif | Bin 0 -> 429 bytes .../widget/templates/images/tab_bot_right.gif | Bin 0 -> 974 bytes .../templates/images/tab_bot_right_curr.gif | Bin 0 -> 1310 bytes .../src/widget/templates/images/tab_close.gif | Bin 0 -> 312 bytes .../widget/templates/images/tab_close_h.gif | Bin 0 -> 313 bytes .../src/widget/templates/images/tab_left.gif | Bin 0 -> 635 bytes .../widget/templates/images/tab_left_r.gif | Bin 0 -> 296 bytes .../templates/images/tab_left_r_curr.gif | Bin 0 -> 429 bytes .../src/widget/templates/images/tab_right.gif | Bin 0 -> 2386 bytes .../widget/templates/images/tab_right_r.gif | Bin 0 -> 974 bytes .../templates/images/tab_right_r_curr.gif | Bin 0 -> 1310 bytes .../widget/templates/images/tab_top_left.gif | Bin 0 -> 2384 bytes .../widget/templates/images/tab_top_right.gif | Bin 0 -> 2386 bytes .../widget/templates/images/toolbar-bg.gif | Bin 0 -> 180 bytes .../widget/templates/images/transparent.gif | Bin 0 -> 870 bytes .../templates/images/treenode_blank.gif | Bin 0 -> 834 bytes .../templates/images/treenode_child.gif | Bin 0 -> 73 bytes .../images/treenode_expand_minus.gif | Bin 0 -> 547 bytes .../templates/images/treenode_expand_plus.gif | Bin 0 -> 542 bytes .../templates/images/treenode_grid_c.gif | Bin 0 -> 60 bytes .../templates/images/treenode_grid_l.gif | Bin 0 -> 68 bytes .../templates/images/treenode_grid_p.gif | Bin 0 -> 63 bytes .../templates/images/treenode_grid_t.gif | Bin 0 -> 74 bytes .../templates/images/treenode_grid_v.gif | Bin 0 -> 71 bytes .../templates/images/treenode_grid_x.gif | Bin 0 -> 60 bytes .../templates/images/treenode_grid_y.gif | Bin 0 -> 67 bytes .../templates/images/treenode_grid_z.gif | Bin 0 -> 60 bytes .../widget/templates/images/treenode_node.gif | Bin 0 -> 195 bytes .../widget/templates/images/verticalbar.gif | Bin 0 -> 158 bytes .../templates/images/whiteDownArrow.gif | Bin 0 -> 46 bytes .../src/widget/templates/incrementMonth.gif | Bin 0 -> 168 bytes .../src/widget/templates/incrementWeek.gif | Bin 0 -> 159 bytes .../src/widget/templates/richtextframe.html | 21 + .../javascripts/dojo/src/widget/validate.js | 729 ++ .../javascripts/dojo/src/widget/vml/Chart.js | 426 + public/javascripts/dojo/src/xml/Parse.js | 215 + .../javascripts/dojo/src/xml/__package__.js | 18 + public/javascripts/dojo/src/xml/svgUtil.js | 32 + public/javascripts/dojo/storage_dialog.swf | Bin 0 -> 26921 bytes public/javascripts/dragdrop.js | 584 + public/javascripts/effects.js | 854 ++ public/javascripts/prototype.js | 1785 +++ public/robots.txt | 1 + public/stylesheets/grindable.css | 122 + script/about | 3 + script/breakpointer | 3 + script/console | 3 + script/destroy | 3 + script/generate | 3 + script/performance/benchmarker | 3 + script/performance/profiler | 3 + script/plugin | 3 + script/process/reaper | 3 + script/process/spawner | 3 + script/process/spinner | 3 + script/runner | 3 + script/server | 22 + test/fixtures/baristas.yml | 5 + test/fixtures/funds.yml | 5 + test/fixtures/ledgers.yml | 5 + test/functional/activity_controller_test.rb | 18 + test/functional/barista_controller_test.rb | 18 + test/functional/cafe_controller_test.rb | 18 + test/functional/fund_controller_test.rb | 18 + test/test_helper.rb | 28 + test/unit/barista_test.rb | 10 + test/unit/fund_test.rb | 10 + test/unit/ledger_test.rb | 10 + 721 files changed, 94113 insertions(+) create mode 100644 README create mode 100644 Rakefile create mode 100644 app/controllers/activity_controller.rb create mode 100644 app/controllers/application.rb create mode 100644 app/controllers/barista_controller.rb create mode 100644 app/controllers/cafe_controller.rb create mode 100644 app/controllers/fund_controller.rb create mode 100644 app/helpers/activity_helper.rb create mode 100755 app/helpers/application_helper.rb create mode 100644 app/helpers/barista_helper.rb create mode 100644 app/helpers/cafe_helper.rb create mode 100644 app/helpers/fund_helper.rb create mode 100644 app/models/barista.rb create mode 100644 app/models/fund.rb create mode 100644 app/models/ledger.rb create mode 100644 app/views/activity/_purchase.rhtml create mode 100644 app/views/activity/index.rhtml create mode 100644 app/views/barista/_barista.rhtml create mode 100644 app/views/barista/identify.rhtml create mode 100644 app/views/barista/index.rhtml create mode 100644 app/views/cafe/index.rhtml create mode 100644 app/views/fund/_fund_line.rhtml create mode 100644 app/views/fund/index.rhtml create mode 100644 app/views/layouts/grindable.rhtml create mode 100644 app/views/shared/_menu.rhtml create mode 100644 config/boot.rb create mode 100644 config/database.yml.template create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/routes.rb create mode 100644 db/migrate/001_base_schema.rb create mode 100644 db/migrate/002_add_find_to_barista.rb create mode 100644 db/migrate/003_add_ledger_comment.rb create mode 100644 db/migrate/004_add_ledger_fund_relationship.rb create mode 100644 db/migrate/005_add_barista_create_date.rb create mode 100644 db/migrate/006_ledger_post_date.rb create mode 100644 db/schema.rb create mode 100644 doc/README_FOR_APP create mode 100644 grindable.kdevelop create mode 100644 grindable.kdevses create mode 100644 lib/tasks/create_fund.rake create mode 100644 lib/tasks/create_user.rake create mode 100644 public/.htaccess create mode 100644 public/404.html create mode 100644 public/500.html create mode 100755 public/dispatch.cgi create mode 100755 public/dispatch.fcgi create mode 100755 public/dispatch.rb create mode 100644 public/favicon.ico create mode 100644 public/images/balance.jpg create mode 100644 public/images/document-open-16.png create mode 100644 public/images/document-open-22.png create mode 100644 public/images/document-open-32.png create mode 100644 public/images/document-save-16.png create mode 100644 public/images/document-save-22.png create mode 100644 public/images/document-save-32.png create mode 100644 public/images/edit-delete-16.png create mode 100644 public/images/edit-delete-22.png create mode 100644 public/images/edit-delete-32.png create mode 100644 public/images/go-home-16.png create mode 100644 public/images/go-home-22.png create mode 100644 public/images/go-home-32.png create mode 100644 public/images/list-add-16.png create mode 100644 public/images/list-add-22.png create mode 100644 public/images/list-add-32.png create mode 100644 public/images/milk-print.jpg create mode 100644 public/images/rails.png create mode 100644 public/javascripts/controls.js create mode 100644 public/javascripts/dojo/LICENSE create mode 100644 public/javascripts/dojo/README create mode 100644 public/javascripts/dojo/Storage_version6.swf create mode 100644 public/javascripts/dojo/Storage_version8.swf create mode 100644 public/javascripts/dojo/apis/alg.html create mode 100644 public/javascripts/dojo/apis/animation.html create mode 100644 public/javascripts/dojo/apis/dnd.html create mode 100644 public/javascripts/dojo/apis/dojo.html create mode 100644 public/javascripts/dojo/apis/event.html create mode 100644 public/javascripts/dojo/apis/graphics.html create mode 100644 public/javascripts/dojo/apis/hostenv.html create mode 100644 public/javascripts/dojo/apis/io.html create mode 100644 public/javascripts/dojo/apis/lang.html create mode 100644 public/javascripts/dojo/apis/log.html create mode 100644 public/javascripts/dojo/apis/logging.html create mode 100644 public/javascripts/dojo/apis/math.html create mode 100644 public/javascripts/dojo/apis/render.html create mode 100644 public/javascripts/dojo/apis/text.html create mode 100644 public/javascripts/dojo/apis/uri.html create mode 100644 public/javascripts/dojo/apis/version.html create mode 100644 public/javascripts/dojo/apis/widget.html create mode 100644 public/javascripts/dojo/apis/xml.html create mode 100644 public/javascripts/dojo/build.txt create mode 100644 public/javascripts/dojo/dojo.js create mode 100644 public/javascripts/dojo/dojo.js.uncompressed.js create mode 100644 public/javascripts/dojo/flash6_gateway.swf create mode 100644 public/javascripts/dojo/iframe_history.html create mode 100644 public/javascripts/dojo/release/dojo/tests/flash/resources/HelloWorld_version6.swf create mode 100644 public/javascripts/dojo/release/dojo/tests/flash/resources/HelloWorld_version8.swf create mode 100644 public/javascripts/dojo/release/dojo/tests/flash/resources/UnitTestsComm_version6.swf create mode 100644 public/javascripts/dojo/release/dojo/tests/flash/resources/UnitTestsComm_version8.swf create mode 100644 public/javascripts/dojo/src/AdapterRegistry.js create mode 100644 public/javascripts/dojo/src/Deferred.js create mode 100644 public/javascripts/dojo/src/TreeEditor.js create mode 100644 public/javascripts/dojo/src/animation.js create mode 100644 public/javascripts/dojo/src/animation/Animation.js create mode 100644 public/javascripts/dojo/src/animation/AnimationEvent.js create mode 100644 public/javascripts/dojo/src/animation/AnimationSequence.js create mode 100644 public/javascripts/dojo/src/animation/Timer.js create mode 100644 public/javascripts/dojo/src/animation/__package__.js create mode 100644 public/javascripts/dojo/src/behavior.js create mode 100644 public/javascripts/dojo/src/bootstrap1.js create mode 100644 public/javascripts/dojo/src/bootstrap2.js create mode 100644 public/javascripts/dojo/src/browser_debug.js create mode 100644 public/javascripts/dojo/src/collections/ArrayList.js create mode 100644 public/javascripts/dojo/src/collections/BinaryTree.js create mode 100644 public/javascripts/dojo/src/collections/Collections.js create mode 100644 public/javascripts/dojo/src/collections/Dictionary.js create mode 100644 public/javascripts/dojo/src/collections/Graph.js create mode 100644 public/javascripts/dojo/src/collections/Queue.js create mode 100644 public/javascripts/dojo/src/collections/Set.js create mode 100644 public/javascripts/dojo/src/collections/SkipList.js create mode 100644 public/javascripts/dojo/src/collections/SortedList.js create mode 100644 public/javascripts/dojo/src/collections/Stack.js create mode 100644 public/javascripts/dojo/src/collections/__package__.js create mode 100644 public/javascripts/dojo/src/compat/0.2.2.js create mode 100644 public/javascripts/dojo/src/crypto.js create mode 100644 public/javascripts/dojo/src/crypto/Blowfish.js create mode 100644 public/javascripts/dojo/src/crypto/LICENSE create mode 100644 public/javascripts/dojo/src/crypto/MD5.js create mode 100644 public/javascripts/dojo/src/crypto/Rijndael.js create mode 100644 public/javascripts/dojo/src/crypto/SHA1.js create mode 100644 public/javascripts/dojo/src/crypto/SHA256.js create mode 100644 public/javascripts/dojo/src/crypto/__package__.js create mode 100644 public/javascripts/dojo/src/data.js create mode 100644 public/javascripts/dojo/src/data/Attribute.js create mode 100644 public/javascripts/dojo/src/data/Item.js create mode 100644 public/javascripts/dojo/src/data/Kind.js create mode 100644 public/javascripts/dojo/src/data/Observable.js create mode 100644 public/javascripts/dojo/src/data/ResultSet.js create mode 100644 public/javascripts/dojo/src/data/SimpleStore.js create mode 100644 public/javascripts/dojo/src/data/Type.js create mode 100644 public/javascripts/dojo/src/data/Value.js create mode 100644 public/javascripts/dojo/src/data/__package__.js create mode 100644 public/javascripts/dojo/src/data/format/Csv.js create mode 100644 public/javascripts/dojo/src/data/format/Json.js create mode 100644 public/javascripts/dojo/src/data/provider/Base.js create mode 100644 public/javascripts/dojo/src/data/provider/Delicious.js create mode 100644 public/javascripts/dojo/src/data/provider/FlatFile.js create mode 100644 public/javascripts/dojo/src/data/provider/JotSpot.js create mode 100644 public/javascripts/dojo/src/data/provider/MySql.js create mode 100644 public/javascripts/dojo/src/data/to_do.txt create mode 100644 public/javascripts/dojo/src/date.js create mode 100644 public/javascripts/dojo/src/debug.js create mode 100644 public/javascripts/dojo/src/debug/Firebug.js create mode 100644 public/javascripts/dojo/src/debug/arrow_hide.gif create mode 100644 public/javascripts/dojo/src/debug/arrow_show.gif create mode 100644 public/javascripts/dojo/src/debug/deep.html create mode 100644 public/javascripts/dojo/src/debug/spacer.gif create mode 100644 public/javascripts/dojo/src/dnd/DragAndDrop.js create mode 100644 public/javascripts/dojo/src/dnd/HtmlDragAndDrop.js create mode 100644 public/javascripts/dojo/src/dnd/HtmlDragManager.js create mode 100644 public/javascripts/dojo/src/dnd/HtmlDragMove.js create mode 100644 public/javascripts/dojo/src/dnd/Sortable.js create mode 100644 public/javascripts/dojo/src/dnd/TreeDragAndDrop.js create mode 100644 public/javascripts/dojo/src/dnd/TreeDragAndDropV3.js create mode 100644 public/javascripts/dojo/src/dnd/__package__.js create mode 100644 public/javascripts/dojo/src/docs.js create mode 100644 public/javascripts/dojo/src/dom.js create mode 100644 public/javascripts/dojo/src/event.js create mode 100644 public/javascripts/dojo/src/event/__package__.js create mode 100644 public/javascripts/dojo/src/event/browser.js create mode 100644 public/javascripts/dojo/src/event/topic.js create mode 100644 public/javascripts/dojo/src/experimental.js create mode 100644 public/javascripts/dojo/src/flash.js create mode 100644 public/javascripts/dojo/src/flash/flash6/DojoExternalInterface.as create mode 100644 public/javascripts/dojo/src/flash/flash6/flash6_gateway.fla create mode 100644 public/javascripts/dojo/src/flash/flash8/DojoExternalInterface.as create mode 100644 public/javascripts/dojo/src/flash/flash8/ExpressInstall.as create mode 100644 public/javascripts/dojo/src/graphics/Colorspace.js create mode 100644 public/javascripts/dojo/src/graphics/__package__.js create mode 100644 public/javascripts/dojo/src/graphics/color.js create mode 100644 public/javascripts/dojo/src/graphics/color/hsl.js create mode 100644 public/javascripts/dojo/src/graphics/color/hsv.js create mode 100644 public/javascripts/dojo/src/hostenv_adobesvg.js create mode 100644 public/javascripts/dojo/src/hostenv_browser.js create mode 100644 public/javascripts/dojo/src/hostenv_dashboard.js create mode 100644 public/javascripts/dojo/src/hostenv_jsc.js create mode 100644 public/javascripts/dojo/src/hostenv_rhino.js create mode 100644 public/javascripts/dojo/src/hostenv_spidermonkey.js create mode 100644 public/javascripts/dojo/src/hostenv_svg.js create mode 100644 public/javascripts/dojo/src/hostenv_wsh.js create mode 100644 public/javascripts/dojo/src/html.js create mode 100644 public/javascripts/dojo/src/html/__package__.js create mode 100644 public/javascripts/dojo/src/html/color.js create mode 100644 public/javascripts/dojo/src/html/common.js create mode 100644 public/javascripts/dojo/src/html/display.js create mode 100644 public/javascripts/dojo/src/html/iframe.js create mode 100644 public/javascripts/dojo/src/html/images/shadowB.png create mode 100644 public/javascripts/dojo/src/html/images/shadowBL.png create mode 100644 public/javascripts/dojo/src/html/images/shadowBR.png create mode 100644 public/javascripts/dojo/src/html/images/shadowL.png create mode 100644 public/javascripts/dojo/src/html/images/shadowR.png create mode 100644 public/javascripts/dojo/src/html/images/shadowT.png create mode 100644 public/javascripts/dojo/src/html/images/shadowTL.png create mode 100644 public/javascripts/dojo/src/html/images/shadowTR..png create mode 100644 public/javascripts/dojo/src/html/images/shadowTR.png create mode 100644 public/javascripts/dojo/src/html/layout.js create mode 100644 public/javascripts/dojo/src/html/selection.js create mode 100644 public/javascripts/dojo/src/html/shadow.js create mode 100644 public/javascripts/dojo/src/html/style.js create mode 100644 public/javascripts/dojo/src/html/util.js create mode 100644 public/javascripts/dojo/src/i18n/calendar/GregorianNames.js create mode 100644 public/javascripts/dojo/src/i18n/calendar/nls/en/gregorian.js create mode 100644 public/javascripts/dojo/src/i18n/calendar/nls/fi/gregorian.js create mode 100644 public/javascripts/dojo/src/i18n/calendar/nls/gregorian.js create mode 100644 public/javascripts/dojo/src/i18n/calendar/nls/ja/gregorian.js create mode 100644 public/javascripts/dojo/src/i18n/calendar/nls/nl/gregorian.js create mode 100644 public/javascripts/dojo/src/i18n/common.js create mode 100644 public/javascripts/dojo/src/i18n/currency.js create mode 100644 public/javascripts/dojo/src/i18n/currency/common.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/EUR.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/GBP.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/INR.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/ITL.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/JPY.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/USD.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/en-us/USD.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/en/EUR.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/en/GBP.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/en/INR.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/en/ITL.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/en/JPY.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/en/USD.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/hi/EUR.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/hi/GBP.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/hi/INR.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/hi/ITL.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/hi/JPY.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/hi/USD.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/ja/EUR.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/ja/GBP.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/ja/INR.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/ja/ITL.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/ja/JPY.js create mode 100644 public/javascripts/dojo/src/i18n/currency/nls/ja/USD.js create mode 100644 public/javascripts/dojo/src/i18n/number.js create mode 100644 public/javascripts/dojo/src/iCalendar.js create mode 100644 public/javascripts/dojo/src/io.js create mode 100644 public/javascripts/dojo/src/io/BrowserIO.js create mode 100644 public/javascripts/dojo/src/io/IframeIO.js create mode 100644 public/javascripts/dojo/src/io/RepubsubIO.js create mode 100644 public/javascripts/dojo/src/io/RhinoIO.js create mode 100644 public/javascripts/dojo/src/io/ScriptSrcIO.js create mode 100644 public/javascripts/dojo/src/io/XhrIframeProxy.js create mode 100644 public/javascripts/dojo/src/io/__package__.js create mode 100644 public/javascripts/dojo/src/io/cometd.js create mode 100644 public/javascripts/dojo/src/io/cookie.js create mode 100644 public/javascripts/dojo/src/io/xip_client.html create mode 100644 public/javascripts/dojo/src/io/xip_server.html create mode 100644 public/javascripts/dojo/src/json.js create mode 100644 public/javascripts/dojo/src/lang.js create mode 100644 public/javascripts/dojo/src/lang/__package__.js create mode 100644 public/javascripts/dojo/src/lang/array.js create mode 100644 public/javascripts/dojo/src/lang/assert.js create mode 100644 public/javascripts/dojo/src/lang/common.js create mode 100644 public/javascripts/dojo/src/lang/declare.js create mode 100644 public/javascripts/dojo/src/lang/extras.js create mode 100644 public/javascripts/dojo/src/lang/func.js create mode 100644 public/javascripts/dojo/src/lang/repr.js create mode 100644 public/javascripts/dojo/src/lang/type.js create mode 100644 public/javascripts/dojo/src/lfx/Animation.js create mode 100644 public/javascripts/dojo/src/lfx/__package__.js create mode 100644 public/javascripts/dojo/src/lfx/extras.js create mode 100644 public/javascripts/dojo/src/lfx/html.js create mode 100644 public/javascripts/dojo/src/lfx/toggle.js create mode 100644 public/javascripts/dojo/src/loader.js create mode 100644 public/javascripts/dojo/src/loader_xd.js create mode 100644 public/javascripts/dojo/src/logging/Logger.js create mode 100644 public/javascripts/dojo/src/logging/__package__.js create mode 100644 public/javascripts/dojo/src/math.js create mode 100644 public/javascripts/dojo/src/math/__package__.js create mode 100644 public/javascripts/dojo/src/math/curves.js create mode 100644 public/javascripts/dojo/src/math/matrix.js create mode 100644 public/javascripts/dojo/src/math/points.js create mode 100644 public/javascripts/dojo/src/math/transform.js create mode 100644 public/javascripts/dojo/src/namespace.js create mode 100644 public/javascripts/dojo/src/namespaces/dojo.js create mode 100644 public/javascripts/dojo/src/profile.js create mode 100644 public/javascripts/dojo/src/regexp.js create mode 100644 public/javascripts/dojo/src/rpc/Deferred.js create mode 100644 public/javascripts/dojo/src/rpc/JotService.js create mode 100644 public/javascripts/dojo/src/rpc/JsonService.js create mode 100644 public/javascripts/dojo/src/rpc/RpcService.js create mode 100644 public/javascripts/dojo/src/rpc/YahooService.js create mode 100644 public/javascripts/dojo/src/rpc/__package__.js create mode 100644 public/javascripts/dojo/src/rpc/yahoo.smd create mode 100644 public/javascripts/dojo/src/selection/Selection.js create mode 100644 public/javascripts/dojo/src/storage.js create mode 100644 public/javascripts/dojo/src/storage/Storage.as create mode 100644 public/javascripts/dojo/src/storage/__package__.js create mode 100644 public/javascripts/dojo/src/storage/browser.js create mode 100644 public/javascripts/dojo/src/storage/dashboard.js create mode 100644 public/javascripts/dojo/src/storage/storage_dialog.fla create mode 100644 public/javascripts/dojo/src/string.js create mode 100644 public/javascripts/dojo/src/string/Builder.js create mode 100644 public/javascripts/dojo/src/string/__package__.js create mode 100644 public/javascripts/dojo/src/string/common.js create mode 100644 public/javascripts/dojo/src/string/extras.js create mode 100644 public/javascripts/dojo/src/style.js create mode 100644 public/javascripts/dojo/src/svg.js create mode 100644 public/javascripts/dojo/src/text/__package__.js create mode 100644 public/javascripts/dojo/src/text/textDirectory.js create mode 100644 public/javascripts/dojo/src/undo/Manager.js create mode 100644 public/javascripts/dojo/src/undo/__package__.js create mode 100644 public/javascripts/dojo/src/undo/browser.js create mode 100644 public/javascripts/dojo/src/uri/Uri.js create mode 100644 public/javascripts/dojo/src/uri/__package__.js create mode 100644 public/javascripts/dojo/src/uuid/LightweightGenerator.js create mode 100644 public/javascripts/dojo/src/uuid/NameBasedGenerator.js create mode 100644 public/javascripts/dojo/src/uuid/NilGenerator.js create mode 100644 public/javascripts/dojo/src/uuid/RandomGenerator.js create mode 100644 public/javascripts/dojo/src/uuid/TimeBasedGenerator.js create mode 100644 public/javascripts/dojo/src/uuid/Uuid.js create mode 100644 public/javascripts/dojo/src/uuid/__package__.js create mode 100644 public/javascripts/dojo/src/validate.js create mode 100644 public/javascripts/dojo/src/validate/__package__.js create mode 100644 public/javascripts/dojo/src/validate/check.js create mode 100644 public/javascripts/dojo/src/validate/common.js create mode 100644 public/javascripts/dojo/src/validate/datetime.js create mode 100644 public/javascripts/dojo/src/validate/de.js create mode 100644 public/javascripts/dojo/src/validate/jp.js create mode 100644 public/javascripts/dojo/src/validate/us.js create mode 100644 public/javascripts/dojo/src/validate/web.js create mode 100644 public/javascripts/dojo/src/widget/AccordionContainer.js create mode 100644 public/javascripts/dojo/src/widget/AccordionPane.js create mode 100644 public/javascripts/dojo/src/widget/AnimatedPng.js create mode 100644 public/javascripts/dojo/src/widget/Button.js create mode 100644 public/javascripts/dojo/src/widget/Chart.js create mode 100644 public/javascripts/dojo/src/widget/Checkbox.js create mode 100644 public/javascripts/dojo/src/widget/CiviCrmDatePicker.js create mode 100644 public/javascripts/dojo/src/widget/ColorPalette.js create mode 100644 public/javascripts/dojo/src/widget/ComboBox.js create mode 100644 public/javascripts/dojo/src/widget/ContentPane.js create mode 100644 public/javascripts/dojo/src/widget/DatePicker.js create mode 100644 public/javascripts/dojo/src/widget/DebugConsole.js create mode 100644 public/javascripts/dojo/src/widget/Dialog.js create mode 100644 public/javascripts/dojo/src/widget/DocPane.js create mode 100644 public/javascripts/dojo/src/widget/DomWidget.js create mode 100644 public/javascripts/dojo/src/widget/DropdownContainer.js create mode 100644 public/javascripts/dojo/src/widget/DropdownDatePicker.js create mode 100644 public/javascripts/dojo/src/widget/Editor.js create mode 100644 public/javascripts/dojo/src/widget/Editor2.js create mode 100644 public/javascripts/dojo/src/widget/Editor2Toolbar.js create mode 100644 public/javascripts/dojo/src/widget/FilteringTable.js create mode 100644 public/javascripts/dojo/src/widget/FisheyeList.js create mode 100644 public/javascripts/dojo/src/widget/FloatingPane.js create mode 100644 public/javascripts/dojo/src/widget/GoogleMap.js create mode 100644 public/javascripts/dojo/src/widget/HslColorPicker.js create mode 100644 public/javascripts/dojo/src/widget/HtmlWidget.js create mode 100644 public/javascripts/dojo/src/widget/InlineEditBox.js create mode 100644 public/javascripts/dojo/src/widget/LayoutContainer.js create mode 100644 public/javascripts/dojo/src/widget/LinkPane.js create mode 100644 public/javascripts/dojo/src/widget/Manager.js create mode 100644 public/javascripts/dojo/src/widget/Menu2.js create mode 100644 public/javascripts/dojo/src/widget/MonthlyCalendar.js create mode 100644 public/javascripts/dojo/src/widget/Parse.js create mode 100644 public/javascripts/dojo/src/widget/RemoteTabController.js create mode 100644 public/javascripts/dojo/src/widget/ResizableTextarea.js create mode 100644 public/javascripts/dojo/src/widget/ResizeHandle.js create mode 100644 public/javascripts/dojo/src/widget/RichText.js create mode 100644 public/javascripts/dojo/src/widget/Rounded.js create mode 100644 public/javascripts/dojo/src/widget/Select.js create mode 100644 public/javascripts/dojo/src/widget/Show.js create mode 100644 public/javascripts/dojo/src/widget/ShowAction.js create mode 100644 public/javascripts/dojo/src/widget/ShowSlide.js create mode 100644 public/javascripts/dojo/src/widget/SlideShow.js create mode 100644 public/javascripts/dojo/src/widget/Slider.js create mode 100644 public/javascripts/dojo/src/widget/SortableTable.js create mode 100644 public/javascripts/dojo/src/widget/Spinner.js create mode 100644 public/javascripts/dojo/src/widget/SplitContainer.js create mode 100644 public/javascripts/dojo/src/widget/SvgButton.js create mode 100644 public/javascripts/dojo/src/widget/SvgWidget.js create mode 100644 public/javascripts/dojo/src/widget/SwtWidget.js create mode 100644 public/javascripts/dojo/src/widget/TabContainer.js create mode 100644 public/javascripts/dojo/src/widget/TaskBar.js create mode 100644 public/javascripts/dojo/src/widget/TimePicker.js create mode 100644 public/javascripts/dojo/src/widget/TitlePane.js create mode 100644 public/javascripts/dojo/src/widget/Toaster.js create mode 100644 public/javascripts/dojo/src/widget/Toggler.js create mode 100644 public/javascripts/dojo/src/widget/Toolbar.js create mode 100644 public/javascripts/dojo/src/widget/Tooltip.js create mode 100644 public/javascripts/dojo/src/widget/Tree.js create mode 100644 public/javascripts/dojo/src/widget/TreeBasicController.js create mode 100644 public/javascripts/dojo/src/widget/TreeBasicControllerV3.js create mode 100644 public/javascripts/dojo/src/widget/TreeCommon.js create mode 100644 public/javascripts/dojo/src/widget/TreeContextMenu.js create mode 100644 public/javascripts/dojo/src/widget/TreeContextMenuV3.js create mode 100644 public/javascripts/dojo/src/widget/TreeControllerExtension.js create mode 100644 public/javascripts/dojo/src/widget/TreeDemo.js create mode 100644 public/javascripts/dojo/src/widget/TreeDeselectOnDblselect.js create mode 100644 public/javascripts/dojo/src/widget/TreeDndControllerV3.js create mode 100644 public/javascripts/dojo/src/widget/TreeDocIconExtension.js create mode 100644 public/javascripts/dojo/src/widget/TreeEmphaseOnSelect.js create mode 100644 public/javascripts/dojo/src/widget/TreeExtension.js create mode 100644 public/javascripts/dojo/src/widget/TreeLinkExtension.js create mode 100644 public/javascripts/dojo/src/widget/TreeLoadingController.js create mode 100644 public/javascripts/dojo/src/widget/TreeLoadingControllerV3.js create mode 100644 public/javascripts/dojo/src/widget/TreeNode.js create mode 100644 public/javascripts/dojo/src/widget/TreeNodeV3.js create mode 100644 public/javascripts/dojo/src/widget/TreeRPCController.js create mode 100644 public/javascripts/dojo/src/widget/TreeRpcControllerV3.js create mode 100644 public/javascripts/dojo/src/widget/TreeSelector.js create mode 100644 public/javascripts/dojo/src/widget/TreeSelectorV3.js create mode 100644 public/javascripts/dojo/src/widget/TreeTimeoutIterator.js create mode 100644 public/javascripts/dojo/src/widget/TreeV3.js create mode 100644 public/javascripts/dojo/src/widget/TreeWithNode.js create mode 100644 public/javascripts/dojo/src/widget/Widget.js create mode 100644 public/javascripts/dojo/src/widget/Wizard.js create mode 100644 public/javascripts/dojo/src/widget/YahooMap.js create mode 100644 public/javascripts/dojo/src/widget/__package__.js create mode 100644 public/javascripts/dojo/src/widget/demoEngine/DemoContainer.js create mode 100644 public/javascripts/dojo/src/widget/demoEngine/DemoItem.js create mode 100644 public/javascripts/dojo/src/widget/demoEngine/DemoNavigator.js create mode 100644 public/javascripts/dojo/src/widget/demoEngine/DemoPane.js create mode 100644 public/javascripts/dojo/src/widget/demoEngine/SourcePane.js create mode 100644 public/javascripts/dojo/src/widget/demoEngine/__package__.js create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/DemoContainer.css create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/DemoContainer.html create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/DemoItem.css create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/DemoItem.html create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/DemoNavigator.css create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/DemoNavigator.html create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/DemoPane.css create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/DemoPane.html create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/SourcePane.css create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/SourcePane.html create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/general.css create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/images/test_thumb.gif create mode 100644 public/javascripts/dojo/src/widget/demoEngine/templates/images/viewDemo.png create mode 100644 public/javascripts/dojo/src/widget/html/layout.js create mode 100644 public/javascripts/dojo/src/widget/html/stabile.js create mode 100644 public/javascripts/dojo/src/widget/svg/Chart.js create mode 100644 public/javascripts/dojo/src/widget/templates/DemoEngine.html create mode 100644 public/javascripts/dojo/src/widget/templates/HslColorPicker.svg create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlButtonTemplate.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlButtonTemplate.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlCheckBox.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlCheckBox.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlCiviCrmDatePicker.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlComboBox.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlComboBox.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlComboButtonTemplate.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlContextMenuTemplate.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlDatePicker.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlDatePicker.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlDialog.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlDocPane.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlDocPane.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlDropDownButtonTemplate.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlEditorToolbar.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlEditorToolbar.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlEditorToolbarOneline.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlFisheyeList.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlFloatingPane.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlFloatingPane.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlInlineEditBox.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlInlineEditBox.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlMenu2.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlMenuItemTemplate.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlMonthlyCalendar.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlMonthlyCalendar.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlResizableTextarea.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlResizableTextarea.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlResizeHandle.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlShow.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlShow.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlShowSlide.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlShowSlide.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSimpleDropdownButtons.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSlideShow.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSlideShow.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSlider.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSlider.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSliderHorizontal.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSliderVertical.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSpinner.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSpinner.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlSplitContainer.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlTabContainer.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlTabContainer.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlTaskBar.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlTaskBarItemTemplate.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlTimePicker.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlTimePicker.html create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlToaster.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlToolbar.css create mode 100644 public/javascripts/dojo/src/widget/templates/HtmlTooltipTemplate.css create mode 100644 public/javascripts/dojo/src/widget/templates/Menu.css create mode 100644 public/javascripts/dojo/src/widget/templates/PopUpButton.css create mode 100644 public/javascripts/dojo/src/widget/templates/RemoteTabControl.css create mode 100644 public/javascripts/dojo/src/widget/templates/Textbox.html create mode 100644 public/javascripts/dojo/src/widget/templates/TitlePane.html create mode 100644 public/javascripts/dojo/src/widget/templates/Tree.css create mode 100644 public/javascripts/dojo/src/widget/templates/TreeDocIcon.css create mode 100644 public/javascripts/dojo/src/widget/templates/TreeV3.css create mode 100644 public/javascripts/dojo/src/widget/templates/ValidationTextbox.html create mode 100644 public/javascripts/dojo/src/widget/templates/Wizard.css create mode 100644 public/javascripts/dojo/src/widget/templates/Wizard.html create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/aggregate.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/backcolor.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/bg-fade.png create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/bold.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/cancel.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/copy.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/createlink.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/cut.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/delete.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/forecolor.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/hilitecolor.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/indent.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/inserthorizontalrule.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/insertimage.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/insertorderedlist.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/inserttable.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/insertunorderedlist.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/italic.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/justifycenter.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/justifyfull.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/justifyleft.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/justifyright.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/left_to_right.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/list_bullet_indent.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/list_bullet_outdent.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/list_num_indent.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/list_num_outdent.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/outdent.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/paste.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/redo.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/removeformat.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/right_to_left.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/save.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/sep.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/space.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/strikethrough.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/subscript.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/superscript.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/underline.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/undo.gif create mode 100644 public/javascripts/dojo/src/widget/templates/buttons/wikiword.gif create mode 100644 public/javascripts/dojo/src/widget/templates/check.gif create mode 100644 public/javascripts/dojo/src/widget/templates/decrementMonth.gif create mode 100644 public/javascripts/dojo/src/widget/templates/decrementWeek.gif create mode 100644 public/javascripts/dojo/src/widget/templates/grabCorner.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/Tree.css create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/blank.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/closed.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/document.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/minus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/plus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/transparent.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_blank.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_child.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_expand_minus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_expand_plus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_c.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_l.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_p.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_t.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_v.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_x.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_y.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_z.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_loading.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/Tree/treenode_loading.jpg create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/closed.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/document.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/expand_leaf.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/expand_loading.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/expand_minus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/expand_plus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/i.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/i_bhalf.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/i_half.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/i_long.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/l.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/minus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/open.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/plus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/t.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/TreeV3/x.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/bdYearBg.1.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/bdYearBg.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/blank.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/combo_box_arrow.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dateIcon.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/decrementMonth.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/decrementMonth.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpBg.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpCurveBL.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpCurveBR.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpCurveTL.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpCurveTR.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpHorizLine.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpHorizLineFoot.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpMonthBg.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpMonthBg.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpMonthBg2.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpVertLine.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpYearBg.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/dpYearBg.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/dropdownButtonsArrow-disabled.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/dropdownButtonsArrow.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/floatingPaneClose.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/floatingPaneMaximize.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/floatingPaneMinimize.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/floatingPaneRestore.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/hue.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/incrementMonth.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/incrementMonth.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/no.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/no.svg create mode 100644 public/javascripts/dojo/src/widget/templates/images/scBackground.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider-bg-progress-vert.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider-bg-vert.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider-bg.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider-button-horz.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider-button-vert.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider-button.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider_down_arrow.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider_left_arrow.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider_right_arrow.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/slider_up_arrow.png create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaActive-c.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaActive-l.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaActive-r.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaBarBg.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaButton-c.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaButton-l.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaButton-r.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaDisabled-c.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaDisabled-l.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaDisabled-r.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaMenuBg.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaPressed-c.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaPressed-l.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/soriaPressed-r.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/spinnerDecrement.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/spinnerIncrement.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/submenu_off.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/submenu_on.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_bot_left.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_bot_left_curr.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_bot_right.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_bot_right_curr.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_close.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_close_h.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_left.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_left_r.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_left_r_curr.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_right.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_right_r.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_right_r_curr.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_top_left.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/tab_top_right.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/toolbar-bg.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/transparent.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_blank.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_child.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_expand_minus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_expand_plus.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_grid_c.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_grid_l.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_grid_p.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_grid_t.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_grid_v.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_grid_x.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_grid_y.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_grid_z.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/treenode_node.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/verticalbar.gif create mode 100644 public/javascripts/dojo/src/widget/templates/images/whiteDownArrow.gif create mode 100644 public/javascripts/dojo/src/widget/templates/incrementMonth.gif create mode 100644 public/javascripts/dojo/src/widget/templates/incrementWeek.gif create mode 100644 public/javascripts/dojo/src/widget/templates/richtextframe.html create mode 100644 public/javascripts/dojo/src/widget/validate.js create mode 100644 public/javascripts/dojo/src/widget/vml/Chart.js create mode 100644 public/javascripts/dojo/src/xml/Parse.js create mode 100644 public/javascripts/dojo/src/xml/__package__.js create mode 100644 public/javascripts/dojo/src/xml/svgUtil.js create mode 100644 public/javascripts/dojo/storage_dialog.swf create mode 100644 public/javascripts/dragdrop.js create mode 100644 public/javascripts/effects.js create mode 100644 public/javascripts/prototype.js create mode 100644 public/robots.txt create mode 100644 public/stylesheets/grindable.css create mode 100755 script/about create mode 100755 script/breakpointer create mode 100755 script/console create mode 100755 script/destroy create mode 100755 script/generate create mode 100755 script/performance/benchmarker create mode 100755 script/performance/profiler create mode 100755 script/plugin create mode 100755 script/process/reaper create mode 100755 script/process/spawner create mode 100755 script/process/spinner create mode 100755 script/runner create mode 100755 script/server create mode 100644 test/fixtures/baristas.yml create mode 100644 test/fixtures/funds.yml create mode 100644 test/fixtures/ledgers.yml create mode 100644 test/functional/activity_controller_test.rb create mode 100644 test/functional/barista_controller_test.rb create mode 100644 test/functional/cafe_controller_test.rb create mode 100644 test/functional/fund_controller_test.rb create mode 100644 test/test_helper.rb create mode 100644 test/unit/barista_test.rb create mode 100644 test/unit/fund_test.rb create mode 100644 test/unit/ledger_test.rb diff --git a/README b/README new file mode 100644 index 0000000..cd9d0ff --- /dev/null +++ b/README @@ -0,0 +1,153 @@ +== Welcome to Rails + +Rails is a web-application and persistence framework that includes everything +needed to create database-backed web-applications according to the +Model-View-Control pattern of separation. This pattern splits the view (also +called the presentation) into "dumb" templates that are primarily responsible +for inserting pre-built data in between HTML tags. The model contains the +"smart" domain objects (such as Account, Product, Person, Post) that holds all +the business logic and knows how to persist themselves to a database. The +controller handles the incoming requests (such as Save New Account, Update +Product, Show Post) by manipulating the model and directing data to the view. + +In Rails, the model is handled by what's called an object-relational mapping +layer entitled Active Record. This layer allows you to present the data from +database rows as objects and embellish these data objects with business logic +methods. You can read more about Active Record in +link:files/vendor/rails/activerecord/README.html. + +The controller and view are handled by the Action Pack, which handles both +layers by its two parts: Action View and Action Controller. These two layers +are bundled in a single package due to their heavy interdependence. This is +unlike the relationship between the Active Record and Action Pack that is much +more separate. Each of these packages can be used independently outside of +Rails. You can read more about Action Pack in +link:files/vendor/rails/actionpack/README.html. + + +== Getting started + +1. Run the WEBrick servlet: ruby script/server (run with --help for options) + ...or if you have lighttpd installed: ruby script/lighttpd (it's faster) +2. Go to http://localhost:3000/ and get "Congratulations, you've put Ruby on Rails!" +3. Follow the guidelines on the "Congratulations, you've put Ruby on Rails!" screen + + +== Example for Apache conf + + + ServerName rails + DocumentRoot /path/application/public/ + ErrorLog /path/application/log/server.log + + + Options ExecCGI FollowSymLinks + AllowOverride all + Allow from all + Order allow,deny + + + +NOTE: Be sure that CGIs can be executed in that directory as well. So ExecCGI +should be on and ".cgi" should respond. All requests from 127.0.0.1 go +through CGI, so no Apache restart is necessary for changes. All other requests +go through FCGI (or mod_ruby), which requires a restart to show changes. + + +== Debugging Rails + +Have "tail -f" commands running on both the server.log, production.log, and +test.log files. Rails will automatically display debugging and runtime +information to these files. Debugging info will also be shown in the browser +on requests from 127.0.0.1. + + +== Breakpoints + +Breakpoint support is available through the script/breakpointer client. This +means that you can break out of execution at any point in the code, investigate +and change the model, AND then resume execution! Example: + + class WeblogController < ActionController::Base + def index + @posts = Post.find_all + breakpoint "Breaking out from the list" + end + end + +So the controller will accept the action, run the first line, then present you +with a IRB prompt in the breakpointer window. Here you can do things like: + +Executing breakpoint "Breaking out from the list" at .../webrick_server.rb:16 in 'breakpoint' + + >> @posts.inspect + => "[#nil, \"body\"=>nil, \"id\"=>\"1\"}>, + #\"Rails you know!\", \"body\"=>\"Only ten..\", \"id\"=>\"2\"}>]" + >> @posts.first.title = "hello from a breakpoint" + => "hello from a breakpoint" + +...and even better is that you can examine how your runtime objects actually work: + + >> f = @posts.first + => #nil, "body"=>nil, "id"=>"1"}> + >> f. + Display all 152 possibilities? (y or n) + +Finally, when you're ready to resume execution, you press CTRL-D + + +== Console + +You can interact with the domain model by starting the console through script/console. +Here you'll have all parts of the application configured, just like it is when the +application is running. You can inspect domain models, change values, and save to the +database. Starting the script without arguments will launch it in the development environment. +Passing an argument will specify a different environment, like console production. + + +== Description of contents + +app + Holds all the code that's specific to this particular application. + +app/controllers + Holds controllers that should be named like weblog_controller.rb for + automated URL mapping. All controllers should descend from + ActionController::Base. + +app/models + Holds models that should be named like post.rb. + Most models will descend from ActiveRecord::Base. + +app/views + Holds the template files for the view that should be named like + weblog/index.rhtml for the WeblogController#index action. All views use eRuby + syntax. This directory can also be used to keep stylesheets, images, and so on + that can be symlinked to public. + +app/helpers + Holds view helpers that should be named like weblog_helper.rb. + +config + Configuration files for the Rails environment, the routing map, the database, and other dependencies. + +components + Self-contained mini-applications that can bundle together controllers, models, and views. + +lib + Application specific libraries. Basically, any kind of custom code that doesn't + belong under controllers, models, or helpers. This directory is in the load path. + +public + The directory available for the web server. Contains subdirectories for images, stylesheets, + and javascripts. Also contains the dispatchers and the default HTML files. + +script + Helper scripts for automation and generation. + +test + Unit and functional tests along with fixtures. + +vendor + External libraries that the application depends on. Also includes the plugins subdirectory. + This directory is in the load path. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..cffd19f --- /dev/null +++ b/Rakefile @@ -0,0 +1,10 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/switchtower.rake, and they will automatically be available to Rake. + +require(File.join(File.dirname(__FILE__), 'config', 'boot')) + +require 'rake' +require 'rake/testtask' +require 'rake/rdoctask' + +require 'tasks/rails' \ No newline at end of file diff --git a/app/controllers/activity_controller.rb b/app/controllers/activity_controller.rb new file mode 100644 index 0000000..ad85134 --- /dev/null +++ b/app/controllers/activity_controller.rb @@ -0,0 +1,19 @@ +class ActivityController < ApplicationController + + append_before_filter :verify_identity + append_before_filter :add_refresh_link, :only => [ 'index' ] + append_before_filter :find_fund, :only => [ 'index' ] + + ## + # This method will display a list of the purchases for the fund, starting + # with the oldest. Also handily paginated by default. Lookit, four lines! + # + def index + unless @fund.nil? + @purchase_pages, @purchases = paginate :ledger, :order => + "ledgers.post_date DESC, ledgers.created_at DESC", + :conditions => [ 'ledgers.fund_id = ?', @fund.id ], + :joins => "LEFT JOIN baristas ON ledgers.barista_id = baristas.id" + end + end +end \ No newline at end of file diff --git a/app/controllers/application.rb b/app/controllers/application.rb new file mode 100644 index 0000000..b40d018 --- /dev/null +++ b/app/controllers/application.rb @@ -0,0 +1,124 @@ +class ApplicationController < ActionController::Base + + append_before_filter :session_setup + append_before_filter :link_setup + + layout 'grindable' + + ## + # Method to determine if a user is authenticated. This might be more + # complicated in the future. + # + def authenticated? + session[:authenticated] == true + end + + ## + # A filter check to ensure that the person using the fund is authenticated + # in some way or another... + # + def verify_identity + # escape check + return true if authenticated? + + # make 'em authenticate before continuing + session[:return_to] = request.request_uri + # nice one, bruddah. it's a route helper. + redirect_to login_url + end + + ## + # Sends the user to the default url. This could either be stored in the + # sesion or in the home_url method. + # + def goto_default_redirect_url + if session[:return_to].nil? + redirect_to home_url + else + redirect_to session[:return_to] + session[:return_to] = nil + end + end + + ## + # Redirects to the index action, useful since it is used in lots of places + # + def goto_index + redirect_to :action => 'index' + end + + ## + # Adds a related link to refresh the current action + # + def add_refresh_link + add_related_link 'Refresh' + end + + ## + # This will add a submenu item to be displayed + # + def add_related_link(*args) + @related_links.push [ *args ] + end + + ## + # This will add a submenu item for a javascript function + # + def add_related_function(what, where) + @related_functions.push [ what, where ] + end + + ## + # Adds an AJAX call to the submenu list + # + def add_remote_function(*args) + @related_remote.push [ *args ] + end + + ## + # Ensures that the method in question was called from a form, ie. POST + # + def ensure_post + return false unless request.post? + true + end + + ## + # Just like ensure_post only for AJAX requests... + # + def ensure_xhr + return false unless request.xhr? + true + end + + ## + # This configures the @fund variable for several methods as a before_filter. + # + def find_fund + return unless session[:barista] and session[:barista][:fund_id] + @fund = Fund.find session[:barista][:fund_id].to_i unless + session[:barista].nil? + end + + private + + ## + # This should ensure a minimum session environment + # + def session_setup + if session[:authenticated].nil? + session[:barista] = nil + session[:authenticated] = false + end + true + end + + ## + # Creates the environment for the submenu of links + # + def link_setup + @related_links ||= [] + @related_functions ||= [] + @related_remote ||= [] + end +end \ No newline at end of file diff --git a/app/controllers/barista_controller.rb b/app/controllers/barista_controller.rb new file mode 100644 index 0000000..e5e400e --- /dev/null +++ b/app/controllers/barista_controller.rb @@ -0,0 +1,79 @@ +class BaristaController < ApplicationController + + append_before_filter :ensure_post, :only => [ 'add', 'delete', 'edit' ] + append_before_filter :add_refresh_link, :only => [ 'index' ] + append_before_filter :find_fund, :only => [ 'index' ] + + ## + # Lists all of the baristas in the system + # + def index + @pages, @baristas = paginate :baristas, :order => 'baristas.name ASC', + :per_page => 10, :include => 'fund' + add_related_function 'Create Barista', + ("dojo.widget.byId('baristaDialog').show();" + + "dojo.byId('barista_name').focus()") + end + + ## + # Adds a new barista to the system. + # + def add + b = Barista.new params['barista'] + + begin + b.save! + flash[:info] = 'Successfully created a new barista!' + rescue => exception + flash[:error] = "Failed to create the barista: #{exception.to_s}" + end + + goto_index + end + + def delete + # not implemented yet + end + + def edit + # nothing to edit, only the password really. and there's none of that now + end + + ## + # This method will identify the user -- basically an authenticate. + # + def identify + # user should probably not be here if they are already authenticated + goto_default_redirect_url if authenticated? + + if request.post? + # mirror mirror on the wall, who is da funkiest of them all? + user_to_auth = Barista.find :first, :conditions => [ "name = ?", + params[:name] ] + + if user_to_auth.nil? + # busted + flash.now[:error] = "You're going to have to try harder than that." + else + # ballin' + session[:authenticated] = true + session[:barista] = user_to_auth + flash[:info] = "Welcome to the Grindable!" + + # shot callin' + goto_default_redirect_url + end + end + end + + ## + # This method should reset the user state to basic -- a deauthenticate. + # + def anonymize + # blank out all knowledge of the user + reset_session + + # go home + goto_default_redirect_url + end +end diff --git a/app/controllers/cafe_controller.rb b/app/controllers/cafe_controller.rb new file mode 100644 index 0000000..e56b5a4 --- /dev/null +++ b/app/controllers/cafe_controller.rb @@ -0,0 +1,121 @@ +class CafeController < ApplicationController + + append_before_filter :verify_identity + append_before_filter :ensure_post, :only => [ 'make_contribution', + 'make_purchase', 'milk_purchased' ] + append_before_filter :add_refresh_link, :only => [ 'index' ] + append_before_filter :find_fund, :only => [ 'index', 'make_contribution', + 'make_purchase' ] + append_before_filter :find_next_milk_purchaser, :only => [ 'index' ] + + ## + # The main coffee page. + # + def index + unless @fund.nil? + add_related_function 'Make Contribution', + "dojo.widget.byId('contributionDialog').show()" + add_related_function 'Make Purchase', + "dojo.widget.byId('purchaseDialog').show()" + add_related_function 'Milk Purchased', + "dojo.byId('milk_form').submit()" unless @fund.contribution == 0.0 + end + end + + ## + # The method to confirm you bought milk. + # + def milk_purchased + l = Ledger.new + l.fund_id = session[:barista][:fund_id] + l.barista_id = session[:barista][:id] + l.comment = 'MILK' + l.post_date = Date.today + begin + l.save! + session[:barista].update_attribute 'milk_last_bought_at', Time.now + flash[:info] = 'You just purchased milk!' + rescue => exception + flash[:error] = 'There was a problem: #{exception.to_s}' + end + goto_index + end + + ## + # The method to make a contribution to the fund. + # + def make_contribution + # this is one of the more complicated procedures in the app + new_contribution = Ledger.new + # set the contribution amount from the fund + if @fund.contribution.nil? or @fund.contribution == 0 + new_contribution.credit_amount = params[:contribution].to_f rescue 0.0 + else + new_contribution.credit_amount = @fund.contribution + end + # update the fund balance + @fund.make_contribution new_contribution.credit_amount + new_contribution.barista_id = params[:contribution][:barista_id] + new_contribution.fund_id = session[:barista][:fund_id] + new_contribution.comment = 'CONTRIBUTION' + new_contribution.post_date = Date.today + + begin + new_contribution.save! + quantity = params[:contribution][:quantity].to_i + if quantity > 1 + (2..quantity).each do |q| + c = Ledger.new + c.attributes = new_contribution.attributes + c.post_date = new_contribution.post_date >> 1 + c.save! + end + end + session[:barista].save! + @fund.save! + flash[:info] = + "Successfully contributed to the fund #{@fund.name}!" + rescue => exception + flash[:error] = "Failed to properly work: #{exception.to_s}" + end + + goto_index + end + + ## + # The method for making a purchase out of general funds. + # + def make_purchase + new_purchase = Ledger.new + new_purchase.debit_amount = params[:amount] + new_purchase.comment = params[:comment] + new_purchase.barista_id = session[:barista][:id] + new_purchase.fund_id = session[:barista][:fund_id] + new_purchase.post_date = Date.today + @fund.make_purchase new_purchase.debit_amount + + begin + new_purchase.save! + session[:barista].save! + @fund.save! + flash[:info] = "Successfully purchased ... supplies!" + rescue => exception + flash[:error] = "Failed to work properly: #{exception.to_s}" + end + + goto_index + end + + private + + ## + # A simple helper to find the next person to buy milk. + # + def find_next_milk_purchaser + return if @fund.nil? + @next_milk_purchaser = Barista.find :first, + :order => "milk_last_bought_at ASC", + :conditions => [ 'fund_id = ?', @fund.id ] + end + +end diff --git a/app/controllers/fund_controller.rb b/app/controllers/fund_controller.rb new file mode 100644 index 0000000..07260a7 --- /dev/null +++ b/app/controllers/fund_controller.rb @@ -0,0 +1,68 @@ +class FundController < ApplicationController + + in_place_edit_for :fund, :contribution + + append_before_filter :ensure_post, :only => [ 'add', 'delete', 'use' ] + append_before_filter :add_refresh_link, :only => [ 'index' ] + + def index + @funds = Fund.find :all, :include => [ 'baristas' ] + add_related_function 'Add Fund', "dojo.widget.byId('fundDialog').show()" + end + + def add + allowed_parameters = [ 'name', 'contribution' ] + params.delete_if { |key, value| !allowed_parameters.include? key } + + begin + fund = Fund.new params + fund.contribution = 0.0 if params[:contribution].nil? or + params[:contribution].empty? + fund.balance = 0.0 + fund.save! + flash[:info] = 'Word, success!' + rescue => exception + flash[:error] = 'There was a problem saving the fund: ' + + exception.to_s + end + + redirect_to :action => 'index' + end + + def delete + fund = Fund.find params[:id].to_i + if fund.nil? + flash[:error] = 'That fund does not exist!' + else + old_name = fund[:name] + begin + fund.destroy + flash[:info] = "The fund #{old_name} has been deleted." + rescue => exception + flash[:error] = "Encountered a problem while removing the fund: " + + exception.to_s + end + end + + goto_index + end + + def use + fund = Fund.find params[:id].to_i + if fund.nil? + flash[:error] = 'That fund does not exist!' + else + session[:barista][:fund_id] = params[:id] + begin + session[:barista].save! + session[:barista].reload + rescue => exception + flash[:error] = "Failed while updating the user: #{exception.to_s}" + else + flash[:info] = 'Successfully updated the user fund.' + end + end + + goto_index + end +end diff --git a/app/helpers/activity_helper.rb b/app/helpers/activity_helper.rb new file mode 100644 index 0000000..3dcc7c6 --- /dev/null +++ b/app/helpers/activity_helper.rb @@ -0,0 +1,2 @@ +module ActivityHelper +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100755 index 0000000..85b994a --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,21 @@ +# Methods added to this helper will be available to all templates in the application. +module ApplicationHelper + + def escape_preserving_linefeeds(text) + h(text).gsub(/\n/, '
') + end + + def escape_preserving_linefeeds_and_html(text) + text.gsub(/\n/, '
') + end + + def display_amount(amount) + return '' if amount.nil? + sprintf("$%0.2f", amount) + end + + def display_date(date) + return '' if date.nil? + "#{date.month}-#{date.day}-#{date.year}" + end +end diff --git a/app/helpers/barista_helper.rb b/app/helpers/barista_helper.rb new file mode 100644 index 0000000..8570b8c --- /dev/null +++ b/app/helpers/barista_helper.rb @@ -0,0 +1,2 @@ +module BaristaHelper +end diff --git a/app/helpers/cafe_helper.rb b/app/helpers/cafe_helper.rb new file mode 100644 index 0000000..43d40db --- /dev/null +++ b/app/helpers/cafe_helper.rb @@ -0,0 +1,2 @@ +module CafeHelper +end diff --git a/app/helpers/fund_helper.rb b/app/helpers/fund_helper.rb new file mode 100644 index 0000000..1a16ef9 --- /dev/null +++ b/app/helpers/fund_helper.rb @@ -0,0 +1,2 @@ +module FundHelper +end diff --git a/app/models/barista.rb b/app/models/barista.rb new file mode 100644 index 0000000..7df5714 --- /dev/null +++ b/app/models/barista.rb @@ -0,0 +1,37 @@ +class Barista < ActiveRecord::Base + has_many :ledgers, :order => "created_at ASC" + + belongs_to :fund + validates_presence_of :fund + + validates_length_of :name, :within => 6..64 + + def self.for_select(fund_id = nil) + if fund_id.nil? + arr = self.find :all, :order => 'name ASC', :select => 'id, name' + else + arr = self.find :all, :order => 'name ASC', :select => 'id, name', + :conditions => [ 'fund_id = ?', fund_id ] + end + + arr.collect do |b| + [ b.name, b.id.to_s ] + end + end + + def paid_this_month? + this_month = Date.new(Date.today.year, Date.today.month, 1) + next_month = (this_month >> 1) - 1 + variables = { :this_month => this_month, :next_month => next_month, + :fund_id => self.fund_id } + query_str = [] + query_str << 'post_date >= :this_month' + query_str << 'post_date <= :next_month' + query_str << 'credit_amount IS NOT NULL' + query_str << 'fund_id = :fund_id' + + return false if (self.ledgers.find :first, + :conditions => [ query_str.join(' AND '), variables ]).nil? + true + end +end \ No newline at end of file diff --git a/app/models/fund.rb b/app/models/fund.rb new file mode 100644 index 0000000..c12e419 --- /dev/null +++ b/app/models/fund.rb @@ -0,0 +1,23 @@ +class Fund < ActiveRecord::Base + + validates_numericality_of :balance, :contribution + validates_uniqueness_of :name + has_many :baristas + has_many :ledgers, :dependent => true + + def make_contribution(amount) + self[:balance] += amount + end + + def make_purchase(amount) + self[:balance] -= amount + end + + def self.for_select + self.find(:all, :select => 'id, name').collect { |f| [ f.name, f.id.to_s ] } + end + + def before_destroy + raise "Fund still has baristas!" unless self.baristas.empty? + end +end diff --git a/app/models/ledger.rb b/app/models/ledger.rb new file mode 100644 index 0000000..4b1f01a --- /dev/null +++ b/app/models/ledger.rb @@ -0,0 +1,6 @@ +class Ledger < ActiveRecord::Base + belongs_to :barista + belongs_to :fund + + validates_numericality_of :debit_amount, :credit_amount, :allow_nil => true +end diff --git a/app/views/activity/_purchase.rhtml b/app/views/activity/_purchase.rhtml new file mode 100644 index 0000000..9618d21 --- /dev/null +++ b/app/views/activity/_purchase.rhtml @@ -0,0 +1,13 @@ +<% @fund_counter ||= 0 -%> +<% if @fund_counter % 2 == 0 -%> + +<% else -%> + +<% end -%> + <%= purchase.comment -%> + <%= purchase.name -%> + <%= display_date purchase.post_date -%> + <%= display_amount purchase.debit_amount -%> + <%= display_amount purchase.credit_amount -%> + +<% @fund_counter += 1 -%> \ No newline at end of file diff --git a/app/views/activity/index.rhtml b/app/views/activity/index.rhtml new file mode 100644 index 0000000..de6ab0c --- /dev/null +++ b/app/views/activity/index.rhtml @@ -0,0 +1,26 @@ +<% @content_title = "Fund Activity :: #{@fund.name rescue 'None!'}" -%> + +<%= render :partial => 'shared/menu' %> + +<% unless @fund.nil? -%> +
+ + + + + + + + + +<%= render :partial => "purchase", :collection => @purchases %> + +
CommentBaristaDate-+


+
+ +
<%= pagination_links @purchase_pages %>
+<% else -%> +
+

Visit the <%= link_to 'Fund Controller', :controller => 'fund' -%> to configure funds and change your associated fund.

+
+<% end -%> \ No newline at end of file diff --git a/app/views/barista/_barista.rhtml b/app/views/barista/_barista.rhtml new file mode 100644 index 0000000..cb86e97 --- /dev/null +++ b/app/views/barista/_barista.rhtml @@ -0,0 +1,11 @@ +<% @fund_counter ||= 0 -%> +<% if @fund_counter % 2 == 0 -%> + +<% else -%> + +<% end -%> + <%= barista.name -%> + <%= barista.fund.name rescue 'None' -%> + <%= display_date barista.created_on -%> + +<% @fund_counter += 1 -%> \ No newline at end of file diff --git a/app/views/barista/identify.rhtml b/app/views/barista/identify.rhtml new file mode 100644 index 0000000..48b2f73 --- /dev/null +++ b/app/views/barista/identify.rhtml @@ -0,0 +1,8 @@ +<% @content_title = 'Identification required' -%> + +
+ <%= form_tag :action => :identify %> +

Name: <%= text_field_tag "name", nil, :size => 32, :maxlength => 64, :class => "inputBox" %>

+

<%= submit_tag "Login", :class => "inputBox" %>

+ <%= end_form_tag %> +
\ No newline at end of file diff --git a/app/views/barista/index.rhtml b/app/views/barista/index.rhtml new file mode 100644 index 0000000..e7237ce --- /dev/null +++ b/app/views/barista/index.rhtml @@ -0,0 +1,37 @@ +<% @content_title = 'Barista Summary' -%> + +<%= render :partial => 'shared/menu' %> + +
+ + + + + + + +<%= render :partial => "barista", :collection => @baristas %> + +
NameFundDate Joined


+
+ +
<%= pagination_links @pages %>
+ + + + +<% + @dojo_map ||= {} + @dojo_map['baristaDialog'] = ['dialog', '{bgColor: "black", bgOpacity: "0.5"}'] +%> \ No newline at end of file diff --git a/app/views/cafe/index.rhtml b/app/views/cafe/index.rhtml new file mode 100644 index 0000000..00c0a3b --- /dev/null +++ b/app/views/cafe/index.rhtml @@ -0,0 +1,91 @@ +<% @content_title = 'Grindable Home' -%> + +<%= render :partial => 'shared/menu' %> + +
+

Fund details

+ <% if @fund.nil? -%> +

You have no associated fund!

+

Visit the <%= link_to 'Fund Controller', :controller => 'fund' -%> to configure funds and change your associated fund.

+ <% else -%> +
    +
  • Fund name: <%= h(@fund.name) -%>
  • +
  • Total fund balance is: <%= display_amount @fund.balance -%>
  • + <% unless @fund.contribution == 0.0 -%> +
  • Monthly contribution: <%= display_amount @fund.contribution -%>
  • + <% end -%> +
+ <% unless @fund.contribution == 0.0 -%> + <% if session[:barista].paid_this_month? -%> +

You have paid this month's contribution.

+ <% else -%> +

You have not paid this month

+ <% end -%> + <% end -%> + <% end -%> +
+ +<% unless @fund.nil? or @fund.contribution == 0.0 -%> +
+

Milk Purchases

+ +<%= form_tag({ :action => 'milk_purchased' }, { :id => 'milk_form' }) -%> +<%= end_form_tag -%> +<% unless session[:barista].milk_last_bought_at.nil? -%> +

You last bought milk <%= time_ago_in_words session[:barista].milk_last_bought_at -%> ago.

+<% else -%> +

You have never bought milk!

+<% end -%> + +<% unless @next_milk_purchaser.id == session[:barista].id -%> +

The next person to buy milk will be: <%= h(@next_milk_purchaser.name) -%>

+<% else -%> +

You will have to buy milk next.

+<% end -%> +
+<% end -%> + +<% unless @fund.nil? -%> + + + + + +<% + @dojo_map ||= {} + @dojo_map['contributionDialog'] = ['dialog', '{bgColor: "black", bgOpacity: "0.5"}'] + @dojo_map['purchaseDialog'] = ['dialog', '{bgColor: "black", bgOpacity: "0.5"}'] +%> +<% end -%> \ No newline at end of file diff --git a/app/views/fund/_fund_line.rhtml b/app/views/fund/_fund_line.rhtml new file mode 100644 index 0000000..6c57c42 --- /dev/null +++ b/app/views/fund/_fund_line.rhtml @@ -0,0 +1,14 @@ +<% @fund_counter ||= 0 -%> +<% if @fund_counter % 2 == 0 -%> + +<% else -%> + +<% end -%> + <%= link_to image_tag('go-home-16.png', :alt => 'Use', :title => 'Use this fund'), { :action => 'use', :id => @fund.id }, :post => true -%> + <%= link_to image_tag('edit-delete-16.png', :alt => 'Delete', :title => 'Delete Fund'), { :action => 'delete', :id => @fund.id }, :post => true -%> + <%= @fund.name -%> + <%= display_amount @fund.balance -%> + <%= in_place_editor_field :fund, :contribution -%> + <%= @fund.baristas.size -%> + +<% @fund_counter += 1 -%> \ No newline at end of file diff --git a/app/views/fund/index.rhtml b/app/views/fund/index.rhtml new file mode 100644 index 0000000..5568148 --- /dev/null +++ b/app/views/fund/index.rhtml @@ -0,0 +1,35 @@ +<% @content_title = 'Fund Summary' -%> + +<%= render :partial => "shared/menu" %> + +
+ + + + + + + + + + + <% @funds.each do |@fund| -%> + <%= render :partial => 'fund_line' %> + <% end -%> + +
UseDeleteNameBalanceContributionSize


+
+ + + diff --git a/public/javascripts/dojo/src/widget/templates/HtmlComboButtonTemplate.html b/public/javascripts/dojo/src/widget/templates/HtmlComboButtonTemplate.html new file mode 100644 index 0000000..809c92a --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlComboButtonTemplate.html @@ -0,0 +1,18 @@ +
+ +
+
+ + +
+ +
+ + + +
+ +
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlContextMenuTemplate.html b/public/javascripts/dojo/src/widget/templates/HtmlContextMenuTemplate.html new file mode 100644 index 0000000..8c85c54 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlContextMenuTemplate.html @@ -0,0 +1,3 @@ +
    +
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlDatePicker.css b/public/javascripts/dojo/src/widget/templates/HtmlDatePicker.css new file mode 100644 index 0000000..c39c22e --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlDatePicker.css @@ -0,0 +1,143 @@ +.calendarContainer { +/* border:1px solid #566f8f;*/ +} + +.calendarBodyContainer { + width:160px; + background: #7591bc url("images/dpBg.gif") top left repeat-x; +} + +.calendarBodyContainer thead tr td { + color:#293a4b; + font:bold 0.75em Helvetica, Arial, Verdana, sans-serif; + text-align:center; + padding:0.25em; + background: url("images/dpHorizLine.gif") bottom left repeat-x; +} + +.calendarBodyContainer tbody tr td { + color:#fff; + font:bold 0.7em Helvetica, Arial, Verdana, sans-serif; + text-align:center; + padding:0.4em; + background: url("images/dpVertLine.gif") top right repeat-y; + cursor:pointer; + cursor:hand; +} + + +.monthWrapper { + padding-bottom:2px; + background: url("images/dpHorizLine.gif") bottom left repeat-x; +} + +.monthContainer { + width:100%; +} + +.monthLabelContainer { + text-align:center; + font:bold 0.75em Helvetica, Arial, Verdana, sans-serif; + background: url("images/dpMonthBg.png") repeat-x top left !important; + color:#293a4b; + padding:0.25em; +} + +.monthCurve { + width:12px; +} + +.monthCurveTL { + background: url("images/dpCurveTL.png") no-repeat top left !important; +} + +.monthCurveTR { + background: url("images/dpCurveTR.png") no-repeat top right !important; +} + + +.yearWrapper { + background: url("images/dpHorizLineFoot.gif") top left repeat-x; + padding-top:2px; +} + +.yearContainer { + width:100%; +} + +.yearContainer td { + background:url("images/dpYearBg.png") top left repeat-x; +} + +.yearContainer .yearLabel { + margin:0; + padding:0.45em 0 0.45em 0; + color:#fff; + font:bold 0.75em Helvetica, Arial, Verdana, sans-serif; + text-align:center; +} + +.curveBL { + background: url("images/dpCurveBL.png") bottom left no-repeat !important; + width:9px !important; + padding:0; + margin:0; +} + +.curveBR { + background: url("images/dpCurveBR.png") bottom right no-repeat !important; + width:9px !important; + padding:0; + margin:0; +} + + +.previousMonth { + background-color:#6782a8 !important; +} + +.currentMonth { +} + +.nextMonth { + background-color:#6782a8 !important; +} + +.currentDate { + text-decoration:underline; + font-style:italic; +} + +.selectedItem { + background-color:#fff !important; + color:#6782a8 !important; +} + +.yearLabel .selectedYear { + padding:0.2em; + background-color:#9ec3fb !important; +} + +.nextYear, .previousYear { + cursor:pointer;cursor:hand; + margin:0 0.55em; +} + +.incrementControl { + cursor:pointer;cursor:hand; + width:1em; +} + +.increase { + float:right; +} + +.decrease { + float:left; +} + +.lastColumn { + background-image:none !important; +} + + diff --git a/public/javascripts/dojo/src/widget/templates/HtmlDatePicker.html b/public/javascripts/dojo/src/widget/templates/HtmlDatePicker.html new file mode 100644 index 0000000..c4d15be --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlDatePicker.html @@ -0,0 +1,141 @@ +
+ + + + + + + + + + + + + + + + +
+ + + + + + +
+ + ↓ + + + ↓ + + + ↑ + + + ↑ + + July +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+

+ + + +

+
+
+ +
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlDialog.html b/public/javascripts/dojo/src/widget/templates/HtmlDialog.html new file mode 100644 index 0000000..e7b8050 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlDialog.html @@ -0,0 +1,13 @@ +
+ + + +
+ + + +
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlDocPane.css b/public/javascripts/dojo/src/widget/templates/HtmlDocPane.css new file mode 100644 index 0000000..e824775 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlDocPane.css @@ -0,0 +1,49 @@ +.dojoDocPane { padding:1em; font: 1em Georgia,Times,"Times New Roman",serif; } + +.dojoDocPane .container{ } + +.dojoDocPane .dialog{ } +.dojoDocPane .dialog .container{ padding: 0.5em; background: #fff; border: 2px solid #333; } +.dojoDocPane .dialog .docDialog{ background: transparent; width: 20em; } +.dojoDocPane .dialog .docDialog h2{ margin-top: 0; padding-top: 0; } +.dojoDocPane .dialog .docDialog input { float: right; margin-right: 1em; } +.dojoDocPane .dialog .docDialog p{ clear: both; } +#dojoDocUserName, #dojoDocPassword { width: 10em; } + +.dojoDocPane .nav{ } +.dojoDocPane .nav span{ } + +.dojoDocPane .detail{ } +.dojoDocPane .detail h1{ } +.dojoDocPane .detail h1 span.fn{ } +.dojoDocPane .detail .description{ } +.dojoDocPane .detail .params{ } +.dojoDocPane .detail .params .row{ } +.dojoDocPane .detail .params .row span{ } +.dojoDocPane .detail .variables{ } +.dojoDocPane .detail .variables .row{ } +.dojoDocPane .detail .signature{ } +.dojoDocPane .detail .signature .source{ white-space: pre; font: 0.8em Monaco, Courier, "Courier New", monospace; } +.dojoDocPane .detail .signature .source .return{ color:#369; } +.dojoDocPane .detail .signature .source .function{ color: #98543F; font-weight: bold; } +.dojoDocPane .detail .signature .source .params{ } +.dojoDocPane .detail .signature .source .params .type{ font-style: italic; color: #d17575; } +.dojoDocPane .detail .signature .source .params .name{ color: #d14040; } + +.dojoDocPane .result{ } +.dojoDocPane .result h1{ } +.dojoDocPane .result .row{ } +.dojoDocPane .result .row .summary{ } + +.dojoDocPane .package{ } +.dojoDocPane .package h1{ } +.dojoDocPane .package .row{ } +.dojoDocPane .package .row .summary{ } +.dojoDocPane .package .description{ } +.dojoDocPane .package .methods{ } +.dojoDocPane .package .methods h2{ } +.dojoDocPane .package .methods .row{ } +.dojoDocPane .package .methods .row .description{ } +.dojoDocPane .package .requires{ } +.dojoDocPane .package .requires h2{ } +.dojoDocPane .package .requires .row{ } diff --git a/public/javascripts/dojo/src/widget/templates/HtmlDocPane.html b/public/javascripts/dojo/src/widget/templates/HtmlDocPane.html new file mode 100644 index 0000000..06134e8 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlDocPane.html @@ -0,0 +1,79 @@ +
+
+ +
+
+
+

Log In

+

+

+

+

+
+
+
+ + + +
+

Detail: dojo.select

+
Description
+
+

Parameters

+
+ optional + type + variable + - +
+
+
+

Variables

+
+ variable - +
+
+
+

Signature

+
+ returnType + foo + ( + type + paramName + ) +
+
+
+ +
+

Search Results: 0 matches

+
+ dojo.fnLink + - summary +
+
+ +
+

Package: + dojo.package + [edit] + [save] +

+
Description
+
+

Methods

+
+ method + - +
+
+
+

Requires

+
+

Environment

+ +
+
+
+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlDropDownButtonTemplate.html b/public/javascripts/dojo/src/widget/templates/HtmlDropDownButtonTemplate.html new file mode 100644 index 0000000..a14822e --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlDropDownButtonTemplate.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbar.css b/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbar.css new file mode 100644 index 0000000..abdf7df --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbar.css @@ -0,0 +1,138 @@ +.StyleDropdownContainer { + position: absolute; + z-index: 1000; + overflow: auto; + cursor: default; + width: 250px; + height: 250px; + background-color: white; + border: 1px solid black; +} + +.ColorDropdownContainer { + position: absolute; + z-index: 1000; + overflow: auto; + cursor: default; + width: 250px; + height: 150px; + background-color: white; + border: 1px solid black; +} + +.EditorToolbarDomNode { + background-image: url(buttons/bg-fade.png); + background-repeat: repeat-x; + background-position: 0px -50px; +} + +.EditorToolbarSmallBg { + background-image: url(images/toolbar-bg.gif); + background-repeat: repeat-x; + background-position: 0px 0px; +} + +/* +body { + background:url(images/blank.gif) fixed; +}*/ + +.IEFixedToolbar { + position:absolute; + /* top:0; */ + top: expression(eval((document.documentElement||document.body).scrollTop)); +} + +div.bigIcon { + width: 40px; + height: 40px; + /* background-color: white; */ + /* border: 1px solid #a6a7a3; */ + font-family: Verdana, Trebuchet, Tahoma, Arial; +} + +.iconContainer { + font-family: Verdana, Trebuchet, Tahoma, Arial; + font-size: 13px; + float: left; + height: 18px; + display: block; + /* background-color: white; */ + /* border: 1px solid white; */ + /* border: 1px solid #a6a7a3; */ + padding-right: 3px; + cursor: pointer; + border: 1px solid transparent; + _border: none; +} + +span.icon { + display: block; + text-align: center; + min-width: 18px; + width: 18px; + height: 18px; + /* background-color: #a6a7a3; */ + background-repeat: no-repeat; + background-image: url(buttons/aggregate.gif); +} + + +span.icon[class~=icon] { +} + +.headingContainer { + width: 150px; + height: 30px; + margin: 0px; + /* padding-left: 5px; */ + overflow: hidden; + line-height: 25px; + border-bottom: 1px solid black; + border-top: 1px solid white; +} + +.EditorToolbarDomNode select { + font-size: 14px; +} + +.sep { width: 5px; min-width: 5px; max-width: 5px; background-position: 0px 0px} +.backcolor { background-position: -18px 0px} +.bold { background-position: -36px 0px} +.cancel { background-position: -54px 0px} +.copy { background-position: -72px 0px} +.createlink { background-position: -90px 0px} +.cut { background-position: -108px 0px} +.delete { background-position: -126px 0px} +.forecolor { background-position: -144px 0px} +.hilitecolor { background-position: -162px 0px} +.indent { background-position: -180px 0px} +.inserthorizontalrule { background-position: -198px 0px} +.insertimage { background-position: -216px 0px} +.insertorderedlist { background-position: -234px 0px} +.inserttable { background-position: -252px 0px} +.insertunorderedlist { background-position: -270px 0px} +.italic { background-position: -288px 0px} +.justifycenter { background-position: -306px 0px} +.justifyfull { background-position: -324px 0px} +.justifyleft { background-position: -342px 0px} +.justifyright { background-position: -360px 0px} +.left_to_right { background-position: -378px 0px} +.list_bullet_indent { background-position: -396px 0px} +.list_bullet_outdent { background-position: -414px 0px} +.list_num_indent { background-position: -432px 0px} +.list_num_outdent { background-position: -450px 0px} +.outdent { background-position: -468px 0px} +.paste { background-position: -486px 0px} +.redo { background-position: -504px 0px} +.removeformat { background-position: -522px 0px} +.right_to_left { background-position: -540px 0px} +.save { background-position: -558px 0px} +.space { background-position: -576px 0px} +.strikethrough { background-position: -594px 0px} +.subscript { background-position: -612px 0px} +.superscript { background-position: -630px 0px} +.underline { background-position: -648px 0px} +.undo { background-position: -666px 0px} +.wikiword { background-position: -684px 0px} + diff --git a/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbar.html b/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbar.html new file mode 100644 index 0000000..4e32fba --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbar.html @@ -0,0 +1,152 @@ +
+ + + + + + + + + + + + +
+
+ + W + +
+
+
+ + S + +
+ +
+ + +   copy + + + +   + + +   + + +   + + +   + + +   + + +   + +
+ + +   paste + + + +   undo + + +   redo + +
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbarOneline.html b/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbarOneline.html new file mode 100644 index 0000000..2927e22 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlEditorToolbarOneline.html @@ -0,0 +1,274 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +   + + + + +   + + + + + +   + + + + +   + + + + + + + + + +   + + + + + + + +   + + + + +   + + + + +   + + + + +   + + + + +   + + + + + + + + + +   + + + + +   + + + + + + + + + +   + + + + +   + + + + + + + + + +   + + + + + +   + + + + + + + + + + +   + + + + +   + + + + +   + + + + +   + + + + +  
+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlFisheyeList.css b/public/javascripts/dojo/src/widget/templates/HtmlFisheyeList.css new file mode 100644 index 0000000..749141e --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlFisheyeList.css @@ -0,0 +1,27 @@ +.dojoHtmlFisheyeListItemLabel { + font-family: Arial, Helvetica, sans-serif; + background-color: #eee; + border: 2px solid #666; + padding: 2px; + text-align: center; + position: absolute; + display: none; +} + +.dojoHtmlFisheyeListItemLabel.selected { + display: block; +} + +.dojoHtmlFisheyeListItemImage { + border: 0px; + position: absolute; +} + +.dojoHtmlFisheyeListItem { + position: absolute; + z-index: 2; +} + +.dojoHtmlFisheyeListBar { + position: relative; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlFloatingPane.css b/public/javascripts/dojo/src/widget/templates/HtmlFloatingPane.css new file mode 100644 index 0000000..1042a19 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlFloatingPane.css @@ -0,0 +1,118 @@ + +/********** Outer Window ***************/ + +.dojoFloatingPane { + /* essential css */ + position: absolute; + overflow: visible; /* so drop shadow is displayed */ + z-index: 10; + + /* styling css */ + border: 1px solid; + border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight; + background-color: ThreeDFace; +} + + +/********** Title Bar ****************/ + +.dojoFloatingPaneTitleBar { + vertical-align: top; + margin: 2px 2px 2px 2px; + z-index: 10; + background-color: #7596c6; + cursor: default; + overflow: hidden; + border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight; + vertical-align: middle; +} + +.dojoFloatingPaneTitleText { + float: left; + padding: 2px 4px 2px 2px; + white-space: nowrap; + color: CaptionText; + font: small-caption; +} + +.dojoTitleBarIcon { + float: left; + height: 22px; + width: 22px; + vertical-align: middle; + margin-right: 5px; + margin-left: 5px; +} + +.dojoFloatingPaneActions{ + float: right; + position: absolute; + right: 2px; + top: 2px; + vertical-align: middle; +} + + +.dojoFloatingPaneActionItem { + vertical-align: middle; + margin-right: 1px; + height: 22px; + width: 22px; +} + + +.dojoFloatingPaneTitleBarIcon { + /* essential css */ + float: left; + + /* styling css */ + margin-left: 2px; + margin-right: 4px; + height: 22px; +} + +/* minimize/maximize icons are specified by CSS only */ +.dojoFloatingPaneMinimizeIcon, +.dojoFloatingPaneMaximizeIcon, +.dojoFloatingPaneRestoreIcon, +.dojoFloatingPaneCloseIcon { + vertical-align: middle; + height: 22px; + width: 22px; + float: right; +} +.dojoFloatingPaneMinimizeIcon { + background-image: url(images/floatingPaneMinimize.gif); +} +.dojoFloatingPaneMaximizeIcon { + background-image: url(images/floatingPaneMaximize.gif); +} +.dojoFloatingPaneRestoreIcon { + background-image: url(images/floatingPaneRestore.gif); +} +.dojoFloatingPaneCloseIcon { + background-image: url(images/floatingPaneClose.gif); +} + +/* bar at bottom of window that holds resize handle */ +.dojoFloatingPaneResizebar { + z-index: 10; + height: 13px; + background-color: ThreeDFace; +} + +/************* Client Area ***************/ + +.dojoFloatingPaneClient { + position: relative; + z-index: 10; + border: 1px solid; + border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow; + margin: 2px; + background-color: ThreeDFace; + padding: 8px; + font-family: Verdana, Helvetica, Garamond, sans-serif; + font-size: 12px; + overflow: auto; +} + diff --git a/public/javascripts/dojo/src/widget/templates/HtmlFloatingPane.html b/public/javascripts/dojo/src/widget/templates/HtmlFloatingPane.html new file mode 100644 index 0000000..07e81ed --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlFloatingPane.html @@ -0,0 +1,18 @@ +
+ + +
+ + +
\ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlInlineEditBox.css b/public/javascripts/dojo/src/widget/templates/HtmlInlineEditBox.css new file mode 100644 index 0000000..f4dde8b --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlInlineEditBox.css @@ -0,0 +1,24 @@ +.editLabel { + font-size : small; + padding : 0 5px; + display : none; +} + +.editableRegion { + background-color : #ffc !important; + cursor : pointer; + _cursor : hand; +} + +.editableRegion .editLabel { + display : inline; +} + +.editableTextareaRegion .editLabel { + display : block; +} + +.inlineEditBox { + /*background-color : #ffc;*/ + display : inline; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlInlineEditBox.html b/public/javascripts/dojo/src/widget/templates/HtmlInlineEditBox.html new file mode 100644 index 0000000..7eb0227 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlInlineEditBox.html @@ -0,0 +1,6 @@ + diff --git a/public/javascripts/dojo/src/widget/templates/HtmlMenu2.css b/public/javascripts/dojo/src/widget/templates/HtmlMenu2.css new file mode 100644 index 0000000..fb83d78 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlMenu2.css @@ -0,0 +1,179 @@ + +.dojoPopupMenu2 { + position: absolute; + border: 1px solid #7298d0; + background:#a9ccfe url(images/soriaMenuBg.gif) repeat-x bottom left !important; + padding: 1px; + margin-top: 1px; + margin-bottom: 1px; +} + +.dojoMenuItem2, .dojoMenuItem2 span span { + white-space: nowrap; + font: menu; + margin: 0; +} + +.dojoMenuItem2 span { + margin: 0; + padding-right:5px; +} + +.dojoMenuItem2Hover { + background-color: #D2E4FD; + cursor:pointer; + cursor:hand; +} + +.dojoMenuItem2Icon { + position: relative; + background-position: center center; + background-repeat: no-repeat; + z-index: 1; + width: 16px; + height: 16px; +} + +.dojoMenuItem2Label { + position: relative; + vertical-align: middle; + z-index: 1; +} + +/* main label text */ +.dojoMenuItem2Label span { + position: relative; + vertical-align: middle; + z-index: 2; +} + +/* label shadow text */ +.dojoMenuItem2Label span span { + position: absolute; + display: none; + left: 1px; + top: 1px; + z-index: -2; +} + +.dojoMenuItem2Accel { + position: relative; + vertical-align: middle; + z-index: 1; +} + +/* accelerator string */ +.dojoMenuItem2Accel span { + position: relative; + vertical-align: middle; + z-index: 2; +} + +/* accelerator string shadow */ +.dojoMenuItem2Accel span span { + position: absolute; + display: none; + left: 1px; + top: 1px; + z-index: -2; +} + +.dojoMenuItem2Disabled .dojoMenuItem2Label span, +.dojoMenuItem2Disabled .dojoMenuItem2Accel span { + color: #607a9e; +} + +.dojoMenuItem2Disabled .dojoMenuItem2Label span span, +.dojoMenuItem2Disabled .dojoMenuItem2Accel span span { + display: block; +} + +.dojoMenuItem2Hover .dojoMenuItem2Label span span, +.dojoMenuItem2Hover .dojoMenuItem2Accel span span { + display: none; +} + +.dojoMenuItem2Submenu { + position: relative; + background-position: center center; + background-repeat: no-repeat; + background-image: url(images/submenu_off.gif); + width: 5px; + height: 9px; +} +.dojoMenuItem2Hover .dojoMenuItem2Submenu { + background-image: url(images/submenu_on.gif); +} + +.dojoMenuSeparator2 { + font-size: 1px; + margin: 0; +} + +.dojoMenuSeparator2Top { + height: 50%; + border-bottom: 1px solid #7996c1; + margin: 0px 2px; + font-size: 1px; +} + +.dojoMenuSeparator2Bottom { + height: 50%; + border-top: 1px solid #e3eeff; + margin: 0px 2px; + font-size: 1px; +} + +.dojoMenuBar2 { + /*position: relative;*/ + background:#a9ccfe url(images/soriaBarBg.gif) repeat-x bottom left; + border-bottom:1px solid #405067; + border-top:1px solid #708bb3; +} + +.dojoMenuBar2Client { + padding: 1px; +} + +.dojoMenuBarItem2 { + white-space: nowrap; + font: menu; + margin: 0; + position: relative; + vertical-align: middle; + z-index: 1; + padding: 3px 8px; +} + +.dojoMenuBarItem2 span { + margin: 0; + position: relative; + z-index: 2; + cursor:pointer; + cursor:hand; +} + +.dojoMenuBarItem2 span span { + position: absolute; + display: none; + left: 1px; + top: 1px; + z-index: -2; +} + +.dojoMenuBarItem2Hover { + background-color:#d2e4fd; +} + +.dojoMenuBarItem2Disabled span { + color: #4f6582; +} + +.dojoMenuBarItem2Disabled span span { + display: block; +} + +.dojoMenuBarItem2Hover span span, +.dojoMenuBarItem2Hover span span { + display: none; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlMenuItemTemplate.html b/public/javascripts/dojo/src/widget/templates/HtmlMenuItemTemplate.html new file mode 100644 index 0000000..36249b1 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlMenuItemTemplate.html @@ -0,0 +1,2 @@ +
+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlMonthlyCalendar.css b/public/javascripts/dojo/src/widget/templates/HtmlMonthlyCalendar.css new file mode 100644 index 0000000..c646902 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlMonthlyCalendar.css @@ -0,0 +1,91 @@ +.datePickerContainer { + margin:0.5em 2em 0.5em 0; + /*width:10em;*/ + float:left; +} + +.previousMonth { + background-color:#bbbbbb; +} + +.currentMonth { + background-color:#8f8f8f; +} + +.nextMonth { + background-color:#eeeeee; +} + +.currentDate { + text-decoration:underline; + font-style:italic; +} + +.selectedItem { + background-color:#3a3a3a; + color:#ffffff; +} + +.calendarContainer { + border-collapse:collapse; + border-spacing:0; + border-bottom:1px solid #e6e6e6; + overflow: hidden; + text-align: right; +} + +.calendarContainer thead{ + border-bottom:1px solid #e6e6e6; +} + +.calendarContainer tbody * td { + height: 100px; + border: 1px solid gray; +} + +.calendarContainer td { + width: 100px; + padding: 2px; + vertical-align: top; +} + +.monthLabel { + font-size:0.9em; + font-weight:400; + margin:0; + text-align:center; +} + +.monthLabel .month { + padding:0 0.4em 0 0.4em; +} + +.yearLabel { + font-size:0.9em; + font-weight:400; + margin:0.25em 0 0 0; + text-align:right; + color:#a3a3a3; +} + +.yearLabel .selectedYear { + color:#000; + padding:0 0.2em; +} + +.nextYear, .previousYear { + cursor:pointer;cursor:hand; +} + +.incrementControl { + cursor:pointer;cursor:hand; + width:1em; +} + +.dojoMonthlyCalendarEvent { + font-size:0.7em; + overflow: hidden; + font-color: grey; + white-space: nowrap; + text-align: left; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlMonthlyCalendar.html b/public/javascripts/dojo/src/widget/templates/HtmlMonthlyCalendar.html new file mode 100644 index 0000000..98ab4a6 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlMonthlyCalendar.html @@ -0,0 +1,110 @@ +
+

+ + + ↑ + + July + + ↓ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SundayMondayTuesdayWednesdayThursdayFridaySaturday
+

+ + + +

+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlResizableTextarea.css b/public/javascripts/dojo/src/widget/templates/HtmlResizableTextarea.css new file mode 100644 index 0000000..8f0cf23 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlResizableTextarea.css @@ -0,0 +1,15 @@ +div.statusBar { + background-color: ThreeDFace; + height: 28px; + padding: 1px; + overflow: hidden; + font-size: 12px; +} + +div.statusPanel { + background-color: ThreeDFace; + border: 1px solid; + border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow; + margin: 1px; + padding: 2px 6px; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlResizableTextarea.html b/public/javascripts/dojo/src/widget/templates/HtmlResizableTextarea.html new file mode 100644 index 0000000..88827f7 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlResizableTextarea.html @@ -0,0 +1,14 @@ +
+
+
+
+
+
drag to resize
+
+
+
+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlResizeHandle.css b/public/javascripts/dojo/src/widget/templates/HtmlResizeHandle.css new file mode 100644 index 0000000..661a86a --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlResizeHandle.css @@ -0,0 +1,12 @@ +.dojoHtmlResizeHandle { + float: right; + position: absolute; + right: 2px; + bottom: 2px; + width: 13px; + height: 13px; + z-index: 20; + cursor: nw-resize; + background-image: url(grabCorner.gif); + line-height: 0px; +} \ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlShow.css b/public/javascripts/dojo/src/widget/templates/HtmlShow.css new file mode 100644 index 0000000..6378bf1 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlShow.css @@ -0,0 +1,59 @@ +@media screen { + html, body { + margin: 0px; + padding: 0px; + width: 100%; + } + body { + display: none; + } + h1 { + font-size: 50px; + } + p, li { + font-size: 30px; + } + .dojoShowNav { + background: #369; + overflow: hidden; + position: absolute; + height: 5px; + bottom: 0px; + left: 0px; + width: 100%; + text-align: center; + } + .dojoShowNav input { + margin: 0px; + } + .dojoShowHider { + height: 5px; + overflow: hidden; + width: 100%; + } + .dojoShowPrint { + position: absolute; + left: 5px; + top: 0px; + } +} +@media print { + .dojoShow { + display: none !important; + } + .dojoShowPrint { + display: block !important; + } + .dojoShowPrintSlide { + border: 1px solid #aaa; + padding: 10px; + margin-bottom: 15px; + } + .dojoShowPrintSlide, ul { + page-break-inside: avoid; + } + h1 { + margin-top: 0; + page-break-after: avoid; + } +} \ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlShow.html b/public/javascripts/dojo/src/widget/templates/HtmlShow.html new file mode 100644 index 0000000..c7610fe --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlShow.html @@ -0,0 +1,11 @@ +
+
+
+
+ < + + > +
+
\ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlShowSlide.css b/public/javascripts/dojo/src/widget/templates/HtmlShowSlide.css new file mode 100644 index 0000000..6e55c82 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlShowSlide.css @@ -0,0 +1,12 @@ +.dojoShowSlideTitle { + height: 100px; + background: #369; +} +.dojoShowSlideTitle h1 { + margin-top: 0; + line-height: 100px; + margin-left: 30px; +} +.dojoShowSlideBody { + margin: 15px; +} \ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlShowSlide.html b/public/javascripts/dojo/src/widget/templates/HtmlShowSlide.html new file mode 100644 index 0000000..5a49586 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlShowSlide.html @@ -0,0 +1,6 @@ +
+
+

Title

+
+
+
\ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSimpleDropdownButtons.css b/public/javascripts/dojo/src/widget/templates/HtmlSimpleDropdownButtons.css new file mode 100644 index 0000000..e72afbd --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSimpleDropdownButtons.css @@ -0,0 +1,100 @@ +ul.dojoSimpleDropdownButtons { + margin : 0; + padding : 5px 0; +} + +ul.dojoSimpleDropdownButtons li { + display : inline; + margin-right : 5px; + padding : 2px 0; +} + +ul.dojoSimpleDropdownButtons li a { + padding : 2px 9px; + border : 2px outset #ccc; + border-right-width : 1px; + background : #f4f4f4; + color : #333; + text-decoration : none; +} + +ul.dojoSimpleDropdownButtons li ul { + display : none; +} + +ul.dojoSimpleDropdownButtons li a.disabled { + color : #999; + cursor : default; +} + +ul.dojoSimpleDropdownButtons li .downArrow { + display : inline; + padding : 2px 4px; + border : 2px outset #ccc; + border-left : 0; + background : #f4f4f4 url(images/dropdownButtonsArrow.gif) no-repeat 4px 9px; + text-decoration : none; + color : black; + cursor : pointer; + _cursor : hand; +} + +ul.dojoSimpleDropdownButtons li .downArrow.disabled { + background-image : url(images/dropdownButtonsArrow-disabled.gif); + cursor : default; +} + +ul.dojoSimpleDropdownButtons li a:hover, +ul.dojoSimpleDropdownButtons li span.downArrow:hover { + color : black; + background-color : #ddd; +} + +ul.dojoSimpleDropdownButtons li .downArrow.pressed, ul.dojoSimpleDropdownButtons li .downArrow:focus { + border-style : inset; + background-position : 5px 10px; + padding : 2px 4px; +} + +ul.dojoSimpleDropdownButtons li a.disabled:hover, +ul.dojoSimpleDropdownButtons li span.downArrow.disabled:hover { + color : #999; + background-color : #f4f4f4; +} + +ul.dojoSimpleDropdownButtons li a:focus { + padding : 3px 8px 1px 10px; + color : #333; + border-style : inset; +} + +/* Menu + ******************** */ +ul.dojoSimpleDropdownButtonsMenu { + position : absolute; + margin : 0; + _margin : -2px; + padding : 0; + display : none; + border : 1px solid #aaa; + background : #f4f4f4; + list-style : none; + z-index : 99; +} + +ul.dojoSimpleDropdownButtonsMenu li { + _display : inline; +} + +ul.dojoSimpleDropdownButtonsMenu a { + display : block; + padding : 2px 5px; + color : #333; + text-decoration : none; +} + +ul.dojoSimpleDropdownButtonsMenu a:hover { + background : #ddd; + color : black; +} + diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSlideShow.css b/public/javascripts/dojo/src/widget/templates/HtmlSlideShow.css new file mode 100644 index 0000000..02e97cd --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSlideShow.css @@ -0,0 +1,9 @@ +.slideShowImg { + position: absolute; + left: 0px; + top: 0px; + border: 2px solid #4d4d4d; + padding: 0px; + margin: 0px; +} + diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSlideShow.html b/public/javascripts/dojo/src/widget/templates/HtmlSlideShow.html new file mode 100644 index 0000000..93b836b --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSlideShow.html @@ -0,0 +1,15 @@ +
+
+ +
+
+ + +
+
\ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSlider.css b/public/javascripts/dojo/src/widget/templates/HtmlSlider.css new file mode 100644 index 0000000..7407aac --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSlider.css @@ -0,0 +1,61 @@ +.sliderMain { + border: 0px !important; + border-spacing: 0px !important; + line-height: 0px !important; + padding: 0px !important; + display: -moz-inline-table !important; + display: inline !important; + -moz-user-focus: normal !important; +} + +.sliderComponent { + border: 0px; + padding: 0px; + margin: 0px; +} + +.sliderHandle { + top: 0px; + left: 0px; + z-index: 1000; + position: absolute !important; +} + +.sliderOutsetButton { + border-style: outset; + border-width: 0px 1px 1px 0px; + border-color: black; +} + +.sliderInsetButton { + border-style: inset; + border-width: 1px 0px 0px 1px; + border-color: black; +} + +.sliderButtonY { + margin: 0px; + padding: 0px; + z-index: 900; +} + +.sliderButtonX { + margin: 0px; + padding: 0px; + z-index: 900; +} + +.sliderBackground { + z-index: 0; + display: block !important; + position: relative !important; +} + +.sliderProgressBackground { + z-index: 800; + position: absolute !important; + clip: rect(0px,0px,0px,0px); +} + +.sliderBackgroundSizeOnly { +} \ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSlider.html b/public/javascripts/dojo/src/widget/templates/HtmlSlider.html new file mode 100644 index 0000000..3280820 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSlider.html @@ -0,0 +1,54 @@ +
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSliderHorizontal.html b/public/javascripts/dojo/src/widget/templates/HtmlSliderHorizontal.html new file mode 100644 index 0000000..0b6da69 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSliderHorizontal.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSliderVertical.html b/public/javascripts/dojo/src/widget/templates/HtmlSliderVertical.html new file mode 100644 index 0000000..d077d33 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSliderVertical.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSpinner.css b/public/javascripts/dojo/src/widget/templates/HtmlSpinner.css new file mode 100644 index 0000000..7c22315 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSpinner.css @@ -0,0 +1,34 @@ +/* inline the table holding the and buttons (method varies by browser) */ +.ie .dojoSpinner, .safari .dojoSpinner { + display: inline; +} + +.moz .dojoSpinner { + display: -moz-inline-box; +} + +.opera .dojoSpinner { + display: inline-table; +} + +/* generic stuff for the table */ +.dojoSpinner td { + padding:0px; + margin:0px; + vertical-align: middle; +} +table.dojoSpinner { + border:0px; + border-spacing:0px; + line-height:0px; + padding:0px; + margin: 0px; + vertical-align: middle; +} + +/* the buttons */ +.dojoSpinner img { + display: block; + border-width:0px 1px 1px 0px; + border-style:outset; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSpinner.html b/public/javascripts/dojo/src/widget/templates/HtmlSpinner.html new file mode 100644 index 0000000..07b15ea --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSpinner.html @@ -0,0 +1,24 @@ + + + + + +
+ + + + +
${this.invalidMessage}${this.missingMessage}${this.rangeMessage}
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlSplitContainer.css b/public/javascripts/dojo/src/widget/templates/HtmlSplitContainer.css new file mode 100644 index 0000000..43b54bb --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlSplitContainer.css @@ -0,0 +1,39 @@ +.dojoSplitContainer{ + position: relative; + overflow: hidden; +} + +.dojoSplitPane{ + position: absolute; +} + +.dojoSplitContainerSizerH, +.dojoSplitContainerSizerV { + font-size: 1px; + cursor: move; + cursor: w-resize; + background-color: ThreeDFace; + border: 1px solid; + border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight; + margin: 0; +} + +.dojoSplitContainerSizerV { + cursor: n-resize; +} + +.dojoSplitContainerVirtualSizerH, +.dojoSplitContainerVirtualSizerV { + font-size: 1px; + cursor: move; + cursor: w-resize; + background-color: ThreeDShadow; + -moz-opacity: 0.5; + opacity: 0.5; + filter: Alpha(Opacity=50); + margin: 0; +} + +.dojoSplitContainerVirtualSizerV { + cursor: n-resize; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlTabContainer.css b/public/javascripts/dojo/src/widget/templates/HtmlTabContainer.css new file mode 100644 index 0000000..e15bd8f --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlTabContainer.css @@ -0,0 +1,181 @@ +.dojoTabContainer { + position : relative; +} + +.dojoTabPaneWrapper { + position : relative; + border : 1px solid #6290d2; + clear: both; + _zoom: 1; /* force IE6 layout mode so top border doesnt disappear */ +} + +.dojoTabLabels-top { + position : absolute; + top : 0px; + left : 0px; + overflow : visible; + margin-bottom : -1px; + width : 100%; + z-index: 2; /* so the bottom of the tab label will cover up the border of dojoTabPaneWrapper */ +} + +.dojoTabNoLayout.dojoTabLabels-top { + position : relative; +} + +.dojoTabNoLayout.dojoTabLabels-top .dojoTabPaneTab { + margin-bottom: -1px; + _margin-bottom: 0px; /* IE filter so top border lines up correctly */ +} + +.dojoTabPaneTab { + position : relative; + float : left; + padding-left : 9px; + border-bottom : 1px solid #6290d2; + background : url(images/tab_left.gif) no-repeat left top; + cursor: pointer; + white-space: nowrap; + z-index: 3; +} + +.dojoTabPaneTab div { + display : block; + padding : 4px 15px 4px 6px; + background : url(images/tab_top_right.gif) no-repeat right top; + color : #333; + font-size : 90%; +} + +.dojoTabPanePaneClose { + position : absolute; + bottom : 0px; + right : 6px; + height : 12px; + width : 12px; + background : url(images/tab_close.gif) no-repeat right top; +} + +.dojoTabPanePaneCloseHover { + background-image : url(images/tab_close_h.gif); +} + +.dojoTabPaneTabClose { + display : inline-block; + height : 12px; + width : 12px; + padding : 0 12px 0 0; + margin : 0 -10px 0 10px; + background : url(images/tab_close.gif) no-repeat right top; + cursor : default; +} + +.dojoTabPaneTabCloseHover { + background-image : url(images/tab_close_h.gif); +} + +.dojoTabPaneTab.current { + padding-bottom : 1px; + border-bottom : 0; + background-position : 0 -150px; +} + +.dojoTabPaneTab.current div { + padding-bottom : 5px; + margin-bottom : -1px; + background-position : 100% -150px; +} + +/* bottom tabs */ + +.dojoTabLabels-bottom { + position : absolute; + bottom : 0px; + left : 0px; + overflow : visible; + margin-top : -1px; + width : 100%; + z-index: 2; +} + +.dojoTabNoLayout.dojoTabLabels-bottom { + position : relative; +} + +.dojoTabLabels-bottom .dojoTabPaneTab { + border-top : 1px solid #6290d2; + border-bottom : 0; + background : url(images/tab_bot_left.gif) no-repeat left bottom; +} + +.dojoTabLabels-bottom .dojoTabPaneTab div { + background : url(images/tab_bot_right.gif) no-repeat right bottom; +} + +.dojoTabLabels-bottom .dojoTabPaneTab.current { + border-top : 0; + background : url(images/tab_bot_left_curr.gif) no-repeat left bottom; +} + +.dojoTabLabels-bottom .dojoTabPaneTab.current div { + padding-top : 4px; + background : url(images/tab_bot_right_curr.gif) no-repeat right bottom; +} + +/* right-h tabs */ + +.dojoTabLabels-right-h { + position : absolute; + top : 0px; + right : 0px; + overflow : visible; + margin-left : -1px; + z-index: 2; +} + +.dojoTabLabels-right-h .dojoTabPaneTab { + padding-left : 0; + border-left : 1px solid #6290d2; + border-bottom : 0; + background : url(images/tab_bot_right.gif) no-repeat right bottom; + float : none; +} + +.dojoTabLabels-right-h .dojoTabPaneTab div { + padding : 4px 15px 4px 15px; +} + +.dojoTabLabels-right-h .dojoTabPaneTab.current { + border-left : 0; + border-bottom : 1px solid #6290d2; +} + +/* left-h tabs */ + +.dojoTabLabels-left-h { + position : absolute; + top : 0px; + left : 0px; + overflow : visible; + margin-right : -1px; + z-index: 2; +} + +.dojoTabLabels-left-h .dojoTabPaneTab { + border-right : 1px solid #6290d2; + border-bottom : 0; + float : none; + background : url(images/tab_top_left.gif) no-repeat left top; +} + +.dojoTabLabels-left-h .dojoTabPaneTab.current { + border-right : 0; + border-bottom : 1px solid #6290d2; + padding-bottom : 0; + background : url(images/tab_top_left.gif) no-repeat 0 -150px; +} + +.dojoTabLabels-left-h .dojoTabPaneTab div { + background : 0; + border-bottom : 1px solid #6290d2; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlTabContainer.html b/public/javascripts/dojo/src/widget/templates/HtmlTabContainer.html new file mode 100644 index 0000000..2a978f1 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlTabContainer.html @@ -0,0 +1,4 @@ +
+
+
+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlTaskBar.css b/public/javascripts/dojo/src/widget/templates/HtmlTaskBar.css new file mode 100644 index 0000000..5f55a7c --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlTaskBar.css @@ -0,0 +1,29 @@ +.dojoTaskBarItem { + display: inline-block; + background-color: ThreeDFace; + border: outset 2px; + margin-right: 5px; + cursor: pointer; + height: 35px; + width: 100px; + font-size: 10pt; + white-space: nowrap; + text-align: center; + float: left; + overflow: hidden; +} + +.dojoTaskBarItem img { + vertical-align: middle; + margin-right: 5px; + margin-left: 5px; + height: 32px; + width: 32px; +} + +.dojoTaskBarItem a { + color: black; + text-decoration: none; +} + + diff --git a/public/javascripts/dojo/src/widget/templates/HtmlTaskBarItemTemplate.html b/public/javascripts/dojo/src/widget/templates/HtmlTaskBarItemTemplate.html new file mode 100644 index 0000000..aeb19d6 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlTaskBarItemTemplate.html @@ -0,0 +1,2 @@ +
+
\ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/HtmlTimePicker.css b/public/javascripts/dojo/src/widget/templates/HtmlTimePicker.css new file mode 100644 index 0000000..00bc2e9 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlTimePicker.css @@ -0,0 +1,179 @@ +/*Time Picker */ +.timePickerContainer { + width:10em; + font-family:Tahoma, Myriad, Helvetica, Arial, Verdana, sans-serif; + font-size:16px; +} + +.timeContainer { + border-collapse:collapse; + border-spacing:0; +} + +.timeContainer thead { + color:#293a4b; + font-size:0.9em; + font-weight:700; +} + +.timeContainer thead td { + padding:0.25em; + font-size:0.80em; + border-bottom:1px solid #6782A8; +} + +.timeCorner { + width:10px; +} + +.cornerTopLeft { + background: url("images/dpCurveTL.png") top left no-repeat; +} + +.cornerTopRight { + background: url("images/dpCurveTR.png") top right no-repeat; +} + +.timeLabelContainer { + background: url("images/dpMonthBg.png") top left repeat-x; +} + +.hours, .minutes, .timeBorder { + background: #7591bc url("images/dpBg.gif") top left repeat-x; + +} + +.hours td, .minutes td { + padding:0.2em; + text-align:center; + font-size:0.7em; + font-weight:bold; + cursor:pointer; + cursor:hand; + color:#fff; +} + +.minutes { + border-left:1px solid #f5d1db; +} + +.hours { + border-right:1px solid #6782A8; +} + +.hourSelector { + border-right:1px solid #6782A8; + padding:5px; + padding-right:10px; +} + +.minutesSelector { + padding:5px; + border-left:1px solid #f5c7d4; + text-align:center; +} + +.minutesHeading { + padding-left:9px !important; +} + +.timeOptions { + background-color:#F9C9D7; +} + +.timeContainer .cornerBottomLeft, .timeContainer .cornerBottomRight, .timeContainer .timeOptions { + border-top:1px solid #6782A8; +} + +.timeContainer .cornerBottomLeft { + background: url("images/dpCurveBL.png") bottom left no-repeat !important; + width:9px !important; + padding:0; + margin:0; +} + +.timeContainer .cornerBottomRight { + background: url("images/dpCurveBR.png") bottom right no-repeat !important; + width:9px !important; + padding:0; + margin:0; +} + +.timeOptions { + color:#fff; + background:url("images/dpYearBg.png") top left repeat-x; + +} + +.selectedItem { + background-color:#fff; + color:#6782a8 !important; +} + +.timeOptions .selectedItem { + color:#fff !important; + background-color:#9ec3fb !important; +} + +.anyTimeContainer { + text-align:center; + font-weight:bold; + font-size:0.7em; + padding:0.1em; + cursor:pointer; + cursor:hand; + color:#fff !important; +} + +.amPmContainer { + width:100%; +} + +.amPmContainer td { + text-align:center; + font-size:0.7em; + font-weight:bold; + cursor:pointer; + cursor:hand; + color:#fff; +} + + + +/*.timePickerContainer { + margin:1.75em 0 0.5em 0; + width:10em; + float:left; +} + +.timeContainer { + border-collapse:collapse; + border-spacing:0; +} + +.timeContainer thead td{ + border-bottom:1px solid #e6e6e6; + padding:0 0.4em 0.2em 0.4em; +} + +.timeContainer td { + font-size:0.9em; + padding:0 0.25em 0 0.25em; + text-align:left; + cursor:pointer;cursor:hand; +} + +.timeContainer td.minutesHeading { + border-left:1px solid #e6e6e6; + border-right:1px solid #e6e6e6; +} + +.timeContainer .minutes { + border-left:1px solid #e6e6e6; + border-right:1px solid #e6e6e6; +} + +.selectedItem { + background-color:#3a3a3a; + color:#ffffff; +}*/ diff --git a/public/javascripts/dojo/src/widget/templates/HtmlTimePicker.html b/public/javascripts/dojo/src/widget/templates/HtmlTimePicker.html new file mode 100644 index 0000000..9458bc0 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlTimePicker.html @@ -0,0 +1,98 @@ +
+ + + + + + + + + + + + + + + + + + + + + +
 HourMinute 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
126
17
28
39
410
511
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
0030
0535
1040
1545
2050
2555
+
  + + + + + + + +
AMPM
+
+
any
+
 
+
diff --git a/public/javascripts/dojo/src/widget/templates/HtmlToaster.css b/public/javascripts/dojo/src/widget/templates/HtmlToaster.css new file mode 100644 index 0000000..b768002 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlToaster.css @@ -0,0 +1,42 @@ +.dojoToasterClip { + position: absolute; + overflow: hidden; +} + +.dojoToasterContainer { + display: block; + position: absolute; + width: 17.5em; + z-index: 5000; + margin: 0px; + font:0.75em Tahoma, Helvetica, Verdana, Arial; +} + +.dojoToasterContent{ + padding:1em; + padding-top:0.25em; + background:#73c74a; +} + +.dojoToasterMessage{ + color:#fff; +} +.dojoToasterWarning{ } +.dojoToasterError, +.dojoToasterFatal{ + font-weight:bold; + color:#fff; +} + + +.dojoToasterWarning .dojoToasterContent{ + padding:1em; + padding-top:0.25em; + background:#d4d943; +} + +.dojoToasterError .dojoToasterContent{ + padding:1em; + padding-top:0.25em; + background:#c46600; +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlToolbar.css b/public/javascripts/dojo/src/widget/templates/HtmlToolbar.css new file mode 100644 index 0000000..b5fe8d5 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlToolbar.css @@ -0,0 +1,54 @@ +.toolbarContainer { + border-bottom : 0; + background-color : #def; + color : ButtonText; + font : Menu; + background-image: url(images/toolbar-bg.gif); +} + +.toolbar { + padding : 2px 4px; + min-height : 26px; + _height : 26px; +} + +.toolbarItem { + float : left; + padding : 1px 2px; + margin : 0 2px 1px 0; + cursor : pointer; +} + +.toolbarItem.selected, .toolbarItem.down { + margin : 1px 1px 0 1px; + padding : 0px 1px; + border : 1px solid #bbf; + background-color : #fafaff; +} + +.toolbarButton img { + vertical-align : bottom; +} + +.toolbarButton span { + line-height : 16px; + vertical-align : middle; +} + +.toolbarButton.hover { + padding : 0px 1px; + border : 1px solid #99c; +} + +.toolbarItem.disabled { + opacity : 0.3; + filter : alpha(opacity=30); + cursor : default; +} + +.toolbarSeparator { + cursor : default; +} + +.toolbarFlexibleSpace { +} diff --git a/public/javascripts/dojo/src/widget/templates/HtmlTooltipTemplate.css b/public/javascripts/dojo/src/widget/templates/HtmlTooltipTemplate.css new file mode 100644 index 0000000..030be2a --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/HtmlTooltipTemplate.css @@ -0,0 +1,10 @@ +.dojoTooltip { + border: solid black 1px; + background: beige; + color: black; + position: absolute; + font-size: small; + padding: 2px 2px 2px 2px; + z-index: 10; + display: block; +} diff --git a/public/javascripts/dojo/src/widget/templates/Menu.css b/public/javascripts/dojo/src/widget/templates/Menu.css new file mode 100644 index 0000000..1419f6d --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/Menu.css @@ -0,0 +1,60 @@ +.dojoMenu { + border:1px solid #000000; + list-style-type:none; + margin:0; + padding:0; + padding-bottom: 1px; + background-color:#f4f4f4; + font-size: 8pt; +} + +.dojoMenuSeparator { + list-style-type:none; + margin:0; + padding:1px 0; + border-bottom:1px solid #000000; + line-height:1px; + height:1px; +} + +li:hover.dojoMenuSeparator { + background-color:#e5e5e5; + cursor:default; +} + + + + +.dojoContextMenu { + position: absolute; + display: none; + border: 2px solid; + border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight; + list-style-type: none; + margin: 0; + padding: 1px; + background-color: ThreeDFace; + font-size: 8pt; +} + +.dojoMenuItem { + white-space: nowrap; + padding: 2px; + font: menu; + color: WindowText; +} + +.dojoMenuItem a { + text-decoration: none; + color: WindowText; + font: inherit; +} + +.dojoMenuItemHover { + padding: 2px; + background-color: blue; + cursor: pointer; + _cursor: hand; + background-color: Highlight; + color: HighlightText; +} \ No newline at end of file diff --git a/public/javascripts/dojo/src/widget/templates/PopUpButton.css b/public/javascripts/dojo/src/widget/templates/PopUpButton.css new file mode 100644 index 0000000..37c5581 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/PopUpButton.css @@ -0,0 +1,35 @@ +.PopUpButton { + padding : 2px 6px 2px 9px; + border : 1px outset #ccc; + background : #f4f4f4; + color : #333; + text-decoration : none; +} + +.PopUpButton .downArrow { + margin-left: 0.5em; + margin-bottom: 2px; +} + +.downArrow.disabled { + background-image : url(images/dropdownButtonsArrow-disabled.gif); + cursor : default; +} + +ul.dropdownButtons li a:hover, +ul.dropdownButtons li span.downArrow:hover { + color : black; + background-color : #ddd; +} + +ul.dropdownButtons li .downArrow.pressed, ul.dropdownButtons li .downArrow:focus { + border-style : inset; + background-position : 5px 10px; + padding : 2px 4px; +} + +ul.dropdownButtons li a.disabled:hover, +ul.dropdownButtons li span.downArrow.disabled:hover { + color : #999; + background-color : #d2e4fd; +} diff --git a/public/javascripts/dojo/src/widget/templates/RemoteTabControl.css b/public/javascripts/dojo/src/widget/templates/RemoteTabControl.css new file mode 100644 index 0000000..c9f54e6 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/RemoteTabControl.css @@ -0,0 +1,61 @@ +.dojoRemoteTabController { + position: relative; +} + +.dojoRemoteTab { + position : relative; + float : left; + padding-left : 9px; + border-bottom : 1px solid #6290d2; + background : url(images/tab_left.gif) no-repeat left top; + cursor: pointer; + white-space: nowrap; + z-index: 3; +} + +.dojoRemoteTab div { + display : block; + padding : 4px 15px 4px 6px; + background : url(images/tab_top_right.gif) no-repeat right top; + color : #333; + font-size : 90%; +} + +.dojoRemoteTabPaneClose { + position : absolute; + bottom : 0px; + right : 6px; + height : 12px; + width : 12px; + background : url(images/tab_close.gif) no-repeat right top; +} + +.dojoRemoteTabPaneCloseHover { + background-image : url(images/tab_close_h.gif); +} + +.dojoRemoteTabClose { + display : inline-block; + height : 12px; + width : 12px; + padding : 0 12px 0 0; + margin : 0 -10px 0 10px; + background : url(images/tab_close.gif) no-repeat right top; + cursor : default; +} + +.dojoRemoteTabCloseHover { + background-image : url(images/tab_close_h.gif); +} + +.dojoRemoteTab.current { + padding-bottom : 1px; + border-bottom : 0; + background-position : 0 -150px; +} + +.dojoRemoteTab.current div { + padding-bottom : 5px; + margin-bottom : -1px; + background-position : 100% -150px; +} diff --git a/public/javascripts/dojo/src/widget/templates/Textbox.html b/public/javascripts/dojo/src/widget/templates/Textbox.html new file mode 100644 index 0000000..3b586fa --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/Textbox.html @@ -0,0 +1,5 @@ + + + diff --git a/public/javascripts/dojo/src/widget/templates/TitlePane.html b/public/javascripts/dojo/src/widget/templates/TitlePane.html new file mode 100644 index 0000000..4d57fe5 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/TitlePane.html @@ -0,0 +1,4 @@ +
+
+
+
diff --git a/public/javascripts/dojo/src/widget/templates/Tree.css b/public/javascripts/dojo/src/widget/templates/Tree.css new file mode 100644 index 0000000..0af721d --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/Tree.css @@ -0,0 +1,29 @@ +.dojoTree { + font: caption; + font-size: 11px; + font-weight: normal; + overflow: auto; +} + +.dojoTreeNodeLabel { + padding: 1px 2px; + color: WindowText; + cursor: default; +} + +.dojoTreeNodeLabel:hover { + text-decoration: underline; +} + +.dojoTreeNodeLabelSelected { + background-color: Highlight; + color: HighlightText; +} + +.dojoTree div { + white-space: nowrap; +} + +.dojoTree img { + vertical-align: middle; +} diff --git a/public/javascripts/dojo/src/widget/templates/TreeDocIcon.css b/public/javascripts/dojo/src/widget/templates/TreeDocIcon.css new file mode 100644 index 0000000..2ff33f3 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/TreeDocIcon.css @@ -0,0 +1,63 @@ + +/* CSS for TreeDocIconExtension */ + + +/* long vertical line under docIcon, connecting w/ children */ +.TreeChildrenYes.TreeExpandOpen .TreeContent { + background-image : url('../templates/images/TreeV3/i_long.gif'); + background-repeat : no-repeat; + background-position: 0px 9px; +} + +/* close has higher priority */ +.TreeChildrenYes.TreeExpandClosed .TreeContent { + background-image : url(); +} + +/* higher priotity: same length and appear after background-definition */ +.TreeChildrenNo.TreeExpandLeaf .TreeContent { + background-image : url(); +} + +.TreeChildrenNo.TreeExpandClosed .TreeContent { + background-image : url(); +} + +.TreeChildrenNo.TreeExpandOpen .TreeContent { + background-image : url(); +} + + +/* highest priority */ +.TreeIconDocument { + background-image: url('../templates/images/TreeV3/document.gif'); +} + +.TreeExpandOpen .TreeIconFolder { + background-image: url('../templates/images/TreeV3/open.gif'); +} + +.TreeExpandClosed .TreeIconFolder { + background-image: url('../templates/images/TreeV3/closed.gif'); +} + +/* generic class for docIcon */ +.TreeIcon { + width: 18px; + height: 18px; + float: left; + display: inline; + background-repeat : no-repeat; +} + +/* add padding to make some space in content for docIcon */ +.TreeContent { + padding-left: 18px; +} + +/* IE workaround */ +.TreeContentIE { + padding-left: 0px; +} + + diff --git a/public/javascripts/dojo/src/widget/templates/TreeV3.css b/public/javascripts/dojo/src/widget/templates/TreeV3.css new file mode 100644 index 0000000..6e598c5 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/TreeV3.css @@ -0,0 +1,79 @@ + + + + +/* indent for all tree children excepts root */ +.TreeNode { + background-image : url('../templates/images/TreeV3/i.gif'); + background-position : top left; + background-repeat : repeat-y; + margin-left: 19px; +} +.TreeNode.TreeIsRoot { + margin-left: 0; +} + +/* left vertical line (grid) for all nodes */ +.TreeNode.TreeIsLast { + background-image: url('../templates/images/TreeV3/i_half.gif'); + background-repeat : no-repeat; +} + + +.TreeExpandOpen .TreeExpand { + background-image: url('../templates/images/TreeV3/expand_minus.gif'); +} + +/* closed is higher priority than open */ +.TreeExpandClosed .TreeExpand { + background-image: url('../templates/images/TreeV3/expand_plus.gif'); +} + +/* highest priority */ +.TreeExpandLeaf .TreeExpand { + background-image: url('../templates/images/TreeV3/expand_leaf.gif'); +} + + +.TreeContent { + min-height: 18px; + min-width: 18px; + margin-left:18px; + cursor: default; + /* can't make inline - multiline bugs */ +} + +.TreeContentIE { + height: 18px; +} + +.TreeContentSafari { + height: 18px; +} + + + +.TreeExpand { + width: 18px; + height: 18px; + float: left; + display: inline; + background-repeat : no-repeat; +} + +/* same style as IE selection */ +.TreeNodeEmphased { + background-color: Highlight; + color: HighlightText; +} + +.TreeExpand.TreeExpandLoading { + background-image: url('../templates/images/TreeV3/expand_loading.gif'); +} + + +.TreeContent .RichTextEditable, .TreeContent .RichTextEditable iframe { + background-color: #ffc; + color: black; +} + diff --git a/public/javascripts/dojo/src/widget/templates/ValidationTextbox.html b/public/javascripts/dojo/src/widget/templates/ValidationTextbox.html new file mode 100644 index 0000000..d4213d5 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/ValidationTextbox.html @@ -0,0 +1,8 @@ + + + ${this.invalidMessage} + ${this.missingMessage} + ${this.rangeMessage} + diff --git a/public/javascripts/dojo/src/widget/templates/Wizard.css b/public/javascripts/dojo/src/widget/templates/Wizard.css new file mode 100644 index 0000000..ff12ef9 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/Wizard.css @@ -0,0 +1,72 @@ +.WizardContainer { + background: #EEEEEE; + border: #798EC5 1px solid; + padding: 2px; +} + +.WizardTitle { + color: #003366; + padding: 8px 5px 15px 2px; + font-weight: bold; + font-size: x-small; + font-style: normal; + font-family: Verdana, Arial, Helvetica; + text-align: left; +} + +.WizardText { + color: #000033; + font-weight: normal; + font-size: xx-small; + font-family: Verdana, Arial, Helvetica; + padding: 2 50; text-align: justify; +} + +.WizardLightText { + color: #666666; + font-weight: normal; + font-size: xx-small; + font-family: verdana, arial, helvetica; + padding: 2px 50px; + text-align: justify; +} + +.WizardButtonHolder { + text-align: right; + padding: 10px 5px; +} + +.WizardButton { + color: #ffffff; + background: #798EC5; + font-size: xx-small; + font-family: verdana, arial, helvetica, sans-serif; + border-right: #000000 1px solid; + border-bottom: #000000 1px solid; + border-left: #666666 1px solid; + border-top: #666666 1px solid; + padding-right: 4px; + padding-left: 4px; + text-decoration: none; height: 18px; +} + +.WizardButton:hover { + cursor: pointer; +} + +.WizardButtonDisabled { + color: #eeeeee; + background-color: #999999; + font-size: xx-small; + FONT-FAMILY: verdana, arial, helvetica, sans-serif; + border-right: #000000 1px solid; + border-bottom: #000000 1px solid; + border-left: #798EC5 1px solid; + border-top: #798EC5 1px solid; + padding-right: 4px; + padding-left: 4px; + text-decoration: none; + height: 18px; +} + + diff --git a/public/javascripts/dojo/src/widget/templates/Wizard.html b/public/javascripts/dojo/src/widget/templates/Wizard.html new file mode 100644 index 0000000..a91474f --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/Wizard.html @@ -0,0 +1,11 @@ +
+
+
+
+ + + + +
+
+ diff --git a/public/javascripts/dojo/src/widget/templates/buttons/aggregate.gif b/public/javascripts/dojo/src/widget/templates/buttons/aggregate.gif new file mode 100644 index 0000000000000000000000000000000000000000..7fe7052c1d60600c6879a9faf3459c5998c0a332 GIT binary patch literal 4360 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/backcolor.gif b/public/javascripts/dojo/src/widget/templates/buttons/backcolor.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef4d2fbf6dc68b33296a21906f2cd12c4c73946d GIT binary patch literal 585 zcmZ?wbhEHb6k-r!c$UPlXV2cpj~`#SaN+!g3!guK0m3z_*EBDA#qhuS@#81&Kfl~n zyLI}K-{EIYK5M__^5@&RX?yE7#D0DM{qz58uD}02_))nFB-NzcP#KOXQrpYYQ(Q_Z;g9n^9lVUgmrS>r~zh;t5 z5EeBQm*ddf$MEx4g1@q=sY=y_51~gH_$1l-8ZI_6wy~;mxpi`i@tmB-p})c-=E%my K#~m9P7_0$zLKAlY literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/bg-fade.png b/public/javascripts/dojo/src/widget/templates/buttons/bg-fade.png new file mode 100644 index 0000000000000000000000000000000000000000..5d74aad603e28eac545fd100d240af2c3035e7dd GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)7|6Oc4mXLbNcv7|ftIx;X^yK%)o!U)KhEOCt} z3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dc{?CIhdQgJKEruZ2TbKZd?4dNRN zjEwkv?@p1lEBR|XK~CDV=7OYM&|A5){}%6ZFXg|_Rdpq~`CR7WHh!zaoF2?95)AH# WS=4$pDr$koF?hQAxvXN#1)|Ns9000000 z00000A^8LW002AyEC2ui01^Na000JeK%Q_&EE)3W9Jt8v%|1Hz*Mz1&eb+ s84467mPG{~3jvEP1Em891U4=Ri#o2aFeV8{0Z>m850y*1yhA|%JI`CHuK)l5 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/cancel.gif b/public/javascripts/dojo/src/widget/templates/buttons/cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bc9973e576ad1554f7a5004987dce6479001a98 GIT binary patch literal 375 zcmZ?wbhEHb6k-r!xN6Su{{8!xFJC@=`t;GGN1s1`zI^%e87HTs($Z%g94=K=ow2jq zc5vIndGjtLC!f&QKWlBhaKpmWW@gW}Y&j|=_4NMz$7j!84hgxwaN$u2iQ`I2FE3ua zmXvg*qT-~E&bC9_o*g~9a{J0_eSPNx0**>b-rl$Gn2gN%*x37L&pueVaM8v^A6~tB zxp(hzW#ykge}4P+?f(7yZ{EE5`}gnf-@otPy?gui?FH)>{09RD96<3W3nK%AIfD*J z9^@wmwkZc@7kKDMWuHjdlpt~~=faA&CvA?cyCLx+O7&XGgAHed-&sY!D9L8@RO~jL z{(9rY)4JN>ynYG>ZX7IHf`aSWaEs$7y9oeb^HrUp|Dq$Fgg8BFqHoG;4G#-=o% zajv;36O#zL&T2K8)hkSynfZj(w=wf7GH=n>=M+D9R7HP_@u|~ijJKFvxOmBAi`O+z K-(;G1a^%SU`}dbGUw-l8#sB~RJLc_UAPy-0WMO1r5N6N;DF@lf!0P`%r7tCO z-V2SjZ)W)gshqzgeZFY!vD^iVw|lHkeYCb$26Z h;U`NRq#jRFIhC};bCNdWM~6Lo5C6{o&&9}K4FDl9Ta*9* literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/createlink.gif b/public/javascripts/dojo/src/widget/templates/buttons/createlink.gif new file mode 100644 index 0000000000000000000000000000000000000000..c214076738ad73e1c71f3d998a71ffa07cfe337a GIT binary patch literal 1081 zcmZ?wbhEHb6k-r!_`ZeV$Io9MK7Q%$?*9DcTXJ%;nVFfXsp<3+GoquT@87>aW5$dt zx8BS-H_ywtXT~k z8auXirj;#B%gol*)m?n#c~4KzfrAHc^{d(%EJIfE{mhxu=H})JNhv>n{m$xJvw8F8v?&(pD&b1#J8yk;a``Fsixna-!4SVms zdH3nswQG|nPu_m+BM_Xv_&BY6S@nwT*Kgd+ow{Yt)%o@H_1!)F=kC0@`|$O$EqCgt zUGeqx%`41{iHUJ>aaptT-l0>Ep1%6F=G^Am+S+5sjs-*pv`yJJcjMhDQ>OIp>8oGc zP_d%(&YinWO---getP=!X-iAX-@pI<|NqZ0+=1dx7Dfh!Eetv!kAm_91IK@cOime( z4GRuN3MsKfNF?%cG;c{`Y`E&`(=BQorxC@F5a!6~_ijgEb0fzh;g#PcB%KSyl*QwI z7+5$oU0JMEw#4O=hCstI{%L7d5vj}`t2Igj7$qzY9MKS~-@uZz=qZP`ZJi3QgoH!L zED6PmHx5OMPcBjQ%9`--7Mr`8L;4N@qc2O&i)q+iE7;q>)Z1k=FX+dLEsBAH68sq| z3rrI(b7(hd_`Fnj5W?pn;&nplL5EmFKuE~LjUO1!EZ4E0gB@7lB1#6k^JEF(xU>8PtVskP++hI0H;aE2><{9 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/cut.gif b/public/javascripts/dojo/src/widget/templates/buttons/cut.gif new file mode 100644 index 0000000000000000000000000000000000000000..9bdbf4a72c0ed84b53130a4c551d4dec90b716db GIT binary patch literal 112 zcmZ?wbhEHb6k-r!Sj5Wk>cD~K)}~h-9WAZRCm0z1|NqYb28usf7#SE?8FWBAkXi<2 z(}-Pn{u!(?T(Wvv?}Snj7Y&~q&N_;rW(%3Pvd%O-jJzSw$WXF;js^FNXV$#d2Npbe Lnr+3+$zTltD@P`Y literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/delete.gif b/public/javascripts/dojo/src/widget/templates/buttons/delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..dee61c2230c33e9c4682ac09dbd3f931805c22f2 GIT binary patch literal 81 zcmZ?wbhEHb6k-r!XkcVGDj~tZz@Ye(g^_`QkwFK@28s(YFfeKK^shYqmd#f`pCWRSyR*WOLFV?oGRcwt8ntWA0vY`06CEwx&QzG literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/forecolor.gif b/public/javascripts/dojo/src/widget/templates/buttons/forecolor.gif new file mode 100644 index 0000000000000000000000000000000000000000..db60b274bae89ae8bf1350514c975850f543fc49 GIT binary patch literal 574 zcmZ?wbhEHb6k-r!coxgBV8McKU%!6)`mK4%D~A8oUw{5Oe*E~_$^SQ1umAcDDEu{R zOHAuJrEhOv|Gz79uJc-3@6Bt67*5VS_3Qn&|G$|&J^QtC<;v3j%~R)|J-Xxn@ojGz z{vUhs;>Fwd-={76FZ7@3*1vDtw{K^7EbsdJZ@~)fbJO;2zx{3T&C}Blo^ANwtapVW z?fTa(8>4UBxN-T+vhTlsetGxp?9o#p{~7Bx#Gc)9c317z@G~dR-e4%a&9LpnirAC& zQ)c|Xw*CL!sRvf9_$0lLp=<3)hW||UJLdm;cvI@XEzm3W2lqyueew1E_x}%{KHhSU zEhYwth5 zG%zsu4+ac$0g69a7#SF18FWClf#QULeRe}^Q*%peTYE=mS8I&0m#Qg;t%*TQdyIz= zzpss?oq&Yww5I5#%a*ZQ%P~8!Hb-+YxiWGxF-D6@1v85qu3sjzyh%;lU85~pH`=o$ zTsgw*1Y5Loi-M20+X=;JzZQQMX{Qrn(R^W%p_(osEb1p1qD2A&jN~1atn@!b3z`R6 ig#3wEkSelJ_hZb41cxNIJ~lS~X;Cg47cFvNum%9kP5t}; literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/hilitecolor.gif b/public/javascripts/dojo/src/widget/templates/buttons/hilitecolor.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef4d2fbf6dc68b33296a21906f2cd12c4c73946d GIT binary patch literal 585 zcmZ?wbhEHb6k-r!c$UPlXV2cpj~`#SaN+!g3!guK0m3z_*EBDA#qhuS@#81&Kfl~n zyLI}K-{EIYK5M__^5@&RX?yE7#D0DM{qz58uD}02_))nFB-NzcP#KOXQrpYYQ(Q_Z;g9n^9lVUgmrS>r~zh;t5 z5EeBQm*ddf$MEx4g1@q=sY=y_51~gH_$1l-8ZI_6wy~;mxpi`i@tmB-p})c-=E%my K#~m9P7_0$zLKAlY literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/indent.gif b/public/javascripts/dojo/src/widget/templates/buttons/indent.gif new file mode 100644 index 0000000000000000000000000000000000000000..efd4decec5d0003b7375f41e4557f3b0d9ce8c7a GIT binary patch literal 83 zcmZ?wbhEHb6k-r!n8?InSoK1^M~wjt6o0ZXGB7YP=zw@2c?KqxDg7%?zy04d$7D^H g{xYruEER{+Bp<$H+8vp@(^*n4L3szIeo}y1j07Ypw}~OiQ12M>K4PNx}N6%A%X$gU0doon|uoo4IWa=LEyqr8RAvFq4Mmc0mGC|M%G5JH%1KMZ zCQRfBnAEb*yKR3;(Kg-gBSD@G`)ik+n||7N=JxANC%IcriFY1I?cH{J;&qNyD;E2; z9p7=`gF?c>lGT=mxuPALZ+2g1Z#rbuc1osXLtN4-^~HzZh4^@um*tYwKaH6 zqgO9y36-(;5LES42^1B&u_szHOwL@y&QU?lDBvXj@@PXgby=-o0SBuN8_RP4&M7R) tJu(ReEnGY-EYVA?miPoP>PQ%8or!3eI;~&9xhutV<&u+=`s{Jn!(q1G~0wKYjAVu_K39Em^U5*Uod7&#qXy zVAYDntClZ*_Uzf`&!1ntdiCSSj|2Pmo;-f+?4>jIi|s;uJpcdy&wv{!{$ycfU=U}} z0Vx65$-tWSK(#L=b6&=(I0gZZ9-%X9H*g$K2@84ue_z+TL(Ec|hvuecY8uQvqY~(} zHfr@Ht`u&=g1vXvB)^fEaQ2B;l6dCs`|sW)|8uzT_DfFkeT5HyYl7HCTUy&%*`0;E RdwTnvwI@!Rtfa_b4FL1mXcGVc literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/insertunorderedlist.gif b/public/javascripts/dojo/src/widget/templates/buttons/insertunorderedlist.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6007302497ac98f60a8d6165a1339e576c5fb4d GIT binary patch literal 98 zcmZ?wbhEHb6k-r!Sj58MzU+f^(2In&_v$@r|NsAIfC0syEQ|~cEDSmz0gze-W_6EU tcm5f83AW@gvY76Y=Sz)E$?Q^_n0w@TYpB+F?yPllxXsMo#&a@Q0{}_K9OeK3 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/italic.gif b/public/javascripts/dojo/src/widget/templates/buttons/italic.gif new file mode 100644 index 0000000000000000000000000000000000000000..13ab00c10b54afa89af341c438bc9e3a88952ac0 GIT binary patch literal 309 zcmZ?wbhEHb6k-r!xN6KWd-WrmnBxady)Ev#ZW(!O%dz*b-v3&)xt7GF)SxpejJ7svP$?ipua zy#8Sye=@A_yj|Q0--1hZQ*LiQ{ASycH$nO5qFV1eC!Acf=S6tY`RS`4du5#Nn0wDX z_4Kdb|9tZCMV9cNcQVa4E16$C6nFSs? zQvD~Ee5z0oa9gufK!J1Vl0%GatOw798FF!SYjkR{uX&J?m9wFtTkEl`OPuWbHA^ce iSc-9TW$AIs@f66bF!DtRGcp>)v9YqU#RWMsSOWmuaD}A+ literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/justifycenter.gif b/public/javascripts/dojo/src/widget/templates/buttons/justifycenter.gif new file mode 100644 index 0000000000000000000000000000000000000000..39c93e1718f5542067f5c68d4447da94cb6e311e GIT binary patch literal 132 zcmV-~0DJ#ONk%w1VG;lm0J9DNI-NN*m@_YvEyfWZsVWo$Y%5db?)NHxp= literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/justifyfull.gif b/public/javascripts/dojo/src/widget/templates/buttons/justifyfull.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c9d8590159d1c6e06720c5195d92ff1c39d5337 GIT binary patch literal 294 zcmZ?wbhEHb6k-r!xT?-zG|kX#mZ{Y|OP3YSo@+gHC+gTQwsTtM7`Z3HZKZ4YuCV0e zNl8Z&-B-I=%r@7Xq-#3UB)9-@_TAtUu-QNMV2sHOW4}$l-s`=h_C@MU&}N_>Q2fcl$iSe^paU`zwb5JMMTNw)YP|kzDK(iiTfSL7qCGK|Fgl(&Z_;j1v{1_A%3;J`JD)mg&S^uaLM)Ig zCyXZN=jZ?b{{R30A^8LW0015UEC2ui01^Na000F)peK%GX`X1RuBSz1%>@|&p+!it wY@^csz+jN2I#ddR!Q`baXgS*)dmtw9XoAiJ?dQ**|NsA=fjFS}lZBB1Xq65~Imk{1R_g^SeJPpqGFGii zKdjR~S)o0U9c GU=08kUORvQ literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/left_to_right.gif b/public/javascripts/dojo/src/widget/templates/buttons/left_to_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..2cbac6864a20419590ed4a659563c29fd01c0f22 GIT binary patch literal 138 zcmZ?wbhEHb6k-r!*v!S?zS_-Yg|ovFd)tLJo@+f!XPW3u(lwlFU@^yBHt-Dt22lLT z!pOkD#h?R{0hz(TVjghPbM;<}*JpRDJ(wEeu#(}C1?w82C99Oq7|HNAPm1=8SL9OA ZH`CPU*>l=);};1L|NauMw=N6})&PAKCUXD) literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/list_bullet_indent.gif b/public/javascripts/dojo/src/widget/templates/buttons/list_bullet_indent.gif new file mode 100644 index 0000000000000000000000000000000000000000..56306cf8a57b4480f9e4cce74b3fe68299d26968 GIT binary patch literal 98 zcmZ?wbhEHb6k-r!Sj58MzU+f^(2In&_v$@r|NsAIfC0syEQ|~cEDSmz0gze-W_6EU tcm5f83AW@gvY77r-|Q3_o;mMKN18NaSzp(=EfH&_z8@=p>&(eu4FGcUA7B6g literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/list_bullet_outdent.gif b/public/javascripts/dojo/src/widget/templates/buttons/list_bullet_outdent.gif new file mode 100644 index 0000000000000000000000000000000000000000..735052529b11da213c20b3e58ad2b857127104ce GIT binary patch literal 99 zcmZ?wbhEHb6k-r!Sj58MzU+f^(2In&_v$@r|NsAIfC0syEQ|~cEDSmz0gze-W(|*B ucm5f8sWr{eX;{$qzd1NIBGc~i%0iYGRbEx+N^(|4e{V92{6Cq6!5RR*6d^eP literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/list_num_indent.gif b/public/javascripts/dojo/src/widget/templates/buttons/list_num_indent.gif new file mode 100644 index 0000000000000000000000000000000000000000..f73741a78eeaa8c4df007a0ccd3fe2619b7a4455 GIT binary patch literal 85 zcmZ?wbhEHb6k-r!n8?iFUG_sZ@Qr$p+W-Im6@RiYGB7YR=r8~QNS=X7ZBGBn(_(uM nHD~cPZWi;q#BY^o-gT@kH11^7gU59T8jCtbHtz~zV6X-NZ}c6N literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/list_num_outdent.gif b/public/javascripts/dojo/src/widget/templates/buttons/list_num_outdent.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ee50e5b864e28faaf80a57dc44647e733d7efd0 GIT binary patch literal 85 zcmZ?wbhEHb6k-r!n8?iFUG_sZ@Qr$p+W-Im6@RiYGB7YR=r8~QNS=X7ZBGBn(^7j6 nHNWfVZk@cvy}n?9A@9w~iH}b3E&aYnHeumRt?gDJ3=Gx)qPZT_ literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/outdent.gif b/public/javascripts/dojo/src/widget/templates/buttons/outdent.gif new file mode 100644 index 0000000000000000000000000000000000000000..40cb4651c0332eb2f0f7a3895b30da448435419a GIT binary patch literal 84 zcmZ?wbhEHb6k-r!n8?InSoK1^M~wjt6o0ZXGB7YP=zw@2c?KrcDg7%?zy04d$7D^H i{xVJnmWtzPk`G@_T#&Ki!SV@{)h_GxJojZ}um%8R{2C_! literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/paste.gif b/public/javascripts/dojo/src/widget/templates/buttons/paste.gif new file mode 100644 index 0000000000000000000000000000000000000000..f236cbe693684d0bd471b93496b4295db57b3177 GIT binary patch literal 241 zcmZ?wbhEHb6k-r!I3mvQ=g*&0hnt^0d-mzmr#pAH&Fb^!pOiN&Y%NQ z0SfczZ+z W!uyj=MOmg!>rx93*PElrU=093q+t;N literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/redo.gif b/public/javascripts/dojo/src/widget/templates/buttons/redo.gif new file mode 100644 index 0000000000000000000000000000000000000000..aff00e73a4f5801259607ff7e88e025f25a1cb4d GIT binary patch literal 543 zcmZ?wbhEHb6k-r!c;>_)8}LRp@Xgs<-$eaye*5`1di9&fuYP^_@<%4%&EJ3jl|tXl z+4?TC@2^_;JC(4vfwNz1I{H4K@^wJf)1z0uxOP41TJf@G)}ycA|K5M`^ZczJd(M3{ z%6MEg`^}f{e-~_f)ph5KRmmOe%;(bnZxut{9J}&)!_g0CZhgz?`}OU|zn!N)Z9Voj zsQJOSAAehxynONQ_wPUdif25vN`HUr@eh}#hXx7nAHDh&GXG`ffsY|I*A;@_R2_UP zf65R-7y<7QMa zp1Yxig+Z&CUDaB|%xZ5li=bwUJp(_h4Rb4}i~vguBdfXml~zePqh`maPw%&ANU7*| Vx3H_3zH5=4@cH|XpKXl{)&Oz6wy^*J literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/removeformat.gif b/public/javascripts/dojo/src/widget/templates/buttons/removeformat.gif new file mode 100644 index 0000000000000000000000000000000000000000..30bb618fe171f3dbab89af1e1fe07f0a39ffe512 GIT binary patch literal 101 zcmZ?wbhEHb6k-r!n8?iVf8)jrxw-$(ocaI%zv538Mg|6E1|0?<0Le2jna$~6dHSvF zq8i5t=@`)k&1YB`p1VGLQF~u$QY^PpE|+%FDz1-;U$^%De&IB|Tl0yv-Lx~y7Betd F0|01@C(Hl< literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/right_to_left.gif b/public/javascripts/dojo/src/widget/templates/buttons/right_to_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..0662cd2f867fc2cca82bd85ae8283b8e7343048e GIT binary patch literal 142 zcmZ?wbhEHb6k-r!*v!S?zS_-Yg|ovFd)tLJo@+f!XPW3u(lwlFU@^yBHt-Dt22lLT z!pOkD#h?R{0hz(TVjXbObM;<}*JpRDELhH<>=1NPRKu}**|Y^5U#8r-zJO;}$z!n= eryotBTwE!v5tbTr#FURNSkSfZhK?B%gEatJkt!Pi literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/save.gif b/public/javascripts/dojo/src/widget/templates/buttons/save.gif new file mode 100644 index 0000000000000000000000000000000000000000..61dc4e1b7a19afd1eb5aa97d1c2219a1b2d55959 GIT binary patch literal 243 zcmZ?wbhEHb6k-r!I3mC>W&Mkkwp;JtzrV3Tw{Ot{1_p+*Nq4`^JT~LZ^quFw{y(K` z8F}pQOFy)XKtNpDbW%*3#Bt)+N9=g<;zCDUABF=gbvQWUvMR Dx3^Va literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/sep.gif b/public/javascripts/dojo/src/widget/templates/buttons/sep.gif new file mode 100644 index 0000000000000000000000000000000000000000..60b65f6339b2700f625dd0e3aabc217bb7bb1a51 GIT binary patch literal 58 zcmZ?wbhEHbWMvR#XkcV$YHIrb|G(l-7DfgJMg|=QAOOiQFbVo3wC$YrT`FbcrPm+M L)Ku>jVXy`O)#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/strikethrough.gif b/public/javascripts/dojo/src/widget/templates/buttons/strikethrough.gif new file mode 100644 index 0000000000000000000000000000000000000000..e941ffd684466a239b9747707a5863e621ee3761 GIT binary patch literal 329 zcmZ?wbhEHb6k-r!xT?rtAAe%wp|@L(yghN_t4I3jtw-KEB%E+cI^DnNU0~&ny7^BQ z?ET=Gb+&2tgT>ok1{PjCdhP3!^)E{1zb@>#wRYd@z`_g1u76ExxVGukXV=X03%9;3 zn{+pG#;YUOzV==0vz%*T8F}pg|Njg$1ByRc7#SE88FWB4fc(V3mUdu5frpM%|A{3< zHyADF`yJnSb7h&rw1W)=EQwl821^5H6!b1&&G2MVymq?3#&7*;=XrbT&Yu^z7VzP4UOJz2n}_%3uuunUxxI literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/underline.gif b/public/javascripts/dojo/src/widget/templates/buttons/underline.gif new file mode 100644 index 0000000000000000000000000000000000000000..832387683c5b4639b372f1bf62779d6df5a17ac6 GIT binary patch literal 344 zcmZ?wbhEHb6k-r!xT?+Int6Wz&Swpr(UKy-y%S9@caX^EcP(c_0WrxtXH zb6#KJwV-R|5h<&iBG!{F16enUI15z8@`$*q@H7Rpw7N*KbZSemvMM=CDzk{X^QkMS l^73kPFbQ&bs4+0fF{~71^Wx)R^Oaxby*)N?SFt05H2|?HbISk# literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/buttons/undo.gif b/public/javascripts/dojo/src/widget/templates/buttons/undo.gif new file mode 100644 index 0000000000000000000000000000000000000000..382eba07bcbd0baa302c002cc1d2e374bffdc6c9 GIT binary patch literal 541 zcmZ?wbhEHb6k-r!c;>_)8}LRp@Xgs<-$eaye*5`1di9&fuYP^_@<%4%&EJ3jl|tXl z+4?TC@2^_;JC(4vfwNz1I{H4K@^wJf)1z0uxOP41TJf@G)}ycA|K5M`^ZczJd(M3{ z%6MEg`^}f{e-~_f)ph5KRmmOe%;(bnZxut{9J}&)!_g0CZhgz?`}OU|zn!N)Z9Voj zsQJOSAAehxynONQ_wPUdif25vN`HUr@eh}#hXx7nAHDh&GXG`ffsY|I*A;@_R2_UP zwJLkF76VHwvkfahgMEvp;K>$dd2?3A78U`S-m8ueA2u7wNltFkSCP_q U;bf|I^c|b*yKmpWH8NNO052}Jd*9-#p>?-k zy#8SyfAYYow{=r)$5mWBdHLh7-~ZO{d68Ow*(>Ap=EHB+?0L~K_g;MUW%tz6&Iu>O z3eQKBUi8d3`}gm^nn|~P3oeBhop+2sarXKr=fsl^NvGXXPuazt2+BWKJ@MA`)sG)O z`*!v27w_z|?ipvd9eGpSb=@-Z*#H0k8HfXlKUo+V7>pQnK*~XWVqlx^FtflzN2>qC zk{~h1qe<pyT_zO(eZPYODDIA zm?Ez;ucDX=x0{kUD>Dl#3p1;@lDo8ojKM^10~rZvcTGJuH8##=YyDfM!$*$|jT{-Q E0Sj%FrvLx| literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/check.gif b/public/javascripts/dojo/src/widget/templates/check.gif new file mode 100644 index 0000000000000000000000000000000000000000..9210f850beb3f5953f654d863fcfc04806febfaa GIT binary patch literal 2154 zcmbu8_dgqm0>BfA5u+D$sL%$bQC^RRL+|v(sP)j{uGhZPPo1`^OWWvc)l(M|8ZD)$ z9b(U@y+uf52@;#45iw$h*dw{Vzu|p<_z~EbV`8I&6Iwz(lRqWIy-emrBv!voY70)Lho#iMO>GHIqlTx};gVZE zCnpAG482Wb;nEwz(`cdTUCF6Q5gCox^v=IBIFW=VTn0Tfi-93@M-Uk4gw)XNp(rBx zeRkWs96COikx3*FbF#1nUq9wkV+&{zh2uGS*^xz)iG`GyVoqK`F1~~xU&6>Q%!?rn zeIQL2l@!L8_ob2ON#&eUQb}ypJfV^mS1rn_?y9IN&#Pgi*N=U!U#_aDB-RgA*H#f4 zCrWC$$&IU-O_M22Yqj+?Svava#1?*9i-gcRSKnBd)v}yJ7G#h&8=D() z+op+>g#xlDk0Q+ISZi)=Dx!SL?pVxkpKT#G7q|0ssLOfn5@N@0Ygs(xvAZ&!W)P7jyU%j;L-uM28RcRMh2;0_dCZAM#hGEzb?=x4oANZGbW{DzkDg&+U)QAI!`NCq&z`^D}(W+T_B{oM?7xVO_8&5iQP7FKsL= ziRPA91uKUOtLw|Fi!0*g*>&0K+KPC6bwRSfBH3D#h!-~w);HE9o9oM4GV#{V#stclz@caTCaQmXL+QPJS{_^z02wyKa1&ZSkAw{YndU z_pzFi>&2jl0$Opx9Eao+6TEbNK6bR)5BAC6ojs0WB@(a+=^wp`P_Mgh`e?78ee--w z@HtlG`r{psQ1#ORmmivvZp9fmOxE5|P-Mg-9Rdczh#=b#`wz3#{ygizaV@^?2pl>w zEQ0DDV=@!7TcZ`GdK^7<8joUSgJhDiRe)2}`-DfoaP8nXxw#I*m(NdFD^$yDl6!1} z2}@b>(x?-?ifX6*Uo^Tt@6tZM)F5Q*`d&#niY7lHG4OGg$o^c zqew)8rww~V9Igj$RJyCrn()KxVa3OkV?l;o7c7ew!GWH-ccMN1xYO$sc94O!&ZIl{ zD#1oC)RAGJ+wSw2(-oxJq4&vZiFgbiD1aD0h9EmsGU3MDbf&q01>fC;FrO04!e?Nm zWddc>sCA9x3+9MxMs`Z@wE6s$%qlmy-z%P@!O$5{=ZPPjkU+Vs_{ubtTi54nz?ej|icLQT?G_?jqEL-q zm+i&I=i^KQ8gir2%7~aCSeQ=Tc#5ZCDXr5Uc*&yDDe^Jra*q{11ZiR^EaQ!$(9*us z#t0587O~#@Ke8<%^Ov|9P|?2yaJ_Up)p)42=Y?1;h8N*Yd=-SIU7Z4jo-1!MDQJ9 zFZ|_{?7RYXona60-Ik|b2H74*(3ysw7c&!y7mPCA4B;DNZl=GM8WW?dAQKLxj1a$?= zBQ#|!(cuUS4nC$-`S#xw>~W=V+$Jzy^{=D)S~UQ?onO96xY-9?DK`RkpcgM_#Olfm zFqYmL3DfPuQx>9=RxhX2UI$TO!iva?Arty{p@qhjIK5>;`fquwNHT77qvW7*7=?|%EXaJJZR#jCT)Rfm-mD0E{2Vx3 z=V&(MEyBSzS6#&s4pgV0e$h4KmbG{p$i+~8wh6xSA!Q>E;Zf}NJG(DQ;|v_|^WPh* BvRwcG literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/decrementMonth.gif b/public/javascripts/dojo/src/widget/templates/decrementMonth.gif new file mode 100644 index 0000000000000000000000000000000000000000..da5d869a4f62345f902cd7c403aab474a2ca1f1f GIT binary patch literal 166 zcmZ?wbhEHb8@9BB(KU literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/grabCorner.gif b/public/javascripts/dojo/src/widget/templates/grabCorner.gif new file mode 100644 index 0000000000000000000000000000000000000000..31453c4702d1544c071c9d7b36c04ca19b694da5 GIT binary patch literal 77 zcmZ?wbhEHbwH|_ub{|pQaia%Kx85o!tbbxH2EH98PH>H22csJvm e#-M=8*{6QFN|#&~kGi*{RK|GG!)QfT25SI98W&{% literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/Tree.css b/public/javascripts/dojo/src/widget/templates/images/Tree/Tree.css new file mode 100644 index 0000000..4d47e2e --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/images/Tree/Tree.css @@ -0,0 +1,36 @@ + +.dojoTree { + font: caption; + font-size: 11px; + font-weight: normal; + overflow: auto; +} + + +.dojoTreeNodeLabelTitle { + padding-left: 2px; + color: WindowText; +} + +.dojoTreeNodeLabel { + cursor:hand; + cursor:pointer; +} + +.dojoTreeNodeLabelTitle:hover { + text-decoration: underline; +} + +.dojoTreeNodeLabelSelected { + background-color: Highlight; + color: HighlightText; +} + +.dojoTree div { + white-space: nowrap; +} + +.dojoTree img, .dojoTreeNodeLabel img { + vertical-align: middle; +} + diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/blank.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..d90ab95a9faf844f0e7cdfa396bddb628de1b061 GIT binary patch literal 55 zcmZ?wbhEHb6krfwXkcLY|NlP&1B2pE79h#MpaUX6G7L<7E&VG`zvW*%XUnbb&33E| F)&Ol-4$J@m literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/closed.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/closed.gif new file mode 100644 index 0000000000000000000000000000000000000000..820bd195f22c9d4366efda80debc1eb6d71d35b3 GIT binary patch literal 1078 zcmdth`A=H~0KoAFR_r#Tj3XhA7;u}}&?U}jf@fGp=FYeojGByuB_$eUho}fH+sf6o zfRl0wvxBx^DSbU@OF0U?UhjjRE2WgS@4dFKcj-(f`h#ZwhTs3-^TYR(b7yMbyH)~} z08izB-G_)xkri81Xh3aVWKJFC>k*|hrgCCS*64~YvI%F*z61w?S*j3Uk1ksyGD}pX zM+ACw9)jf?QBNrC4QJFY%;1efp19T%kENg7AhV;XJh--@a$!Csqj6)~kt|OO^B`Di zju?HZHZn7WWl0RB#Dso*pJUldICoOF$7TI29UR{^Z68j zsnd^U#`*ejk;CPWkeO>1FKpaQObCtJXjb8jPp@p=9p>1MiMzfAA69cz4LH67|XVH z(|(><9tE{-Lz!5z{@6??kiTkiqXM%oYmg-jqUYM3yX(+Y>VGx_#Y_@u8hC zmg{4vlupd*Pr7zeQZs7uB?LNzI4J|Qh*0GgsoXL%N)s8b^~^13JnIgOA>ZnoUTeNL z-Sud-^TB-ggrvQnX%D2RT+2-o6H7l?Fd!fl=4iq~9isQfulGz5?$EHzpTCKn?W0n6 zFin|Jbc{*4T4d3Twhn-h8x!b)(PZAXopJ_JA_L0Sgg3U6XkwSIgBQ(_AE<&5mWw2J z6%Gu9;OpJL-yGx$l&)1Pyl9EG4T;zqI1tVLp$uBLlCEHyuW)=vo}Jgg!2hV~JzN0* z$bmPXnVvlX;Qs|W_f?)1(p5e9&gT5dqy2|2y>p{#?=+n`_C=xh!+i^fFVa62wyo^} zbi%o=rn?O-km@=1=PU`CI-)jD9{i}I5!M_b)znCPF}x_GEq7EXVR{h2pT_s&yT_&h$tZ%BjMSpQ}e>tx1GO@0QR9fgb zMzrf*o-1#y3>1jrT9l9v?o&_~&Wvg(4jA!G8@sA$R}) literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/document.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/document.gif new file mode 100644 index 0000000000000000000000000000000000000000..3d57afb1513e153583b15e92f58646c684c0cd5a GIT binary patch literal 240 zcmV!t_WJ$V-s1NA{^jfN?eg~i|Ns5||MU6% zUx1%RUUmQf{{R30A^8LW0018VEC2ui01^Na000GT;3tk`X?AF;re(LiaJ+SGgvc>X zc1U+|z#u1}8+9-bNMIRQP$rh5s8i`kgu#LI(@``A1Atg;Fl;-Fjspu!oDGF|fu4C7qzk0v_Hlf{&lRw9G&8`rXGTFW&z9_y5b+?>~M5jrj#6zJ34k`t8TcX$SxR z|IaYEf#OdVumg2KBq&Z8*y|d+nwnc$+uA!iTRnSv`&heG)Xa_Ll`K7&dArqhM5K&l zHJGhtw|I)lX<9h4u(K&JcAM!-8?0l~;@-4eTY}*Lg9$g2sq%6~9&u|!cULCcJRx=dVNmzq5F`0Y5|gt<5*MY|mYon3@vIGk+kyZgRR==$~BtC7JP04#jz!T$^%AK!oa_WRG@pTB;$ z&Oi3=-@i*YpWe9l;`>h^_xRg)A09t{-@fof%e-UzPTu_e`|pQO-%ek7c>Ce2`%m6H zdGY?wpTGAXJ^%9c$DhA{pT7L?`u&%`|NdRL@#Mj?x6UpuPhWi~Dk^&Q?(@k@500F> z`{~P%FW-JXdj9U_{gH%MZT&_;v5eoAw3AA3c5b@8AEbs;bIq2mk;7 z&oJnL;!hT^8+AY=C{7sID;hkTnp;}i+B-U1J$ickSh|~)#Q5bn^o1vS@^G5!h%2(Y zOq?UgWXZ;^%h>HE!)3z6<{)ISro}^^i(wA~tFw{1`wkmBLswO4DL!R^ZYOPKSyo#; p3r+5BD`tBIb2DB?>zg|`G}KfijU}{1MY{VwPU!mb)w7Yo8UT$6-?{(* literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/transparent.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/transparent.gif new file mode 100644 index 0000000000000000000000000000000000000000..350cc279533a48800d2a29eacc8ddc0ceda6db57 GIT binary patch literal 870 zcmZuwO=uHQ5T3QW`7uFsTuLN8B$z`eIRw2#yaXCeB0W^Rc*vo)f~~ZokbroSTH2t3 zyZ#>9L$n$~dr7N82|1*x;#TP`#Y^uSB5S=CRgI)=nTL6GY2({>5loy>T z7Of1T*8e{+Bs;#NF(Uo+$<7#wlcwxgu)t+BzLB7%xyg3zvYO4IStYX6x=CcIbwkYs z8G|d)rsg6dh*S%}M+h2}6(^hw%}__pM)vJ-G{d(J{;-e(q_vyNm8b;j5!F8fFhNl* zn?gNo`>5Yn{etZSIMIkt(+R-qLEw(S?WZYEwwI_h!MCBkJv33~Hr zWMttywNVzv(Rf2R>dU*)%0)CLttgdl>;nrnXr)k>cnUQq6P1N^%a78LCep}v|NTWS z9eHX#YNFH{0|>AvO~i_s{okPXVhbv8a>Ty`@)fMS(+C%Ye76Cs*U-8rQ01cr*rHo#DkJ*Q(F^Nyi0 zK&8=4uiX@hy4XwXZW{C z0Lo2QS=-6XsYYk9ahnBoEQ@A|2(+48bM!iUYQaA|-Hn3?OJn~8xcZ>W)sre0R_?ft z_GXmw^VR9Y$Is2C7GJ!-=R0|IQ(2t*@F384wya_v$0!hB|J>D8xa(czD?>DR^e KnV8$b!|8vvLLx~3 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_blank.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..80848bb0a06cb34a6a5084a3dc10d613b0c84c24 GIT binary patch literal 834 zcmZ?wbhEHb6k-r!_^!?X1poj4|M&0T-@kwV{Q2|y_wQf7e*OIU^T&@L-@kwV_U+r( zuV24>`SR)0r;i^$zJLGz-Me>h-n@DJ`t_?0f#JE#sm&2^X{9pRxM%FH><@ U$t914(V1cAxsQJeW?--e07RY@wg3PC literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_expand_minus.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_expand_minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..0e8f8d960214a06705a1a4203d145549f650b74f GIT binary patch literal 547 zcmZ?wbhEHb6k-r!c;?B_IOnLPrRASLe?EWt);Ra*yAPjVzWMO=+xPb$zx@06_t&pq zkDk5x|Nr0pC$F#Ee){p#m*2mC|NZy>(#`*-@vgP%Wty?Xoc*8LY>zJ7o5;_d#EH?Q7)y6@!8*Ka?5`TFhh zttV%$JUn{-?uSob&R%`^=G~`jcb>id^6%s4umAr3J$3oPpFh8!zk0vx*!7>kem#Bh z?(y@tZ{L5q{ouusvv+D|9eMil-M@eTzkUDl`rXIx-+w%N_5Q`{_eaj%dGr2L<+Otg zLjfrMWMO1r@MO>dITjQr4D1aJo=wdyt!?ccO&;Any&mlz=Bhe+2E6tf9HJA{-L%yt zEfqO587A1u^GT?%u`)|9Yx6MClCfIL?98>X)kDaJ@gSoJ7Zb|_C2m)1DMt$?x#OF- z&D@RH6__|>_q2Gp=<~A+n{x69icN6RRTdX8=5a8zo6y(S`QzuW-+%u8Y-F$o0OCgK AaR2}S literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_expand_plus.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_expand_plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..00f90aeb2dcfd6f7b82812f25c064ea768649953 GIT binary patch literal 542 zcmZ?wbhEHb6k-r!c;>-iX=zzE>#&Q9i?g%K`%mAVzy8=T`^dYGUw{7k{pS6b-+%u8 z`}gn2xx0^_zrT6^A}8}Hy=EG`|ZcCr!PNTzV-COr*E}057*B+{NUN!+L?zg-hA@s&)*9- zp4_FJFHE&3p0YgazWx0E^Y{HHZ(hCo{QBMJfB*hpzxSeY+QI+-|1%5`p!k!8 zk%7U3K?mesP@FKZS2uVxHMg|3wRbeRb@%kTwY#}b64Z4tW^rblFo~N>)LvPbbynNN zxq3`eoU9hM6I?VobeK3zdG%E%*l{rIWndO}Wt<=)Vi_@% literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_t.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_t.gif new file mode 100644 index 0000000000000000000000000000000000000000..029c58813ce9bbde04e22297d1326778e5c0ccae GIT binary patch literal 74 zcmZ?wbhEHb6k-r!XkcV0Dk@@NU{L(Y!pOkD$e;sc1I2|H7?>1$te+ literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_y.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_y.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f3efbc012cb4c7a43418b779254fb5ca6ff4e8e GIT binary patch literal 67 zcmZ?wbhEHb6k-r!XkcV0Dk@@NU{L(Y!pOkD$e;sc1I2|H7?`Ab`d6NQ%fEO|NmI9R V#O$)@+DQ@h5}E)2 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_z.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_grid_z.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b23b356da931890130c921195c4141cb85f6c66 GIT binary patch literal 60 zcmZ?wbhEHb6k-r!XkcWpw6tVkU{L(Y!pOkD$e;sc1I2|H7?^~6`d6NQ%fEO|NmEtk NwjJ5$Yke6RtN~bo4$lAp literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_loading.gif b/public/javascripts/dojo/src/widget/templates/images/Tree/treenode_loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b9860f970686f56e2a7a5e09bbd0c9ed91660a6 GIT binary patch literal 1089 zcmeH`*-z2|0LOo*sW2@MmbR6OM_Ib2TPt0zTprC$moIHTxFwa@@+IfdLz?2%Pm(}W z(?tC-L`6^zF>qdh;;osccz^<_fCq|#fS@${Cwl4o@Ok}gpY8iNE;cM2jRcT@0RV`D zM_;(R?;&xcKu;Mn2c+?^?JES1nlx;v>CxoW&zDh`i<=je8Utt6#F{o}j!y8M67q;? z_}4DJOGRMHj3=i!=0=m?NUJwjv!&&93ARJg{qw|ZIm;!9OIlZXQ|iiYRqME=h$6;z z$O|b;Ci5xSzS=os)*CI~`u8ilwr~uEYTt-wtbx?!vomY`_w`!N+W3-&HLY)(Fc&~S z3Za?Ow&jMw1F_-|q{&NKm&!ZVurvvlCe3e{s9;DsCk@RbCXl*1Ce}0zXxc_~pXgG~ zxDuqUNH%rVTy>LBhaoS1AT1Ku8y~6C?E@oo#z-I9?48+8Pfurvw(18oM6Rs3Wr;DR zXH1{e@YH$G0$F6tBTg7hmeIvM9DTK}cTcpiCzs2aQ~GzrdBNOHBmZzmYnofr)^L?N zgSlCB4ASN6O1)4hBo1hQ?;KaLqz!%Q+Fs3PhOCSx;ZCY>EG0-+)b(jGEmEu13jE){ zD}XZD{gnrw^ZXNlqZNR`uLdT@6gkij!CnL594Nz%LIBDFi*7vv1kF zc>$Hubr87cuoE*Pbr*f^Iac~6xypz6@Zi#j zT12Z2gs^45N)1KJoUXm*`3L~n1;_)KYY~wtK8S}|mN9)7Y__x~^J`)jtU0o95FRZ9 zkS{T4Z(oE8Z5wEd1qdjvOIVt$?lKJ92SfVVl-NR-l6e^cPDS(Kw-dpTw@=^?nCMJ` z5OsIg4Q2l*giprruk+2rp#TPQb;+*`dUoazEiOjI=ek7p1KBX|_!QUh5uoZ0LKx&_ jWXB{pRTTIHqM{V=GOwq}&C5UDG zKg1x&!63pQ!ptbhz$D1XEXer(2*ZA`!+@@b0}ggJPM~EB%y1DPgN>DmnOy)F8f?sr z2yqrBW(FZ)5mr$~HZgHQpjVlhSXfzM@{CN(EFywJ!iq`^%B-S>j)6fc0!Br~YC=F` zm{~ax<_j_~Dl!QH6*w^qd`LX_P*_=Hp|grG0}~_AZ!B6r4L#MK>NTl49cJyZI<7Cn~qQ94m?mE^YN@?bU0AT=6GeJ07vmQHlp_A~RV-E^g!QQu#9*!Fgsb%IWe%Nq>r4S7fzPb6Xgf)#j$6d(U~_ao_s&>Iv7MwtX`1;un0| z!9Q^`#B`9}T3d6TYrA@`#>*MT{#odgQ?4cC<*@HX(r(H2(B~rS1=iP;LH))ER2|!_ z`p7gZ$1hgRY)9yP&k*?~v%du1VL6mC zd#5JD(YxCVR<4-6_g%lVnXOUEI*WUEHd)q9FTB#REkOBs_I}4;S?6UXcX}($XL!xC z-*Qx!>4R|4GC|=#akEPOlT)T-*v738oaI^aMZlx&HTROz0N)iN*QY$v3ftFs)AG}! zXUFGOntRWcbMq9+xmo-D$=#^e$G-$Bh2%_(e)qY*|4F=m+Li~_I&}}@d{$a!Kb1;5 zGr#XY!*XyaFfudRD;i9GmMF*~b$l8N*CIm|(SQV<0~4~^#4j{FH5a)Op|a9KGQdKE zlT-U?&;@~zM3bb9Dw`=&A9c$GJ#(!+CGcJ7=w(Q3fXuRcW)a4D^;?LW3pWcBm(M#+ zmUG(<|A_t)eAJosj5AC2*<%;GxM$9A;81x#T}5z}fK+W;Q$$##r^fond9N+kt4I74 zH-s3+3^Gps&W$QwEe}RU&I1ZJnf86YxBhy?%8U!uzuucJKR9znWQtDn!qQcrr&n0- zF|Yb_`p5aK53B3!CWA~sBwc}2>mo>!0(n>9)U$m~tJJ%Fxle0Ou0OUT)a_kw-swA; zs_Gm^)>JT-WvpyfklB20{_|Uom)3wnJ*26y^;}*5;n6sZB5^78!W89}*U7kMm zfP{dGF{65zmXV6$1SJ8kM7Of;ckjMfEL7A?UwlH{5|Sc8rWP_ambn~=n5c4~yRZ3!0!J8QL!yr7%w-$f zr|0(Hs18hsT;$1;k;9tAB;@9)@~)wQi91+`p=lbY-NUQLHYNua7su?C+$UbHyUKpn KKlKa$Zvp_SrOO=v literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/TreeV3/closed.gif b/public/javascripts/dojo/src/widget/templates/images/TreeV3/closed.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4b6f94c605b86a4e6d60a49e1f558883cae895e GIT binary patch literal 162 zcmZ?wbhEHb6k-r!*v!E29|Y!~KcBz=WS^fue?Cy;JW%MvhYvszOrZFag%KpG10q0X zFtGRwobX(|cgD26?$cO{B-|7#A{5uGIZ!C2d45SJldI$#8~-_zW6p~!yvaNC@Z1mQ pR~j=_4)n#{r>m+ z{`~#^`uzU+{QlS8;`{vm{Qm#;`~KP9;_dSGF2mDJURh2 z?EHY(fr-Y0C?YbPO#~qdh;;osccz^<_fCq|#fS@${Cwl4o@Ok}gpY8iNE;cM2jRcT@0RV`D zM_;(R?;&xcKu;Mn2c+?^?JES1nlx;v>CxoW&zDh`i<=je8Utt6#F{o}j!y8M67q;? z_}4DJOGRMHj3=i!=0=m?NUJwjv!&&93ARJg{qw|ZIm;!9OIlZXQ|iiYRqME=h$6;z z$O|b;Ci5xSzS=os)*CI~`u8ilwr~uEYTt-wtbx?!vomY`_w`!N+W3-&HLY)(Fc&~S z3Za?Ow&jMw1F_-|q{&NKm&!ZVurvvlCe3e{s9;DsCk@RbCXl*1Ce}0zXxc_~pXgG~ zxDuqUNH%rVTy>LBhaoS1AT1Ku8y~6C?E@oo#z-I9?48+8Pfurvw(18oM6Rs3Wr;DR zXH1{e@YH$G0$F6tBTg7hmeIvM9DTK}cTcpiCzs2aQ~GzrdBNOHBmZzmYnofr)^L?N zgSlCB4ASN6O1)4hBo1hQ?;KaLqz!%Q+Fs3PhOCSx;ZCY>EG0-+)b(jGEmEu13jE){ zD}XZD{gnrw^ZXNlqZNR`uLdT@6gkij!CnL594Nz%LIBDFi*7vv1kF zc>$Hubr87cuoE*Pbr*f^Iac~6xypz6@Zi#j zT12Z2gs^45N)1KJoUXm*`3L~n1;_)KYY~wtK8S}|mN9)7Y__x~^J`)jtU0o95FRZ9 zkS{T4Z(oE8Z5wEd1qdjvOIVt$?lKJ92SfVVl-NR-l6e^cPDS(Kw-dpTw@=^?nCMJ` z5OsIg4Q2l*giprruk+2rp#TPQb;+*`dUoazEiOjI=ek7p1KBX|_!QUh5uoZ0LKx&_ jWXB{pRTTIHqM{V=GOwq}&iw=`*Uw&k_~Fx+qv!9wdH3n# z=dW+S{JVDN+4t{1UcdYJ?fZ{suin3T|LMrNJ1<_pzy09F+xMRyKYx4V?45uA{y%;B zu6EXuyN_P|`1!M8&e401U)_25^81e;pFV$WoO9&kr!QA-KfV9t_3z)mfByV=>E@Ha z|NiegdGqS+r~6OdeEs(0nJW)3-+BUc*^?JMMEV*w%J1TB~Nd_u=!Y%Mbqj{rmCr*Imc1|NQmq&!6AVU%mhE>C4gcch6jTc=qbUw_pBUyYuYL zyH8JFy!-zB$Ln_=zkUDl?A7}>?>`+mcjv|H_qQLsc>Dg-0Ce7JJ^>ED0PynO4)m#^Pmzx{aY{)>M=AD-T}1{rL0eFR;&s0HOGk zg%RXT9VP}A1_1_c1_t(u2F9l57Dk5lc1A&KF$pPSO$Q#Gj!s)8aVrBEHy(SIsSJ$j zu4abJro7zx3#Kyi*}14Ouaae3+ren0!n~K6iH((u>BtdAM-F9GW_cl2C$5Ez93qMW oOzy0l&O164q%BQ!g*n;HwJ*tu+UQyEvuj9dU21Jz*vMcF00(;61poj5 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/TreeV3/i.gif b/public/javascripts/dojo/src/widget/templates/images/TreeV3/i.gif new file mode 100644 index 0000000000000000000000000000000000000000..f7e3b601691ac3b02af2f2aa2d8b5226e43003e3 GIT binary patch literal 71 zcmZ?wbhEHb6k-r!XkcI{Dk@@NU{L(Y!pOkD$e;sc1I2|H7?|XGn_u`Wv~VSy5JF` literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/TreeV3/i_long.gif b/public/javascripts/dojo/src/widget/templates/images/TreeV3/i_long.gif new file mode 100644 index 0000000000000000000000000000000000000000..771f04c066087a6faad03f3f82715084df2fba79 GIT binary patch literal 2107 zcmV-B2*meCNk%w1VG;m{6Mz5!|NsATa&jU01OWg5001li0000I0EiO+0{?_>fy>$N zU{jLOiY|_ucfEm_Sdo$mp^rLs2Wz=rC)Z?di(D#gO&yFqtdp#L%w6rhEZ$81Y#xn14W7-u-P7&<4IeH) zZeNanuAk1oPTvmTJ0bT3&Lf!5U_pfY6eeWY&tXG||0rJbcTr+Qi~s5}a>Up%B*>8( zD;|kg(&Nc`DMhv<`SGR9m^4=gtZ5`?F_$=Z!n8RM=s}?ii9R$s5$Q&yCUv6h`IMhtT{sd2-StqV5q+^l=I;_WN< zui&VF?V25YwXj~qVj15h?D#O`$%!MQwX7C1Tg`4c!=>C9^yA8+C6hiK8ujSZtXI1> z-5U1m%cW_nmW|tXY~8an*YC2%vr~Vv!^v~6` zU+113{C2w2#eXN?-MsMi%-LIa?;XDS_VnM^kAHu@{r&j)>;LZ$;C}+57aoD*@#UF; z=OI|0g7P_-AB6r%7$AiMGMJu)8e&)=hX?xApoa^Bn4yRdniwI96RKDtix-mEA&ege z7NU$J(paL6C+e6Yk1P7vB9JfQ7$cE08n&a6HzL`il1Vc8qmxZS8Kjg^QaL1+8w$Cl zl~ro#VwYfY8D^Pep6O+li`AH>m}}A#{s%fa87JBNTsV2JWqOCUi z>Z7qnD(I-QURrCZsOCy)ueWyk>!-X1YwNJaR!Xd{s{bClX|ldDYbvz6A}j5()Lz?c zwXACEDz~tDD=WCPVjC^F(`IX~wdk%}F1zQp3-7z~sv9r8^KP3izV6z~ufFyAdvCY- z3cN4C{Sy2y!U2CfFvA5ae6Yg_OT2Kn4O{#$#SvpXF~=2;o3Y0mgWNI6ALDwl$s?m2 zvdRX(3^B|a%Pca@F2{`X%sJP*^UXT{%rnqF2Tk3mdiAPm|rX*;A`sHQQIaoi*HBqa8NgV;5Vt-Dl&Sw%%*| z-8SHF3m!M&bMsv{;&&_ix8i#<9=PL;Lq53Vk^fU(xaE~&emLh}8~(ZGnR_mG=%j;Q zdg`dJE_&zB=H0sKulF6h>b0|e`t7>s&im|%_wH=)P1_Fq@VNWFIP#AxKRNT4JHI*f zqf76)@URzuJ@v9%PdoPAYfn7*$8-O?_`93$efi`kzy9*=H~;?g@kc-Z^z~P7{Q389 zpMU!7_m92+?k{`;93KD+sJ{a$Fnb8}pZga0y#@*pg6gB-{}^b&2V!u85zHX`JSaa9 z(ocl;BO(4cSV0tCu!AbpAPZlZLKvRN$rwg7j*)*` zRO1=hSVlK0agJ1^qZjRHMm)-~j(oghAM^OfJ^FEwfFz_K3yH`>DiV%qWaJtNXhKK6 z5t40`q#i99NK6`1lZoWyA}JY1Pl^(hjU?qG4OmH2P7;-&ROKaInMqh~QkI>h zHo3V>aE?-$v=RAX1Pj}`Mp6lGFKl=&Ldp0wm z5-eyW^-0i!@>8JCWau;Qbx@6{=dDDp$W+)vnT1tTrVpPR*)QwDJ_JS!L^1!|GPA!ga1~ zrR!Vkir2g9RjzsE>t4qiSHRlUuY?tBUk&@$vIbVMgGFp%8GBgBCibk0rEFs*`&i3H zRP}kb7|XJ=)M-IYL)J6sT*7C`c}Ke<*stQ+g$KI7rV6; zuX)KEUGz>@so7QUb=g~9_ik6d-KFn$?HgYFju*b^(~A2bS=FDV$&nR~W+!)^LV7++YuP7{m`I@p&D5ViAYf#QIG!i&5O- z7{hqRDlYL=16*Sl-?+dzmT`}1{Nf)AImkrbafFL()g)Kf$4Fi>kc~WHC|_908>aGy ztvq5ZuUN}ARx*y8{ADid*vmWybD71=WHdjS%tu!9klk$NHnTa(bDnaYt9<7x=Q+!J l-g2M2?BqB9dCY;1GZLK(4d+A;I?an-Gol+UXb2Pl06X&$JwpHh literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/TreeV3/l.gif b/public/javascripts/dojo/src/widget/templates/images/TreeV3/l.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb51a35ed5b497c93e36960c7af65fa918a5f7c2 GIT binary patch literal 58 zcmZ?wbhEHb6k-r!=wJYWqM{B~HM`h{FazZvI8&ON^a H7#OSpLE8;e literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/TreeV3/minus.gif b/public/javascripts/dojo/src/widget/templates/images/TreeV3/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..9786b656a71c96341e3f88abac57b03b6b903861 GIT binary patch literal 512 zcmdVR$4zP(AH#zW;lTt@U%`Xm#YgaDJZMb7#GMFeSOPLE zg|@V`bWpzPYxw`2|EAq--NK#*XaEkt!RejF?$qn`q9|tRoaNj}kaRMgVR9^<$wF8V z1mQc8mLwR8rQH5FNzwUyz5u0nZ;a=8qtR%wJIr<`$MeB&^ec)|S%&4fKqM*sJrF** z!#ppb80iZkG{eRa?DoOy@yBl-yeW*NnVicPbG`*L6#e3fq;cvakick2W*Jy0Ji5Z7 znEyeE>-$e$5aI~VvYg{35dFb0f`U+bc1I4+9PuQcK#3g7rEoG$Q2sE2qzK1r0Q`rv zG9U-4KcH;i46H}T)`bD>_+;h!aA^Y=+F2cJ(f5>&6ahn5Rdat?xxCFbJKDZAOfV8fjNL<*PVY8 zIxQaysiY?s{*ZSJ6k?nwmB=%_a^JyKJtnC~bRO(=4OqiA^W4{$KMM}tnebejgYA6S i$A}f{7OkDP?N_x{sp+i;+!C|Tr*~JK?Nec3um%9}W;)ye literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/TreeV3/plus.gif b/public/javascripts/dojo/src/widget/templates/images/TreeV3/plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..6919e94c8a1dc082da439c433034abd5d69d21e3 GIT binary patch literal 512 zcmdVR$424pEZ)-^6E#5JZvXc=d09(DN1Z1>=$= z6BPU44De~;`p)h0My~GMB*pUS%$p~?cY;4UgN_$}lH;FT!352{`=S&N*;E?la`$h6 z%iE71f>D&LB+C@Tc>}Q+$%KBWNSuaH#h-j6%?g4TiP0HB#Gic$hKmvm_&*JyARp-d z0PT(i>>nKNPj?NCjFm3*7FL5EY_Pk2wY{(}4=i<5)*n?=r% zqGB{3wCLu{$eIalzR=CAPZYJGnkL)EXk$s0QKL81faT%N+KNg2;`qQ($O`6u0TlPo A`~Uy| literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/TreeV3/t.gif b/public/javascripts/dojo/src/widget/templates/images/TreeV3/t.gif new file mode 100644 index 0000000000000000000000000000000000000000..15df5f3d3e777249e80c8a77f79f3bedc9c0e337 GIT binary patch literal 67 zcmZ?wbhEHb6k-r!=wM_3f})}##h)x-rVcxh&kdAeV3OkL%RG7dgrU5Y}53%>vYaI>ZGpMeli{K*1Vq5~p9eqvx-dSGUO zhYlAr=i*5n96Iw2Zx&1DUR-x0r|jq|p#;q+MzaM66S$aXyk_k_nYP91=(NbKKeG33 z4dBe+(GoDx(h}vZtBy}hPEF6ujx7_^U^n5{;4{(C;FXwKU1`Fm!mv!XddjpJvosWz zDNACHjN6z2ZwDM-a0E$0Z zz+yTe5@aU>t4e~Z5u-|!hJx;kQpw0Rj&;sQrxdCB%ZT?LJ~DkKkJ5}KlLVL;tO1xa BLd*aF literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/decrementMonth.png b/public/javascripts/dojo/src/widget/templates/images/decrementMonth.png new file mode 100644 index 0000000000000000000000000000000000000000..4495ed24edb091fe4b848924d2cc67c99587812b GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@!3HEvBYEP0lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6Jlq7+XT#}J9j$rrYKN^>}5cKNx!|G)qL_Z#~3F!~-eRIqFI zb`%l#&;D@Pyv(Zxt_GfR3Uy4u3`zHQ{=Xm=>1aJkMdEqrwsY(=nI?rWKAQi6%OOd6 r+uN_~ng+W|-ab>z`SJ4e^w*55)MMif)ibP0l+XkKyD~*B literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/dpBg.gif b/public/javascripts/dojo/src/widget/templates/images/dpBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..3eaccf3528e6163a476f75568b441e099fd2afe3 GIT binary patch literal 522 zcmZ?wbhEHbWMs%@c*ej`K6zi|v_qBC4pz@RS~cTH!~Cv-AZy=9a3HZ8o+y7X$x;!D*tkM*p3P&fBfJy7NHYyBIa)XzQLIR9+(;!Bm& z57o>(HhJ5t>KRANr|g@&?RD4cJ53AES4=t3vGUf0&Ce!neOWQ}VCSk^9V>43Z+zUk z^h)1`N3Bb)lug=GKlfDoiW{}Fk9V)V*Sr4VgiTM|mR&8Kw5Mn7{puMY;I()=>jX~4-T z#=&7KAfT=5xkOOPii^vJpI^zrXM-dwD?7WWi-f+2GdH)J?*T&|9%~sPW@b4H78dVw f(u|BuOzK|Ols#_BGcdUG^78TNnX$1oGFSruE|ag# literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/dpCurveBL.png b/public/javascripts/dojo/src/widget/templates/images/dpCurveBL.png new file mode 100644 index 0000000000000000000000000000000000000000..aecfe803dff9e346780503fc31745dbd35d56b36 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^l0bZdgAGW^c6+@936!`-lmzFem6RtIr7}3COG*@5kS%#EqE~7o=jjb? z2do75RF*WIu&%K`920j_cD?RyrbY(^0S*@Os1xi8EHVBZ-NRkl>_k;l56 zo^M zoxZ)hB>Y76u4V@X0S*?XMqJd1de^*rmt^s%;7IY$Wh~JR_4t|iBM<0322WQ%mvv4F FO#r{~aEbr` literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/dpCurveTR.png b/public/javascripts/dojo/src/widget/templates/images/dpCurveTR.png new file mode 100644 index 0000000000000000000000000000000000000000..9cfb0aadb099d8a9d5b7d3bb0bc1e1077292b6de GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^l0bZdgAGW^c6+@936!`-lmzFem6RtIr7}3CIg|PdvAUqo~9E)?}p< sa!id53IZG~IH~;Zo^pKh6Ve^uC8SLJB<8_-6X+=hPgg&ebxsLQ033~FZ~y=R literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/dpHorizLine.gif b/public/javascripts/dojo/src/widget/templates/images/dpHorizLine.gif new file mode 100644 index 0000000000000000000000000000000000000000..67bf681e2a527e2a5b092765f62c096bb34c6e4c GIT binary patch literal 43 rcmZ?wbhEHbWMp7sXkcJick*M)lFN!eSr|Y-2Sk8m7?_xNxEQPf>IVoh literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/dpHorizLineFoot.gif b/public/javascripts/dojo/src/widget/templates/images/dpHorizLineFoot.gif new file mode 100644 index 0000000000000000000000000000000000000000..4499aebcba4c0dcf6206c2e99d533b68f73af841 GIT binary patch literal 43 rcmZ?wbhEHbWMp7sXkcI{?AbbT`ANl}EDRu^10p~&3`|TeTnyF#*82y! literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/dpMonthBg.gif b/public/javascripts/dojo/src/widget/templates/images/dpMonthBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..0348a910d696b83b3ea55db31cf60f1d1ba096cf GIT binary patch literal 107 zcmZ?wbhEHbWMU9v*v!B%bKjS#JKxRT|83U3FVlB_oVM%z>;vDX@A@!p=ey~FerU5YTm?gnQ)THG$VOvZt7ylB!%I#FBkT oZ&IXn;+i^%)iW5f*>fWpGGE7=N&9EC0QE9>y85}Sb4q9e0JCW-r2qf` literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/dropdownButtonsArrow-disabled.gif b/public/javascripts/dojo/src/widget/templates/images/dropdownButtonsArrow-disabled.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1644402f7bb4f55e22034eca1f75224c2bb5379 GIT binary patch literal 816 zcmZ?wbhEHbWMyDx_|D8ACnxv+|No^+mokik(GVDUA)xq^g^>Z66?8ye2jvL{4qgUU R4iSrl2Mx_kd~7TX)&MFY3{3z4 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/dropdownButtonsArrow.gif b/public/javascripts/dojo/src/widget/templates/images/dropdownButtonsArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..5264181c899e704994460cdcd03234f3091466bb GIT binary patch literal 46 ycmZ?wbhEHbWMyDxXkcW}w~zY&|G(l-7DfgJMg|=QAOOiQFtN7CigQOZSOWm^W(cbQ literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/floatingPaneClose.gif b/public/javascripts/dojo/src/widget/templates/images/floatingPaneClose.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e7658ea26d2d2a3c9870b25d7a2e2fc01f5c7cd GIT binary patch literal 752 zcmZ?wbhEHb6k`x$c*ejmbIo%}gx--n{!tyX?1 zHUVh`-J84DKeY=?pR)PUyge_i{ZeWd-CTd}SMP?W^Y(vObo6Ib@uZ2H9?U!Vb=t0X zZL1!xJM(kl!A~=Hzs>E~udDSexsFF5>t!QNMSof|9XU0ZqL z+oFT-CvSfx%zg+slRh~znr<}-piUZ_8$1PAH#hy{WKgb7Ak6qTVew{;4?~8;)FkH*M$J!&ly}JNsMH%DZ#j zlT8=?ZaDvE^TmIYx4mvyc0Z?M)5_ETie_9mcI|C;>uLsS1I3>#U?X)vBq&Z8*#9@A zG&Q%hwlyVoc6ImkaHhC~CQqI+by{+$OTSX6d+huL3m3YFD)lRe8bz;Ovv#dfsB%z> zSg3W(j-9)9S%-=Rrl^GqM;wh%IClJ`aHyJoilnm)(-mJw^(*R*zE_xJoF&g&dfTzH zYnw*u2?*##nrc6@^R^5~aSPXC{q4#Z8SJ;oLSxhVhAwS4i3t}AQjayXGf$atVp401 zPzQ5b%*6#0j*7}MIP&aroyF{!Fu75SMw@qj*1P3u6gxu z%kzC$rLcjKb*4N^PQ}gB+w~b!cdscDO@WeVK#9A$B9pj0ZoQc5X^NZIQ90 m;*83%rRS$487y>i>v?&3Mey=AN4B2V*Eb{|ZxiHTum%9y30O7& literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/floatingPaneMaximize.gif b/public/javascripts/dojo/src/widget/templates/images/floatingPaneMaximize.gif new file mode 100644 index 0000000000000000000000000000000000000000..d75cec09076b7c89e92b32dc14ca6fdb2b608b08 GIT binary patch literal 704 zcmZ?wbhEHb6k`x$c*ekR=<=I&XMe9c`E%*fugi~rpR@17n$y4LANaKB@Ryl;-WPOl zF6!O7=;+Vh4Nupc`cc@krE=c2X}jJnKlXLvmRB?Pd^~vh^|F(HY8TyHa2Tlf{k;7j znwH&Naq92-bHC;t{JQb{@68wflefKYSav_BW7Eph|B7Z@ICkxAcI#?Q zEARjR|1%6?p!kyo>^dC~35pX2_Wuo@P0cN>ZB1^SUEMuB+@3Nv9+Rg`o#tU9(=TRY z;xvE3!i6R_V*PqH3J$B+tX->Mqi62PV7&;>Q(F-(PeEHDX66si zP6mJSck1W(74=1-k-^cS(R+%C%EiU4`#5dmWGp@eESS`*U*&UQVu}ktFDqBcoaHJ@ z+vJo(R2(lVJ2$aBo^bcf1?JW>LJVntB)qm{T$E(+TH>*Zv7tjTV6oR!Ev5r)OT`&X zJ{;V-I($7ZLk!167AGEQmrJW+cVBbk;Yg894cXx`J&0A(dXmh|)7#g_@7I|mBI&bZ ML*ii_CPoHp07AGIYXATM literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/floatingPaneMinimize.gif b/public/javascripts/dojo/src/widget/templates/images/floatingPaneMinimize.gif new file mode 100644 index 0000000000000000000000000000000000000000..79e0b3297d136b18fe734dded75a500c03f979aa GIT binary patch literal 692 zcmZ?wbhEHb6k`x$c*elcu(2aKf9_ZBhNsI;{^{HFe9_UL({{aUS^41b)wdhZ|IX{&IBm!4g$F-1ExWtm@b?v` z{?6R}_Tc5$-RqyuJNPxXW5dKPuhyLUQP{JkZPmlg7yc|c@}+F{<;r>2^1C+8+4p|= zv9CGp>u2x(JbC+@+C?{yTz$Lb_^+9JJ|4XMX61=*TQ2^cxBo+7&*sA3Ejb+%k_hkNoPn$0MU3B=%^5frEo&34x^sjYie{VSdXY<8>npWOLGcM$GY+8Bx-?3|N zvs+g)3~r$KlLhQR9S{kM69)GG4PH&nEv;=$9-Up?Jw04rQmmenr%avZ$tu;)$7@hLQph0m3H#2XU$6T+eSc`3x-{u|sI&Igx?)6V+?)f-p--p7U&9isEnzZHV z)NRiSd$-Kk@gl!_Q&I1hMTfsEJ^FS2floOd8|LkOJz>-1BUj%YzVfzn-IGlh{%*eb zZ}PU+4a@Eq&A5=$v1#S$f5)!9&2C+-Y32R@|9^(T0Th3-fE}U(B0+J&!2Z7>psBf~ zwXMmov#YzOhbutE)qnDosnh&jRr>i|`8?+@Sh$eSmA_xkRn24dnzd`yT;=Qn1YITA z19$G)&AwN{RnR&>z*U)b_lZE()5@*_vH?ayGHfSzv)zypGP)ovX}}T~^!Ul+K$aH< zlEUTzrf!DJkDfjWWd3gGX37y@>?ZE;Y^Jx_lctH1e_|wVesEqOl5JroQFu_lMUdA~ z#%ju>hITe(#VUu&#FnPslrKUr79>15%Bf+}W5VIE`PnfRODTzkA15_32r@KrZFO^L zVPI2TutI>rsq^ykfQ3y03zSx}GHUl_+&wk*H5a3pmP6viq=S<-XIx$uJE5sHLPTCl h@8r@ijI9D1KA&FQJv}|2Tf>)$Th3=jLAL{gH2|VAB)H9xj_mwJ8Y*`Ipf9;y>zsar=d=ztOpY?0Zw{Rr3J0M}m%_m2d6R6hf%pG+;D$-Eq2`{)zmL3|CcfWLoz{MZv;>hX0OAN3z< zJ$`JyhVyTTZ}j-M&A)x+{Hd>@*Sn{&ek(XWsy`54xBUmLzdST>!TznsU-O`W`Y#?d zP_uO(@1Q>u-@*RF8TLQ)_!`IGLBBvh!|R{m_yh5vftvlwA!Ple&?m&-VEupwD*gXG cJ$?ij05cVg@%;HynE(I)07*qoM6N<$f>CrV%m4rY literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/incrementMonth.gif b/public/javascripts/dojo/src/widget/templates/images/incrementMonth.gif new file mode 100644 index 0000000000000000000000000000000000000000..9710e3bf9f8f7d0417e48672cf51d7e7eff37755 GIT binary patch literal 168 zcmZ?wbhEHb3DrR-AzO(emm+8AcG%dPd7nG%A>u>52J9F>n>AOEJ+jf4&o==)q-VE4);!hT^ zunvd>*~!4Fs*uvV8U}fi7AzZCsS>Jit;^O978nDCtuj|$t-$v=5wc{)iaa?^4!BkX2lr1{r~^}rxRTj4L>+1EmA-3AAh0g)Irh40v(^gqB>v0 zGa@CfXB=weTJGZN1 zCkrD311EzHNCspE151LzNnxH{YBDECf literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/no.svg b/public/javascripts/dojo/src/widget/templates/images/no.svg new file mode 100644 index 0000000..3350920 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/images/no.svg @@ -0,0 +1,11 @@ + + + + +]> + + + + diff --git a/public/javascripts/dojo/src/widget/templates/images/scBackground.gif b/public/javascripts/dojo/src/widget/templates/images/scBackground.gif new file mode 100644 index 0000000000000000000000000000000000000000..22d1289c8a7390a368170621746c42ddadda995e GIT binary patch literal 715 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/slider-bg-vert.gif b/public/javascripts/dojo/src/widget/templates/images/slider-bg-vert.gif new file mode 100644 index 0000000000000000000000000000000000000000..189f4a6b0bd6a75d535d56de09d8c2725a3719ab GIT binary patch literal 1899 zcmV-x2bB0nNk%w1VFmyk0fztpQDS_Ama%+}t9Od2Phot2lCFf7vUrN7lA^kFhopFn zs$O)KcZi}^YKd%so?>~JPGEajZH#h-pk#QLe2}eeewS{7pl5xaZGxg@calt9cvfeC zUUZXde3n^if_jarikr1$dz^BHrFx8~XnmY!e4T-muVHqSd5WZRho(teb#a8EYJQz~ ziKA+Km27~ac#Elah^1_RoMd{MTX2zVeU@r|n{b1lX?~z$d7FHVrihudXL^`>jHOd# zerbG~T55ucnzU|ymwk?=dXB7Oa*2A2q;-a&W_y}?j;m{bo_C3*YJZ?)c9C*|n|zO~ zkD$4Hj;UR6jZ|fRRcVJ}ca?I5qD^0VcZ{iZh@^|0wrqi+Wqh1ye3^EKqGNlVj-Iz% zZH9i2sC0&-T5ykHbB|_tlVWv{S7?A@bdYFzlvikhQe%BpW`AIEk7s$4fRe0eexGT3 zm0)v^V|tr{l(2)9uwQkSf03(zldn)=d|Yypf03~I%V|9>$ldpb|tZRXxUUQRihNWS6n01J!Zhx0~jHzUL znPGRAV|I~ngQ0PRpJH>5Y=4|%b&+6ol!241Xnvl4kgI2Wn{b4raD}9FiKl9Sp=*Gk zV|kfzg{5bHo^*+*X?~q)dX;^Ts)3WOV0M;%kg9-^u7;ShhnTW{kga}^u7s7bZ-AL* zd6R;av4WMbevzwpil$|Gmw}S3Z-k?OldfHIlZTnKbcd#fn6rnOvqxBQf|IRnfuC-H zpk{fPbBCrsPi16xmQ!PXMOAG;Pi9|rlVNgopy<*X?>b`jjLgJmxGkC zQf7lwXN7%{t&g6#TXB+giKkm@glBn_Xn&t_g{5nNo^FGpTym3KbCZ9Nt#E~D5k~K63`; z8B|EfXF7lw4S*C#g^+M`cz7Bh>Qtywsan;V73Xqx%9d_{aIGc8D1+;3} z#(mpXu3NZw>(ZTTZ5cDSeg964R40~^!G#Z3AZ!?M;|j#;1XCP&^3=+ThncWkK{IF1 zhig>o(#0&<#{cecC^x$MBhe{+kmhrEqebBUc)!=-UWawDxSQ> zas$nuM`x~_y7Lal_!MHW2D^6d9SnW{?=F5j`SIb=mj}PT`#OCiymVJqEdKoZ@;lV= zG-4AP{rvd{V1NJZN8o_|xd6!%mK=eGf($wcVS^7YNa2JMS}0*25kANvg_-0bzyX?U z5aNg>o=BpJBCe=niE@b842&|uSilEM*odQ!Ic^}wjXnN|qXa$zNu-cV9BJeRy%FYM6;;8*Q!$r<*s-DQBE- zs`11CV+;c4o{jja=Kz8JNvNQJB6_Hyh0a67IaWwA#T!XLDk-IwPFiWCnr4bAr7T91dw%VF80Jp+^n{Bw@dRwlz+VV3%J=&o2O$LNGk_|d+ zz$-7k_Rd>xy!z&gFTeQiGK&L0)GIK-1`k|t2DK<$Z^H;P>@dU7*waP5k1(P{A{cAT zaRwQ0+_A_Ydpz>TkK7}26WmO~0uKPN>@v(UzZ`SRHrGsZ3K;ORbI(8f9J2^pkg(0r zMIYS+(MAJ+N+?A;<22MHNd0uwQ)AsqE-%P3fgW3T{dL%0gS`(WWphHyEoraaHrrpT z4YwYg%)$f`-so}0A$KGHLcrdA|IIfNegjUp;DH-nI5dd|@&^)C{Ovg8l0P2#8Ixb0 zdF7O2Zn@<2%n*4R7{oEd2?UUCI_jjuVhZaRxDLDQsmK0$?Yi7fdhW3Ep86IS;Nr^f z!4IDX@WK%h_074D!frKFh#tBQPLKK?Ng)L;^3R5`47s?OQ{2>oWeW=4B3NeU9L?RH0xWpqe(TGW8;sVH^0V#aJ5BZ>C1adIN2&kX| lcc4K8sGtINz#{?;Xva0a*Z?XJARPYyhXz#8jei6L06X+?k^2Au literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/slider-bg.gif b/public/javascripts/dojo/src/widget/templates/images/slider-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f98175dd4f9b218558b7ce72fe2dc4dadd68ad04 GIT binary patch literal 1102 zcmZ?wbhEHblwo9NXlG!s^G$A;yuNqd_LPdLg{_NIin~)wd!qAt6AC&idsju~bU6iP z7Pl?+h$yP+UD>~2M`6pNhDqx(>*r!0RdPc>hq@vFJ<^`!G-4)%-qq189 z5^LNe3Ucb_*!!i}`=z!_+t@sHgPl)OQrYB+?v-g3liQ|m3Qce6oV~Sf;@bG)ep{cU zl8)ucPG$(jSurs1F))|`4asB3`TGaz0SJSGA%}s%6)Xf~00Fa598e=eKp;?~ z4Oj$3{QZ+Nk<)b|rys+^-9oVV-)# zGFq|1xIlIuPytwqacTZEARB5dNH3@0`3q7T7bd1NoI4o85ZwB6A=HdChD?azFf*~! zia%MH85m+1fDUG00Obh=j{gihMGOucI?%@yC8QN|V#C72?E=bPb38UKI@&E^oOS2K zM&)BN98O;r9Bk!g5|P)kDfqak>-2Pkgwu<%~^L(ZC!nReZt``S?_IYZf;IsUeSBNrG;5eTuQ;S zAmykqo7B1&cTaC$e}8`iGq;@2jtvhFcL;08o!PPR@nIGYhYJgtJb1N?{3<3G96Z9S zv%tAq&Ue?AmzP%ruZ}yrYwPRl8^2z1^ZWMx{{G?d>G}Tq e_x=6-(sW<| literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/slider-button-horz.png b/public/javascripts/dojo/src/widget/templates/images/slider-button-horz.png new file mode 100644 index 0000000000000000000000000000000000000000..628cb1d5411a56b108a3a7cb836f3c8e8aa1590b GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv}!3-qt$+x@!QaUBB5hcz=sfi_-`FRQa(Nr-7ne|uoU z3KZfj@Q5sCV30cq!iVEa{HEjtmSN`?>!lf)u$1_=LFr|Np;d>9v+Q$9mS@ z>sfnk&ffP^wmxrJdaZiOu_;^MR|CbjKA*A|$T-)t_W7J+-&>a6TYBt&%hGezbFLN7 zxpwZ}|8vj(yQ%M11scd$666=m;PC858j!QW)5S5Q;#TT~XrX2W9@YS^I|8n*A$R@< zNy~-JXxnc*on=wT+L<%cuZphUy_{9ywC|T$8Vl!4=*eq&@>IuZho&<3+f47^b9Z<2 zn)FZcJ2T5OYX6Q>CATTnbMsMZF59tw1w!Yi=XxIinclb;zGvP c@chmC+)X@Hx7!|D0Nu{u>FVdQ&MBb@091Xoxc~qF literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/slider-button-vert.png b/public/javascripts/dojo/src/widget/templates/images/slider-button-vert.png new file mode 100644 index 0000000000000000000000000000000000000000..db90bfece3283b421617df0036a68a664bbb831a GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6S!3-pQQqx+1lun6jM2T}zYGO%dex5=|W^O8j zTT!Nhk+FhTX`X_Sfq|KVfu)tPp_P%Dg06w7fx-SGNs>T)>?NMQuI$&?#Ca7A+xA!7 z2MTc(ctjR6FvuMQVaCImA;CaFmUKs7M+SzC{oH>NS%G}l0G|-o|NsA2&pB2-#H5N*3L#(#qEHaUm4I=2*dzp>TWKKYbRG5?0By|Wd&b<~#y*Ir8bdb!i- z8d@BeIx*LGB<3Gak+i2?h$Xq&xaLGB9lH=l+w(3go*6_=LFr|Np;w%CX`(*Q)0n ztDbYNdd{_$rT1EvUh7%=yk*X@mZj%bP0l+XkKBu|{I literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/slider.gif b/public/javascripts/dojo/src/widget/templates/images/slider.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4cf32e03e8738e204199bd5b7726ce063381c33 GIT binary patch literal 865 zcmZ?wbhEHbM90`gIEWCntJ`5ipxO9nf#vPd< lc+jm+)V_(wQYhJ_U)7)M&x%P4Pqy$!OHJ7skl?^z4FK~v4u${# literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/slider_down_arrow.png b/public/javascripts/dojo/src/widget/templates/images/slider_down_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..68ff366f1ad88e3b8b8a0092298fbf2e62dfd6b6 GIT binary patch literal 382 zcmV-^0fGLBP)G85sVTc*?1rqCbDYE!~uwtl&pFe*gJKfk8 zWXZ2ze~<?NMQuI$&?rTEzdH#Pn<019yy zctjR6FvuMOVaB`*rFK9;mUKs7M+SzC{oH>NS%Lg#o-U3d6}OVt%qg4DC~|=5NZT(f zmsNK4AGx?&N}t^_HZuz=GczkIGYbn7Q(zE2(vXq)F$0=b~xO=U4Nea zKIbWI_xIPy+}&Js@W`a_^YRHFO^km0|9}6j_HlpNh~Hm7SI=3(nCJXEec(g?#E<5O>)DR&@8S7B!6asH n9rvq50md{(4Tl{ARPD%j!oPoj9)z4*}Q$iB}H6Dya literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/slider_right_arrow.png b/public/javascripts/dojo/src/widget/templates/images/slider_right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3231ffde982c08b739b08c392b7a659be2328bc4 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI$&?rTEzlJKx{?0Tkja z@Q5sCV30cm!i;$rO6`DxEa{HEjtmSN`?>!lvI6;kJzX3_DsCmOnNv2Qxp{KqLwjbK zKkb+Q2Wqgj#qY1%$e`(4n#$&;wt>ati+xMO!~!vC?ax2E!y^>h{w6>D|6QEr|DT`S zEDoQ(%M1MY`}_R)`TOgbeE)sD?c&X~Vp3jcY%f>E>1ceWMpBRlq0~BXnm^ zQySmFPg%$I*ZpN=)3)P1b4I5vEUqo=UXPE?feM9$<{3+zoa*@b_iLy;;;{A%3S$+z zykm~ny5%$L_NFrx-QMx^TV7q74Ysb9bUUb_8~plTB>DUb~e42(d)#>PsllNiAi zI~yCa=<8>9fuyLEG8PRCj36u6*%2E4|NnRP@LC|lFSd%2kqJWs$W08atSoS$TbGW$ zd-WK|czElqs*WX^1}2~dKrJjV@c-YR(}&hWy21aHkW(I=bFWd%31}0`E;x#Zb{Qt-F>pfu&5Xb-c@g0~3iBt^) Y0KQ#Np>~7>;s5{u07*qoM6N<$f)crwF8}}l literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaActive-c.gif b/public/javascripts/dojo/src/widget/templates/images/soriaActive-c.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd9d6369c2af883918edbcbf76cd1a5875bf31b1 GIT binary patch literal 1694 zcmchV=~EL10>x9Lz#v7cRw!kWwTvL3wXFlJ?YNA(7>;&3tt-}gVC@J36>K}D)9uWn zAS5PA-|i*@ zN&!j$pmTH^&C!zt_P*CX()2EU&fP0=bc`Bs6XvclBW-4{XL^S!c9uY>jCl`p-UI7d zc?1_fY7mt)h)`@jo@Z$tP(g6g)Y?Ol6@lfX!;6tR;c zcF<>CV9esfI$;xQ3p-&dsTchO7lW~jIDxl)SVx$&VYo)runs%zeNI^Fp5CE}_n?F& z+N`UFyoz8bV5Al7xT(2M`GWX{EVMT=H>}5@DU3~)_(b&}7()tRP z)Q&=Tbar8|*l!8M?j91kmqMk{8BA7RKjq`0;Sn}xbd1Zr$>UE>O$&q~(Sg~y`Gwbu z66w;L<(1XB44HgGvALyGsjh2vdc(HSWVTpsJG*v=(|p72@%jJi?8D3!VDIbga49A!_K0CwF$ST&c%Zgp|t(ct49lT%zXB z@7u`kWoC&_G1Z#I>{%W7&D!6|VUpHI$_^Zi{v7dGJ_b6Hcw4~gRq$XRW?e`^QMRTL zpBAnO8m%BP@)9Kai+0?0MocmYYaO6~}cdu0}zVwQ4jhJyLV9?plGS6LBA}>1w_x*I(0ox2TT)*#zEWScf|n? zCBZoC-qjgLe4{ZYwtsk$i4zppQgSdPMQ<7lyOLz)9yxT^>>H2BBbq0oN>?7e7gLpF z;m5*@ER%8fkd~<=rrt7rmKQ~R`<$f6Doj-ot)kDeLahqu?fF39HPdMynA}4(d#lwVtj6!q}bQ1Jv|F;56J_LMJ}4&PZhL>Hk&J=_e@o3A*iq_;N=r| z83>q-It=G?PoAFzzY9Vg#Q?_>ZkV54=c4=>{P8otn<2R&=!o&u$DcHrq50Y9NC`hZ zxl8uE1d5JQ0eR=&%)YqDM@QTFybF8g>N5Wyjs|4#FGgBmpzMwl?>%^ue%|sD2JMKA T%gD$~*r-7WVo&(J1^Dd08lu9E literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaActive-l.gif b/public/javascripts/dojo/src/widget/templates/images/soriaActive-l.gif new file mode 100644 index 0000000000000000000000000000000000000000..970ee6914efed94a2602dba204bff97133b87bda GIT binary patch literal 2892 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaBarBg.gif b/public/javascripts/dojo/src/widget/templates/images/soriaBarBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..54a7b564646454c108d3f1768bc04ceccf71d858 GIT binary patch literal 155 zcmZ?wbhEHbWMq(KIKsd%ZRfl86*p(^`!spm>zR8$HZQ+dzvR~PQ-7Bn|F!bWzlmF3 zP1*6bX!?bUxmQbPU0QMa-_jGmyVpOdUT}TxfiH`X{+zM}Yb;03p3^1VhlLgGw0g)g(8CWF}KFLV51W0c8WeQ|Gy&xuRiD=su3m*X{25SK7 C)=cvN literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaButton-c.gif b/public/javascripts/dojo/src/widget/templates/images/soriaButton-c.gif new file mode 100644 index 0000000000000000000000000000000000000000..226830f474504a55062bdc7f80c74500c6ebef02 GIT binary patch literal 1662 zcmchU`B%~h0Kj==>Y6z_X3TY1_R7?;R2!CP82&5;XR2t)cc6u zT#5olQ6SjH;uh2E2IZsT5BK4{rEO+7%aB{IMDwhOCgTG{@86Z5OIoMX@MF)=L$B)O z*(6y>i>Zz)$9LNaA_t~(?m2cC#kFJ*#w$3pN$>gzB6|@_U&PcuM1II2PocQhLWZt@ zu7$G=Xr8TtWBCX3<#B0We4zv@n8)(xQ>sSp!+VfT0GexkQZbNR{s|{sNG$3}#f`oo zO5f78Rf2hm)KT1QN-FDriW+>~pvtVC$f}+EtK?%LQ;%#0N?WH37&@ZJQ7v|Y{&zOb zx%}4*`s%MwKyJ>Im1*f2FEX>TU%tEu%YB`f|K@E$VG$gGEG{W6dsm+S9l8>Ot-|36 zgs7TYQXQF6-$11`(iuz^yJ34vYg>BafJ{`8cO~7vU^8pSd)uBr z4+OdTOH*9DW2LEXnJ8(RM~F(A?sXK5{$@>N?8FQ3O~ORxkC&tqS-zS6li6F~QGcxV z#}Ou91<_TLIl+;eWUxI0v9jDy1rp;GW>LxV!d4+_^C@Y{;wSR7GN633S+N)!3pm1U0xF5*3s6+~tE zGmBbT@%-#26)MB~jtZTKtE>7?7 zXal(g0qrhp?@~I}Y^en}9(#2F*XuBp%Ug5duF2U6zExY#-||Rj68L5XO$)aaM02|Q z@wL<4K@44k=qxYDEZ#GC*DMK@t?TRwv+B&f;ch!vZB3uiQ0NwSVT zv+5b+`(1Y0q#0}DZ4=pko}5Y8UV}}Re{3g9?sq3$TJDIkr$`MdyUQJup`0t znf?n2_SvE92RkhzNk+R>nibqSYy%f2IObG%vSVIHJ;+@E1i{Y5nZblM`!YG%=~%QH zolcMo%EcAZzQhMeafhOoe2+|Z-3O$4!B8&SAipj@BuxX0QLcN19iC6#r-R(l?#CdU zRV6@%|B+2gBZVAqHt=E>4DIn}a+=Q8GvJcxRg}2WyV2IM^NA^EeOMY;0O9{sVuHm&ult-6@ceFV{z<00000 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaButton-l.gif b/public/javascripts/dojo/src/widget/templates/images/soriaButton-l.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe0c0fd09f4f5b25c702a80ef44707e534bbd05e GIT binary patch literal 2716 zcmV;N3S;$0Nk%w1VKxAF0QUd@g{a+wr`vd((!<*Owao6b%I&Sg=BmQws=?)%y6u*@ z>yx(WsLK7L#`&JX^_;)+r^)=C!1QvM(5cM+aF)(-m(OpM&2N>>rO5k_v*?kv>X5YQ zqQ&^8$^4(f_I8`oo4)dWqS>d){cx4ea+l9>md>cl{%(}bl(_An!}p4=b{D+=r~b{C+lQ;-oWJyerQDgk@P@15khAHc#rch~ z=BCK}g{t71z4CLJ(Q}y4dY{*&$NQ4C>Vl`;h^*p~wCZ%4(u1eoqQv-lp4P3+{q3q!`b@6*!h2>*SF5^nY-@C-Tk1!@{6tEjIQFIzwvmR(v7g=zt#1ez3`5)}O(p3`@m(UG&}fuz`otKfpA*|N&(pTY92&i=jB^uN{irN;ND zzvH^k@}$M}q{a5I$my}j>Z!rxsLA@Z%kG%D?4`%}m$~ekyY7;;=$*guyV3J~pw)h& z)|CYiF3Wxp^6J&wNYK!~HSzA<+ZV9mnEg5^Uc9)K-@}Ic&6!M@vY~KYGHc$u{KMb&A$3ESdUaCFqif&(yx)!Q;K7ssip03Q`Sa-0FYec%y?ghM$g7`EA3gi`?;r6h z&A-3@{{WKKPYwhYSYSGx$fn?e3^wRsZ2iO`;e->Sli-6GX4qgq9CYZRhnKjM+=wKW zXyS>;^#jO?EV6h>JJ!W0Euqs|Yi%N$d}{8w=%#yaKOnU0uDha?tM0t? zqRZ~P?}{SHuKf1v@4x-_Q^&vr6THd304J=lzx}x2@WT&pf{3^jS8Vac757ua#vF5e z%)}UnEV9M@xMA|iC)0w+7A&{y^2;#CEHljg&|ve;Hy7dxzC8Er^Upo^!@|%+6I}=~ zS|qLX(o8q)^wUlElf=|iQ(eeC5NECR)?9b}a6dMLEwP;L&V>J1K!OwI2UgC;fN=Gb3Z*a?zrRXz*F?(lvi%~oeNWcOb@PN4MM;{i*Kn5x!0mqA=1Sd$r z3L38;8_1vrHMj_ARPTcz450`|NWFf*;e;qe;UcIpz81Rhg)oev`1+B78rsl??4ZW~ zcF4mX`tXPT>qi;?hDbyru0sJpOrjEh*pC)C@rh3y#3(jM#VT6yidfWOKhD6#E_P9h zSq!5XvDgnCnDLBf97H8<$i_Ch@r`h_VL#+R$2!(=6>E&69{2dhek|dSfCMBX7BGcE z8uE~cOr#_fA`7sLr7UMj%Uar!miumFQX7s}9vI`p9sb!b1HK+%d;^b@a;f<`yW z(T;lbqagKYKmI_{l9tpNudt{}SIW|sy0oJG*n>=GI@4wZBMdmrsZMvw)1La2r~Pn( zP=`8HOn`x?NKL9zm&(+k_M;6@jcQaeu?s6$^{QCSs#dqkRju|z4PXsxSQP<)9hmj3 zXickH*UDD4_M@$2MS@)CO4qvD^{#leYd`W@j{t<=uYe7#U0r1Qi2;2$gqYt%;64u_`@BpaCs>q zfC`xS#3)X&idW2H75Brw$&dvVW=!K6+xW&f&hd@=;fEgk*vGo?1qFso|UP>!;cr%dH4TbauJu!EMjyk%41!vbIqvzW(B<}#a^%>B57n%BJMc|_rP z&2WyhoaapEI@7ryAkMR%_pIlBkl@dN4z!>LP3S@!y3qY-v7#5v=tcLV1dxujq$f@3 zN?ZEUmhOj=H_hozbGjcR2(_q3P3lsc`qZdCbw94m>Q=kD)%`fLtY=N@S@+`vxX!h% Wcg^cw`})_uR*0~NO>Be&1OPjWeQ10D literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaButton-r.gif b/public/javascripts/dojo/src/widget/templates/images/soriaButton-r.gif new file mode 100644 index 0000000000000000000000000000000000000000..705b0531d0e7ab197568066fdf8e93af5d64d24f GIT binary patch literal 2683 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaDisabled-c.gif b/public/javascripts/dojo/src/widget/templates/images/soriaDisabled-c.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c0ee9ddda6081b296b939f8ca5dbf7aa9288f3c GIT binary patch literal 625 zcmV-%0*?JhNk%w1VKV@C0K@Iv9Za?$;QUU!otGY+1anJugAy7#KgqG!NJJL z$g;As!^6YN%ge>Z#lXP8u&}Vs&d%cE;=jMYzP`TA&CSfr%m4rY000000000000000 z000000000000000A^8LV00000EC2ui05br0000I5pd^lDX`X1Ru59bRa4gSsZHrN^ z?|kq7z@TtQEE2rvsHv)} ztgWuEu(7hUw6(UkxU&GeyuH4^z`?@9#Kp$P$jQnA%+1cv(9zP<)YaD4)e73%+}+;a z;Njxq0PICJXUNua0C zpFo2O9ZIyQ(W6L>CRoa}sne%Wqe`7hwW`&tShH$(BTJr4xw7TUm@{kM z%(=7Y&!9t#9!C>oFt6t5zwd>cgW6PdRySDAyxO3~qov}B@1;B#~A5Ofu@#Dyo zD__pMx%1}%qD!Any}I@5*t2Wj&Rsi%@8H9WA5Xr#`Sa-0t6$H)z5Dm@*Bh8mzrOwZ L`19+(9|8b7gt=?> literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaDisabled-l.gif b/public/javascripts/dojo/src/widget/templates/images/soriaDisabled-l.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdbef1acb0c20438d90a1d7f0411c34886f92f31 GIT binary patch literal 1206 zcmbu4`8OK|0D$9`Oc84_)XF?ZoO{+W-7B>O#X6g=TGdWF?L4Ioqjc34jYvgM%uQ)D zOPrAia!2Hlh$9klR!AyT=sN1E?b+-8g?&GKzkNS^p=U${GQiVdn zWHS5v`(-lO#Kgqpze3V4`@P03J8nkYHo**HEuyd$;**M4_+ z<2QDE^yiUYbwW)~Ecz;4w9&_~^@Ex0F&>Wnd9a-Uc7`DGkp-wHh54|8Jap+(GzM8x zR#jDzUs>HySc|A{#1=t|AGZ)7O_1lU4KQ~S$qe7s*iCk)^kJ!F29pS-(R;aN>>lAz zsaP;l!=nvIM`av|0yQ={_vGcQ^2Ik!8qHCax(&Lrx~7J`aeA#?+<3FSQ?R-JRtY<8 ze6)H=*_)#mm=N`Sd-Gs{d4_{szt3|%`iP4~0;(I!chn6=$~jW3s0a!z_P9q{29-k2 z(&~ZHEs`2fG-8^%r5kZre>`K;B=s7ffekB%WVlrPB7G5swNIIq;pJ^n1Pe+bMSI@y z1Q*Euc3y!Z z?kFvS5ccO7{eKCWkI=>s8Pu&M(Icanb4=Q{b{eZ^l*^>=u0sP*R)PP}?`^>ZE3xws$A1%Q*D&vr!;HskX+%z@k%l2D9 zcJ+&zI=H}Xr9PcSz?CN}2rG>l3zvc$vkh(V&vHOXt__IZd#le=oyDuz+m_%JP+>4F z5$u*w>jwNiHpvxNiwg<{HdiLC5%9QJs6jjFy$*pOfVj89{Nvj?x<*^Ios@;Opia7B z8w6~A^m03Z2x?2l!>sQolZL%6>+8yYu;l`!H&3NdjN|H3dgd-@H~PeuQVw+`FGuD{ z<<_Ea>#dRIyug<7%Xa`;aoa60=-r$*>-}apf_ujG6sE33&XjT`? z)3yG2UWb3oHv%fK`E@=O2Xl%iiR@8dr-@u#N;ikh%~ClMU$zOE4;_yqi;r71Z|Qug zTC{zf0MkjETW)E8@Jb=8>)*syGvD;MBRND)M`?r!KWJ*9V;X E7c;JBAOHXW literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaDisabled-r.gif b/public/javascripts/dojo/src/widget/templates/images/soriaDisabled-r.gif new file mode 100644 index 0000000000000000000000000000000000000000..449a8c8cc0b6d4c6ec618b280fc05404c528dbfb GIT binary patch literal 1105 zcmbu4`!m}I0KgMfkIq&rTRXH>T7t~QW}DHw+SaXJQ`@f2T36|H4q-jjH8M;SYbBmV zm87kAJVG=gPkG3fJmf**8MGadEQF{;)T^x7b^pRXKYV`t+@0`F866#EGMRmSeOxY=PN(yDJQj<^U@%lF6`ReT znwsMC`Qzi`YPEWDa&lr~Vr*l;`>y7(!**v!XG1j=#eTu(*P|MWtoflJd%`imHc2 z)ine({!v}-lln)FE`F_T?M>w^?PNbvSyy)(rIgzHl#XNe_Hl?THXp<79xN8HBtj`q zen&)B-g*D1mwI|;Jb!ZLFRy2RyqKHT%TVOaf50E=>O)uAzlk=MSQwV&`Tt*yT(-ZwJ;gSmqIwb6RTtQ}zHdMoN@ft{kj} zoufaAbP+4?zG*9oX)Y;BYh5^Z^VRM`<5)|?Zn6fTlO~99E%IpUBF zC&IW#2kwVZ^$PsH~e{W|a%rLJK2&`7n8g@Px{9!5_eSnj#DR9cE_!{GV9{d!~YsIQFg z^s}i|5|-Plk^U+6o>2G-siU~lht$F3pgYsbH5gmE8WBKFmA?j_^0tbN1kRTKD&?2* zMvRTrrwdBG?$)(RI|K_@bg&7Bzhulrx%)6?kndoa@bb~G4*Xq{9>`8APQS6ndAHHn z%C-{)n0RYQM-y*Ht} z>k^Ob)%77y?EX!M)3q5E8Kj+TkwaOl76ohwx-lF)?Q{zqvP9lcp50#EP@T00gTnp= D(7sAq literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaMenuBg.gif b/public/javascripts/dojo/src/widget/templates/images/soriaMenuBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..54a7b564646454c108d3f1768bc04ceccf71d858 GIT binary patch literal 155 zcmZ?wbhEHbWMq(KIKsd%ZRfl86*p(^`!spm>zR8$HZQ+dzvR~PQ-7Bn|F!bWzlmF3 zP1*6bX!?bUxmQbPU0QMa-_jGmyVpOdUT}TxfiH`X{+zM}Yb;03p3^1VhlLgGw0g)g(8CWF}KFLV51W0c8WeQ|Gy&xuRiD=su3m*X{25SK7 C)=cvN literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaPressed-c.gif b/public/javascripts/dojo/src/widget/templates/images/soriaPressed-c.gif new file mode 100644 index 0000000000000000000000000000000000000000..9dd781b0fe5c59a0d8d3dbcac05f3bc5b5fde238 GIT binary patch literal 1397 zcmdUsX-^Xd0EQc7fXAkDL|BGbG;$LX9pEqwDh3TPWLbNe0aY;Z}OZxm6>|vw`4#CKm!2a#GXFB zlP335Wa|Wp7d`G65UkRs{AG0nvTVJRt{D)zNRuCl(lrdvdAm&lAG3lPnmg@MqQu+J zcjCn!D9eZyxheAXE`}DvbKoVO+pXfV7IDA82^%$cGj%wTr<`NP(X!Uq=Z8pP)?z0RKbwd4v9Y9shYhHvxnMDnlPWs;UOn)INTk zQUCN=L*w%oP0cN>ZS5~#z3%7)H%4{$KzrZ7;0VM|XiQ)K02YTQ5J_YTl}5*Z&m0a_is_k|&9fio<`!*)`iTvO2PGJ#XtG4&{f9;Go=wy~m$K9=QYJ zHAUy3@_6{`f*ncM_#LMRFwyIj1lLpdUbc@#x1+g zQn8Ednw;n>LMl$hZQOrSkwL?&1?`85<{7kVtpswsZudEQxqbs82Yp3ECmE-)*972m zX(Z4r^{#PVG)O63`0C-7J?9xzyK4M-NUoScb7-Z|GhOGI^i`uUreHzL9CTZi>>79a z5X0-x$1z{To_e8eIs^4`qi7kfd`OSK1D3zi;7fgnpy;>o(Dx+G4-e!yWxf$C|h2BCU( z)TL83q$_eq8c*!Jx%@oqAhI{`;=9B8<)-Y+7AqiN4Q z57fLYfFU)niplRZo69&c+KzI?O>JjIGDHi0;L>ZmDuZKnkgA=9I&kU%l&+^f*`R|q z9{ZEs+kB}||E4`3g@h%Q8}x7pDAs`JeZglT5ipbig&`XZXe=kzh(Wvu8vCdkl(C=T zdSA4G6&z>6j_oWm;l>Z5O?Y8&8jB#!j58DEmx|1!nS8XFEd5<+rYJ#i7V2{AFNxcA zFtmkkA{#A(Hcp(C;Zzh^nN~W)I`q+HvNYtf z=^+VD>51?X=R{UipL6nTirFd4KAEs8zj(Q1bt+f&QK-nPn5z#0)+D%Q{%9+4y}RLt zxZW32%&yro?k@Mn^63)y+U2+i!r6Z0e}6c(st4#5EnX0l20|!28z>7|Q$)Ut+n5J`-{Jmd{Ly>+x9_`*(x_ G(*6ZN^Y6+4 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/soriaPressed-l.gif b/public/javascripts/dojo/src/widget/templates/images/soriaPressed-l.gif new file mode 100644 index 0000000000000000000000000000000000000000..2226c7ad3688d7f3ee5ce392af4634d0948aff50 GIT binary patch literal 2624 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/spinnerDecrement.gif b/public/javascripts/dojo/src/widget/templates/images/spinnerDecrement.gif new file mode 100644 index 0000000000000000000000000000000000000000..80c9fd300d6a79b8bceb50c212de99eaca7f23a4 GIT binary patch literal 120 zcmZ?wbhEHbyx+y1l*c^oH)Z%5 X6`s77@VtAaQ(2>CeSm{I3xhQPnz%A> literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/spinnerIncrement.gif b/public/javascripts/dojo/src/widget/templates/images/spinnerIncrement.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fc237d6096b2357af3de4c64f8433259ed8bdcc GIT binary patch literal 119 zcmZ?wbhEHbRPYaLyXjpQ) zbk?QiC;w<#c~?$5$iTp$_>%=lGBD_X2#^^JEGidHS~BjQv2#Mz>&{>WkK{?`3TC`{ WD3J3;!Yfz1Z^N5EPJjD27_0$?-!xeO literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/submenu_off.gif b/public/javascripts/dojo/src/widget/templates/images/submenu_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff7a2fa5a218f512c8e0a3ec07aaf1511a20d351 GIT binary patch literal 161 zcmZ?wbhEHbWM$xFI3mGNSks}XZ<|rlkXBS*P}6SV5ust>5t5j%W$h!UWfqlQqHO3O zuVdj7oTO^vBB`wB7!a?hZzG|kqh{tNsiG&NZY-;5Dx+cY|NnmmY(ViR3nK%A1cMGp r5@aU>tDHh(uY|#brb|8SEfx`pIz6VW;;pVzP1N`=wYG3FGFSru98n|| literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/submenu_on.gif b/public/javascripts/dojo/src/widget/templates/images/submenu_on.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7509877c296df0aea1ec239328b4791f0455451 GIT binary patch literal 106 zcmZ?wbhEHbWM$xF*v!Z9* z>(#4QpFVy14+abj42nNl7#SG&7<7Pa29OyHEaDq>zMM7Z+p|Dn&Za{;t%ntkl`vd! JvJ_;n1^}6cIlTY? literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_bot_left.gif b/public/javascripts/dojo/src/widget/templates/images/tab_bot_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..0dfab386f0f30d451fbc8e1ade9b13768cda6902 GIT binary patch literal 296 zcmV+@0oVRVNk%w1VF>`10K^^umcaj@#{am~|E$A}L`~3c>!sdps?1!%Ac%ay|&-aP0<%z4^ zVvy35zW@LK{{R30A^8LW0015UEC2ui00{t=000H0ASaGwXPzd9qUxHuFWkEGTC;F> zpLp(fPRXHeT;#GiH?hrl!BFzmYJBFhL@e1pPXq74KNrE0I8|~ u5EcQiumK7O4+FNh9tal#yuBV28yXV?!~`D45epI-1qH{)1{Db+Apkp{ZkJR5 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_bot_left_curr.gif b/public/javascripts/dojo/src/widget/templates/images/tab_bot_left_curr.gif new file mode 100644 index 0000000000000000000000000000000000000000..9279d240b3b2e8238027f7cd601ca5e3466c69fd GIT binary patch literal 429 zcmZ?wbhEHb*h!Z1EM%YpeEF?SAmI?2qX5x#<~EQf}L?=5Mo{H~044@`|{= z_pkrf)HgM@ls2?AceKV-clGtOPw1S~ol-KTe_HR1IkP6to4jCZ_RJ-7mn~X4edY4i zE7q^uID5^O4V$;k-?4C)C)>XL`xF@uA33bZbmHU*Mb@+D&MLB8x_n8I;rfm1lFaOP z@3BisFh736%)`&|@)d`Of(+M(kIFn^oZr4H3rdU1asT61W{Ug4;ONxM#>nhfa6!?f ILxI5>01&3a&;S4c literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_bot_right.gif b/public/javascripts/dojo/src/widget/templates/images/tab_bot_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bc0795648c0e37bfce7cca80f15c21ab7cbfd0a GIT binary patch literal 974 zcmV;<12OzZNk%w1VUPiq0K^>tVvy3H#{ZVU|E6WEz@TtQEE)3{JH!60A>9PNHEpFf(S(&OvrH4!iEqj zJ&Z`P(Zq@v4PDI0@z2JNAn|+*NitH&lblBXqFkwmrAtUEU&`zfbEZuzHE-(7va=_j zoIZmh0V=fU5TZtt`ar7GDAT4wpF;I1b?VNlR&Qd>I&&-6mtMcJ3@a8T*|H_iq7A8b zZO685Gs2BqaW376cJDUKt2ZIvz6JjR4k&nVzru#|Ax>OxG2?iSAGeDvIUVK7)1p-wH2wb<3Jo57B4k9OACwu#}+t&ca<-M)JP5AKh6(&5Hw zAx|!lc~s{?mqTYIeLAY@)=gp0u8_M{?>4uCPdQ$u`0|&|qpzfXeKGed+rxJxe?Fu7 z_7UOFuaQ4n{~+xLARqz`=tqGD{*)m9MhGtWjDr+42q7I3P6$VZ7P^69hN^Jrmxl;# z2x3bk5>}##CmxofiYqGCqKhv!7Nd+aLRO=VH%^wLjyqb`qmMt5Q^5fO6lvs0+o_y9x!2$yWD(Iku7Ha6Bh$gD&qKr1`=%bKED(R$@R%+>`m}aV}q#8VM z0RfZ`EED(kGY)@tjmxaJyb1P*jiz^}jtE9|hu7HjOW z$R?}ovdlK??6c5DEA6z@R%`7`wb(kF00azJ(18KqhAZy4+ZYo w#w+i<^ww+dz4+$aE(Q%8ut5g^^C0lR1Q%@Z!3Za;@WKNlkbwdK0~`VXJBcM5Jpcdz literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_bot_right_curr.gif b/public/javascripts/dojo/src/widget/templates/images/tab_bot_right_curr.gif new file mode 100644 index 0000000000000000000000000000000000000000..a661efdc976cf9b18b1c6d91c3449bdc12c82615 GIT binary patch literal 1310 zcmcJ~2UC*=0D$2SY6B`~^;E!x5k11ztJWYxv04(n)Y@u+3VLcimaIbsJ;g@EhzQCu zLD?~kgbWk}R7OAyF(!f#0x}FEdy>7Ap8XGfe!zS8!j46S9Jo;8ga#(Ofr}+$W{cfs zw~Le}x!SDOS@b3wSFGpDjnjPHqSP=a)K4vGIg8pRsvxO?EmRoGU(O>Nr(d(A*j_$$ zT!DVIko<(bBsH`Q3M^LpBMSEx_RH|35RyYBGHxT$O|Lq9? zIjAL>@W9QF>A0*9siAeFEmx0|&QPX^*>T@z_RqInM+8@mB(+0X>2JBq-M9MU$CbvO z+arlH7UZ40yZJZ%xmWO@@L|!3`^6=tW#u`KD=?K$pT(f7YU}E2YZ`EkP4}KR6IzLx zcv9PomvNN#&aUp`uU_}`w!iHg7;L1zqYY!;(?2pFFj%9XZ;p&ja5C7F(=&g6ndQz` zFD&uq_(D*6y*SKv6`Y3x4wf0a%5q#bF zP@(6}vrPK$pJ|W4F1c>U%0}pAz5$K#DY`QttTiVD2%!@(6=c zx6Wbra&pBWciCXz9Uw1Xc;2ct6JVIz!I0v7&tKp>yxh;hVW`cF0mp^=WTbCpfm<&8 zA_C%##uf$ybFdG0hq^y6+8Y)9ycqh25A{*FUbOT$66D7#IqIIwD~0>ud1Z+GVqW>l zC_jG1>ClytKx_h@kB-k4^D*a9euBzN=w!juq$a%JS!$BZLxTK8_4)28qJ{z=f(To*U*d}eHh{&ris%$^V`TzC+*F+{5jWSP{3R_obczJu z(nOFD8l5Alt!*@aDY1i-A|-VT2vTy7ULvJXK>@P1A@|F&7xY!DsQ`1oRMtKk6(H|m zM_-n|no4Mucg|)@vdpRWDWc z11^EfeJ=6!)B#rrae2@UDqDWH78a-)+7OefdheM?RMEEP$W+7NM5~jFOGT>sgKslY z%?Rw0sXy)+4%9IBO{QvCAwr_&Q@BB0xH*zpM(YJ*r#LC zbQ7_OBpoOIR1M(jxeKhHx`av7e@SX4>8De>?-POg2l1 zT?(_bZ8+E>>zGUrv&g%JWQ&3l6FKnR`T}q`FyxV8RnZ|7tC|T_S~a7v-8L;dCc~zi XN~GBIvpL&)S8R#|_beXB?yXJ=ms2srEK zci!LsZgusY>gscTeis7+@5jU(_wYF3<@LIt;9X|sX>adWsi|)>GTx-8A9Z)X3AFmd zhhrWdZ;Fauq@=vh$~xlac0E4+d2{pY^z;`^O=o<44~U8V|Nox>8&Leo0v6T*ksv=Y zu!TCzDe#cF*LPychqA_nevB*%CDGG@)@7(Eu6UGZB6K>SI)dZg?bitsJ}RPqzZT5k s6`R|y$$P*+L5^2YDN}^WNI{xU*DzC?MaoQBiR literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_close_h.gif b/public/javascripts/dojo/src/widget/templates/images/tab_close_h.gif new file mode 100644 index 0000000000000000000000000000000000000000..a71004db968629237062e023469d2e4b77374799 GIT binary patch literal 313 zcmV-90mlAENk%w1VGIBa0M!5h=z)RketzVBe(!>U@PmW%ii*%}ZSskU>5h)-cX#M^ zcHMS%5q@lZf^YV@6u^$?tg#LYHIxS^wDy1(`st( zgM-j$XzhfA>yVJ*fPmR)Y3F==-gtQFeSP(hkJNB*;dOP`ZEfarbN%%6z!nz&|Nj60 z00000A^8LV00000EC2ui01N;O000J7z@BhO9P*CHq>yJT5KsXNz`THb}CAPrJjLI850^eDQW^Z3nLXAE+uL)G#(fy9R@3E LNts2PLO}pKb61-p literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_left.gif b/public/javascripts/dojo/src/widget/templates/images/tab_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..d14099fb35eb4cdf5c6226d43959ec0e63d76c7b GIT binary patch literal 635 zcmV->0)+iXNk%w1VF>^%0o6MI^7Z@r`~KhQ_T}yP?ehBe`ThO={^;-dmB0U=#{aF( z|KjWS-RJh$(`=6Imkm9*iGwCv&P_o2Mx)Zz2E()OOc>$lVXp}pj~)A{4;_j;k(qrT{<3MtNL#pjl2yAzoiVopckboe~}uFv!PI)8nFdW3#}dx(LGhKY!ci;s+xl9hmv zn3R{AgPet)hnAh9pQNFirjDqqqpYQ_r>(NDv$3?dwz;acySTl&k+8qR!Mw%3$H1AX z$;8XT&C$=s)5z7zpw8LS+t=F6-rV5b(uSm@7U+mIQ91RLqtYMN){*` zFGxhG03(KkgA#UZ0MVeKLlqNbK$u8z0}TckGcs6VLx9JR0x}3#K(gcl90O9SOo`)w z%a<;35SU4GCJq2NbK=BNpr_B6o;U&s9V!%uful%|;>f|YDbuA+n?jA6V`@~ZPO(a* z`jl%`uUflu4f}O0*t2HSQYFh4?OL~2;bxV)Rc&0mbMe-Ft5+=Fzjp!W6}&gF;lYOs zBVMeyvERgx8Ao`10K^^umcaj@#{am~|E$A}L`~3c>!sdps?1!%Ac%ay|&-aP0<%z4^ zVvy35zW@LK{{R30A^8LW0015UEC2ui00{t=000H0ASaGwXPzd9qUxHuFWkEGTC;F> zpLp(fPRXHeT;#GiH?hrl!BFzmYJBFhL@e1pPXq74KNrE0I8|~ u5EcQiumK7O4+FNh9tal#yuBV28yXV?!~`D45epI-1qH{)1{Db+Apkp{ZkJR5 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_left_r_curr.gif b/public/javascripts/dojo/src/widget/templates/images/tab_left_r_curr.gif new file mode 100644 index 0000000000000000000000000000000000000000..9279d240b3b2e8238027f7cd601ca5e3466c69fd GIT binary patch literal 429 zcmZ?wbhEHb*h!Z1EM%YpeEF?SAmI?2qX5x#<~EQf}L?=5Mo{H~044@`|{= z_pkrf)HgM@ls2?AceKV-clGtOPw1S~ol-KTe_HR1IkP6to4jCZ_RJ-7mn~X4edY4i zE7q^uID5^O4V$;k-?4C)C)>XL`xF@uA33bZbmHU*Mb@+D&MLB8x_n8I;rfm1lFaOP z@3BisFh736%)`&|@)d`Of(+M(kIFn^oZr4H3rdU1asT61W{Ug4;ONxM#>nhfa6!?f ILxI5>01&3a&;S4c literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_right.gif b/public/javascripts/dojo/src/widget/templates/images/tab_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..fcab384f6d6ebfcb918c671c5689399f17fb58b8 GIT binary patch literal 2386 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_right_r_curr.gif b/public/javascripts/dojo/src/widget/templates/images/tab_right_r_curr.gif new file mode 100644 index 0000000000000000000000000000000000000000..a661efdc976cf9b18b1c6d91c3449bdc12c82615 GIT binary patch literal 1310 zcmcJ~2UC*=0D$2SY6B`~^;E!x5k11ztJWYxv04(n)Y@u+3VLcimaIbsJ;g@EhzQCu zLD?~kgbWk}R7OAyF(!f#0x}FEdy>7Ap8XGfe!zS8!j46S9Jo;8ga#(Ofr}+$W{cfs zw~Le}x!SDOS@b3wSFGpDjnjPHqSP=a)K4vGIg8pRsvxO?EmRoGU(O>Nr(d(A*j_$$ zT!DVIko<(bBsH`Q3M^LpBMSEx_RH|35RyYBGHxT$O|Lq9? zIjAL>@W9QF>A0*9siAeFEmx0|&QPX^*>T@z_RqInM+8@mB(+0X>2JBq-M9MU$CbvO z+arlH7UZ40yZJZ%xmWO@@L|!3`^6=tW#u`KD=?K$pT(f7YU}E2YZ`EkP4}KR6IzLx zcv9PomvNN#&aUp`uU_}`w!iHg7;L1zqYY!;(?2pFFj%9XZ;p&ja5C7F(=&g6ndQz` zFD&uq_(D*6y*SKv6`Y3x4wf0a%5q#bF zP@(6}vrPK$pJ|W4F1c>U%0}pAz5$K#DY`QttTiVD2%!@(6=c zx6Wbra&pBWciCXz9Uw1Xc;2ct6JVIz!I0v7&tKp>yxh;hVW`cF0mp^=WTbCpfm<&8 zA_C%##uf$ybFdG0hq^y6+8Y)9ycqh25A{*FUbOT$66D7#IqIIwD~0>ud1Z+GVqW>l zC_jG1>ClytKx_h@kB-k4^D*a9euBzN=w!juq$a%JS!$BZLxTK8_4)28qJ{z=f(To*U*d}eHh{&ris%$^V`TzC+*F+{5jWSP{3R_obczJu z(nOFD8l5Alt!*@aDY1i-A|-VT2vTy7ULvJXK>@P1A@|F&7xY!DsQ`1oRMtKk6(H|m zM_-n|no4Mucg|)@vdpRWDWc z11^EfeJ=6!)B#rrae2@UDqDWH78a-)+7OefdheM?RMEEP$W+7NM5~jFOGT>sgKslY z%?Rw0sXy)+4%9IBO{QvCAwr_&Q@BB0xH*zpM(YJ*r#LC zbQ7_OBpoOIR1M(jxeKhHx`av7e@SX4>8De>?-POg2l1 zT?(_bZ8+E>>zGUrv&g%JWQ&3l6FKnR`T}q`FyxV8RnZ|7tC|T_S~a7v-8L;dCc~zi XN~GBIvpL&)S8R#|_beX*q>-Uwv z|DVSH-RJhL&i}yL|G3ou+U51w!sfZn>!!fwi?HUEwBez=i3?#>z2Oxz0vHr()PF0{*tob#@6ru|NoS}|NsC00000000000 z00000A^8LW0027xEC2ui0FVJJ0RRU7z@2cX>1-^3q;kn@I-k&}bV{vSuh^`1%k6r< z;IOzl^k8JQS7ps^yWjA*d`_?1@A$la&+q&HfPsR8gm*g}7bY+hjE#m?;lqd% zD_+dhFyqINBTJs^c(Ucom@`+cthux2&zd=d9!BVRiHC}d+p7MY@vNVb;bl4}LYB$7@(S!9$_3Q1*^K3<9Cj#_ScW0zji2xgcu zj!CAAW}c~HnrfcNW}73v3Fn7$&beWoc3y~Qo)hlL=YxL!xnQ7z9!O}R1RjbgfQl~4 zU!#uV2Wh1AO-dK%dcYo{@bCz90pAAX$NCy zaKeBs%rKA-_ZcyS4o{3%#TMIzamI3O%rRUZf2^d)iIQBh$&8|$vdWLL+_KA(!W^^A zmC{_Z&6whxv(B6Hyy+M~2QBo_L>F!J(MTtK^bkZCfrQdfM=kZ#R99{F)k~CtfeSR8 zK*85whb{KlWS4FB*=VP&_S$T>?e^Pn$1V5Vbk}Y7-FUBk$OSjxAi>{&2QK*Fgcol3 z;fN=$_~MK=?)c-7M=tr~lvi%~<(NCZ!v`Tm;Q8mEhc5c)q?c~`>8Pi!`s%E=?)vMn z$1eNqwAXI``|YofV1Wt{^zQrbzy~k<@WdBy{PD;qul(}NH}CxO&_^%*^wd{xz4ITS zz`*w0ckli8;D;~%_~e&w{`u&qum1Y%x9|S@@W(Iz{Pefq!U_iDumAr1_wWDz01Ti2 z2S~sI8t{M!OrQc6$iN0V@PQDFpad6~0Rtr9f*8!81~q7TiOrsjf2mk@N@r`hdqa5c* z$2!{o@s4=RqaOFj$3FV;kAMuMAO}gvLK^arfdoJS7Rks)I`WZ_jHDzdNy$oD@{*X$ zq$W4X$xeFmlb{TxC`U<3PXb^7s7$3QSINp&y7HBE&)J*VjA<9$V{d(m&wd#I`f&(jHWcFNzH0n^P1SqrZ%_9&2D-Vn*cz7ILArO za+>p;=uD?N*U8Ryy7QgzjHf*3NzZ!P^Pc$3r#|;tPXOfLp8yT0KnF_Df*SOo2u-L$ z7s}9vI`p9sji^K?O3{j1^r9G*s6R8x(T;lbqaY2bNJmQ2l8SVrCQYeISIW|sy7Z<0 zFg++rV@lJS+VrM4&8bOes?(nO^rt`#YE5}6)S?>os7Ot!LW!!>raJYhP>m^5qe|7P zTJ@?Eohnwh%GIu7RjXbNt60YxRIrlutY}RuOUz%t#J7|+~Qs~ zxW-McSdpvT=5Cd_&W$crp)1|$HkG>8&8|_gtKIJYl)K&yFHXTL-ttP-yy)%!DtXh( z-krAhy@rLae6Ks-`W|(?_Ra5S^~+zK;#z{V|Y>E94;yx5!5JEs~S0+a)vEwoZPsY@;k?*HXF4s=YFnO{?WC zi?+*NW^I^74CXO&w#;URZJINT<~2{Y&2FY`oFNS7IV-l#cE)X<6O89Q54O*K=53$} z4Cq1Ywa|tJZlWo?=>8(Q(Qth!;GX*7U`-cW50x+1<7c0suR- Cdss;T literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/tab_top_right.gif b/public/javascripts/dojo/src/widget/templates/images/tab_top_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..fcab384f6d6ebfcb918c671c5689399f17fb58b8 GIT binary patch literal 2386 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 KnV8$b!|8vvLLx~3 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/treenode_blank.gif b/public/javascripts/dojo/src/widget/templates/images/treenode_blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..80848bb0a06cb34a6a5084a3dc10d613b0c84c24 GIT binary patch literal 834 zcmZ?wbhEHb6k-r!_^!?X1poj4|M&0T-@kwV{Q2|y_wQf7e*OIU^T&@L-@kwV_U+r( zuV24>`SR)0r;i^$zJLGz-Me>h-n@DJ`t_?0f#JE#sm&2^X{9pRxM%FH><@ U$t914(V1cAxsQJeW?--e07RY@wg3PC literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/treenode_expand_minus.gif b/public/javascripts/dojo/src/widget/templates/images/treenode_expand_minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..0e8f8d960214a06705a1a4203d145549f650b74f GIT binary patch literal 547 zcmZ?wbhEHb6k-r!c;?B_IOnLPrRASLe?EWt);Ra*yAPjVzWMO=+xPb$zx@06_t&pq zkDk5x|Nr0pC$F#Ee){p#m*2mC|NZy>(#`*-@vgP%Wty?Xoc*8LY>zJ7o5;_d#EH?Q7)y6@!8*Ka?5`TFhh zttV%$JUn{-?uSob&R%`^=G~`jcb>id^6%s4umAr3J$3oPpFh8!zk0vx*!7>kem#Bh z?(y@tZ{L5q{ouusvv+D|9eMil-M@eTzkUDl`rXIx-+w%N_5Q`{_eaj%dGr2L<+Otg zLjfrMWMO1r@MO>dITjQr4D1aJo=wdyt!?ccO&;Any&mlz=Bhe+2E6tf9HJA{-L%yt zEfqO587A1u^GT?%u`)|9Yx6MClCfIL?98>X)kDaJ@gSoJ7Zb|_C2m)1DMt$?x#OF- z&D@RH6__|>_q2Gp=<~A+n{x69icN6RRTdX8=5a8zo6y(S`QzuW-+%u8Y-F$o0OCgK AaR2}S literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/treenode_expand_plus.gif b/public/javascripts/dojo/src/widget/templates/images/treenode_expand_plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..00f90aeb2dcfd6f7b82812f25c064ea768649953 GIT binary patch literal 542 zcmZ?wbhEHb6k-r!c;>-iX=zzE>#&Q9i?g%K`%mAVzy8=T`^dYGUw{7k{pS6b-+%u8 z`}gn2xx0^_zrT6^A}8}Hy=EG`|ZcCr!PNTzV-COr*E}057*B+{NUN!+L?zg-hA@s&)*9- zp4_FJFHE&3p0YgazWx0E^Y{HHZ(hCo{QBMJfB*hpzxSeY+QI+-|1%5`p!k!8 zk%7U3K?mesP@FKZS2uVxHMg|3wRbeRb@%kTwY#}b64Z4tW^rblFo~N>)LvPbbynNN zxq3`eoU9hM6I?VobeK3zdG%E%*l{rIWndO}Wt<=)Vi_@% literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/treenode_grid_t.gif b/public/javascripts/dojo/src/widget/templates/images/treenode_grid_t.gif new file mode 100644 index 0000000000000000000000000000000000000000..029c58813ce9bbde04e22297d1326778e5c0ccae GIT binary patch literal 74 zcmZ?wbhEHb6k-r!XkcV0Dk@@NU{L(Y!pOkD$e;sc1I2|H7?>1$te+ literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/treenode_grid_y.gif b/public/javascripts/dojo/src/widget/templates/images/treenode_grid_y.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f3efbc012cb4c7a43418b779254fb5ca6ff4e8e GIT binary patch literal 67 zcmZ?wbhEHb6k-r!XkcV0Dk@@NU{L(Y!pOkD$e;sc1I2|H7?`Ab`d6NQ%fEO|NmI9R V#O$)@+DQ@h5}E)2 literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/treenode_grid_z.gif b/public/javascripts/dojo/src/widget/templates/images/treenode_grid_z.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b23b356da931890130c921195c4141cb85f6c66 GIT binary patch literal 60 zcmZ?wbhEHb6k-r!XkcWpw6tVkU{L(Y!pOkD$e;sc1I2|H7?^~6`d6NQ%fEO|NmEtk NwjJ5$Yke6RtN~bo4$lAp literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/treenode_node.gif b/public/javascripts/dojo/src/widget/templates/images/treenode_node.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ac7e1952bf1bbe638fa8db077c8f52a1ed4d02c GIT binary patch literal 195 zcmZ?wbhEHb6k-r!I3mEX^2pm2Ky>)cs-y2#g3#OLhu8GiTYd zWt%o_TD59bK|w)nZEbFDZhL$Clqplzty@=8QX(rW+t=4OW5$e*j*g0oiUkW6Y~H+? x0SPGnWC8PZKqSac23Bc>CjmE=6T%8LZyDu&IA$_SB=y(?85dTCISw2Q)&L>zHuC@g literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/images/whiteDownArrow.gif b/public/javascripts/dojo/src/widget/templates/images/whiteDownArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..c83982f1e4dabc378879abfbf1c07308e3f6827b GIT binary patch literal 46 ucmZ?wbhEHbWMyDxXkcXc4+e@qSr{1@7#VaJfB+=Jz{J`jE6yFwU=08{Knmah literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/incrementMonth.gif b/public/javascripts/dojo/src/widget/templates/incrementMonth.gif new file mode 100644 index 0000000000000000000000000000000000000000..42fe20dad3a05c51395072db46fff77625dffaf5 GIT binary patch literal 168 zcmZ?wbhEHb{rh*@wrw|V+-PoYPE1U+va({p3lx8{faP^SB*;z%R@DT> qo+Szh+qP{>PEI~_=+L!m*D5P3@87@Q z+S=;u?EL7_qcdmDxVgDyWo6~&=H9q*gMm1p_>%>!PzOYU>||h-QMknLBtWL0i6`(8 YOAiYxw*$)##R=Q}Cbh~curOEy0CS}=h5!Hn literal 0 HcmV?d00001 diff --git a/public/javascripts/dojo/src/widget/templates/richtextframe.html b/public/javascripts/dojo/src/widget/templates/richtextframe.html new file mode 100644 index 0000000..9f3a4e4 --- /dev/null +++ b/public/javascripts/dojo/src/widget/templates/richtextframe.html @@ -0,0 +1,21 @@ + + + + + + + + + +
+ + diff --git a/public/javascripts/dojo/src/widget/validate.js b/public/javascripts/dojo/src/widget/validate.js new file mode 100644 index 0000000..370e8e9 --- /dev/null +++ b/public/javascripts/dojo/src/widget/validate.js @@ -0,0 +1,729 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.validate"); + +dojo.require("dojo.widget.*"); +dojo.require("dojo.widget.HtmlWidget"); +dojo.require("dojo.widget.Manager"); +dojo.require("dojo.widget.Parse"); +dojo.require("dojo.xml.Parse"); +dojo.require("dojo.lang"); + +dojo.require("dojo.validate.common"); +dojo.require("dojo.validate.datetime"); +dojo.require("dojo.validate.check"); +dojo.require("dojo.validate.web"); +dojo.require("dojo.validate.us"); + +dojo.widget.manager.registerWidgetPackage("dojo.widget.validate"); + +/* + ****** Textbox ****** + + This widget is a generic textbox field. + Serves as a base class to derive more specialized functionality in subclasses. + Has the following properties that can be specified as attributes in the markup. + + @attr id The textbox id attribute. + @attr className The textbox class attribute. + @attr name The textbox name attribute. + @attr value The textbox value attribute. + @attr trim Removes leading and trailing whitespace if true. Default is false. + @attr uppercase Converts all characters to uppercase if true. Default is false. + @attr lowercase Converts all characters to lowercase if true. Default is false. + @attr ucFirst Converts the first character of each word to uppercase if true. + @attr lowercase Removes all characters that are not digits if true. Default is false. +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.Textbox", + dojo.widget.HtmlWidget, + { + // default values for new subclass properties + className: "", + name: "", + value: "", + type: "", + trim: false, + uppercase: false, + lowercase: false, + ucFirst: false, + digit: false, + htmlfloat: "none", + + templatePath: dojo.uri.dojoUri("src/widget/templates/Textbox.html"), + + // our DOM nodes + textbox: null, + + // Apply various filters to textbox value + filter: function() { + if (this.trim) { + this.textbox.value = this.textbox.value.replace(/(^\s*|\s*$)/g, ""); + } + if (this.uppercase) { + this.textbox.value = this.textbox.value.toUpperCase(); + } + if (this.lowercase) { + this.textbox.value = this.textbox.value.toLowerCase(); + } + if (this.ucFirst) { + this.textbox.value = this.textbox.value.replace(/\b\w+\b/g, + function(word) { return word.substring(0,1).toUpperCase() + word.substring(1).toLowerCase(); }); + } + if (this.digit) { + this.textbox.value = this.textbox.value.replace(/\D/g, ""); + } + }, + + // event handlers, you can over-ride these in your own subclasses + onfocus: function() {}, + onblur: function() { this.filter(); }, + + // All functions below are called by create from dojo.widget.Widget + mixInProperties: function(localProperties, frag) { + dojo.widget.validate.Textbox.superclass.mixInProperties.apply(this, arguments); + if ( localProperties["class"] ) { + this.className = localProperties["class"]; + } + }, + + fillInTemplate: function() { + // apply any filters to initial value + this.filter(); + + // set table to be inlined (technique varies by browser) + if(dojo.render.html.ie){ dojo.html.addClass(this.domNode, "ie"); } + if(dojo.render.html.moz){ dojo.html.addClass(this.domNode, "moz"); } + if(dojo.render.html.opera){ dojo.html.addClass(this.domNode, "opera"); } + if(dojo.render.html.safari){ dojo.html.addClass(this.domNode, "safari"); } + } + + } +); + +/* + ****** ValidationTextbox ****** + + A subclass of Textbox. + Over-ride isValid in subclasses to perform specific kinds of validation. + Has several new properties that can be specified as attributes in the markup. + + @attr type Basic input tag type declaration. + @attr size Basic input tag size declaration. + @attr type Basic input tag maxlength declaration. + @attr required Can be true or false, default is false. + @attr validColor The color textbox is highlighted for valid input. Default is #cfc. + @attr invalidColor The color textbox is highlighted for invalid input. Default is #fcc. + @attr invalidClass Class used to format displayed text in page if necessary to override default class + @attr invalidMessage The message to display if value is invalid. + @attr missingMessage The message to display if value is missing. + @attr missingClass Override default class used for missing input data + @attr listenOnKeyPress Updates messages on each key press. Default is true. + @attr promptMessage Will not issue invalid message if field is populated with default user-prompt text +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.ValidationTextbox", + dojo.widget.validate.Textbox, + function() { + // this property isn't a primitive and needs to be created on a per-item basis. + this.flags = {}; + }, + { + // default values for new subclass properties + required: false, + validColor: "#cfc", + invalidColor: "#fcc", + rangeClass: "range", + invalidClass: "invalid", + missingClass: "missing", + size: "", + maxlength: "", + promptMessage: "", + invalidMessage: "* The value entered is not valid.", + missingMessage: "* This value is required.", + rangeMessage: "* This value out of range.", + listenOnKeyPress: true, + htmlfloat: "none", + lastCheckedValue: null, + + templatePath: dojo.uri.dojoUri("src/widget/templates/ValidationTextbox.html"), + + // new DOM nodes + invalidSpan: null, + missingSpan: null, + rangeSpan: null, + + getValue: function() { + return this.textbox.value; + }, + + setValue: function(value) { + this.textbox.value = value; + this.update(); + }, + + // Need to over-ride with your own validation code in subclasses + isValid: function() { return true; }, + + // Need to over-ride with your own validation code in subclasses + isInRange: function() { return true; }, + + // Returns true if value is all whitespace + isEmpty: function() { + return ( /^\s*$/.test(this.textbox.value) ); + }, + + // Returns true if value is required and it is all whitespace. + isMissing: function() { + return ( this.required && this.isEmpty() ); + }, + + // Called oninit, onblur, and onkeypress. + // Show missing or invalid messages if appropriate, and highlight textbox field. + update: function() { + this.lastCheckedValue = this.textbox.value; + this.missingSpan.style.display = "none"; + this.invalidSpan.style.display = "none"; + this.rangeSpan.style.display = "none"; + + var empty = this.isEmpty(); + var valid = true; + if(this.promptMessage != this.textbox.value){ + valid = this.isValid(); + } + var missing = this.isMissing(); + + // Display at most one error message + if(missing){ + this.missingSpan.style.display = ""; + }else if( !empty && !valid ){ + this.invalidSpan.style.display = ""; + }else if( !empty && !this.isInRange() ){ + this.rangeSpan.style.display = ""; + } + this.highlight(); + }, + + // Called oninit, and onblur. + highlight: function() { + // highlight textbox background + if ( this.isEmpty() ) { + this.textbox.style.backgroundColor = ""; + }else if ( this.isValid() && this.isInRange() ){ + this.textbox.style.backgroundColor = this.validColor; + }else if( this.textbox.value != this.promptMessage){ + this.textbox.style.backgroundColor = this.invalidColor; + } + }, + + onfocus: function() { + if ( !this.listenOnKeyPress) { + this.textbox.style.backgroundColor = ""; + } + }, + + onblur: function() { + this.filter(); + this.update(); + }, + + onkeyup: function(){ + if(this.listenOnKeyPress){ + //this.filter(); trim is problem if you have to type two words + this.update(); + }else if (this.textbox.value != this.lastCheckedValue){ + this.textbox.style.backgroundColor = ""; + } + }, + + // FIXME: why are there to fillInTemplate methods defined here? + fillInTemplate: function() { + dojo.widget.validate.ValidationTextbox.superclass.fillInTemplate.apply(this, arguments); + + // Attach isMissing and isValid methods to the textbox. + // We may use them later in connection with a submit button widget. + // TODO: this is unorthodox; it seems better to do it another way -- Bill + this.textbox.isValid = function() { this.isValid.call(this); }; + this.textbox.isMissing = function() { this.isMissing.call(this); }; + this.textbox.isInRange = function() { this.isInRange.call(this); }; + this.update(); + } + } +); + + +/* + ****** IntegerTextbox ****** + + A subclass of ValidationTextbox. + Over-rides isValid/isInRange to test for integer input. + Has 4 new properties that can be specified as attributes in the markup. + + @attr signed The leading plus-or-minus sign. Can be true or false, default is either. + @attr separator The character used as the thousands separator. Default is no separator. + @attr min Minimum signed value. Default is -Infinity + @attr max Maximum signed value. Default is +Infinity +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.IntegerTextbox", + dojo.widget.validate.ValidationTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.IntegerTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if((localProperties.signed == "true")|| + (localProperties.signed == "always")){ + this.flags.signed = true; + }else if((localProperties.signed == "false")|| + (localProperties.signed == "never")){ + this.flags.signed = false; + this.flags.min = 0; + }else{ + this.flags.signed = [ true, false ]; // optional + } + if(localProperties.separator){ + this.flags.separator = localProperties.separator; + } + if(localProperties.min){ + this.flags.min = parseInt(localProperties.min); + } + if(localProperties.max){ + this.flags.max = parseInt(localProperties.max); + } + }, + + // Over-ride for integer validation + isValid: function() { + return dojo.validate.isInteger(this.textbox.value, this.flags); + }, + isInRange: function() { + return dojo.validate.isInRange(this.textbox.value, this.flags); + } + } +); + +/* + ****** RealNumberTextbox ****** + + A subclass that extends IntegerTextbox. + Over-rides isValid/isInRange to test for real number input. + Has 5 new properties that can be specified as attributes in the markup. + + @attr places The exact number of decimal places. If omitted, it's unlimited and optional. + @attr exponent Can be true or false. If omitted the exponential part is optional. + @attr eSigned Is the exponent signed? Can be true or false, if omitted the sign is optional. + @attr min Minimum signed value. Default is -Infinity + @attr max Maximum signed value. Default is +Infinity +*/ + +dojo.widget.defineWidget( + "dojo.widget.validate.RealNumberTextbox", + dojo.widget.validate.IntegerTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.RealNumberTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.places ) { + this.flags.places = Number( localProperties.places ); + } + if((localProperties.exponent == "true")|| + (localProperties.exponent == "always")){ + this.flags.exponent = true; + }else if((localProperties.exponent == "false")||(localProperties.exponent == "never")){ + this.flags.exponent = false; + }else{ + this.flags.exponent = [ true, false ]; // optional + } + if((localProperties.esigned == "true")||(localProperties.esigned == "always")){ + this.flags.eSigned = true; + }else if((localProperties.esigned == "false")||(localProperties.esigned == "never")){ + this.flags.eSigned = false; + }else{ + this.flags.eSigned = [ true, false ]; // optional + } + if(localProperties.min){ + this.flags.min = parseFloat(localProperties.min); + } + if(localProperties.max){ + this.flags.max = parseFloat(localProperties.max); + } + }, + + // Over-ride for real number validation + isValid: function() { + return dojo.validate.isRealNumber(this.textbox.value, this.flags); + }, + isInRange: function() { + return dojo.validate.isInRange(this.textbox.value, this.flags); + } + + } +); + +/* + ****** CurrencyTextbox ****** + + A subclass that extends IntegerTextbox. + Over-rides isValid/isInRange to test if input denotes a monetary value . + Has 5 new properties that can be specified as attributes in the markup. + + @attr cents The two decimal places for cents. Can be true or false, optional if omitted. + @attr symbol A currency symbol such as Yen "???", Pound "???", or the Euro "???". Default is "$". + @attr separator Default is "," instead of no separator as in IntegerTextbox. + @attr min Minimum signed value. Default is -Infinity + @attr max Maximum signed value. Default is +Infinity +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.CurrencyTextbox", + dojo.widget.validate.IntegerTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.CurrencyTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.cents ) { + this.flags.cents = ( localProperties.cents == "true" ); + } + if ( localProperties.symbol ) { + this.flags.symbol = localProperties.symbol; + } + if(localProperties.min){ + this.flags.min = parseFloat(localProperties.min); + } + if(localProperties.max){ + this.flags.max = parseFloat(localProperties.max); + } + }, + + // Over-ride for currency validation + isValid: function() { + return dojo.validate.isCurrency(this.textbox.value, this.flags); + }, + isInRange: function() { + return dojo.validate.isInRange(this.textbox.value, this.flags); + } + + } +); + +/* + ****** IpAddressTextbox ****** + + A subclass of ValidationTextbox. + Over-rides isValid to test for IP addresses. + Can specify formats for ipv4 or ipv6 as attributes in the markup. + + @attr allowDottedDecimal true or false, default is true. + @attr allowDottedHex true or false, default is true. + @attr allowDottedOctal true or false, default is true. + @attr allowDecimal true or false, default is true. + @attr allowHex true or false, default is true. + @attr allowIPv6 true or false, default is true. + @attr allowHybrid true or false, default is true. +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.IpAddressTextbox", + dojo.widget.validate.ValidationTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.IpAddressTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.allowdotteddecimal ) { + this.flags.allowDottedDecimal = ( localProperties.allowdotteddecimal == "true" ); + } + if ( localProperties.allowdottedhex ) { + this.flags.allowDottedHex = ( localProperties.allowdottedhex == "true" ); + } + if ( localProperties.allowdottedoctal ) { + this.flags.allowDottedOctal = ( localProperties.allowdottedoctal == "true" ); + } + if ( localProperties.allowdecimal ) { + this.flags.allowDecimal = ( localProperties.allowdecimal == "true" ); + } + if ( localProperties.allowhex ) { + this.flags.allowHex = ( localProperties.allowhex == "true" ); + } + if ( localProperties.allowipv6 ) { + this.flags.allowIPv6 = ( localProperties.allowipv6 == "true" ); + } + if ( localProperties.allowhybrid ) { + this.flags.allowHybrid = ( localProperties.allowhybrid == "true" ); + } + }, + + // Over-ride for IP address validation + isValid: function() { + return dojo.validate.isIpAddress(this.textbox.value, this.flags); + } + } +); + +/* + ****** UrlTextbox ****** + + A subclass of IpAddressTextbox. + Over-rides isValid to test for URL's. + Can specify 5 additional attributes in the markup. + + @attr scheme Can be true or false. If omitted the scheme is optional. + @attr allowIP Allow an IP address for hostname. Default is true. + @attr allowLocal Allow the host to be "localhost". Default is false. + @attr allowCC Allow 2 letter country code domains. Default is true. + @attr allowGeneric Allow generic domains. Can be true or false, default is true. +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.UrlTextbox", + dojo.widget.validate.IpAddressTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.UrlTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.scheme ) { + this.flags.scheme = ( localProperties.scheme == "true" ); + } + if ( localProperties.allowip ) { + this.flags.allowIP = ( localProperties.allowip == "true" ); + } + if ( localProperties.allowlocal ) { + this.flags.allowLocal = ( localProperties.allowlocal == "true" ); + } + if ( localProperties.allowcc ) { + this.flags.allowCC = ( localProperties.allowcc == "true" ); + } + if ( localProperties.allowgeneric ) { + this.flags.allowGeneric = ( localProperties.allowgeneric == "true" ); + } + }, + + // Over-ride for URL validation + isValid: function() { + return dojo.validate.isUrl(this.textbox.value, this.flags); + } + } +); + +/* + ****** EmailTextbox ****** + + A subclass of UrlTextbox. + Over-rides isValid to test for email addresses. + Can use all markup attributes/properties of UrlTextbox except scheme. + One new attribute available in the markup. + + @attr allowCruft Allow address like . Default is false. +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.EmailTextbox", + dojo.widget.validate.UrlTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.EmailTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.allowcruft ) { + this.flags.allowCruft = ( localProperties.allowcruft == "true" ); + } + }, + + // Over-ride for email address validation + isValid: function() { + return dojo.validate.isEmailAddress(this.textbox.value, this.flags); + } + } +); + +/* + ****** EmailListTextbox ****** + + A subclass of EmailTextbox. + Over-rides isValid to test for a list of email addresses. + Can use all markup attributes/properties of EmailTextbox and ... + + @attr listSeparator The character used to separate email addresses. + Default is ";", ",", "\n" or " ". +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.EmailListTextbox", + dojo.widget.validate.EmailTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.EmailListTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.listseparator ) { + this.flags.listSeparator = localProperties.listseparator; + } + }, + + // Over-ride for email address list validation + isValid: function() { + return dojo.validate.isEmailAddressList(this.textbox.value, this.flags); + } + } +); + +/* + ****** DateTextbox ****** + + A subclass of ValidationTextbox. + Over-rides isValid to test if input is in a valid date format. + + @attr format Described in dojo.validate.js. Default is "MM/DD/YYYY". +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.DateTextbox", + dojo.widget.validate.ValidationTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.DateTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.format ) { + this.flags.format = localProperties.format; + } + }, + + // Over-ride for date validation + isValid: function() { + return dojo.validate.isValidDate(this.textbox.value, this.flags.format); + } + } +); + +/* + ****** TimeTextbox ****** + + A subclass of ValidationTextbox. + Over-rides isValid to test if input is in a valid time format. + + @attr format Described in dojo.validate.js. Default is "h:mm:ss t". + @attr amSymbol The symbol used for AM. Default is "AM" or "am". + @attr pmSymbol The symbol used for PM. Default is "PM" or "pm". +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.TimeTextbox", + dojo.widget.validate.ValidationTextbox, + { + mixInProperties: function(localProperties, frag) { + // First initialize properties in super-class. + dojo.widget.validate.TimeTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.format ) { + this.flags.format = localProperties.format; + } + if ( localProperties.amsymbol ) { + this.flags.amSymbol = localProperties.amsymbol; + } + if ( localProperties.pmsymbol ) { + this.flags.pmSymbol = localProperties.pmsymbol; + } + }, + + // Over-ride for time validation + isValid: function() { + return dojo.validate.isValidTime(this.textbox.value, this.flags); + } + } +); + +/* + ****** UsStateTextbox ****** + + A subclass of ValidationTextbox. + Over-rides isValid to test if input is a US state abbr. + + @attr allowTerritories Allow Guam, Puerto Rico, etc. Default is true. + @attr allowMilitary Allow military 'states', e.g. Armed Forces Europe (AE). Default is true. +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.UsStateTextbox", + dojo.widget.validate.ValidationTextbox, + { + mixInProperties: function(localProperties, frag) { + // Initialize properties in super-class. + dojo.widget.validate.UsStateTextbox.superclass.mixInProperties.apply(this, arguments); + + // Get properties from markup attributes, and assign to flags object. + if ( localProperties.allowterritories ) { + this.flags.allowTerritories = ( localProperties.allowterritories == "true" ); + } + if ( localProperties.allowmilitary ) { + this.flags.allowMilitary = ( localProperties.allowmilitary == "true" ); + } + }, + + isValid: function() { + return dojo.validate.us.isState(this.textbox.value, this.flags); + } + } +); + +/* + ****** UsZipTextbox ****** + + A subclass of ValidationTextbox. + Over-rides isValid to test if input is a US zip code. + Validates zip-5 and zip-5 plus 4. +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.UsZipTextbox", + dojo.widget.validate.ValidationTextbox, + { + isValid: function() { + return dojo.validate.us.isZipCode(this.textbox.value); + } + } +); + +/* + ****** UsSocialSecurityNumberTextbox ****** + + A subclass of ValidationTextbox. + Over-rides isValid to test if input is a US Social Security Number. +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.UsSocialSecurityNumberTextbox", + dojo.widget.validate.ValidationTextbox, + { + isValid: function() { + return dojo.validate.us.isSocialSecurityNumber(this.textbox.value); + } + } +); + +/* + ****** UsPhoneNumberTextbox ****** + + A subclass of ValidationTextbox. + Over-rides isValid to test if input is a 10-digit US phone number, an extension is optional. +*/ +dojo.widget.defineWidget( + "dojo.widget.validate.UsPhoneNumberTextbox", + dojo.widget.validate.ValidationTextbox, + { + isValid: function() { + return dojo.validate.us.isPhoneNumber(this.textbox.value); + } + } +); diff --git a/public/javascripts/dojo/src/widget/vml/Chart.js b/public/javascripts/dojo/src/widget/vml/Chart.js new file mode 100644 index 0000000..33b01f4 --- /dev/null +++ b/public/javascripts/dojo/src/widget/vml/Chart.js @@ -0,0 +1,426 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.vml.Chart"); + +dojo.require("dojo.widget.HtmlWidget"); +dojo.require("dojo.widget.Chart"); +dojo.require("dojo.math"); +dojo.require("dojo.html"); +//dojo.require("dojo.vml"); +dojo.require("dojo.graphics.color"); + +dojo.widget.vml.Chart=function(){ + dojo.widget.Chart.call(this); + dojo.widget.HtmlWidget.call(this); +}; +dojo.inherits(dojo.widget.vml.Chart, dojo.widget.HtmlWidget); +dojo.lang.extend(dojo.widget.vml.Chart, { + // widget props + templatePath:null, + templateCssPath:null, + + // state + _isInitialized:false, + hasData:false, + + // chart props + vectorNode:null, + plotArea:null, + dataGroup:null, + axisGroup:null, + + properties:{ + height:400, // defaults, will resize to the domNode. + width:600, + plotType:null, + padding:{ + top:10, + bottom:2, + left:60, + right:30 + }, + axes:{ + x:{ + plotAt:0, + label:"", + unitLabel:"", + unitType:Number, + nUnitsToShow:10, + range:{ + min:0, + max:200 + } + }, + y:{ + plotAt:0, + label:"", + unitLabel:"", + unitType:Number, + nUnitsToShow:10, + range:{ + min:0, + max:200 + } + } + } + }, + + fillInTemplate:function(args,frag){ + this.initialize(); + this.render(); + }, + parseData:function(){ + }, + initialize:function(){ + // parse the data first. + this.parseData(); + + // render the body of the chart, not the chart data. + if(this.vectorNode){ this.destroy(); } + this.vectorNode=document.createElement("div"); + this.vectorNode.style.width=this.properties.width+"px"; + this.vectorNode.style.height=this.properties.height+"px"; + this.vectorNode.style.position="relative"; + this.domNode.appendChild(this.vectorNode); + + var plotWidth=this.properties.width-this.properties.padding.left-this.properties.padding.right; + var plotHeight=this.properties.height-this.properties.padding.top-this.properties.padding.bottom; + + this.plotArea=document.createElement("div"); + this.plotArea.style.position="absolute"; + this.plotArea.style.backgroundColor="#fff"; + this.plotArea.style.top=(this.properties.padding.top)-2+"px"; + this.plotArea.style.left=(this.properties.padding.left-1)+"px"; + this.plotArea.style.width=plotWidth+"px"; + this.plotArea.style.height=plotHeight+"px"; + this.vectorNode.appendChild(this.plotArea); + + this.dataGroup=document.createElement("div"); + this.dataGroup.style.position="relative"; + this.plotArea.appendChild(this.dataGroup); + + // clipping rects, what a fucking pain. + var bg=this.domNode.style.backgroundColor; + var r=document.createElement("v:rect"); + r.setAttribute("fillcolor", bg); + r.setAttribute("stroked", "false"); + r.style.position="absolute"; + r.style.top=(-1*this.properties.padding.top)-1+"px"; + r.style.left=(-1*this.properties.padding.left)+"px"; + r.style.width=(this.properties.width-3)+"px"; + r.style.height=(this.properties.padding.top)-2+"px"; + this.vectorNode.appendChild(r); + + r=document.createElement("v:rect"); + r.setAttribute("fillcolor", bg); + r.setAttribute("stroked", "false"); + r.style.position="absolute"; + r.style.top=plotHeight-2+"px"; + r.style.left=(-1*this.properties.padding.left)+"px"; + r.style.width=(this.properties.width-3)+"px"; + r.style.height=(this.properties.padding.bottom)-2+"px"; // fixme: check this. + this.vectorNode.appendChild(r); + + r=document.createElement("v:rect"); + r.setAttribute("fillcolor", bg); + r.setAttribute("stroked", "false"); + r.style.position="absolute"; + r.style.top="-2px"; + r.style.left=(-1*this.properties.padding.left)+"px"; + r.style.width=(this.properties.padding.left-1)+"px"; + r.style.height=plotHeight+"px"; + this.vectorNode.appendChild(r); + + r=document.createElement("v:rect"); + r.setAttribute("fillcolor", bg); + r.setAttribute("stroked", "false"); + r.style.position="absolute"; + r.style.top="-2px"; + r.style.right=(-1*this.properties.padding.right)+1+"px"; + r.style.width=(this.properties.padding.right-1)+"px"; + r.style.height=plotHeight+"px"; + this.vectorNode.appendChild(r); + // end clipping rects. god that sucks, i wish VML had clipping outside of that crap vmlframe... + + this.axisGroup=document.createElement("div"); + this.axisGroup.style.position="relative"; + this.plotArea.appendChild(this.axisGroup); + + var stroke=1; + + // x axis + var line=document.createElement("v:line"); + var y=dojo.widget.vml.Chart.Plotter.getY(this.properties.axes.x.plotAt, this); + line.setAttribute("from", this.properties.padding.left-stroke + "," + y); + line.setAttribute("to", plotWidth + "," + y); + line.style.position="absolute"; + line.style.antialias="false"; + line.setAttribute("strokecolor", "#666"); + line.setAttribute("strokeweight", stroke*2+"px"); + this.axisGroup.appendChild(line); + + // y axis + var line=document.createElement("v:line"); + var y=dojo.widget.vml.Chart.Plotter.getX(this.properties.axes.y.plotAt, this); + line.setAttribute("from", y+","+this.properties.padding.top); + line.setAttribute("to", y+","+this.properties.height-this.properties.padding.bottom); + line.style.position="absolute"; + line.style.antialias="false"; + line.setAttribute("strokecolor", "#666"); + line.setAttribute("strokeweight", stroke*2+"px"); + this.axisGroup.appendChild(line); + + // labels + var size=10; + + // x axis labels. + var t=document.createElement("div"); + t.style.position="absolute"; + t.style.top=(this.properties.height-this.properties.padding.bottom+size+2)+"px"; + t.style.left=this.properties.padding.left+"px"; + t.style.fontFamily="sans-serif"; + t.style.fontSize=size+"px"; + t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.x.range.min),2); + this.axisGroup.appendChild(t); + + t=document.createElement("div"); + t.style.position="absolute"; + t.style.top=(this.properties.height-this.properties.padding.bottom+size+2)+"px"; + t.style.left=(this.properties.width-this.properties.padding.right-(size/2))+"px"; + t.style.fontFamily="sans-serif"; + t.style.fontSize=size+"px"; + t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.x.range.max),2); + this.axisGroup.appendChild(t); + + // y axis labels. + t=document.createElement("div"); + t.style.position="absolute"; + t.style.top=-1*(size/2)+"px"; + t.style.right=(plotWidth+4)+"px"; + t.style.fontFamily="sans-serif"; + t.style.fontSize=size+"px"; + t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.y.range.max),2); + this.axisGroup.appendChild(t); + + t=document.createElement("div"); + t.style.position="absolute"; + t.style.top=(this.properties.height-this.properties.padding.bottom)+"px"; + t.style.right=(plotWidth+4)+"px"; + t.style.fontFamily="sans-serif"; + t.style.fontSize=size+"px"; + t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.y.range.min),2); + this.axisGroup.appendChild(t); + + // this is last. + this.assignColors(); + this._isInitialized=true; + }, + destroy:function(){ + while(this.domNode.childNodes.length>0){ + this.domNode.removeChild(this.domNode.childNodes[0]); + } + this.vectorNode=this.plotArea=this.dataGroup=this.axisGroup=null; + }, + render:function(){ + if (this.dataGroup){ + while(this.dataGroup.childNodes.length>0){ + this.dataGroup.removeChild(this.dataGroup.childNodes[0]); + } + } else { + this.initialize(); + } + for(var i=0; i + + + +can be described as: + +dojo.???.foo = {} +dojo.???.foo.bar = {} +dojo.???.foo.bar.value = "bar"; +dojo.???.foo.baz = {} +dojo.???.foo.baz.xyzzy = {} +dojo.???.foo.baz.xyzzy.value = "xyzzy" + +*/ +// using documentFragment nomenclature to generalize in case we don't want to require passing a collection of nodes with a single parent +dojo.xml.Parse = function(){ + + function getDojoTagName(node){ + var tagName = node.tagName; + if(dojo.render.html.capable && dojo.render.html.ie && node.scopeName != 'HTML'){ + tagName = node.scopeName + ':' + tagName; + } + if(tagName.substr(0,5).toLowerCase() == "dojo:"){ + return tagName.toLowerCase(); + } + + if(tagName.substr(0,4).toLowerCase() == "dojo"){ + // FIXME: this assumes tag names are always lower case + return "dojo:" + tagName.substring(4).toLowerCase(); + } + + // allow lower-casing + var djt = node.getAttribute("dojoType") || node.getAttribute("dojotype"); + if(djt){ + if(djt.indexOf(":")<0){ + djt = "dojo:"+djt; + } + return djt.toLowerCase(); + } + + if(node.getAttributeNS && node.getAttributeNS(dojo.dom.dojoml,"type")){ + return "dojo:" + node.getAttributeNS(dojo.dom.dojoml,"type").toLowerCase(); + } + try{ + // FIXME: IE really really doesn't like this, so we squelch errors for it + djt = node.getAttribute("dojo:type"); + }catch(e){ /* FIXME: log? */ } + + if(djt){ return "dojo:"+djt.toLowerCase(); } + + if(!dj_global["djConfig"] || !djConfig["ignoreClassNames"]){ + // FIXME: should we make this optionally enabled via djConfig? + var classes = node.className||node.getAttribute("class"); + // FIXME: following line, without check for existence of classes.indexOf + // breaks firefox 1.5's svg widgets + if(classes && classes.indexOf && classes.indexOf("dojo-") != -1){ + var aclasses = classes.split (" "); + for(var x=0; x 5 && aclasses[x].indexOf("dojo-") >= 0){ + return "dojo:"+aclasses[x].substr(5).toLowerCase(); + } + } + } + } + + return tagName.toLowerCase(); + } + + this.parseElement = function(node, hasParentNodeSet, optimizeForDojoML, thisIdx){ + + var parsedNodeSet = {}; + + //There's a weird bug in IE where it counts end tags, e.g. as nodes that should be parsed. Ignore these + if(node.tagName && node.tagName.indexOf("/") == 0){ + return null; + } + + var tagName = getDojoTagName(node); + parsedNodeSet[tagName] = []; + if(tagName.substr(0,4).toLowerCase()=="dojo"){ + parsedNodeSet.namespace = "dojo"; + }else{ + var pos = tagName.indexOf(":"); + if(pos > 0){ + parsedNodeSet.namespace = tagName.substring(0,pos); + } + } + + var process = false; + if(!optimizeForDojoML){process=true;} + else if(parsedNodeSet.namespace&&dojo.getNamespace(parsedNodeSet.namespace)){process=true;} + else if(dojo.widget.tags[tagName]){ + dojo.deprecated('dojo.xml.Parse.parseElement', 'Widgets should be placed in a defined namespace', "0.5"); + process = true; + } + + if(process){ + var attributeSet = this.parseAttributes(node); + for(var attr in attributeSet){ + if((!parsedNodeSet[tagName][attr])||(typeof parsedNodeSet[tagName][attr] != "array")){ + parsedNodeSet[tagName][attr] = []; + } + parsedNodeSet[tagName][attr].push(attributeSet[attr]); + } + // FIXME: we might want to make this optional or provide cloning instead of + // referencing, but for now, we include a node reference to allow + // instantiated components to figure out their "roots" + parsedNodeSet[tagName].nodeRef = node; + parsedNodeSet.tagName = tagName; + parsedNodeSet.index = thisIdx||0; + // dojo.debug("parseElement: set the element tagName = "+parsedNodeSet.tagName+" and namespace to "+parsedNodeSet.namespace); + } + + var count = 0; + for(var i = 0; i < node.childNodes.length; i++){ + var tcn = node.childNodes.item(i); + switch(tcn.nodeType){ + case dojo.dom.ELEMENT_NODE: // element nodes, call this function recursively + count++; + var ctn = getDojoTagName(tcn); + if(!parsedNodeSet[ctn]){ + parsedNodeSet[ctn] = []; + } + parsedNodeSet[ctn].push(this.parseElement(tcn, true, optimizeForDojoML, count)); + if( (tcn.childNodes.length == 1)&& + (tcn.childNodes.item(0).nodeType == dojo.dom.TEXT_NODE)){ + parsedNodeSet[ctn][parsedNodeSet[ctn].length-1].value = tcn.childNodes.item(0).nodeValue; + } + break; + case dojo.dom.TEXT_NODE: // if a single text node is the child, treat it as an attribute + if(node.childNodes.length == 1){ + parsedNodeSet[tagName].push({ value: node.childNodes.item(0).nodeValue }); + } + break; + default: break; + /* + case dojo.dom.ATTRIBUTE_NODE: // attribute node... not meaningful here + break; + case dojo.dom.CDATA_SECTION_NODE: // cdata section... not sure if this would ever be meaningful... might be... + break; + case dojo.dom.ENTITY_REFERENCE_NODE: // entity reference node... not meaningful here + break; + case dojo.dom.ENTITY_NODE: // entity node... not sure if this would ever be meaningful + break; + case dojo.dom.PROCESSING_INSTRUCTION_NODE: // processing instruction node... not meaningful here + break; + case dojo.dom.COMMENT_NODE: // comment node... not not sure if this would ever be meaningful + break; + case dojo.dom.DOCUMENT_NODE: // document node... not sure if this would ever be meaningful + break; + case dojo.dom.DOCUMENT_TYPE_NODE: // document type node... not meaningful here + break; + case dojo.dom.DOCUMENT_FRAGMENT_NODE: // document fragment node... not meaningful here + break; + case dojo.dom.NOTATION_NODE:// notation node... not meaningful here + break; + */ + } + } + //return (hasParentNodeSet) ? parsedNodeSet[node.tagName] : parsedNodeSet; + //if(parsedNodeSet.tagName)dojo.debug("parseElement: RETURNING NODE WITH TAGNAME "+parsedNodeSet.tagName); + return parsedNodeSet; + }; + + /* parses a set of attributes on a node into an object tree */ + this.parseAttributes = function(node){ + var parsedAttributeSet = {}; + var atts = node.attributes; + // TODO: should we allow for duplicate attributes at this point... + // would any of the relevant dom implementations even allow this? + var attnode, i=0; + while((attnode=atts[i++])){ + if((dojo.render.html.capable)&&(dojo.render.html.ie)){ + if(!attnode){ continue; } + if( (typeof attnode == "object")&& + (typeof attnode.nodeValue == 'undefined')|| + (attnode.nodeValue == null)|| + (attnode.nodeValue == '')){ + continue; + } + } + + var nn = attnode.nodeName.split(":"); + nn = (nn.length == 2) ? nn[1] : attnode.nodeName; + + parsedAttributeSet[nn] = { + value: attnode.nodeValue + }; + } + return parsedAttributeSet; + }; +}; diff --git a/public/javascripts/dojo/src/xml/__package__.js b/public/javascripts/dojo/src/xml/__package__.js new file mode 100644 index 0000000..d1c38e6 --- /dev/null +++ b/public/javascripts/dojo/src/xml/__package__.js @@ -0,0 +1,18 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.require("dojo.xml.Parse"); +dojo.kwCompoundRequire({ + common: ["dojo.dom"], + browser: ["dojo.html.*"], + dashboard: ["dojo.html.*"], + svg: ["dojo.xml.svgUtil"] +}); +dojo.provide("dojo.xml.*"); diff --git a/public/javascripts/dojo/src/xml/svgUtil.js b/public/javascripts/dojo/src/xml/svgUtil.js new file mode 100644 index 0000000..e6c9f05 --- /dev/null +++ b/public/javascripts/dojo/src/xml/svgUtil.js @@ -0,0 +1,32 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.xml.svgUtil"); +// FIXME: add imports for deps! + +dojo.xml.svgUtil = new function(){ + + this.getInnerWidth = function(node){ + // FIXME: need to find out from dylan how to + } + + this.getOuterWidth = function(node){ + + } + + this.getInnerHeight = function(node){ + + } + + this.getOuterHeight = function(node){ + + } + +} diff --git a/public/javascripts/dojo/storage_dialog.swf b/public/javascripts/dojo/storage_dialog.swf new file mode 100644 index 0000000000000000000000000000000000000000..cb15ec89eaecd72d1e9408cce30c1bf03f0840be GIT binary patch literal 26921 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®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 0) + this.observers.each( function(o) { + if(o[eventName]) o[eventName](eventName, draggable, event); + }); + }, + + _cacheObserverCallbacks: function() { + ['onStart','onEnd','onDrag'].each( function(eventName) { + Draggables[eventName+'Count'] = Draggables.observers.select( + function(o) { return o[eventName]; } + ).length; + }); + } +} + +/*--------------------------------------------------------------------------*/ + +var Draggable = Class.create(); +Draggable.prototype = { + initialize: function(element) { + var options = Object.extend({ + handle: false, + starteffect: function(element) { + new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7}); + }, + reverteffect: function(element, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; + element._revert = new Effect.MoveBy(element, -top_offset, -left_offset, {duration:dur}); + }, + endeffect: function(element) { + new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0}); + }, + zindex: 1000, + revert: false, + snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] } + }, arguments[1] || {}); + + this.element = $(element); + + if(options.handle && (typeof options.handle == 'string')) + this.handle = Element.childrenWithClassName(this.element, options.handle)[0]; + if(!this.handle) this.handle = $(options.handle); + if(!this.handle) this.handle = this.element; + + Element.makePositioned(this.element); // fix IE + + this.delta = this.currentDelta(); + this.options = options; + this.dragging = false; + + this.eventMouseDown = this.initDrag.bindAsEventListener(this); + Event.observe(this.handle, "mousedown", this.eventMouseDown); + + Draggables.register(this); + }, + + destroy: function() { + Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); + Draggables.unregister(this); + }, + + currentDelta: function() { + return([ + parseInt(this.element.style.left || '0'), + parseInt(this.element.style.top || '0')]); + }, + + initDrag: function(event) { + if(Event.isLeftClick(event)) { + // abort on form elements, fixes a Firefox issue + var src = Event.element(event); + if(src.tagName && ( + src.tagName=='INPUT' || + src.tagName=='SELECT' || + src.tagName=='BUTTON' || + src.tagName=='TEXTAREA')) return; + + if(this.element._revert) { + this.element._revert.cancel(); + this.element._revert = null; + } + + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var pos = Position.cumulativeOffset(this.element); + this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); + + Draggables.activate(this); + Event.stop(event); + } + }, + + startDrag: function(event) { + this.dragging = true; + + if(this.options.zindex) { + this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); + this.element.style.zIndex = this.options.zindex; + } + + if(this.options.ghosting) { + this._clone = this.element.cloneNode(true); + Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + Draggables.notify('onStart', this, event); + if(this.options.starteffect) this.options.starteffect(this.element); + }, + + updateDrag: function(event, pointer) { + if(!this.dragging) this.startDrag(event); + Position.prepare(); + Droppables.show(pointer, this.element); + Draggables.notify('onDrag', this, event); + this.draw(pointer); + if(this.options.change) this.options.change(this); + + // fix AppleWebKit rendering + if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); + Event.stop(event); + }, + + finishDrag: function(event, success) { + this.dragging = false; + + if(this.options.ghosting) { + Position.relativize(this.element); + Element.remove(this._clone); + this._clone = null; + } + + if(success) Droppables.fire(event, this.element); + Draggables.notify('onEnd', this, event); + + var revert = this.options.revert; + if(revert && typeof revert == 'function') revert = revert(this.element); + + var d = this.currentDelta(); + if(revert && this.options.reverteffect) { + this.options.reverteffect(this.element, + d[1]-this.delta[1], d[0]-this.delta[0]); + } else { + this.delta = d; + } + + if(this.options.zindex) + this.element.style.zIndex = this.originalZ; + + if(this.options.endeffect) + this.options.endeffect(this.element); + + Draggables.deactivate(this); + Droppables.reset(); + }, + + keyPress: function(event) { + if(!event.keyCode==Event.KEY_ESC) return; + this.finishDrag(event, false); + Event.stop(event); + }, + + endDrag: function(event) { + if(!this.dragging) return; + this.finishDrag(event, true); + Event.stop(event); + }, + + draw: function(point) { + var pos = Position.cumulativeOffset(this.element); + var d = this.currentDelta(); + pos[0] -= d[0]; pos[1] -= d[1]; + + var p = [0,1].map(function(i){ return (point[i]-pos[i]-this.offset[i]) }.bind(this)); + + if(this.options.snap) { + if(typeof this.options.snap == 'function') { + p = this.options.snap(p[0],p[1]); + } else { + if(this.options.snap instanceof Array) { + p = p.map( function(v, i) { + return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this)) + } else { + p = p.map( function(v) { + return Math.round(v/this.options.snap)*this.options.snap }.bind(this)) + } + }} + + var style = this.element.style; + if((!this.options.constraint) || (this.options.constraint=='horizontal')) + style.left = p[0] + "px"; + if((!this.options.constraint) || (this.options.constraint=='vertical')) + style.top = p[1] + "px"; + if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering + } +} + +/*--------------------------------------------------------------------------*/ + +var SortableObserver = Class.create(); +SortableObserver.prototype = { + initialize: function(element, observer) { + this.element = $(element); + this.observer = observer; + this.lastValue = Sortable.serialize(this.element); + }, + + onStart: function() { + this.lastValue = Sortable.serialize(this.element); + }, + + onEnd: function() { + Sortable.unmark(); + if(this.lastValue != Sortable.serialize(this.element)) + this.observer(this.element) + } +} + +var Sortable = { + sortables: new Array(), + + options: function(element){ + element = $(element); + return this.sortables.detect(function(s) { return s.element == element }); + }, + + destroy: function(element){ + element = $(element); + this.sortables.findAll(function(s) { return s.element == element }).each(function(s){ + Draggables.removeObserver(s.element); + s.droppables.each(function(d){ Droppables.remove(d) }); + s.draggables.invoke('destroy'); + }); + this.sortables = this.sortables.reject(function(s) { return s.element == element }); + }, + + create: function(element) { + element = $(element); + var options = Object.extend({ + element: element, + tag: 'li', // assumes li children, override with tag: 'tagname' + dropOnEmpty: false, + tree: false, // fixme: unimplemented + overlap: 'vertical', // one of 'vertical', 'horizontal' + constraint: 'vertical', // one of 'vertical', 'horizontal', false + containment: element, // also takes array of elements (or id's); or false + handle: false, // or a CSS class + only: false, + hoverclass: null, + ghosting: false, + format: null, + onChange: Prototype.emptyFunction, + onUpdate: Prototype.emptyFunction + }, arguments[1] || {}); + + // clear any old sortable with same element + this.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + ghosting: options.ghosting, + constraint: options.constraint, + handle: options.handle }; + + if(options.starteffect) + options_for_draggable.starteffect = options.starteffect; + + if(options.reverteffect) + options_for_draggable.reverteffect = options.reverteffect; + else + if(options.ghosting) options_for_draggable.reverteffect = function(element) { + element.style.top = 0; + element.style.left = 0; + }; + + if(options.endeffect) + options_for_draggable.endeffect = options.endeffect; + + if(options.zindex) + options_for_draggable.zindex = options.zindex; + + // build options for the droppables + var options_for_droppable = { + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass, + onHover: Sortable.onHover, + greedy: !options.dropOnEmpty + } + + // fix for gecko engine + Element.cleanWhitespace(element); + + options.draggables = []; + options.droppables = []; + + // make it so + + // drop on empty handling + if(options.dropOnEmpty) { + Droppables.add(element, + {containment: options.containment, onHover: Sortable.onEmptyHover, greedy: false}); + options.droppables.push(element); + } + + (this.findElements(element, options) || []).each( function(e) { + // handles are per-draggable + var handle = options.handle ? + Element.childrenWithClassName(e, options.handle)[0] : e; + options.draggables.push( + new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); + Droppables.add(e, options_for_droppable); + options.droppables.push(e); + }); + + // keep reference + this.sortables.push(options); + + // for onupdate + Draggables.addObserver(new SortableObserver(element, options.onUpdate)); + + }, + + // return all suitable-for-sortable elements in a guaranteed order + findElements: function(element, options) { + if(!element.hasChildNodes()) return null; + var elements = []; + $A(element.childNodes).each( function(e) { + if(e.tagName && e.tagName.toUpperCase()==options.tag.toUpperCase() && + (!options.only || (Element.hasClassName(e, options.only)))) + elements.push(e); + if(options.tree) { + var grandchildren = this.findElements(e, options); + if(grandchildren) elements.push(grandchildren); + } + }); + + return (elements.length>0 ? elements.flatten() : null); + }, + + onHover: function(element, dropon, overlap) { + if(overlap>0.5) { + Sortable.mark(dropon, 'before'); + if(dropon.previousSibling != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, dropon); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } else { + Sortable.mark(dropon, 'after'); + var nextElement = dropon.nextSibling || null; + if(nextElement != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, nextElement); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } + }, + + onEmptyHover: function(element, dropon) { + if(element.parentNode!=dropon) { + var oldParentNode = element.parentNode; + dropon.appendChild(element); + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon).onChange(element); + } + }, + + unmark: function() { + if(Sortable._marker) Element.hide(Sortable._marker); + }, + + mark: function(dropon, position) { + // mark on ghosting only + var sortable = Sortable.options(dropon.parentNode); + if(sortable && !sortable.ghosting) return; + + if(!Sortable._marker) { + Sortable._marker = $('dropmarker') || document.createElement('DIV'); + Element.hide(Sortable._marker); + Element.addClassName(Sortable._marker, 'dropmarker'); + Sortable._marker.style.position = 'absolute'; + document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); + } + var offsets = Position.cumulativeOffset(dropon); + Sortable._marker.style.left = offsets[0] + 'px'; + Sortable._marker.style.top = offsets[1] + 'px'; + + if(position=='after') + if(sortable.overlap == 'horizontal') + Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px'; + else + Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px'; + + Element.show(Sortable._marker); + }, + + serialize: function(element) { + element = $(element); + var sortableOptions = this.options(element); + var options = Object.extend({ + tag: sortableOptions.tag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format || /^[^_]*_(.*)$/ + }, arguments[1] || {}); + return $(this.findElements(element, options) || []).map( function(item) { + return (encodeURIComponent(options.name) + "[]=" + + encodeURIComponent(item.id.match(options.format) ? item.id.match(options.format)[1] : '')); + }).join("&"); + } +} \ No newline at end of file diff --git a/public/javascripts/effects.js b/public/javascripts/effects.js new file mode 100644 index 0000000..414398c --- /dev/null +++ b/public/javascripts/effects.js @@ -0,0 +1,854 @@ +// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// See scriptaculous.js for full license. + +/* ------------- element ext -------------- */ + +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() { + var color = '#'; + if(this.slice(0,4) == 'rgb(') { + var cols = this.slice(4,this.length-1).split(','); + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); + } else { + if(this.slice(0,1) == '#') { + if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); + if(this.length==7) color = this.toLowerCase(); + } + } + return(color.length==7 ? color : (arguments[0] || this)); +} + +Element.collectTextNodesIgnoreClass = function(element, ignoreclass) { + var children = $(element).childNodes; + var text = ''; + var classtest = new RegExp('^([^ ]+ )*' + ignoreclass+ '( [^ ]+)*$','i'); + + for (var i = 0; i < children.length; i++) { + if(children[i].nodeType==3) { + text+=children[i].nodeValue; + } else { + if((!children[i].className.match(classtest)) && children[i].hasChildNodes()) + text += Element.collectTextNodesIgnoreClass(children[i], ignoreclass); + } + } + + return text; +} + +Element.setStyle = function(element, style) { + element = $(element); + for(k in style) element.style[k.camelize()] = style[k]; +} + +Element.setContentZoom = function(element, percent) { + Element.setStyle(element, {fontSize: (percent/100) + 'em'}); + if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); +} + +Element.getOpacity = function(element){ + var opacity; + if (opacity = Element.getStyle(element, 'opacity')) + return parseFloat(opacity); + if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) + if(opacity[1]) return parseFloat(opacity[1]) / 100; + return 1.0; +} + +Element.setOpacity = function(element, value){ + element= $(element); + if (value == 1){ + Element.setStyle(element, { opacity: + (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? + 0.999999 : null }); + if(/MSIE/.test(navigator.userAgent)) + Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); + } else { + if(value < 0.00001) value = 0; + Element.setStyle(element, {opacity: value}); + if(/MSIE/.test(navigator.userAgent)) + Element.setStyle(element, + { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + + 'alpha(opacity='+value*100+')' }); + } +} + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +} + +Element.childrenWithClassName = function(element, className) { + return $A($(element).getElementsByTagName('*')).select( + function(c) { return Element.hasClassName(c, className) }); +} + +Array.prototype.call = function() { + var args = arguments; + this.each(function(f){ f.apply(this, args) }); +} + +/*--------------------------------------------------------------------------*/ + +var Effect = { + tagifyText: function(element) { + var tagifyStyle = 'position:relative'; + if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; + element = $(element); + $A(element.childNodes).each( function(child) { + if(child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + Builder.node('span',{style: tagifyStyle}, + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if(((typeof element == 'object') || + (typeof element == 'function')) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || {}); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + } +}; + +var Effect2 = Effect; // deprecated + +/* ------------- transitions ------------- */ + +Effect.Transitions = {} + +Effect.Transitions.linear = function(pos) { + return pos; +} +Effect.Transitions.sinoidal = function(pos) { + return (-Math.cos(pos*Math.PI)/2) + 0.5; +} +Effect.Transitions.reverse = function(pos) { + return 1-pos; +} +Effect.Transitions.flicker = function(pos) { + return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; +} +Effect.Transitions.wobble = function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; +} +Effect.Transitions.pulse = function(pos) { + return (Math.floor(pos*10) % 2 == 0 ? + (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10))); +} +Effect.Transitions.none = function(pos) { + return 0; +} +Effect.Transitions.full = function(pos) { + return 1; +} + +/* ------------- core effects ------------- */ + +Effect.Queue = { + effects: [], + _each: function(iterator) { + this.effects._each(iterator); + }, + interval: null, + add: function(effect) { + var timestamp = new Date().getTime(); + + switch(effect.options.queue) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + this.effects.push(effect); + if(!this.interval) + this.interval = setInterval(this.loop.bind(this), 40); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if(this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + this.effects.invoke('loop', timePos); + } +} +Object.extend(Effect.Queue, Enumerable); + +Effect.Base = function() {}; +Effect.Base.prototype = { + position: null, + setOptions: function(options) { + this.options = Object.extend({ + transition: Effect.Transitions.sinoidal, + duration: 1.0, // seconds + fps: 25.0, // max. 25fps due to Effect.Queue implementation + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' + }, options || {}); + }, + start: function(options) { + this.setOptions(options || {}); + this.currentFrame = 0; + this.state = 'idle'; + this.startOn = this.options.delay*1000; + this.finishOn = this.startOn + (this.options.duration*1000); + this.event('beforeStart'); + if(!this.options.sync) Effect.Queue.add(this); + }, + loop: function(timePos) { + if(timePos >= this.startOn) { + if(timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if(this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); + var frame = Math.round(pos * this.options.fps * this.options.duration); + if(frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + render: function(pos) { + if(this.state == 'idle') { + this.state = 'running'; + this.event('beforeSetup'); + if(this.setup) this.setup(); + this.event('afterSetup'); + } + if(this.state == 'running') { + if(this.options.transition) pos = this.options.transition(pos); + pos *= (this.options.to-this.options.from); + pos += this.options.from; + this.position = pos; + this.event('beforeUpdate'); + if(this.update) this.update(pos); + this.event('afterUpdate'); + } + }, + cancel: function() { + if(!this.options.sync) Effect.Queue.remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if(this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + return '#'; + } +} + +Effect.Parallel = Class.create(); +Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if(effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Opacity = Class.create(); +Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + // make this work on IE on elements without 'layout' + if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout)) + Element.setStyle(this.element, {zoom: 1}); + var options = Object.extend({ + from: Element.getOpacity(this.element) || 0.0, + to: 1.0 + }, arguments[1] || {}); + this.start(options); + }, + update: function(position) { + Element.setOpacity(this.element, position); + } +}); + +Effect.MoveBy = Class.create(); +Object.extend(Object.extend(Effect.MoveBy.prototype, Effect.Base.prototype), { + initialize: function(element, toTop, toLeft) { + this.element = $(element); + this.toTop = toTop; + this.toLeft = toLeft; + this.start(arguments[3]); + }, + setup: function() { + // Bug in Opera: Opera returns the "real" position of a static element or + // relative element that does not have top/left explicitly set. + // ==> Always set top and left for position relative elements in your stylesheets + // (to 0 if you do not need them) + Element.makePositioned(this.element); + this.originalTop = parseFloat(Element.getStyle(this.element,'top') || '0'); + this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0'); + }, + update: function(position) { + Element.setStyle(this.element, { + top: this.toTop * position + this.originalTop + 'px', + left: this.toLeft * position + this.originalLeft + 'px' + }); + } +}); + +Effect.Scale = Class.create(); +Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { + initialize: function(element, percent) { + this.element = $(element) + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or {} with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || {}); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = Element.getStyle(this.element,'position'); + + this.originalStyle = {}; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = Element.getStyle(this.element,'font-size') || '100%'; + ['em','px','%'].each( function(fontSizeType) { + if(fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if(this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if(/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if(!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if(this.options.scaleContent && this.fontSize) + Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle); + }, + setDimensions: function(height, width) { + var d = {}; + if(this.options.scaleX) d.width = width + 'px'; + if(this.options.scaleY) d.height = height + 'px'; + if(this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if(this.elementPositioning == 'absolute') { + if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if(this.options.scaleY) d.top = -topd + 'px'; + if(this.options.scaleX) d.left = -leftd + 'px'; + } + } + Element.setStyle(this.element, d); + } +}); + +Effect.Highlight = Class.create(); +Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = { + backgroundImage: Element.getStyle(this.element, 'background-image') }; + Element.setStyle(this.element, {backgroundImage: 'none'}); + if(!this.options.endcolor) + this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff'); + if(!this.options.restorecolor) + this.options.restorecolor = Element.getStyle(this.element, 'background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + Element.setStyle(this.element,{backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); + }, + finish: function() { + Element.setStyle(this.element, Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = Class.create(); +Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + this.start(arguments[1] || {}); + }, + setup: function() { + Position.prepare(); + var offsets = Position.cumulativeOffset(this.element); + if(this.options.offset) offsets[1] += this.options.offset; + var max = window.innerHeight ? + window.height - window.innerHeight : + document.body.scrollHeight - + (document.documentElement.clientHeight ? + document.documentElement.clientHeight : document.body.clientHeight); + this.scrollStart = Position.deltaY; + this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; + }, + update: function(position) { + Position.prepare(); + window.scrollTo(Position.deltaX, + this.scrollStart + (position*this.delta)); + } +}); + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + var oldOpacity = Element.getInlineOpacity(element); + var options = Object.extend({ + from: Element.getOpacity(element) || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { with(Element) { + if(effect.options.to!=0) return; + hide(effect.element); + setStyle(effect.element, {opacity: oldOpacity}); }} + }, arguments[1] || {}); + return new Effect.Opacity(element,options); +} + +Effect.Appear = function(element) { + var options = Object.extend({ + from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0), + to: 1.0, + beforeSetup: function(effect) { with(Element) { + setOpacity(effect.element, effect.options.from); + show(effect.element); }} + }, arguments[1] || {}); + return new Effect.Opacity(element,options); +} + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { opacity: Element.getInlineOpacity(element), position: Element.getStyle(element, 'position') }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { with(Element) { + setStyle(effect.effects[0].element, {position: 'absolute'}); }}, + afterFinishInternal: function(effect) { with(Element) { + hide(effect.effects[0].element); + setStyle(effect.effects[0].element, oldStyle); }} + }, arguments[1] || {}) + ); +} + +Effect.BlindUp = function(element) { + element = $(element); + Element.makeClipping(element); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoClipping].call(effect.element); }} + }, arguments[1] || {}) + ); +} + +Effect.BlindDown = function(element) { + element = $(element); + var oldHeight = Element.getStyle(element, 'height'); + var elementDimensions = Element.getDimensions(element); + return new Effect.Scale(element, 100, + Object.extend({ scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { with(Element) { + makeClipping(effect.element); + setStyle(effect.element, {height: '0px'}); + show(effect.element); + }}, + afterFinishInternal: function(effect) { with(Element) { + undoClipping(effect.element); + setStyle(effect.element, {height: oldHeight}); + }} + }, arguments[1] || {}) + ); +} + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = Element.getInlineOpacity(element); + return new Effect.Appear(element, { + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { with(Element) { + [makePositioned,makeClipping].call(effect.element); + }}, + afterFinishInternal: function(effect) { with(Element) { + [hide,undoClipping,undoPositioned].call(effect.element); + setStyle(effect.element, {opacity: oldOpacity}); + }} + }) + } + }); +} + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: Element.getStyle(element, 'top'), + left: Element.getStyle(element, 'left'), + opacity: Element.getInlineOpacity(element) }; + return new Effect.Parallel( + [ new Effect.MoveBy(element, 100, 0, { sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { with(Element) { + makePositioned(effect.effects[0].element); }}, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoPositioned].call(effect.effects[0].element); + setStyle(effect.effects[0].element, oldStyle); }} + }, arguments[1] || {})); +} + +Effect.Shake = function(element) { + element = $(element); + var oldStyle = { + top: Element.getStyle(element, 'top'), + left: Element.getStyle(element, 'left') }; + return new Effect.MoveBy(element, 0, 20, + { duration: 0.05, afterFinishInternal: function(effect) { + new Effect.MoveBy(effect.element, 0, -40, + { duration: 0.1, afterFinishInternal: function(effect) { + new Effect.MoveBy(effect.element, 0, 40, + { duration: 0.1, afterFinishInternal: function(effect) { + new Effect.MoveBy(effect.element, 0, -40, + { duration: 0.1, afterFinishInternal: function(effect) { + new Effect.MoveBy(effect.element, 0, 40, + { duration: 0.1, afterFinishInternal: function(effect) { + new Effect.MoveBy(effect.element, 0, -20, + { duration: 0.05, afterFinishInternal: function(effect) { with(Element) { + undoPositioned(effect.element); + setStyle(effect.element, oldStyle); + }}}) }}) }}) }}) }}) }}); +} + +Effect.SlideDown = function(element) { + element = $(element); + Element.cleanWhitespace(element); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); + var elementDimensions = Element.getDimensions(element); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { with(Element) { + makePositioned(effect.element); + makePositioned(effect.element.firstChild); + if(window.opera) setStyle(effect.element, {top: ''}); + makeClipping(effect.element); + setStyle(effect.element, {height: '0px'}); + show(element); }}, + afterUpdateInternal: function(effect) { with(Element) { + setStyle(effect.element.firstChild, {bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, + afterFinishInternal: function(effect) { with(Element) { + undoClipping(effect.element); + undoPositioned(effect.element.firstChild); + undoPositioned(effect.element); + setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} + }, arguments[1] || {}) + ); +} + +Effect.SlideUp = function(element) { + element = $(element); + Element.cleanWhitespace(element); + var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + restoreAfterFinish: true, + beforeStartInternal: function(effect) { with(Element) { + makePositioned(effect.element); + makePositioned(effect.element.firstChild); + if(window.opera) setStyle(effect.element, {top: ''}); + makeClipping(effect.element); + show(element); }}, + afterUpdateInternal: function(effect) { with(Element) { + setStyle(effect.element.firstChild, {bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoClipping].call(effect.element); + undoPositioned(effect.element.firstChild); + undoPositioned(effect.element); + setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} + }, arguments[1] || {}) + ); +} + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, + { restoreAfterFinish: true, + beforeSetup: function(effect) { with(Element) { + makeClipping(effect.element); }}, + afterFinishInternal: function(effect) { with(Element) { + hide(effect.element); + undoClipping(effect.element); }} + }); +} + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransistion: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || {}); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: Element.getInlineOpacity(element) }; + + var dims = Element.getDimensions(element); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.MoveBy(element, initialMoveY, initialMoveX, { + duration: 0.01, + beforeSetup: function(effect) { with(Element) { + hide(effect.element); + makeClipping(effect.element); + makePositioned(effect.element); + }}, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.MoveBy(effect.element, moveY, moveX, { sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { with(Element) { + setStyle(effect.effects[0].element, {height: '0px'}); + show(effect.effects[0].element); }}, + afterFinishInternal: function(effect) { with(Element) { + [undoClipping, undoPositioned].call(effect.effects[0].element); + setStyle(effect.effects[0].element, oldStyle); }} + }, options) + ) + } + }); +} + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransistion: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || {}); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: Element.getInlineOpacity(element) }; + + var dims = Element.getDimensions(element); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.MoveBy(element, moveY, moveX, { sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { with(Element) { + [makePositioned, makeClipping].call(effect.effects[0].element) }}, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoClipping, undoPositioned].call(effect.effects[0].element); + setStyle(effect.effects[0].element, oldStyle); }} + }, options) + ); +} + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || {}; + var oldOpacity = Element.getInlineOpacity(element); + var transition = options.transition || Effect.Transitions.sinoidal; + var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) }; + reverser.bind(transition); + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 3.0, from: 0, + afterFinishInternal: function(effect) { Element.setStyle(effect.element, {opacity: oldOpacity}); } + }, options), {transition: reverser})); +} + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + Element.makeClipping(element); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoClipping].call(effect.element); + setStyle(effect.element, oldStyle); + }} }); + }}, arguments[1] || {})); +} diff --git a/public/javascripts/prototype.js b/public/javascripts/prototype.js new file mode 100644 index 0000000..e9ccd3c --- /dev/null +++ b/public/javascripts/prototype.js @@ -0,0 +1,1785 @@ +/* Prototype JavaScript framework, version 1.4.0 + * (c) 2005 Sam Stephenson + * + * THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff + * against the source tree, available from the Prototype darcs repository. + * + * Prototype is freely distributable under the terms of an MIT-style license. + * + * For details, see the Prototype web site: http://prototype.conio.net/ + * +/*--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.4.0', + ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', + + emptyFunction: function() {}, + K: function(x) {return x} +} + +var Class = { + create: function() { + return function() { + this.initialize.apply(this, arguments); + } + } +} + +var Abstract = new Object(); + +Object.extend = function(destination, source) { + for (property in source) { + destination[property] = source[property]; + } + return destination; +} + +Object.inspect = function(object) { + try { + if (object == undefined) return 'undefined'; + if (object == null) return 'null'; + return object.inspect ? object.inspect() : object.toString(); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } +} + +Function.prototype.bind = function() { + var __method = this, args = $A(arguments), object = args.shift(); + return function() { + return __method.apply(object, args.concat($A(arguments))); + } +} + +Function.prototype.bindAsEventListener = function(object) { + var __method = this; + return function(event) { + return __method.call(object, event || window.event); + } +} + +Object.extend(Number.prototype, { + toColorPart: function() { + var digits = this.toString(16); + if (this < 16) return '0' + digits; + return digits; + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + } +}); + +var Try = { + these: function() { + var returnValue; + + for (var i = 0; i < arguments.length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) {} + } + + return returnValue; + } +} + +/*--------------------------------------------------------------------------*/ + +var PeriodicalExecuter = Class.create(); +PeriodicalExecuter.prototype = { + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.callback(); + } finally { + this.currentlyExecuting = false; + } + } + } +} + +/*--------------------------------------------------------------------------*/ + +function $() { + var elements = new Array(); + + for (var i = 0; i < arguments.length; i++) { + var element = arguments[i]; + if (typeof element == 'string') + element = document.getElementById(element); + + if (arguments.length == 1) + return element; + + elements.push(element); + } + + return elements; +} +Object.extend(String.prototype, { + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(eval); + }, + + escapeHTML: function() { + var div = document.createElement('div'); + var text = document.createTextNode(this); + div.appendChild(text); + return div.innerHTML; + }, + + unescapeHTML: function() { + var div = document.createElement('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; + }, + + toQueryParams: function() { + var pairs = this.match(/^\??(.*)$/)[1].split('&'); + return pairs.inject({}, function(params, pairString) { + var pair = pairString.split('='); + params[pair[0]] = pair[1]; + return params; + }); + }, + + toArray: function() { + return this.split(''); + }, + + camelize: function() { + var oStringList = this.split('-'); + if (oStringList.length == 1) return oStringList[0]; + + var camelizedString = this.indexOf('-') == 0 + ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) + : oStringList[0]; + + for (var i = 1, len = oStringList.length; i < len; i++) { + var s = oStringList[i]; + camelizedString += s.charAt(0).toUpperCase() + s.substring(1); + } + + return camelizedString; + }, + + inspect: function() { + return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'"; + } +}); + +String.prototype.parseQuery = String.prototype.toQueryParams; + +var $break = new Object(); +var $continue = new Object(); + +var Enumerable = { + each: function(iterator) { + var index = 0; + try { + this._each(function(value) { + try { + iterator(value, index++); + } catch (e) { + if (e != $continue) throw e; + } + }); + } catch (e) { + if (e != $break) throw e; + } + }, + + all: function(iterator) { + var result = true; + this.each(function(value, index) { + result = result && !!(iterator || Prototype.K)(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator) { + var result = true; + this.each(function(value, index) { + if (result = !!(iterator || Prototype.K)(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator) { + var results = []; + this.each(function(value, index) { + results.push(iterator(value, index)); + }); + return results; + }, + + detect: function (iterator) { + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator) { + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(pattern, iterator) { + var results = []; + this.each(function(value, index) { + var stringValue = value.toString(); + if (stringValue.match(pattern)) + results.push((iterator || Prototype.K)(value, index)); + }) + return results; + }, + + include: function(object) { + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inject: function(memo, iterator) { + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.collect(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (value >= (result || value)) + result = value; + }); + return result; + }, + + min: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (value <= (result || value)) + result = value; + }); + return result; + }, + + partition: function(iterator) { + var trues = [], falses = []; + this.each(function(value, index) { + ((iterator || Prototype.K)(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value, index) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator) { + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator) { + return this.collect(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.collect(Prototype.K); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (typeof args.last() == 'function') + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + iterator(value = collections.pluck(index)); + return value; + }); + }, + + inspect: function() { + return '#'; + } +} + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray +}); +var $A = Array.from = function(iterable) { + if (!iterable) return []; + if (iterable.toArray) { + return iterable.toArray(); + } else { + var results = []; + for (var i = 0; i < iterable.length; i++) + results.push(iterable[i]); + return results; + } +} + +Object.extend(Array.prototype, Enumerable); + +Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0; i < this.length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != undefined || value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(value.constructor == Array ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + indexOf: function(object) { + for (var i = 0; i < this.length; i++) + if (this[i] == object) return i; + return -1; + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + shift: function() { + var result = this[0]; + for (var i = 0; i < this.length - 1; i++) + this[i] = this[i + 1]; + this.length--; + return result; + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } +}); +var Hash = { + _each: function(iterator) { + for (key in this) { + var value = this[key]; + if (typeof value == 'function') continue; + + var pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + merge: function(hash) { + return $H(hash).inject($H(this), function(mergedHash, pair) { + mergedHash[pair.key] = pair.value; + return mergedHash; + }); + }, + + toQueryString: function() { + return this.map(function(pair) { + return pair.map(encodeURIComponent).join('='); + }).join('&'); + }, + + inspect: function() { + return '#'; + } +} + +function $H(object) { + var hash = Object.extend({}, object || {}); + Object.extend(hash, Enumerable); + Object.extend(hash, Hash); + return hash; +} +ObjectRange = Class.create(); +Object.extend(ObjectRange.prototype, Enumerable); +Object.extend(ObjectRange.prototype, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + do { + iterator(value); + value = value.succ(); + } while (this.include(value)); + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')}, + function() {return new XMLHttpRequest()} + ) || false; + }, + + activeRequestCount: 0 +} + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responderToAdd) { + if (!this.include(responderToAdd)) + this.responders.push(responderToAdd); + }, + + unregister: function(responderToRemove) { + this.responders = this.responders.without(responderToRemove); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (responder[callback] && typeof responder[callback] == 'function') { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) {} + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { + Ajax.activeRequestCount++; + }, + + onComplete: function() { + Ajax.activeRequestCount--; + } +}); + +Ajax.Base = function() {}; +Ajax.Base.prototype = { + setOptions: function(options) { + this.options = { + method: 'post', + asynchronous: true, + parameters: '' + } + Object.extend(this.options, options || {}); + }, + + responseIsSuccess: function() { + return this.transport.status == undefined + || this.transport.status == 0 + || (this.transport.status >= 200 && this.transport.status < 300); + }, + + responseIsFailure: function() { + return !this.responseIsSuccess(); + } +} + +Ajax.Request = Class.create(); +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Request.prototype = Object.extend(new Ajax.Base(), { + initialize: function(url, options) { + this.transport = Ajax.getTransport(); + this.setOptions(options); + this.request(url); + }, + + request: function(url) { + var parameters = this.options.parameters || ''; + if (parameters.length > 0) parameters += '&_='; + + try { + this.url = url; + if (this.options.method == 'get' && parameters.length > 0) + this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; + + Ajax.Responders.dispatch('onCreate', this, this.transport); + + this.transport.open(this.options.method, this.url, + this.options.asynchronous); + + if (this.options.asynchronous) { + this.transport.onreadystatechange = this.onStateChange.bind(this); + setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); + } + + this.setRequestHeaders(); + + var body = this.options.postBody ? this.options.postBody : parameters; + this.transport.send(this.options.method == 'post' ? body : null); + + } catch (e) { + this.dispatchException(e); + } + }, + + setRequestHeaders: function() { + var requestHeaders = + ['X-Requested-With', 'XMLHttpRequest', + 'X-Prototype-Version', Prototype.Version]; + + if (this.options.method == 'post') { + requestHeaders.push('Content-type', + 'application/x-www-form-urlencoded'); + + /* Force "Connection: close" for Mozilla browsers to work around + * a bug where XMLHttpReqeuest sends an incorrect Content-length + * header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType) + requestHeaders.push('Connection', 'close'); + } + + if (this.options.requestHeaders) + requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); + + for (var i = 0; i < requestHeaders.length; i += 2) + this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState != 1) + this.respondToReadyState(this.transport.readyState); + }, + + header: function(name) { + try { + return this.transport.getResponseHeader(name); + } catch (e) {} + }, + + evalJSON: function() { + try { + return eval(this.header('X-JSON')); + } catch (e) {} + }, + + evalResponse: function() { + try { + return eval(this.transport.responseText); + } catch (e) { + this.dispatchException(e); + } + }, + + respondToReadyState: function(readyState) { + var event = Ajax.Request.Events[readyState]; + var transport = this.transport, json = this.evalJSON(); + + if (event == 'Complete') { + try { + (this.options['on' + this.transport.status] + || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(transport, json); + } catch (e) { + this.dispatchException(e); + } + + if ((this.header('Content-type') || '').match(/^text\/javascript/i)) + this.evalResponse(); + } + + try { + (this.options['on' + event] || Prototype.emptyFunction)(transport, json); + Ajax.Responders.dispatch('on' + event, this, transport, json); + } catch (e) { + this.dispatchException(e); + } + + /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ + if (event == 'Complete') + this.transport.onreadystatechange = Prototype.emptyFunction; + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Updater = Class.create(); + +Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { + initialize: function(container, url, options) { + this.containers = { + success: container.success ? $(container.success) : $(container), + failure: container.failure ? $(container.failure) : + (container.success ? null : $(container)) + } + + this.transport = Ajax.getTransport(); + this.setOptions(options); + + var onComplete = this.options.onComplete || Prototype.emptyFunction; + this.options.onComplete = (function(transport, object) { + this.updateContent(); + onComplete(transport, object); + }).bind(this); + + this.request(url); + }, + + updateContent: function() { + var receiver = this.responseIsSuccess() ? + this.containers.success : this.containers.failure; + var response = this.transport.responseText; + + if (!this.options.evalScripts) + response = response.stripScripts(); + + if (receiver) { + if (this.options.insertion) { + new this.options.insertion(receiver, response); + } else { + Element.update(receiver, response); + } + } + + if (this.responseIsSuccess()) { + if (this.onComplete) + setTimeout(this.onComplete.bind(this), 10); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(); +Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { + initialize: function(container, url, options) { + this.setOptions(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = {}; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(request) { + if (this.options.decay) { + this.decay = (request.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = request.responseText; + } + this.timer = setTimeout(this.onTimerEvent.bind(this), + this.decay * this.frequency * 1000); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +document.getElementsByClassName = function(className, parentElement) { + var children = ($(parentElement) || document.body).getElementsByTagName('*'); + return $A(children).inject([], function(elements, child) { + if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) + elements.push(child); + return elements; + }); +} + +/*--------------------------------------------------------------------------*/ + +if (!window.Element) { + var Element = new Object(); +} + +Object.extend(Element, { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + Element[Element.visible(element) ? 'hide' : 'show'](element); + } + }, + + hide: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = 'none'; + } + }, + + show: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = ''; + } + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + }, + + update: function(element, html) { + $(element).innerHTML = html.stripScripts(); + setTimeout(function() {html.evalScripts()}, 10); + }, + + getHeight: function(element) { + element = $(element); + return element.offsetHeight; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).include(className); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).add(className); + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).remove(className); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + for (var i = 0; i < element.childNodes.length; i++) { + var node = element.childNodes[i]; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + Element.remove(node); + } + }, + + empty: function(element) { + return $(element).innerHTML.match(/^\s*$/); + }, + + scrollTo: function(element) { + element = $(element); + var x = element.x ? element.x : element.offsetLeft, + y = element.y ? element.y : element.offsetTop; + window.scrollTo(x, y); + }, + + getStyle: function(element, style) { + element = $(element); + var value = element.style[style.camelize()]; + if (!value) { + if (document.defaultView && document.defaultView.getComputedStyle) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css.getPropertyValue(style) : null; + } else if (element.currentStyle) { + value = element.currentStyle[style.camelize()]; + } + } + + if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) + if (Element.getStyle(element, 'position') == 'static') value = 'auto'; + + return value == 'auto' ? null : value; + }, + + setStyle: function(element, style) { + element = $(element); + for (name in style) + element.style[name.camelize()] = style[name]; + }, + + getDimensions: function(element) { + element = $(element); + if (Element.getStyle(element, 'display') != 'none') + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = ''; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = 'none'; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return; + element._overflow = element.style.overflow; + if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') + element.style.overflow = 'hidden'; + }, + + undoClipping: function(element) { + element = $(element); + if (element._overflow) return; + element.style.overflow = element._overflow; + element._overflow = undefined; + } +}); + +var Toggle = new Object(); +Toggle.display = Element.toggle; + +/*--------------------------------------------------------------------------*/ + +Abstract.Insertion = function(adjacency) { + this.adjacency = adjacency; +} + +Abstract.Insertion.prototype = { + initialize: function(element, content) { + this.element = $(element); + this.content = content.stripScripts(); + + if (this.adjacency && this.element.insertAdjacentHTML) { + try { + this.element.insertAdjacentHTML(this.adjacency, this.content); + } catch (e) { + if (this.element.tagName.toLowerCase() == 'tbody') { + this.insertContent(this.contentFromAnonymousTable()); + } else { + throw e; + } + } + } else { + this.range = this.element.ownerDocument.createRange(); + if (this.initializeRange) this.initializeRange(); + this.insertContent([this.range.createContextualFragment(this.content)]); + } + + setTimeout(function() {content.evalScripts()}, 10); + }, + + contentFromAnonymousTable: function() { + var div = document.createElement('div'); + div.innerHTML = '' + this.content + '
'; + return $A(div.childNodes[0].childNodes[0].childNodes); + } +} + +var Insertion = new Object(); + +Insertion.Before = Class.create(); +Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { + initializeRange: function() { + this.range.setStartBefore(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, this.element); + }).bind(this)); + } +}); + +Insertion.Top = Class.create(); +Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(true); + }, + + insertContent: function(fragments) { + fragments.reverse(false).each((function(fragment) { + this.element.insertBefore(fragment, this.element.firstChild); + }).bind(this)); + } +}); + +Insertion.Bottom = Class.create(); +Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.appendChild(fragment); + }).bind(this)); + } +}); + +Insertion.After = Class.create(); +Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { + initializeRange: function() { + this.range.setStartAfter(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, + this.element.nextSibling); + }).bind(this)); + } +}); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { + initialize: function(element) { + this.element = $(element); + }, + + _each: function(iterator) { + this.element.className.split(/\s+/).select(function(name) { + return name.length > 0; + })._each(iterator); + }, + + set: function(className) { + this.element.className = className; + }, + + add: function(classNameToAdd) { + if (this.include(classNameToAdd)) return; + this.set(this.toArray().concat(classNameToAdd).join(' ')); + }, + + remove: function(classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set(this.select(function(className) { + return className != classNameToRemove; + }).join(' ')); + }, + + toString: function() { + return this.toArray().join(' '); + } +} + +Object.extend(Element.ClassNames.prototype, Enumerable); +var Field = { + clear: function() { + for (var i = 0; i < arguments.length; i++) + $(arguments[i]).value = ''; + }, + + focus: function(element) { + $(element).focus(); + }, + + present: function() { + for (var i = 0; i < arguments.length; i++) + if ($(arguments[i]).value == '') return false; + return true; + }, + + select: function(element) { + $(element).select(); + }, + + activate: function(element) { + element = $(element); + element.focus(); + if (element.select) + element.select(); + } +} + +/*--------------------------------------------------------------------------*/ + +var Form = { + serialize: function(form) { + var elements = Form.getElements($(form)); + var queryComponents = new Array(); + + for (var i = 0; i < elements.length; i++) { + var queryComponent = Form.Element.serialize(elements[i]); + if (queryComponent) + queryComponents.push(queryComponent); + } + + return queryComponents.join('&'); + }, + + getElements: function(form) { + form = $(form); + var elements = new Array(); + + for (tagName in Form.Element.Serializers) { + var tagElements = form.getElementsByTagName(tagName); + for (var j = 0; j < tagElements.length; j++) + elements.push(tagElements[j]); + } + return elements; + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) + return inputs; + + var matchingInputs = new Array(); + for (var i = 0; i < inputs.length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || + (name && input.name != name)) + continue; + matchingInputs.push(input); + } + + return matchingInputs; + }, + + disable: function(form) { + var elements = Form.getElements(form); + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + element.blur(); + element.disabled = 'true'; + } + }, + + enable: function(form) { + var elements = Form.getElements(form); + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + element.disabled = ''; + } + }, + + findFirstElement: function(form) { + return Form.getElements(form).find(function(element) { + return element.type != 'hidden' && !element.disabled && + ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + Field.activate(Form.findFirstElement(form)); + }, + + reset: function(form) { + $(form).reset(); + } +} + +Form.Element = { + serialize: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + var parameter = Form.Element.Serializers[method](element); + + if (parameter) { + var key = encodeURIComponent(parameter[0]); + if (key.length == 0) return; + + if (parameter[1].constructor != Array) + parameter[1] = [parameter[1]]; + + return parameter[1].map(function(value) { + return key + '=' + encodeURIComponent(value); + }).join('&'); + } + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + var parameter = Form.Element.Serializers[method](element); + + if (parameter) + return parameter[1]; + } +} + +Form.Element.Serializers = { + input: function(element) { + switch (element.type.toLowerCase()) { + case 'submit': + case 'hidden': + case 'password': + case 'text': + return Form.Element.Serializers.textarea(element); + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element); + } + return false; + }, + + inputSelector: function(element) { + if (element.checked) + return [element.name, element.value]; + }, + + textarea: function(element) { + return [element.name, element.value]; + }, + + select: function(element) { + return Form.Element.Serializers[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + }, + + selectOne: function(element) { + var value = '', opt, index = element.selectedIndex; + if (index >= 0) { + opt = element.options[index]; + value = opt.value; + if (!value && !('value' in opt)) + value = opt.text; + } + return [element.name, value]; + }, + + selectMany: function(element) { + var value = new Array(); + for (var i = 0; i < element.length; i++) { + var opt = element.options[i]; + if (opt.selected) { + var optValue = opt.value; + if (!optValue && !('value' in opt)) + optValue = opt.text; + value.push(optValue); + } + } + return [element.name, value]; + } +} + +/*--------------------------------------------------------------------------*/ + +var $F = Form.Element.getValue; + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = function() {} +Abstract.TimedObserver.prototype = { + initialize: function(element, frequency, callback) { + this.frequency = frequency; + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + this.registerCallback(); + }, + + registerCallback: function() { + setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + } +} + +Form.Element.Observer = Class.create(); +Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(); +Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = function() {} +Abstract.EventObserver.prototype = { + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + var elements = Form.getElements(this.element); + for (var i = 0; i < elements.length; i++) + this.registerCallback(elements[i]); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + case 'password': + case 'text': + case 'textarea': + case 'select-one': + case 'select-multiple': + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +} + +Form.Element.EventObserver = Class.create(); +Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(); +Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) { + var Event = new Object(); +} + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + + element: function(event) { + return event.target || event.srcElement; + }, + + isLeftClick: function(event) { + return (((event.which) && (event.which == 1)) || + ((event.button) && (event.button == 1))); + }, + + pointerX: function(event) { + return event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)); + }, + + pointerY: function(event) { + return event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)); + }, + + stop: function(event) { + if (event.preventDefault) { + event.preventDefault(); + event.stopPropagation(); + } else { + event.returnValue = false; + event.cancelBubble = true; + } + }, + + // find the first node with the given tagName, starting from the + // node the event was triggered on; traverses the DOM upwards + findElement: function(event, tagName) { + var element = Event.element(event); + while (element.parentNode && (!element.tagName || + (element.tagName.toUpperCase() != tagName.toUpperCase()))) + element = element.parentNode; + return element; + }, + + observers: false, + + _observeAndCache: function(element, name, observer, useCapture) { + if (!this.observers) this.observers = []; + if (element.addEventListener) { + this.observers.push([element, name, observer, useCapture]); + element.addEventListener(name, observer, useCapture); + } else if (element.attachEvent) { + this.observers.push([element, name, observer, useCapture]); + element.attachEvent('on' + name, observer); + } + }, + + unloadCache: function() { + if (!Event.observers) return; + for (var i = 0; i < Event.observers.length; i++) { + Event.stopObserving.apply(this, Event.observers[i]); + Event.observers[i][0] = null; + } + Event.observers = false; + }, + + observe: function(element, name, observer, useCapture) { + var element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.attachEvent)) + name = 'keydown'; + + this._observeAndCache(element, name, observer, useCapture); + }, + + stopObserving: function(element, name, observer, useCapture) { + var element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.detachEvent)) + name = 'keydown'; + + if (element.removeEventListener) { + element.removeEventListener(name, observer, useCapture); + } else if (element.detachEvent) { + element.detachEvent('on' + name, observer); + } + } +}); + +/* prevent memory leaks in IE */ +Event.observe(window, 'unload', Event.unloadCache, false); +var Position = { + // set to true if needed, warning: firefox performance problems + // NOT neeeded for page scrolling, only if draggable contained in + // scrollable elements + includeScrollOffsets: false, + + // must be called before calling withinIncludingScrolloffset, every time the + // page is scrolled + prepare: function() { + this.deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + this.deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + }, + + realOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return [valueL, valueT]; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return [valueL, valueT]; + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + p = Element.getStyle(element, 'position'); + if (p == 'relative' || p == 'absolute') break; + } + } while (element); + return [valueL, valueT]; + }, + + offsetParent: function(element) { + if (element.offsetParent) return element.offsetParent; + if (element == document.body) return element; + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return element; + + return document.body; + }, + + // caches x/y coordinate pair to use with overlap + within: function(element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = this.cumulativeOffset(element); + + return (y >= this.offset[1] && + y < this.offset[1] + element.offsetHeight && + x >= this.offset[0] && + x < this.offset[0] + element.offsetWidth); + }, + + withinIncludingScrolloffsets: function(element, x, y) { + var offsetcache = this.realOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = this.cumulativeOffset(element); + + return (this.ycomp >= this.offset[1] && + this.ycomp < this.offset[1] + element.offsetHeight && + this.xcomp >= this.offset[0] && + this.xcomp < this.offset[0] + element.offsetWidth); + }, + + // within must be called directly before + overlap: function(mode, element) { + if (!mode) return 0; + if (mode == 'vertical') + return ((this.offset[1] + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + if (mode == 'horizontal') + return ((this.offset[0] + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + }, + + clone: function(source, target) { + source = $(source); + target = $(target); + target.style.position = 'absolute'; + var offsets = this.cumulativeOffset(source); + target.style.top = offsets[1] + 'px'; + target.style.left = offsets[0] + 'px'; + target.style.width = source.offsetWidth + 'px'; + target.style.height = source.offsetHeight + 'px'; + }, + + page: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent==document.body) + if (Element.getStyle(element,'position')=='absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } while (element = element.parentNode); + + return [valueL, valueT]; + }, + + clone: function(source, target) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || {}) + + // find page position of source + source = $(source); + var p = Position.page(source); + + // find coordinate system to use + target = $(target); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(target,'position') == 'absolute') { + parent = Position.offsetParent(target); + delta = Position.page(parent); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if(options.setWidth) target.style.width = source.offsetWidth + 'px'; + if(options.setHeight) target.style.height = source.offsetHeight + 'px'; + }, + + absolutize: function(element) { + element = $(element); + if (element.style.position == 'absolute') return; + Position.prepare(); + + var offsets = Position.positionedOffset(element); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px';; + element.style.left = left + 'px';; + element.style.width = width + 'px';; + element.style.height = height + 'px';; + }, + + relativize: function(element) { + element = $(element); + if (element.style.position == 'relative') return; + Position.prepare(); + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + } +} + +// Safari returns margins on body which is incorrect if the child is absolutely +// positioned. For performance reasons, redefine Position.cumulativeOffset for +// KHTML/WebKit only. +if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { + Position.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return [valueL, valueT]; + } +} \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..4ab9e89 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file \ No newline at end of file diff --git a/public/stylesheets/grindable.css b/public/stylesheets/grindable.css new file mode 100644 index 0000000..fe339ae --- /dev/null +++ b/public/stylesheets/grindable.css @@ -0,0 +1,122 @@ +#Container { + float: none; + margin: 0 auto; + text-align: center; +} + +#Content { + margin: 0; + padding: 5px; + text-align: left; + border-top: none; + float: left; +} + +#Container, #Content { + width: 750px; +} + +body, p, ol, ul, td { + font-family: georgia, verdana, arial, helvetica, sans-serif; + line-height: 18px; +} + +h1, h2, h3 { color: #966956; } +h1 { font-size: 28px } +h2 { font-size: 19px } +h3 { font-size: 16px } + +.inputBox { + font-family: georgia, verdana, arial, helvetica, sans-serif; + border: 1px solid #966956; + padding: 2px; +} + +#info, #errorExplanation { + font-style: italic; + padding: 10px; + margin: 10px 0px 10px 0px; +} + +#errorExplanation { + border: 1px solid #d20000; + background-color: #d28f8f; + color: #8b0000; +} + +#info { + border: 1px solid #966956; + background-color: #fffecb; + color: #006400; +} + +.formRequest { + border: 1px solid #555555; + background-color: #eeeeee; + padding: 10px; + margin-top: 10px; + margin-bottom: 10px; +} + +#milkBox, #fundBox, #contributeBox { + border: 1px solid black; + padding: 0px 5px 0px 5px; + margin: 10px 0px 10px 0px; +} + +#milkBox { + background-color: #ffffff; + background-image: url(/images/milk-print.jpg); + background-repeat: repeat; +} + +#fundBox { + background-color: #99FF99; + background-image: url(/images/balance.jpg); + background-repeat: no-repeat; + background-position: center right; +} + +.even { + background-color: #bcffcd; +} + +.odd { + background-color: #46ff76; +} + +.collectionList { + padding: 2px; +} + +.collectionList th { + text-align: center; +} + +.collectionList a img { + text-decoration: none; + border: none; +} + +.dojoDialog { + background: #F3EBD8; + border: 1px solid #999; + -moz-border-radius: 5px; + padding: 4px; + max-width: 700px; + height: auto; + max-height: 400px; + overflow: auto; +} + +.dialog_header { + margin-bottom:10px; + background:#787d86; + padding:2px 5px 2px 5px; + text-align:right; + -moz-border-radius : 5px; +} + +.dialog_header a { + color:white; +} \ No newline at end of file diff --git a/script/about b/script/about new file mode 100755 index 0000000..7b07d46 --- /dev/null +++ b/script/about @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../config/boot' +require 'commands/about' \ No newline at end of file diff --git a/script/breakpointer b/script/breakpointer new file mode 100755 index 0000000..64af76e --- /dev/null +++ b/script/breakpointer @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../config/boot' +require 'commands/breakpointer' \ No newline at end of file diff --git a/script/console b/script/console new file mode 100755 index 0000000..42f28f7 --- /dev/null +++ b/script/console @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../config/boot' +require 'commands/console' \ No newline at end of file diff --git a/script/destroy b/script/destroy new file mode 100755 index 0000000..fa0e6fc --- /dev/null +++ b/script/destroy @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../config/boot' +require 'commands/destroy' \ No newline at end of file diff --git a/script/generate b/script/generate new file mode 100755 index 0000000..ef976e0 --- /dev/null +++ b/script/generate @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../config/boot' +require 'commands/generate' \ No newline at end of file diff --git a/script/performance/benchmarker b/script/performance/benchmarker new file mode 100755 index 0000000..c842d35 --- /dev/null +++ b/script/performance/benchmarker @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../../config/boot' +require 'commands/performance/benchmarker' diff --git a/script/performance/profiler b/script/performance/profiler new file mode 100755 index 0000000..d855ac8 --- /dev/null +++ b/script/performance/profiler @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../../config/boot' +require 'commands/performance/profiler' diff --git a/script/plugin b/script/plugin new file mode 100755 index 0000000..26ca64c --- /dev/null +++ b/script/plugin @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../config/boot' +require 'commands/plugin' \ No newline at end of file diff --git a/script/process/reaper b/script/process/reaper new file mode 100755 index 0000000..c77f045 --- /dev/null +++ b/script/process/reaper @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../../config/boot' +require 'commands/process/reaper' diff --git a/script/process/spawner b/script/process/spawner new file mode 100755 index 0000000..7118f39 --- /dev/null +++ b/script/process/spawner @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../../config/boot' +require 'commands/process/spawner' diff --git a/script/process/spinner b/script/process/spinner new file mode 100755 index 0000000..6816b32 --- /dev/null +++ b/script/process/spinner @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../../config/boot' +require 'commands/process/spinner' diff --git a/script/runner b/script/runner new file mode 100755 index 0000000..ccc30f9 --- /dev/null +++ b/script/runner @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require File.dirname(__FILE__) + '/../config/boot' +require 'commands/runner' \ No newline at end of file diff --git a/script/server b/script/server new file mode 100755 index 0000000..1b9a002 --- /dev/null +++ b/script/server @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby + +argv = ARGV.dup + +mroot = "#{File.dirname(__FILE__) + '/..'}" +if File.exists?("#{mroot}/log/mongrel.pid") + pid = "" + File.open("#{mroot}/log/mongrel.pid") {|f| pid = f.readline} +else + pid = false +end + +if (pid != false) && (ARGV[0] == 'stop') + command = "echo 'Mongrel stopping...';kill " + pid + ";echo 'Mongrel stopped.'" + argv = [] +elsif (pid != false) + command = "echo '\nMongrel is running with PID " + pid + "'\necho 'Use \"script/server stop\" to stop Mongrel\n'" +else + command = "mongrel_rails start -c #{mroot} " +end + +exec command + argv.join(' ') diff --git a/test/fixtures/baristas.yml b/test/fixtures/baristas.yml new file mode 100644 index 0000000..8794d28 --- /dev/null +++ b/test/fixtures/baristas.yml @@ -0,0 +1,5 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html +first: + id: 1 +another: + id: 2 diff --git a/test/fixtures/funds.yml b/test/fixtures/funds.yml new file mode 100644 index 0000000..8794d28 --- /dev/null +++ b/test/fixtures/funds.yml @@ -0,0 +1,5 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html +first: + id: 1 +another: + id: 2 diff --git a/test/fixtures/ledgers.yml b/test/fixtures/ledgers.yml new file mode 100644 index 0000000..8794d28 --- /dev/null +++ b/test/fixtures/ledgers.yml @@ -0,0 +1,5 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html +first: + id: 1 +another: + id: 2 diff --git a/test/functional/activity_controller_test.rb b/test/functional/activity_controller_test.rb new file mode 100644 index 0000000..62a515d --- /dev/null +++ b/test/functional/activity_controller_test.rb @@ -0,0 +1,18 @@ +require File.dirname(__FILE__) + '/../test_helper' +require 'activity_controller' + +# Re-raise errors caught by the controller. +class ActivityController; def rescue_action(e) raise e end; end + +class ActivityControllerTest < Test::Unit::TestCase + def setup + @controller = ActivityController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + end + + # Replace this with your real tests. + def test_truth + assert true + end +end diff --git a/test/functional/barista_controller_test.rb b/test/functional/barista_controller_test.rb new file mode 100644 index 0000000..b688a25 --- /dev/null +++ b/test/functional/barista_controller_test.rb @@ -0,0 +1,18 @@ +require File.dirname(__FILE__) + '/../test_helper' +require 'barista_controller' + +# Re-raise errors caught by the controller. +class BaristaController; def rescue_action(e) raise e end; end + +class BaristaControllerTest < Test::Unit::TestCase + def setup + @controller = BaristaController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + end + + # Replace this with your real tests. + def test_truth + assert true + end +end diff --git a/test/functional/cafe_controller_test.rb b/test/functional/cafe_controller_test.rb new file mode 100644 index 0000000..36cb554 --- /dev/null +++ b/test/functional/cafe_controller_test.rb @@ -0,0 +1,18 @@ +require File.dirname(__FILE__) + '/../test_helper' +require 'cafe_controller' + +# Re-raise errors caught by the controller. +class CafeController; def rescue_action(e) raise e end; end + +class CafeControllerTest < Test::Unit::TestCase + def setup + @controller = CafeController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + end + + # Replace this with your real tests. + def test_truth + assert true + end +end diff --git a/test/functional/fund_controller_test.rb b/test/functional/fund_controller_test.rb new file mode 100644 index 0000000..f6dae5e --- /dev/null +++ b/test/functional/fund_controller_test.rb @@ -0,0 +1,18 @@ +require File.dirname(__FILE__) + '/../test_helper' +require 'fund_controller' + +# Re-raise errors caught by the controller. +class FundController; def rescue_action(e) raise e end; end + +class FundControllerTest < Test::Unit::TestCase + def setup + @controller = FundController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + end + + # Replace this with your real tests. + def test_truth + assert true + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..a299c7f --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,28 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path(File.dirname(__FILE__) + "/../config/environment") +require 'test_help' + +class Test::Unit::TestCase + # Transactional fixtures accelerate your tests by wrapping each test method + # in a transaction that's rolled back on completion. This ensures that the + # test database remains unchanged so your fixtures don't have to be reloaded + # between every test method. Fewer database queries means faster tests. + # + # Read Mike Clark's excellent walkthrough at + # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting + # + # Every Active Record database supports transactions except MyISAM tables + # in MySQL. Turn off transactional fixtures in this case; however, if you + # don't care one way or the other, switching from MyISAM to InnoDB tables + # is recommended. + self.use_transactional_fixtures = true + + # Instantiated fixtures are slow, but give you @david where otherwise you + # would need people(:david). If you don't want to migrate your existing + # test cases which use the @david style and don't mind the speed hit (each + # instantiated fixtures translates to a database query per test method), + # then set this back to true. + self.use_instantiated_fixtures = false + + # Add more helper methods to be used by all tests here... +end diff --git a/test/unit/barista_test.rb b/test/unit/barista_test.rb new file mode 100644 index 0000000..344cda5 --- /dev/null +++ b/test/unit/barista_test.rb @@ -0,0 +1,10 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class BaristaTest < Test::Unit::TestCase + fixtures :baristas + + # Replace this with your real tests. + def test_truth + assert_kind_of Barista, baristas(:first) + end +end diff --git a/test/unit/fund_test.rb b/test/unit/fund_test.rb new file mode 100644 index 0000000..789caf6 --- /dev/null +++ b/test/unit/fund_test.rb @@ -0,0 +1,10 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class FundTest < Test::Unit::TestCase + fixtures :funds + + # Replace this with your real tests. + def test_truth + assert true + end +end diff --git a/test/unit/ledger_test.rb b/test/unit/ledger_test.rb new file mode 100644 index 0000000..37ab504 --- /dev/null +++ b/test/unit/ledger_test.rb @@ -0,0 +1,10 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class LedgerTest < Test::Unit::TestCase + fixtures :ledgers + + # Replace this with your real tests. + def test_truth + assert_kind_of Ledger, ledgers(:first) + end +end