From 6a1aa64f6d22473e0357ad1cd7bd93259d899a69 Mon Sep 17 00:00:00 2001 From: Dan Vanderkam Date: Tue, 18 Aug 2009 23:35:08 +0000 Subject: [PATCH] Initial check-in --- data.js | 63 + dygraph-canvas.js | 230 + dygraph-combined.js | 10375 +++++++++++++++++++ dygraph.js | 1063 ++ generate-combined.sh | 9 + mochikit_v14/LICENSE.txt | 69 + mochikit_v14/MochiKit/Async.js | 699 ++ mochikit_v14/MochiKit/Base.js | 1404 +++ mochikit_v14/MochiKit/Color.js | 902 ++ mochikit_v14/MochiKit/Controls.js | 1388 +++ mochikit_v14/MochiKit/DOM.js | 1276 +++ mochikit_v14/MochiKit/DateTime.js | 216 + mochikit_v14/MochiKit/DragAndDrop.js | 824 ++ mochikit_v14/MochiKit/Format.js | 304 + mochikit_v14/MochiKit/Iter.js | 851 ++ mochikit_v14/MochiKit/Logging.js | 321 + mochikit_v14/MochiKit/LoggingPane.js | 374 + mochikit_v14/MochiKit/MochiKit.js | 154 + mochikit_v14/MochiKit/MockDOM.js | 115 + mochikit_v14/MochiKit/Position.js | 258 + mochikit_v14/MochiKit/Selector.js | 431 + mochikit_v14/MochiKit/Signal.js | 898 ++ mochikit_v14/MochiKit/Sortable.js | 589 ++ mochikit_v14/MochiKit/Style.js | 445 + mochikit_v14/MochiKit/Test.js | 181 + mochikit_v14/MochiKit/Visual.js | 1981 ++++ mochikit_v14/MochiKit/__package__.js | 18 + mochikit_v14/doc/html/MochiKit/Async.html | 781 ++ mochikit_v14/doc/html/MochiKit/Base.html | 1665 +++ mochikit_v14/doc/html/MochiKit/Color.html | 753 ++ mochikit_v14/doc/html/MochiKit/DOM.html | 1186 +++ mochikit_v14/doc/html/MochiKit/DateTime.html | 166 + mochikit_v14/doc/html/MochiKit/DragAndDrop.html | 185 + mochikit_v14/doc/html/MochiKit/Format.html | 290 + mochikit_v14/doc/html/MochiKit/Iter.html | 522 + mochikit_v14/doc/html/MochiKit/Logging.html | 398 + mochikit_v14/doc/html/MochiKit/LoggingPane.html | 140 + mochikit_v14/doc/html/MochiKit/Position.html | 36 + mochikit_v14/doc/html/MochiKit/Selector.html | 210 + mochikit_v14/doc/html/MochiKit/Signal.html | 476 + mochikit_v14/doc/html/MochiKit/Sortable.html | 238 + mochikit_v14/doc/html/MochiKit/Style.html | 332 + mochikit_v14/doc/html/MochiKit/VersionHistory.html | 331 + mochikit_v14/doc/html/MochiKit/Visual.html | 699 ++ mochikit_v14/doc/html/MochiKit/index.html | 393 + mochikit_v14/doc/js/toc.js | 113 + mochikit_v14/doc/rst/MochiKit/Async.rst | 735 ++ mochikit_v14/doc/rst/MochiKit/Base.rst | 1416 +++ mochikit_v14/doc/rst/MochiKit/Color.rst | 651 ++ mochikit_v14/doc/rst/MochiKit/DOM.rst | 1130 ++ mochikit_v14/doc/rst/MochiKit/DateTime.rst | 145 + mochikit_v14/doc/rst/MochiKit/DragAndDrop.rst | 197 + mochikit_v14/doc/rst/MochiKit/Format.rst | 249 + mochikit_v14/doc/rst/MochiKit/Iter.rst | 454 + mochikit_v14/doc/rst/MochiKit/Logging.rst | 345 + mochikit_v14/doc/rst/MochiKit/LoggingPane.rst | 128 + mochikit_v14/doc/rst/MochiKit/Position.rst | 26 + mochikit_v14/doc/rst/MochiKit/Selector.rst | 182 + mochikit_v14/doc/rst/MochiKit/Signal.rst | 468 + mochikit_v14/doc/rst/MochiKit/Sortable.rst | 181 + mochikit_v14/doc/rst/MochiKit/Style.rst | 309 + mochikit_v14/doc/rst/MochiKit/VersionHistory.rst | 311 + mochikit_v14/doc/rst/MochiKit/Visual.rst | 531 + mochikit_v14/doc/rst/MochiKit/index.rst | 81 + mochikit_v14/examples/ajax_tables/ajax_tables.css | 69 + mochikit_v14/examples/ajax_tables/ajax_tables.js | 401 + mochikit_v14/examples/ajax_tables/domains.json | 10 + mochikit_v14/examples/ajax_tables/domains.xml | 40 + mochikit_v14/examples/ajax_tables/index.html | 96 + mochikit_v14/examples/color_wheel/color_wheel.css | 4 + mochikit_v14/examples/color_wheel/color_wheel.js | 95 + mochikit_v14/examples/color_wheel/index.html | 31 + .../examples/dnd_sortable/dnd_sortable.css | 23 + mochikit_v14/examples/dnd_sortable/dropmarker.png | Bin 0 -> 213 bytes mochikit_v14/examples/dnd_sortable/icon.png | Bin 0 -> 281 bytes mochikit_v14/examples/dnd_sortable/index.html | 54 + .../examples/dnd_sortable/sortable2_test.html | 150 + .../examples/dnd_sortable/sortable3_test.html | 42 + .../examples/dnd_sortable/sortable4_test.html | 90 + .../examples/dnd_sortable/sortable5_test.html | 45 + .../examples/dnd_sortable/sortable_test.html | 38 + .../examples/dnd_sortable/sortable_tree_test.html | 189 + mochikit_v14/examples/draggable/draggable.css | 28 + mochikit_v14/examples/draggable/draggable.js | 73 + mochikit_v14/examples/draggable/index.html | 38 + .../examples/effects/effects_bigslide.html | 36 + mochikit_v14/examples/effects/effects_blind.html | 65 + .../examples/effects/effects_blindslide.html | 31 + mochikit_v14/examples/effects/effects_combi.css | 34 + .../examples/effects/effects_fadeappear.html | 61 + .../examples/effects/effects_grow_shrink.html | 38 + mochikit_v14/examples/effects/effects_onload.html | 66 + mochikit_v14/examples/effects/effects_queue.html | 67 + .../examples/effects/effects_queue_limit.html | 30 + mochikit_v14/examples/effects/effects_scroll.html | 483 + mochikit_v14/examples/effects/effects_slide.html | 63 + mochikit_v14/examples/effects/full.html | 71 + mochikit_v14/examples/effects/icon.png | Bin 0 -> 281 bytes mochikit_v14/examples/effects/index.html | 113 + mochikit_v14/examples/interpreter/index.html | 88 + mochikit_v14/examples/interpreter/interpreter.css | 54 + mochikit_v14/examples/interpreter/interpreter.js | 373 + mochikit_v14/examples/key_events/index.html | 78 + mochikit_v14/examples/key_events/key_events.css | 5 + mochikit_v14/examples/key_events/key_events.js | 85 + mochikit_v14/examples/logging_pane/index.html | 46 + .../examples/logging_pane/logging_pane.css | 78 + mochikit_v14/examples/logging_pane/logging_pane.js | 11 + mochikit_v14/examples/mochiregexp/index.html | 74 + mochikit_v14/examples/mochiregexp/mochiregexp.css | 73 + mochikit_v14/examples/mochiregexp/mochiregexp.js | 125 + mochikit_v14/examples/rounded_corners/index.html | 28 + .../examples/rounded_corners/rounded_corners.css | 3 + .../examples/rounded_corners/rounded_corners.js | 19 + mochikit_v14/examples/simple_dnd/dnd_boxes.html | 45 + mochikit_v14/examples/simple_dnd/dnd_full.html | 119 + mochikit_v14/examples/simple_dnd/dnd_ghost.html | 40 + .../examples/simple_dnd/dnd_hoverclass.html | 43 + mochikit_v14/examples/simple_dnd/dnd_scroll.html | 91 + mochikit_v14/examples/simple_dnd/dnd_snap.html | 54 + mochikit_v14/examples/simple_dnd/index.html | 93 + mochikit_v14/examples/simple_dnd/simple_dnd.css | 64 + mochikit_v14/examples/sortable_tables/index.html | 71 + .../examples/sortable_tables/sortable_tables.css | 66 + .../examples/sortable_tables/sortable_tables.js | 203 + .../lib/SyntaxHighlighter/SyntaxHighlighter.css | 177 + .../view-source/lib/SyntaxHighlighter/Tests.html | 339 + .../lib/SyntaxHighlighter/shBrushCSharp.js | 30 + .../lib/SyntaxHighlighter/shBrushDelphi.js | 31 + .../lib/SyntaxHighlighter/shBrushJScript.js | 22 + .../lib/SyntaxHighlighter/shBrushPhp.js | 23 + .../lib/SyntaxHighlighter/shBrushPython.js | 71 + .../lib/SyntaxHighlighter/shBrushSql.js | 40 + .../view-source/lib/SyntaxHighlighter/shBrushVb.js | 29 + .../lib/SyntaxHighlighter/shBrushXml.js | 61 + .../view-source/lib/SyntaxHighlighter/shCore.js | 622 ++ mochikit_v14/examples/view-source/view-source.css | 1 + mochikit_v14/examples/view-source/view-source.html | 19 + mochikit_v14/examples/view-source/view-source.js | 70 + mochikit_v14/include/_img/bg_docheader.gif | Bin 0 -> 3348 bytes mochikit_v14/include/_img/g_bullet.gif | Bin 0 -> 102 bytes mochikit_v14/include/_img/g_logo_doc.gif | Bin 0 -> 4193 bytes mochikit_v14/include/css/documentation.css | 120 + mochikit_v14/include/css/general.css | 48 + mochikit_v14/packed/MochiKit/MochiKit.js | 6905 ++++++++++++ mochikit_v14/packed/MochiKit/__package__.js | 2 + mochikit_v14/scripts/build.py | 115 + mochikit_v14/scripts/custom_rhino.jar | Bin 0 -> 715901 bytes mochikit_v14/scripts/js.jar | Bin 0 -> 701049 bytes mochikit_v14/scripts/jscriptmochi.js | 24 + mochikit_v14/scripts/make_docs.py | 110 + mochikit_v14/scripts/pack.py | 56 + mochikit_v14/scripts/rhinomochi.js | 2 + mochikit_v14/scripts/spidermochi.js | 2 + mochikit_v14/tests/FakeJSAN.js | 40 + mochikit_v14/tests/SimpleTest/SimpleTest.js | 366 + mochikit_v14/tests/SimpleTest/TestRunner.js | 159 + mochikit_v14/tests/SimpleTest/test.css | 28 + mochikit_v14/tests/cli.js | 6 + mochikit_v14/tests/index.html | 25 + mochikit_v14/tests/standalone.js | 16 + mochikit_v14/tests/test_Base.js | 507 + mochikit_v14/tests/test_Color.js | 137 + mochikit_v14/tests/test_DateTime.js | 45 + mochikit_v14/tests/test_DragAndDrop.js | 30 + mochikit_v14/tests/test_Format.js | 80 + mochikit_v14/tests/test_Iter.js | 176 + mochikit_v14/tests/test_Logging.js | 75 + mochikit_v14/tests/test_MochiKit-Async.html | 408 + mochikit_v14/tests/test_MochiKit-Async.json | 1 + mochikit_v14/tests/test_MochiKit-Base.html | 34 + mochikit_v14/tests/test_MochiKit-Color.html | 84 + mochikit_v14/tests/test_MochiKit-DOM-Safari.html | 48 + mochikit_v14/tests/test_MochiKit-DOM.html | 316 + mochikit_v14/tests/test_MochiKit-DateTime.html | 39 + mochikit_v14/tests/test_MochiKit-DragAndDrop.html | 54 + mochikit_v14/tests/test_MochiKit-Format.html | 39 + mochikit_v14/tests/test_MochiKit-Iter.html | 38 + mochikit_v14/tests/test_MochiKit-JSAN.html | 32 + mochikit_v14/tests/test_MochiKit-Logging.html | 40 + mochikit_v14/tests/test_MochiKit-MochiKit.html | 18 + mochikit_v14/tests/test_MochiKit-Selector.html | 274 + mochikit_v14/tests/test_MochiKit-Signal.html | 43 + mochikit_v14/tests/test_MochiKit-Style.html | 141 + mochikit_v14/tests/test_MochiKit-Visual.html | 176 + mochikit_v14/tests/test_Signal.js | 430 + plotkit_v091/COPYING | 28 + plotkit_v091/PlotKit/Base.js | 406 + plotkit_v091/PlotKit/Canvas.js | 683 ++ plotkit_v091/PlotKit/EasyPlot.js | 161 + plotkit_v091/PlotKit/Layout.js | 756 ++ plotkit_v091/PlotKit/PlotKit.js | 151 + plotkit_v091/PlotKit/PlotKit_Packed.js | 2177 ++++ plotkit_v091/PlotKit/SVG.js | 705 ++ plotkit_v091/PlotKit/SweetCanvas.js | 348 + plotkit_v091/PlotKit/SweetSVG.js | 247 + plotkit_v091/PlotKit/dummy.svg | 9 + plotkit_v091/PlotKit/excanvas.js | 723 ++ plotkit_v091/README | 1 + plotkit_v091/doc/MochiKitAdditions.html | 2 + plotkit_v091/doc/MochiKitAdditions.txt | 2 + plotkit_v091/doc/PlotKit.Base.html | 302 + plotkit_v091/doc/PlotKit.Base.txt | 139 + plotkit_v091/doc/PlotKit.Canvas.html | 172 + plotkit_v091/doc/PlotKit.Canvas.txt | 81 + plotkit_v091/doc/PlotKit.EasyPlot.html | 155 + plotkit_v091/doc/PlotKit.EasyPlot.txt | 50 + plotkit_v091/doc/PlotKit.Layout.html | 428 + plotkit_v091/doc/PlotKit.Layout.txt | 330 + plotkit_v091/doc/PlotKit.QuickStart.html | 368 + plotkit_v091/doc/PlotKit.QuickStart.txt | 256 + plotkit_v091/doc/PlotKit.Renderer.html | 436 + plotkit_v091/doc/PlotKit.Renderer.txt | 299 + plotkit_v091/doc/PlotKit.SVG.html | 159 + plotkit_v091/doc/PlotKit.SVG.txt | 64 + plotkit_v091/doc/PlotKit.SweetCanvas.html | 131 + plotkit_v091/doc/PlotKit.SweetCanvas.txt | 34 + plotkit_v091/doc/PlotKit.SweetSVG.html | 131 + plotkit_v091/doc/PlotKit.SweetSVG.txt | 34 + plotkit_v091/doc/PlotKit.html | 334 + plotkit_v091/doc/PlotKit.txt | 151 + plotkit_v091/doc/SVGCanvasCompat.html | 304 + plotkit_v091/doc/SVGCanvasCompat.txt | 144 + plotkit_v091/doc/barsample.png | Bin 0 -> 2752 bytes plotkit_v091/doc/black.png | Bin 0 -> 262 bytes plotkit_v091/doc/blue.png | Bin 0 -> 329 bytes plotkit_v091/doc/cyan.png | Bin 0 -> 268 bytes plotkit_v091/doc/doc.css | 62 + plotkit_v091/doc/generate.py | 37 + plotkit_v091/doc/green.png | Bin 0 -> 277 bytes plotkit_v091/doc/orange.png | Bin 0 -> 274 bytes plotkit_v091/doc/piesample.png | Bin 0 -> 15399 bytes plotkit_v091/doc/purple.png | Bin 0 -> 273 bytes plotkit_v091/doc/red.png | Bin 0 -> 280 bytes plotkit_v091/scripts/custom_rhino.jar | Bin 0 -> 705856 bytes plotkit_v091/scripts/pack.py | 58 + plotkit_v091/tests/axis.html | 31 + plotkit_v091/tests/basic.html | 25 + plotkit_v091/tests/basic.js | 143 + plotkit_v091/tests/debug.html | 56 + plotkit_v091/tests/demo-svg.html | 58 + plotkit_v091/tests/demo-svg.js | 133 + plotkit_v091/tests/demo.html | 57 + plotkit_v091/tests/demo.js | 136 + plotkit_v091/tests/dynamic.html | 161 + plotkit_v091/tests/img/firefox.png | Bin 0 -> 1198 bytes plotkit_v091/tests/img/konqueror.png | Bin 0 -> 7776 bytes plotkit_v091/tests/img/mozilla.ico | Bin 0 -> 1406 bytes plotkit_v091/tests/img/msie.gif | Bin 0 -> 1556 bytes plotkit_v091/tests/img/opera.ico | Bin 0 -> 3638 bytes plotkit_v091/tests/img/safari.gif | Bin 0 -> 1166 bytes plotkit_v091/tests/labels-img.html | 38 + plotkit_v091/tests/labels.html | 43 + plotkit_v091/tests/prototype_compat.html | 28 + plotkit_v091/tests/quickstart-easy.html | 29 + plotkit_v091/tests/quickstart-horiz.html | 53 + plotkit_v091/tests/quickstart-neg.html | 29 + plotkit_v091/tests/quickstart-svg.html | 61 + plotkit_v091/tests/quickstart.html | 57 + plotkit_v091/tests/sample.txt | 6 + plotkit_v091/tests/svg-sweet.html | 29 + plotkit_v091/tests/svg-sweet.js | 141 + plotkit_v091/tests/svg.html | 26 + plotkit_v091/tests/svg.js | 147 + plotkit_v091/tests/sweet.html | 24 + plotkit_v091/tests/sweet.js | 89 + plotkit_v091/tests/tests.css | 66 + plotkit_v091/tests/testsvg.html | 20 + plotkit_v091/tests/testsvg.js | 31 + test.html | 152 + 270 files changed, 72345 insertions(+) create mode 100644 data.js create mode 100644 dygraph-canvas.js create mode 100644 dygraph-combined.js create mode 100644 dygraph.js create mode 100755 generate-combined.sh create mode 100644 mochikit_v14/LICENSE.txt create mode 100644 mochikit_v14/MochiKit/Async.js create mode 100644 mochikit_v14/MochiKit/Base.js create mode 100644 mochikit_v14/MochiKit/Color.js create mode 100644 mochikit_v14/MochiKit/Controls.js create mode 100644 mochikit_v14/MochiKit/DOM.js create mode 100644 mochikit_v14/MochiKit/DateTime.js create mode 100644 mochikit_v14/MochiKit/DragAndDrop.js create mode 100644 mochikit_v14/MochiKit/Format.js create mode 100644 mochikit_v14/MochiKit/Iter.js create mode 100644 mochikit_v14/MochiKit/Logging.js create mode 100644 mochikit_v14/MochiKit/LoggingPane.js create mode 100644 mochikit_v14/MochiKit/MochiKit.js create mode 100644 mochikit_v14/MochiKit/MockDOM.js create mode 100644 mochikit_v14/MochiKit/Position.js create mode 100644 mochikit_v14/MochiKit/Selector.js create mode 100644 mochikit_v14/MochiKit/Signal.js create mode 100644 mochikit_v14/MochiKit/Sortable.js create mode 100644 mochikit_v14/MochiKit/Style.js create mode 100644 mochikit_v14/MochiKit/Test.js create mode 100644 mochikit_v14/MochiKit/Visual.js create mode 100644 mochikit_v14/MochiKit/__package__.js create mode 100644 mochikit_v14/doc/html/MochiKit/Async.html create mode 100644 mochikit_v14/doc/html/MochiKit/Base.html create mode 100644 mochikit_v14/doc/html/MochiKit/Color.html create mode 100644 mochikit_v14/doc/html/MochiKit/DOM.html create mode 100644 mochikit_v14/doc/html/MochiKit/DateTime.html create mode 100644 mochikit_v14/doc/html/MochiKit/DragAndDrop.html create mode 100644 mochikit_v14/doc/html/MochiKit/Format.html create mode 100644 mochikit_v14/doc/html/MochiKit/Iter.html create mode 100644 mochikit_v14/doc/html/MochiKit/Logging.html create mode 100644 mochikit_v14/doc/html/MochiKit/LoggingPane.html create mode 100644 mochikit_v14/doc/html/MochiKit/Position.html create mode 100644 mochikit_v14/doc/html/MochiKit/Selector.html create mode 100644 mochikit_v14/doc/html/MochiKit/Signal.html create mode 100644 mochikit_v14/doc/html/MochiKit/Sortable.html create mode 100644 mochikit_v14/doc/html/MochiKit/Style.html create mode 100644 mochikit_v14/doc/html/MochiKit/VersionHistory.html create mode 100644 mochikit_v14/doc/html/MochiKit/Visual.html create mode 100644 mochikit_v14/doc/html/MochiKit/index.html create mode 100644 mochikit_v14/doc/js/toc.js create mode 100755 mochikit_v14/doc/rst/MochiKit/Async.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Base.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Color.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/DOM.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/DateTime.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/DragAndDrop.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Format.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Iter.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Logging.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/LoggingPane.rst create mode 100644 mochikit_v14/doc/rst/MochiKit/Position.rst create mode 100644 mochikit_v14/doc/rst/MochiKit/Selector.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Signal.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Sortable.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Style.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/VersionHistory.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/Visual.rst create mode 100755 mochikit_v14/doc/rst/MochiKit/index.rst create mode 100755 mochikit_v14/examples/ajax_tables/ajax_tables.css create mode 100644 mochikit_v14/examples/ajax_tables/ajax_tables.js create mode 100755 mochikit_v14/examples/ajax_tables/domains.json create mode 100755 mochikit_v14/examples/ajax_tables/domains.xml create mode 100644 mochikit_v14/examples/ajax_tables/index.html create mode 100755 mochikit_v14/examples/color_wheel/color_wheel.css create mode 100644 mochikit_v14/examples/color_wheel/color_wheel.js create mode 100644 mochikit_v14/examples/color_wheel/index.html create mode 100755 mochikit_v14/examples/dnd_sortable/dnd_sortable.css create mode 100755 mochikit_v14/examples/dnd_sortable/dropmarker.png create mode 100755 mochikit_v14/examples/dnd_sortable/icon.png create mode 100644 mochikit_v14/examples/dnd_sortable/index.html create mode 100644 mochikit_v14/examples/dnd_sortable/sortable2_test.html create mode 100644 mochikit_v14/examples/dnd_sortable/sortable3_test.html create mode 100644 mochikit_v14/examples/dnd_sortable/sortable4_test.html create mode 100644 mochikit_v14/examples/dnd_sortable/sortable5_test.html create mode 100644 mochikit_v14/examples/dnd_sortable/sortable_test.html create mode 100644 mochikit_v14/examples/dnd_sortable/sortable_tree_test.html create mode 100755 mochikit_v14/examples/draggable/draggable.css create mode 100644 mochikit_v14/examples/draggable/draggable.js create mode 100644 mochikit_v14/examples/draggable/index.html create mode 100644 mochikit_v14/examples/effects/effects_bigslide.html create mode 100644 mochikit_v14/examples/effects/effects_blind.html create mode 100644 mochikit_v14/examples/effects/effects_blindslide.html create mode 100755 mochikit_v14/examples/effects/effects_combi.css create mode 100644 mochikit_v14/examples/effects/effects_fadeappear.html create mode 100644 mochikit_v14/examples/effects/effects_grow_shrink.html create mode 100644 mochikit_v14/examples/effects/effects_onload.html create mode 100644 mochikit_v14/examples/effects/effects_queue.html create mode 100644 mochikit_v14/examples/effects/effects_queue_limit.html create mode 100644 mochikit_v14/examples/effects/effects_scroll.html create mode 100644 mochikit_v14/examples/effects/effects_slide.html create mode 100644 mochikit_v14/examples/effects/full.html create mode 100755 mochikit_v14/examples/effects/icon.png create mode 100644 mochikit_v14/examples/effects/index.html create mode 100644 mochikit_v14/examples/interpreter/index.html create mode 100755 mochikit_v14/examples/interpreter/interpreter.css create mode 100644 mochikit_v14/examples/interpreter/interpreter.js create mode 100644 mochikit_v14/examples/key_events/index.html create mode 100755 mochikit_v14/examples/key_events/key_events.css create mode 100644 mochikit_v14/examples/key_events/key_events.js create mode 100644 mochikit_v14/examples/logging_pane/index.html create mode 100755 mochikit_v14/examples/logging_pane/logging_pane.css create mode 100644 mochikit_v14/examples/logging_pane/logging_pane.js create mode 100644 mochikit_v14/examples/mochiregexp/index.html create mode 100755 mochikit_v14/examples/mochiregexp/mochiregexp.css create mode 100644 mochikit_v14/examples/mochiregexp/mochiregexp.js create mode 100644 mochikit_v14/examples/rounded_corners/index.html create mode 100755 mochikit_v14/examples/rounded_corners/rounded_corners.css create mode 100644 mochikit_v14/examples/rounded_corners/rounded_corners.js create mode 100644 mochikit_v14/examples/simple_dnd/dnd_boxes.html create mode 100644 mochikit_v14/examples/simple_dnd/dnd_full.html create mode 100644 mochikit_v14/examples/simple_dnd/dnd_ghost.html create mode 100644 mochikit_v14/examples/simple_dnd/dnd_hoverclass.html create mode 100644 mochikit_v14/examples/simple_dnd/dnd_scroll.html create mode 100644 mochikit_v14/examples/simple_dnd/dnd_snap.html create mode 100644 mochikit_v14/examples/simple_dnd/index.html create mode 100755 mochikit_v14/examples/simple_dnd/simple_dnd.css create mode 100644 mochikit_v14/examples/sortable_tables/index.html create mode 100755 mochikit_v14/examples/sortable_tables/sortable_tables.css create mode 100644 mochikit_v14/examples/sortable_tables/sortable_tables.js create mode 100755 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/SyntaxHighlighter.css create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/Tests.html create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushCSharp.js create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushDelphi.js create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushJScript.js create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushPhp.js create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushPython.js create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushSql.js create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushVb.js create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushXml.js create mode 100644 mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shCore.js create mode 100755 mochikit_v14/examples/view-source/view-source.css create mode 100644 mochikit_v14/examples/view-source/view-source.html create mode 100644 mochikit_v14/examples/view-source/view-source.js create mode 100755 mochikit_v14/include/_img/bg_docheader.gif create mode 100755 mochikit_v14/include/_img/g_bullet.gif create mode 100755 mochikit_v14/include/_img/g_logo_doc.gif create mode 100755 mochikit_v14/include/css/documentation.css create mode 100755 mochikit_v14/include/css/general.css create mode 100644 mochikit_v14/packed/MochiKit/MochiKit.js create mode 100644 mochikit_v14/packed/MochiKit/__package__.js create mode 100755 mochikit_v14/scripts/build.py create mode 100755 mochikit_v14/scripts/custom_rhino.jar create mode 100755 mochikit_v14/scripts/js.jar create mode 100644 mochikit_v14/scripts/jscriptmochi.js create mode 100755 mochikit_v14/scripts/make_docs.py create mode 100755 mochikit_v14/scripts/pack.py create mode 100644 mochikit_v14/scripts/rhinomochi.js create mode 100644 mochikit_v14/scripts/spidermochi.js create mode 100644 mochikit_v14/tests/FakeJSAN.js create mode 100644 mochikit_v14/tests/SimpleTest/SimpleTest.js create mode 100644 mochikit_v14/tests/SimpleTest/TestRunner.js create mode 100755 mochikit_v14/tests/SimpleTest/test.css create mode 100644 mochikit_v14/tests/cli.js create mode 100644 mochikit_v14/tests/index.html create mode 100644 mochikit_v14/tests/standalone.js create mode 100644 mochikit_v14/tests/test_Base.js create mode 100644 mochikit_v14/tests/test_Color.js create mode 100644 mochikit_v14/tests/test_DateTime.js create mode 100644 mochikit_v14/tests/test_DragAndDrop.js create mode 100644 mochikit_v14/tests/test_Format.js create mode 100644 mochikit_v14/tests/test_Iter.js create mode 100644 mochikit_v14/tests/test_Logging.js create mode 100644 mochikit_v14/tests/test_MochiKit-Async.html create mode 100755 mochikit_v14/tests/test_MochiKit-Async.json create mode 100644 mochikit_v14/tests/test_MochiKit-Base.html create mode 100644 mochikit_v14/tests/test_MochiKit-Color.html create mode 100644 mochikit_v14/tests/test_MochiKit-DOM-Safari.html create mode 100644 mochikit_v14/tests/test_MochiKit-DOM.html create mode 100644 mochikit_v14/tests/test_MochiKit-DateTime.html create mode 100644 mochikit_v14/tests/test_MochiKit-DragAndDrop.html create mode 100644 mochikit_v14/tests/test_MochiKit-Format.html create mode 100644 mochikit_v14/tests/test_MochiKit-Iter.html create mode 100644 mochikit_v14/tests/test_MochiKit-JSAN.html create mode 100644 mochikit_v14/tests/test_MochiKit-Logging.html create mode 100644 mochikit_v14/tests/test_MochiKit-MochiKit.html create mode 100644 mochikit_v14/tests/test_MochiKit-Selector.html create mode 100644 mochikit_v14/tests/test_MochiKit-Signal.html create mode 100644 mochikit_v14/tests/test_MochiKit-Style.html create mode 100644 mochikit_v14/tests/test_MochiKit-Visual.html create mode 100644 mochikit_v14/tests/test_Signal.js create mode 100644 plotkit_v091/COPYING create mode 100644 plotkit_v091/PlotKit/Base.js create mode 100644 plotkit_v091/PlotKit/Canvas.js create mode 100644 plotkit_v091/PlotKit/EasyPlot.js create mode 100644 plotkit_v091/PlotKit/Layout.js create mode 100644 plotkit_v091/PlotKit/PlotKit.js create mode 100644 plotkit_v091/PlotKit/PlotKit_Packed.js create mode 100644 plotkit_v091/PlotKit/SVG.js create mode 100644 plotkit_v091/PlotKit/SweetCanvas.js create mode 100644 plotkit_v091/PlotKit/SweetSVG.js create mode 100644 plotkit_v091/PlotKit/dummy.svg create mode 100644 plotkit_v091/PlotKit/excanvas.js create mode 100644 plotkit_v091/README create mode 100644 plotkit_v091/doc/MochiKitAdditions.html create mode 100644 plotkit_v091/doc/MochiKitAdditions.txt create mode 100644 plotkit_v091/doc/PlotKit.Base.html create mode 100644 plotkit_v091/doc/PlotKit.Base.txt create mode 100644 plotkit_v091/doc/PlotKit.Canvas.html create mode 100644 plotkit_v091/doc/PlotKit.Canvas.txt create mode 100644 plotkit_v091/doc/PlotKit.EasyPlot.html create mode 100644 plotkit_v091/doc/PlotKit.EasyPlot.txt create mode 100644 plotkit_v091/doc/PlotKit.Layout.html create mode 100644 plotkit_v091/doc/PlotKit.Layout.txt create mode 100644 plotkit_v091/doc/PlotKit.QuickStart.html create mode 100644 plotkit_v091/doc/PlotKit.QuickStart.txt create mode 100644 plotkit_v091/doc/PlotKit.Renderer.html create mode 100644 plotkit_v091/doc/PlotKit.Renderer.txt create mode 100644 plotkit_v091/doc/PlotKit.SVG.html create mode 100644 plotkit_v091/doc/PlotKit.SVG.txt create mode 100644 plotkit_v091/doc/PlotKit.SweetCanvas.html create mode 100644 plotkit_v091/doc/PlotKit.SweetCanvas.txt create mode 100644 plotkit_v091/doc/PlotKit.SweetSVG.html create mode 100644 plotkit_v091/doc/PlotKit.SweetSVG.txt create mode 100644 plotkit_v091/doc/PlotKit.html create mode 100644 plotkit_v091/doc/PlotKit.txt create mode 100644 plotkit_v091/doc/SVGCanvasCompat.html create mode 100644 plotkit_v091/doc/SVGCanvasCompat.txt create mode 100644 plotkit_v091/doc/barsample.png create mode 100644 plotkit_v091/doc/black.png create mode 100644 plotkit_v091/doc/blue.png create mode 100644 plotkit_v091/doc/cyan.png create mode 100644 plotkit_v091/doc/doc.css create mode 100755 plotkit_v091/doc/generate.py create mode 100644 plotkit_v091/doc/green.png create mode 100644 plotkit_v091/doc/orange.png create mode 100644 plotkit_v091/doc/piesample.png create mode 100644 plotkit_v091/doc/purple.png create mode 100644 plotkit_v091/doc/red.png create mode 100644 plotkit_v091/scripts/custom_rhino.jar create mode 100755 plotkit_v091/scripts/pack.py create mode 100644 plotkit_v091/tests/axis.html create mode 100644 plotkit_v091/tests/basic.html create mode 100644 plotkit_v091/tests/basic.js create mode 100644 plotkit_v091/tests/debug.html create mode 100644 plotkit_v091/tests/demo-svg.html create mode 100644 plotkit_v091/tests/demo-svg.js create mode 100644 plotkit_v091/tests/demo.html create mode 100644 plotkit_v091/tests/demo.js create mode 100644 plotkit_v091/tests/dynamic.html create mode 100644 plotkit_v091/tests/img/firefox.png create mode 100644 plotkit_v091/tests/img/konqueror.png create mode 100644 plotkit_v091/tests/img/mozilla.ico create mode 100644 plotkit_v091/tests/img/msie.gif create mode 100644 plotkit_v091/tests/img/opera.ico create mode 100644 plotkit_v091/tests/img/safari.gif create mode 100644 plotkit_v091/tests/labels-img.html create mode 100644 plotkit_v091/tests/labels.html create mode 100644 plotkit_v091/tests/prototype_compat.html create mode 100644 plotkit_v091/tests/quickstart-easy.html create mode 100644 plotkit_v091/tests/quickstart-horiz.html create mode 100644 plotkit_v091/tests/quickstart-neg.html create mode 100644 plotkit_v091/tests/quickstart-svg.html create mode 100644 plotkit_v091/tests/quickstart.html create mode 100644 plotkit_v091/tests/sample.txt create mode 100644 plotkit_v091/tests/svg-sweet.html create mode 100644 plotkit_v091/tests/svg-sweet.js create mode 100644 plotkit_v091/tests/svg.html create mode 100644 plotkit_v091/tests/svg.js create mode 100644 plotkit_v091/tests/sweet.html create mode 100644 plotkit_v091/tests/sweet.js create mode 100644 plotkit_v091/tests/tests.css create mode 100644 plotkit_v091/tests/testsvg.html create mode 100644 plotkit_v091/tests/testsvg.js create mode 100644 test.html diff --git a/data.js b/data.js new file mode 100644 index 0000000..d92a633 --- /dev/null +++ b/data.js @@ -0,0 +1,63 @@ +function StubbedData() { +return "" + +"Date,A,B\n" + +"20061001,3.01953818828,0.7212041046,2.18487394958,0.599318549691\n" + +"20061002,3.63321799308,0.778297234566,1.69491525424,0.531417655826\n" + +"20061003,2.44328097731,0.644967734352,2.51256281407,0.640539070386\n" + +"20061004,3.52733686067,0.774700921683,2.68456375839,0.66207105053\n" + +"20061005,3.28719723183,0.741636245748,2.35294117647,0.621407707226\n" + +"20061006,1.58450704225,0.523967868159,3.78657487091,0.791868460623\n" + +"20061007,5.32859680284,0.946589405904,4.0404040404,0.807910739509\n" + +"20061008,2.64084507042,0.672799548916,2.37288135593,0.626609885481\n" + +"20061009,2.26480836237,0.620990945917,3.5413153457,0.75897176848\n" + +"20061010,3.29289428076,0.74289969528,2.02702702703,0.579191340004\n" + +"20061011,2.7633851468,0.681234043829,1.1744966443,0.4413034044\n" + +"20061012,3.28719723183,0.741636245748,3.37268128162,0.741327769578\n" + +"20061013,1.77304964539,0.55569466381,1.85810810811,0.555011329732\n" + +"20061014,3.39892665474,0.7664008338,1.67224080268,0.524368852929\n" + +"20061015,2.65017667845,0.675144574777,3.35570469799,0.737661045752\n" + +"20061016,3.63951473137,0.779620631266,2.34899328859,0.620377617453\n" + +"20061017,2.25694444444,0.618859623032,1.68067226891,0.526990133716\n" + +"20061018,4.47504302926,0.857766274964,2.51677852349,0.641599927369\n" + +"20061019,2.44755244755,0.646081155692,1.68067226891,0.526990133716\n" + +"20061020,3.67775831874,0.787656442774,3.066439523,0.711598843969\n" + +"20061021,3.94265232975,0.823839169829,3.85906040268,0.788990618726\n" + +"20061022,2.59067357513,0.660187558973,3.71621621622,0.777438794254\n" + +"20061023,4.33275563258,0.847570482324,3.85906040268,0.788990618726\n" + +"20061024,3.10344827586,0.720049610821,2.84280936455,0.679611549697\n" + +"20061025,1.40350877193,0.492720767725,2.7027027027,0.666482380968\n" + +"20061026,1.95035460993,0.582291234145,2.36486486486,0.624518599275\n" + +"20061027,2.30905861456,0.632980642182,2.03045685279,0.580161203819\n" + +"20061028,4.09252669039,0.835706590809,2.87648054146,0.68754192469\n" + +"20061029,2.66903914591,0.679883997626,2.02360876897,0.578224712918\n" + +"20061030,4.74516695958,0.89127787497,4.36241610738,0.836670992529\n" + +"20061031,2.78260869565,0.685905251933,3.20945945946,0.724388507178\n" + +"20061101,1.5873015873,0.524884521441,1.51260504202,0.500373860545\n" + +"20061102,2.78745644599,0.687083077461,2.0202020202,0.57726130639\n" + +"20061103,5.11463844797,0.925157232782,2.68907563025,0.663168401088\n" + +"20061104,4.9001814882,0.919644816432,3.07692307692,0.713993047527\n" + +"20061105,5.13274336283,0.928343545136,3.55329949239,0.761492892041\n" + +"20061106,1.92644483363,0.575222935029,2.35294117647,0.621407707226\n" + +"20061107,2.46478873239,0.650573541306,1.52027027027,0.502889967904\n" + +"20061108,2.13523131673,0.609772022763,2.6981450253,0.665374048085\n" + +"20061109,3.88007054674,0.811026422222,2.72572402044,0.672079879106\n" + +"20061110,2.63620386643,0.671633132526,3.71621621622,0.777438794254\n" + +"20061111,3.69718309859,0.791736755355,3.0303030303,0.703344064467\n" + +"20061112,3.83944153578,0.802703592906,4.05405405405,0.81058250986\n" + +"20061113,2.47787610619,0.653984033555,2.20338983051,0.604340313133\n" + +"20061114,1.77304964539,0.55569466381,2.22222222222,0.60944692682\n" + +"20061115,2.30088495575,0.630766388737,0.843170320405,0.375484163785\n" + +"20061116,1.57894736842,0.522144132232,2.19594594595,0.602321544724\n" + +"20061118,2.45183887916,0.647198426991,1.69491525424,0.531417655826\n" + +"20061119,3.52733686067,0.774700921683,1.85185185185,0.55316023504\n" + +"20061120,2.97723292469,0.711254751484,2.6981450253,0.665374048085\n" + +"20061121,2.29681978799,0.629665059963,2.01680672269,0.576301104352\n" + +"20061122,3.01418439716,0.719945245328,2.5466893039,0.649125445325\n" + +"20061123,3.78378378378,0.809917534069,2.6936026936,0.664269394219\n" + +"20061124,3.18584070796,0.738851643987,2.01005025126,0.57439025002\n" + +"20061125,2.83185840708,0.697868332879,3.066439523,0.711598843969\n" + +"20061126,3.01953818828,0.7212041046,2.53378378378,0.645878720149\n" + +"20061127,2.81195079086,0.693033387099,1.51006711409,0.499540743312\n" + +"20061128,2.97723292469,0.711254751484,2.54237288136,0.648039583782\n" + +"20061129,1.41093474427,0.495309102312,3.02013422819,0.701020603129"; +} diff --git a/dygraph-canvas.js b/dygraph-canvas.js new file mode 100644 index 0000000..04e1eb1 --- /dev/null +++ b/dygraph-canvas.js @@ -0,0 +1,230 @@ +// Copyright 2006 Dan Vanderkam (danvdk@gmail.com) +// All Rights Reserved. + +/** + * @fileoverview Subclasses various parts of PlotKit to meet the additional + * needs of DateGraph: grid overlays and error bars + */ + +// Subclass PlotKit.Layout to add: +// 1. Sigma/errorBars properties +// 2. Copy error terms for PlotKit.CanvasRenderer._renderLineChart + +/** + * Creates a new DateGraphLayout object. Options are the same as those allowed + * by the PlotKit.Layout constructor. + * @param {Object} options Options for PlotKit.Layout + * @return {Object} The DateGraphLayout object + */ +DateGraphLayout = function(options) { + PlotKit.Layout.call(this, "line", options); +}; +DateGraphLayout.prototype = new PlotKit.Layout(); + +/** + * Behaves the same way as PlotKit.Layout, but also copies the errors + * @private + */ +DateGraphLayout.prototype.evaluateWithError = function() { + this.evaluate(); + if (!this.options.errorBars) return; + + // Copy over the error terms + var i = 0; // index in this.points + for (var setName in this.datasets) { + var j = 0; + var dataset = this.datasets[setName]; + if (PlotKit.Base.isFuncLike(dataset)) continue; + for (var j = 0; j < dataset.length; j++, i++) { + var item = dataset[j]; + var xv = parseFloat(item[0]); + var yv = parseFloat(item[1]); + + if (xv == this.points[i].xval && + yv == this.points[i].yval) { + this.points[i].errorMinus = parseFloat(item[2]); + this.points[i].errorPlus = parseFloat(item[3]); + } + } + } +}; + +/** + * Convenience function to remove all the data sets from a graph + */ +DateGraphLayout.prototype.removeAllDatasets = function() { + delete this.datasets; + this.datasets = new Array(); +}; + +/** + * Change the values of various layout options + * @param {Object} new_options an associative array of new properties + */ +DateGraphLayout.prototype.updateOptions = function(new_options) { + MochiKit.Base.update(this.options, new_options ? new_options : {}); +}; + +// Subclass PlotKit.CanvasRenderer to add: +// 1. X/Y grid overlay +// 2. Ability to draw error bars (if required) + +/** + * Sets some PlotKit.CanvasRenderer options + * @param {Object} element The canvas to attach to + * @param {Layout} layout The DateGraphLayout object for this graph. + * @param {Object} options Options to pass on to CanvasRenderer + */ +DateGraphCanvasRenderer = function(element, layout, options) { + PlotKit.CanvasRenderer.call(this, element, layout, options); + this.options.shouldFill = false; + this.options.shouldStroke = true; + this.options.drawYGrid = true; + this.options.drawXGrid = true; + this.options.gridLineColor = MochiKit.Color.Color.grayColor(); + MochiKit.Base.update(this.options, options); + + // TODO(danvk) This shouldn't be necessary: effects should be overlaid + this.options.drawBackground = false; +}; +DateGraphCanvasRenderer.prototype = new PlotKit.CanvasRenderer(); + +/** + * Draw an X/Y grid on top of the existing plot + */ +DateGraphCanvasRenderer.prototype.render = function() { + // Do the ordinary rendering, as before + // TODO(danvk) Call super.render() + this._renderLineChart(); + this._renderLineAxis(); + + // Draw the new X/Y grid + var ctx = this.element.getContext("2d"); + if (this.options.drawYGrid) { + var ticks = this.layout.yticks; + ctx.save(); + ctx.strokeStyle = this.options.gridLineColor.toRGBString(); + ctx.lineWidth = this.options.axisLineWidth; + for (var i = 0; i < ticks.length; i++) { + var x = this.area.x; + var y = this.area.y + ticks[i][0] * this.area.h; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + this.area.w, y); + ctx.closePath(); + ctx.stroke(); + } + } + + if (this.options.drawXGrid) { + var ticks = this.layout.xticks; + ctx.save(); + ctx.strokeStyle = this.options.gridLineColor.toRGBString(); + ctx.lineWidth = this.options.axisLineWidth; + for (var i=0; i= 0) { + ctx_.moveTo(prevX, prevYs[0]); + ctx_.lineTo(point.canvasx, newYs[0]); + ctx_.lineTo(point.canvasx, newYs[1]); + ctx_.lineTo(prevX, prevYs[1]); + ctx_.closePath(); + } + prevYs[0] = newYs[0]; + prevYs[1] = newYs[1]; + prevX = point.canvasx; + } + }; + // should be same color as the lines + var err_color = color.colorWithAlpha(0.15); + ctx.fillStyle = err_color.toRGBString(); + ctx.beginPath(); + MochiKit.Iter.forEach(this.layout.points, partial(errorTrapezoid, ctx), this); + ctx.fill(); + } + }; + + if (errorBars) + bind(makeErrorBars, this)(context); + bind(makePath, this)(context); + context.restore(); +}; diff --git a/dygraph-combined.js b/dygraph-combined.js new file mode 100644 index 0000000..d0c243a --- /dev/null +++ b/dygraph-combined.js @@ -0,0 +1,10375 @@ +/*** + + MochiKit.MochiKit 1.4 : PACKED VERSION + + THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please + diff against the source tree, not this file. + + See for documentation, downloads, license, etc. + + (c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Base"); +} +if(typeof (MochiKit)=="undefined"){ +MochiKit={}; +} +if(typeof (MochiKit.Base)=="undefined"){ +MochiKit.Base={}; +} +if(typeof (MochiKit.__export__)=="undefined"){ +MochiKit.__export__=(MochiKit.__compat__||(typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")); +} +MochiKit.Base.VERSION="1.4"; +MochiKit.Base.NAME="MochiKit.Base"; +MochiKit.Base.update=function(_1,_2){ +if(_1===null){ +_1={}; +} +for(var i=1;i=0;i--){ +_15.unshift(o[i]); +} +}else{ +res.push(o); +} +} +return res; +},extend:function(_18,obj,_1a){ +if(!_1a){ +_1a=0; +} +if(obj){ +var l=obj.length; +if(typeof (l)!="number"){ +if(typeof (MochiKit.Iter)!="undefined"){ +obj=MochiKit.Iter.list(obj); +l=obj.length; +}else{ +throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); +} +} +if(!_18){ +_18=[]; +} +for(var i=_1a;i>b; +},zrshift:function(a,b){ +return a>>>b; +},eq:function(a,b){ +return a==b; +},ne:function(a,b){ +return a!=b; +},gt:function(a,b){ +return a>b; +},ge:function(a,b){ +return a>=b; +},lt:function(a,b){ +return al){ +_90=l; +} +} +_8e=[]; +for(i=0;i<_90;i++){ +var _92=[]; +for(var j=1;j=0;i--){ +_af=[_ab[i].apply(this,_af)]; +} +return _af[0]; +}; +},bind:function(_b1,_b2){ +if(typeof (_b1)=="string"){ +_b1=_b2[_b1]; +} +var _b3=_b1.im_func; +var _b4=_b1.im_preargs; +var _b5=_b1.im_self; +var m=MochiKit.Base; +if(typeof (_b1)=="function"&&typeof (_b1.apply)=="undefined"){ +_b1=m._wrapDumbFunction(_b1); +} +if(typeof (_b3)!="function"){ +_b3=_b1; +} +if(typeof (_b2)!="undefined"){ +_b5=_b2; +} +if(typeof (_b4)=="undefined"){ +_b4=[]; +}else{ +_b4=_b4.slice(); +} +m.extend(_b4,arguments,2); +var _b7=function(){ +var _b8=arguments; +var me=arguments.callee; +if(me.im_preargs.length>0){ +_b8=m.concat(me.im_preargs,_b8); +} +var _ba=me.im_self; +if(!_ba){ +_ba=this; +} +return me.im_func.apply(_ba,_b8); +}; +_b7.im_self=_b5; +_b7.im_func=_b3; +_b7.im_preargs=_b4; +return _b7; +},bindMethods:function(_bb){ +var _bc=MochiKit.Base.bind; +for(var k in _bb){ +var _be=_bb[k]; +if(typeof (_be)=="function"){ +_bb[k]=_bc(_be,_bb); +} +} +},registerComparator:function(_bf,_c0,_c1,_c2){ +MochiKit.Base.comparatorRegistry.register(_bf,_c0,_c1,_c2); +},_primitives:{"boolean":true,"string":true,"number":true},compare:function(a,b){ +if(a==b){ +return 0; +} +var _c5=(typeof (a)=="undefined"||a===null); +var _c6=(typeof (b)=="undefined"||b===null); +if(_c5&&_c6){ +return 0; +}else{ +if(_c5){ +return -1; +}else{ +if(_c6){ +return 1; +} +} +} +var m=MochiKit.Base; +var _c8=m._primitives; +if(!(typeof (a) in _c8&&typeof (b) in _c8)){ +try{ +return m.comparatorRegistry.match(a,b); +} +catch(e){ +if(e!=m.NotFound){ +throw e; +} +} +} +if(ab){ +return 1; +} +} +var _c9=m.repr; +throw new TypeError(_c9(a)+" and "+_c9(b)+" can not be compared"); +},compareDateLike:function(a,b){ +return MochiKit.Base.compare(a.getTime(),b.getTime()); +},compareArrayLike:function(a,b){ +var _ce=MochiKit.Base.compare; +var _cf=a.length; +var _d0=0; +if(_cf>b.length){ +_d0=1; +_cf=b.length; +}else{ +if(_cf=0;i--){ +sum+=o[i]; +} +}else{ +sum+=o; +} +} +if(_113<=0){ +throw new TypeError("mean() requires at least one argument"); +} +return sum/_113; +},median:function(){ +var data=MochiKit.Base.flattenArguments(arguments); +if(data.length===0){ +throw new TypeError("median() requires at least one argument"); +} +data.sort(compare); +if(data.length%2==0){ +var _117=data.length/2; +return (data[_117]+data[_117-1])/2; +}else{ +return data[(data.length-1)/2]; +} +},findValue:function(lst,_119,_11a,end){ +if(typeof (end)=="undefined"||end===null){ +end=lst.length; +} +if(typeof (_11a)=="undefined"||_11a===null){ +_11a=0; +} +var cmp=MochiKit.Base.compare; +for(var i=_11a;i0))){ +var kv=MochiKit.DOM.formContents(_127); +_127=kv[0]; +_128=kv[1]; +}else{ +if(arguments.length==1){ +if(typeof (_127.length)=="number"&&_127.length==2){ +return arguments.callee(_127[0],_127[1]); +} +var o=_127; +_127=[]; +_128=[]; +for(var k in o){ +var v=o[k]; +if(typeof (v)=="function"){ +continue; +}else{ +if(typeof (v)!="string"&&typeof (v.length)=="number"){ +for(var i=0;i=stop){ +throw self.StopIteration; +} +_174+=step; +return rval; +}}; +},imap:function(fun,p,q){ +var m=MochiKit.Base; +var self=MochiKit.Iter; +var _17e=m.map(self.iter,m.extend(null,arguments,1)); +var map=m.map; +var next=self.next; +return {repr:function(){ +return "imap(...)"; +},toString:m.forwardCall("repr"),next:function(){ +return fun.apply(this,map(next,_17e)); +}}; +},applymap:function(fun,seq,self){ +seq=MochiKit.Iter.iter(seq); +var m=MochiKit.Base; +return {repr:function(){ +return "applymap(...)"; +},toString:m.forwardCall("repr"),next:function(){ +return fun.apply(self,seq.next()); +}}; +},chain:function(p,q){ +var self=MochiKit.Iter; +var m=MochiKit.Base; +if(arguments.length==1){ +return self.iter(arguments[0]); +} +var _189=m.map(self.iter,arguments); +return {repr:function(){ +return "chain(...)"; +},toString:m.forwardCall("repr"),next:function(){ +while(_189.length>1){ +try{ +return _189[0].next(); +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +_189.shift(); +} +} +if(_189.length==1){ +var arg=_189.shift(); +this.next=m.bind("next",arg); +return this.next(); +} +throw self.StopIteration; +}}; +},takewhile:function(pred,seq){ +var self=MochiKit.Iter; +seq=self.iter(seq); +return {repr:function(){ +return "takewhile(...)"; +},toString:MochiKit.Base.forwardCall("repr"),next:function(){ +var rval=seq.next(); +if(!pred(rval)){ +this.next=function(){ +throw self.StopIteration; +}; +this.next(); +} +return rval; +}}; +},dropwhile:function(pred,seq){ +seq=MochiKit.Iter.iter(seq); +var m=MochiKit.Base; +var bind=m.bind; +return {"repr":function(){ +return "dropwhile(...)"; +},"toString":m.forwardCall("repr"),"next":function(){ +while(true){ +var rval=seq.next(); +if(!pred(rval)){ +break; +} +} +this.next=bind("next",seq); +return rval; +}}; +},_tee:function(_194,sync,_196){ +sync.pos[_194]=-1; +var m=MochiKit.Base; +var _198=m.listMin; +return {repr:function(){ +return "tee("+_194+", ...)"; +},toString:m.forwardCall("repr"),next:function(){ +var rval; +var i=sync.pos[_194]; +if(i==sync.max){ +rval=_196.next(); +sync.deque.push(rval); +sync.max+=1; +sync.pos[_194]+=1; +}else{ +rval=sync.deque[i-sync.min]; +sync.pos[_194]+=1; +if(i==sync.min&&_198(sync.pos)!=sync.min){ +sync.min+=1; +sync.deque.shift(); +} +} +return rval; +}}; +},tee:function(_19b,n){ +var rval=[]; +var sync={"pos":[],"deque":[],"max":-1,"min":-1}; +if(arguments.length==1||typeof (n)=="undefined"||n===null){ +n=2; +} +var self=MochiKit.Iter; +_19b=self.iter(_19b); +var _tee=self._tee; +for(var i=0;i0&&_1ac>=stop)||(step<0&&_1ac<=stop)){ +throw MochiKit.Iter.StopIteration; +} +var rval=_1ac; +_1ac+=step; +return rval; +},repr:function(){ +return "range("+[_1ac,stop,step].join(", ")+")"; +},toString:MochiKit.Base.forwardCall("repr")}; +},sum:function(_1b0,_1b1){ +if(typeof (_1b1)=="undefined"||_1b1===null){ +_1b1=0; +} +var x=_1b1; +var self=MochiKit.Iter; +_1b0=self.iter(_1b0); +try{ +while(true){ +x+=_1b0.next(); +} +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +} +return x; +},exhaust:function(_1b4){ +var self=MochiKit.Iter; +_1b4=self.iter(_1b4); +try{ +while(true){ +_1b4.next(); +} +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +} +},forEach:function(_1b6,func,self){ +var m=MochiKit.Base; +if(arguments.length>2){ +func=m.bind(func,self); +} +if(m.isArrayLike(_1b6)){ +try{ +for(var i=0;i<_1b6.length;i++){ +func(_1b6[i]); +} +} +catch(e){ +if(e!=MochiKit.Iter.StopIteration){ +throw e; +} +} +}else{ +self=MochiKit.Iter; +self.exhaust(self.imap(func,_1b6)); +} +},every:function(_1bb,func){ +var self=MochiKit.Iter; +try{ +self.ifilterfalse(func,_1bb).next(); +return false; +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +return true; +} +},sorted:function(_1be,cmp){ +var rval=MochiKit.Iter.list(_1be); +if(arguments.length==1){ +cmp=MochiKit.Base.compare; +} +rval.sort(cmp); +return rval; +},reversed:function(_1c1){ +var rval=MochiKit.Iter.list(_1c1); +rval.reverse(); +return rval; +},some:function(_1c3,func){ +var self=MochiKit.Iter; +try{ +self.ifilter(func,_1c3).next(); +return true; +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +return false; +} +},iextend:function(lst,_1c7){ +if(MochiKit.Base.isArrayLike(_1c7)){ +for(var i=0;i<_1c7.length;i++){ +lst.push(_1c7[i]); +} +}else{ +var self=MochiKit.Iter; +_1c7=self.iter(_1c7); +try{ +while(true){ +lst.push(_1c7.next()); +} +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +} +} +return lst; +},groupby:function(_1ca,_1cb){ +var m=MochiKit.Base; +var self=MochiKit.Iter; +if(arguments.length<2){ +_1cb=m.operator.identity; +} +_1ca=self.iter(_1ca); +var pk=undefined; +var k=undefined; +var v; +function fetch(){ +v=_1ca.next(); +k=_1cb(v); +} +function eat(){ +var ret=v; +v=undefined; +return ret; +} +var _1d2=true; +var _1d3=m.compare; +return {repr:function(){ +return "groupby(...)"; +},next:function(){ +while(_1d3(k,pk)===0){ +fetch(); +if(_1d2){ +_1d2=false; +break; +} +} +pk=k; +return [k,{next:function(){ +if(v==undefined){ +fetch(); +} +if(_1d3(k,pk)!==0){ +throw self.StopIteration; +} +return eat(); +}}]; +}}; +},groupby_as_array:function(_1d4,_1d5){ +var m=MochiKit.Base; +var self=MochiKit.Iter; +if(arguments.length<2){ +_1d5=m.operator.identity; +} +_1d4=self.iter(_1d4); +var _1d8=[]; +var _1d9=true; +var _1da; +var _1db=m.compare; +while(true){ +try{ +var _1dc=_1d4.next(); +var key=_1d5(_1dc); +} +catch(e){ +if(e==self.StopIteration){ +break; +} +throw e; +} +if(_1d9||_1db(key,_1da)!==0){ +var _1de=[]; +_1d8.push([key,_1de]); +} +_1de.push(_1dc); +_1d9=false; +_1da=key; +} +return _1d8; +},arrayLikeIter:function(_1df){ +var i=0; +return {repr:function(){ +return "arrayLikeIter(...)"; +},toString:MochiKit.Base.forwardCall("repr"),next:function(){ +if(i>=_1df.length){ +throw MochiKit.Iter.StopIteration; +} +return _1df[i++]; +}}; +},hasIterateNext:function(_1e1){ +return (_1e1&&typeof (_1e1.iterateNext)=="function"); +},iterateNextIter:function(_1e2){ +return {repr:function(){ +return "iterateNextIter(...)"; +},toString:MochiKit.Base.forwardCall("repr"),next:function(){ +var rval=_1e2.iterateNext(); +if(rval===null||rval===undefined){ +throw MochiKit.Iter.StopIteration; +} +return rval; +}}; +}}); +MochiKit.Iter.EXPORT_OK=["iteratorRegistry","arrayLikeIter","hasIterateNext","iterateNextIter",]; +MochiKit.Iter.EXPORT=["StopIteration","registerIteratorFactory","iter","count","cycle","repeat","next","izip","ifilter","ifilterfalse","islice","imap","applymap","chain","takewhile","dropwhile","tee","list","reduce","range","sum","exhaust","forEach","every","sorted","reversed","some","iextend","groupby","groupby_as_array"]; +MochiKit.Iter.__new__=function(){ +var m=MochiKit.Base; +if(typeof (StopIteration)!="undefined"){ +this.StopIteration=StopIteration; +}else{ +this.StopIteration=new m.NamedError("StopIteration"); +} +this.iteratorRegistry=new m.AdapterRegistry(); +this.registerIteratorFactory("arrayLike",m.isArrayLike,this.arrayLikeIter); +this.registerIteratorFactory("iterateNext",this.hasIterateNext,this.iterateNextIter); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}; +MochiKit.Iter.__new__(); +if(MochiKit.__export__){ +reduce=MochiKit.Iter.reduce; +} +MochiKit.Base._exportSymbols(this,MochiKit.Iter); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Logging"); +dojo.require("MochiKit.Base"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Base",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Logging depends on MochiKit.Base!"; +} +if(typeof (MochiKit.Logging)=="undefined"){ +MochiKit.Logging={}; +} +MochiKit.Logging.NAME="MochiKit.Logging"; +MochiKit.Logging.VERSION="1.4"; +MochiKit.Logging.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.Logging.toString=function(){ +return this.__repr__(); +}; +MochiKit.Logging.EXPORT=["LogLevel","LogMessage","Logger","alertListener","logger","log","logError","logDebug","logFatal","logWarning"]; +MochiKit.Logging.EXPORT_OK=["logLevelAtLeast","isLogMessage","compareLogMessage"]; +MochiKit.Logging.LogMessage=function(num,_1e6,info){ +this.num=num; +this.level=_1e6; +this.info=info; +this.timestamp=new Date(); +}; +MochiKit.Logging.LogMessage.prototype={repr:function(){ +var m=MochiKit.Base; +return "LogMessage("+m.map(m.repr,[this.num,this.level,this.info]).join(", ")+")"; +},toString:MochiKit.Base.forwardCall("repr")}; +MochiKit.Base.update(MochiKit.Logging,{logLevelAtLeast:function(_1e9){ +var self=MochiKit.Logging; +if(typeof (_1e9)=="string"){ +_1e9=self.LogLevel[_1e9]; +} +return function(msg){ +var _1ec=msg.level; +if(typeof (_1ec)=="string"){ +_1ec=self.LogLevel[_1ec]; +} +return _1ec>=_1e9; +}; +},isLogMessage:function(){ +var _1ed=MochiKit.Logging.LogMessage; +for(var i=0;i=0&&this._messages.length>this.maxSize){ +this._messages.shift(); +} +},getMessages:function(_1ff){ +var _200=0; +if(!(typeof (_1ff)=="undefined"||_1ff===null)){ +_200=Math.max(0,this._messages.length-_1ff); +} +return this._messages.slice(_200); +},getMessageText:function(_201){ +if(typeof (_201)=="undefined"||_201===null){ +_201=30; +} +var _202=this.getMessages(_201); +if(_202.length){ +var lst=map(function(m){ +return "\n ["+m.num+"] "+m.level+": "+m.info.join(" "); +},_202); +lst.unshift("LAST "+_202.length+" MESSAGES:"); +return lst.join(""); +} +return ""; +},debuggingBookmarklet:function(_205){ +if(typeof (MochiKit.LoggingPane)=="undefined"){ +alert(this.getMessageText()); +}else{ +MochiKit.LoggingPane.createLoggingPane(_205||false); +} +}}; +MochiKit.Logging.__new__=function(){ +this.LogLevel={ERROR:40,FATAL:50,WARNING:30,INFO:20,DEBUG:10}; +var m=MochiKit.Base; +m.registerComparator("LogMessage",this.isLogMessage,this.compareLogMessage); +var _207=m.partial; +var _208=this.Logger; +var _209=_208.prototype.baseLog; +m.update(this.Logger.prototype,{debug:_207(_209,"DEBUG"),log:_207(_209,"INFO"),error:_207(_209,"ERROR"),fatal:_207(_209,"FATAL"),warning:_207(_209,"WARNING")}); +var self=this; +var _20b=function(name){ +return function(){ +self.logger[name].apply(self.logger,arguments); +}; +}; +this.log=_20b("log"); +this.logError=_20b("error"); +this.logDebug=_20b("debug"); +this.logFatal=_20b("fatal"); +this.logWarning=_20b("warning"); +this.logger=new _208(); +this.logger.useNativeConsole=true; +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}; +if(typeof (printfire)=="undefined"&&typeof (document)!="undefined"&&document.createEvent&&typeof (dispatchEvent)!="undefined"){ +printfire=function(){ +printfire.args=arguments; +var ev=document.createEvent("Events"); +ev.initEvent("printfire",false,true); +dispatchEvent(ev); +}; +} +MochiKit.Logging.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.Logging); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.DateTime"); +} +if(typeof (MochiKit)=="undefined"){ +MochiKit={}; +} +if(typeof (MochiKit.DateTime)=="undefined"){ +MochiKit.DateTime={}; +} +MochiKit.DateTime.NAME="MochiKit.DateTime"; +MochiKit.DateTime.VERSION="1.4"; +MochiKit.DateTime.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.DateTime.toString=function(){ +return this.__repr__(); +}; +MochiKit.DateTime.isoDate=function(str){ +str=str+""; +if(typeof (str)!="string"||str.length===0){ +return null; +} +var iso=str.split("-"); +if(iso.length===0){ +return null; +} +return new Date(iso[0],iso[1]-1,iso[2]); +}; +MochiKit.DateTime._isoRegexp=/(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/; +MochiKit.DateTime.isoTimestamp=function(str){ +str=str+""; +if(typeof (str)!="string"||str.length===0){ +return null; +} +var res=str.match(MochiKit.DateTime._isoRegexp); +if(typeof (res)=="undefined"||res===null){ +return null; +} +var year,_213,day,hour,min,sec,msec; +year=parseInt(res[1],10); +if(typeof (res[2])=="undefined"||res[2]===""){ +return new Date(year); +} +_213=parseInt(res[2],10)-1; +day=parseInt(res[3],10); +if(typeof (res[4])=="undefined"||res[4]===""){ +return new Date(year,_213,day); +} +hour=parseInt(res[4],10); +min=parseInt(res[5],10); +sec=(typeof (res[6])!="undefined"&&res[6]!=="")?parseInt(res[6],10):0; +if(typeof (res[7])!="undefined"&&res[7]!==""){ +msec=Math.round(1000*parseFloat("0."+res[7])); +}else{ +msec=0; +} +if((typeof (res[8])=="undefined"||res[8]==="")&&(typeof (res[9])=="undefined"||res[9]==="")){ +return new Date(year,_213,day,hour,min,sec,msec); +} +var ofs; +if(typeof (res[9])!="undefined"&&res[9]!==""){ +ofs=parseInt(res[10],10)*3600000; +if(typeof (res[11])!="undefined"&&res[11]!==""){ +ofs+=parseInt(res[11],10)*60000; +} +if(res[9]=="-"){ +ofs=-ofs; +} +}else{ +ofs=0; +} +return new Date(Date.UTC(year,_213,day,hour,min,sec,msec)-ofs); +}; +MochiKit.DateTime.toISOTime=function(date,_21b){ +if(typeof (date)=="undefined"||date===null){ +return null; +} +var hh=date.getHours(); +var mm=date.getMinutes(); +var ss=date.getSeconds(); +var lst=[((_21b&&(hh<10))?"0"+hh:hh),((mm<10)?"0"+mm:mm),((ss<10)?"0"+ss:ss)]; +return lst.join(":"); +}; +MochiKit.DateTime.toISOTimestamp=function(date,_221){ +if(typeof (date)=="undefined"||date===null){ +return null; +} +var sep=_221?"T":" "; +var foot=_221?"Z":""; +if(_221){ +date=new Date(date.getTime()+(date.getTimezoneOffset()*60000)); +} +return MochiKit.DateTime.toISODate(date)+sep+MochiKit.DateTime.toISOTime(date,_221)+foot; +}; +MochiKit.DateTime.toISODate=function(date){ +if(typeof (date)=="undefined"||date===null){ +return null; +} +var _225=MochiKit.DateTime._padTwo; +return [date.getFullYear(),_225(date.getMonth()+1),_225(date.getDate())].join("-"); +}; +MochiKit.DateTime.americanDate=function(d){ +d=d+""; +if(typeof (d)!="string"||d.length===0){ +return null; +} +var a=d.split("/"); +return new Date(a[2],a[0]-1,a[1]); +}; +MochiKit.DateTime._padTwo=function(n){ +return (n>9)?n:"0"+n; +}; +MochiKit.DateTime.toPaddedAmericanDate=function(d){ +if(typeof (d)=="undefined"||d===null){ +return null; +} +var _22a=MochiKit.DateTime._padTwo; +return [_22a(d.getMonth()+1),_22a(d.getDate()),d.getFullYear()].join("/"); +}; +MochiKit.DateTime.toAmericanDate=function(d){ +if(typeof (d)=="undefined"||d===null){ +return null; +} +return [d.getMonth()+1,d.getDate(),d.getFullYear()].join("/"); +}; +MochiKit.DateTime.EXPORT=["isoDate","isoTimestamp","toISOTime","toISOTimestamp","toISODate","americanDate","toPaddedAmericanDate","toAmericanDate"]; +MochiKit.DateTime.EXPORT_OK=[]; +MochiKit.DateTime.EXPORT_TAGS={":common":MochiKit.DateTime.EXPORT,":all":MochiKit.DateTime.EXPORT}; +MochiKit.DateTime.__new__=function(){ +var base=this.NAME+"."; +for(var k in this){ +var o=this[k]; +if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){ +try{ +o.NAME=base+k; +} +catch(e){ +} +} +} +}; +MochiKit.DateTime.__new__(); +if(typeof (MochiKit.Base)!="undefined"){ +MochiKit.Base._exportSymbols(this,MochiKit.DateTime); +}else{ +(function(_22f,_230){ +if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){ +var all=_230.EXPORT_TAGS[":all"]; +for(var i=0;i_23a){ +var i=_242.length-_23a; +res=fmt.separator+_242.substring(i,_242.length)+res; +_242=_242.substring(0,i); +} +} +res=_242+res; +if(_238>0){ +while(frac.length<_23b){ +frac=frac+"0"; +} +res=res+fmt.decimal+frac; +} +return _23d+res+_23e; +}; +}; +MochiKit.Format.numberFormatter=function(_246,_247,_248){ +if(typeof (_247)=="undefined"){ +_247=""; +} +var _249=_246.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/); +if(!_249){ +throw TypeError("Invalid pattern"); +} +var _24a=_246.substr(0,_249.index); +var _24b=_246.substr(_249.index+_249[0].length); +if(_24a.search(/-/)==-1){ +_24a=_24a+"-"; +} +var _24c=_249[1]; +var frac=(typeof (_249[2])=="string"&&_249[2]!="")?_249[2]:""; +var _24e=(typeof (_249[3])=="string"&&_249[3]!=""); +var tmp=_24c.split(/,/); +var _250; +if(typeof (_248)=="undefined"){ +_248="default"; +} +if(tmp.length==1){ +_250=null; +}else{ +_250=tmp[1].length; +} +var _251=_24c.length-_24c.replace(/0/g,"").length; +var _252=frac.length-frac.replace(/0/g,"").length; +var _253=frac.length; +var rval=MochiKit.Format._numberFormatter(_247,_24a,_24b,_248,_24e,_253,_251,_250,_252); +var m=MochiKit.Base; +if(m){ +var fn=arguments.callee; +var args=m.concat(arguments); +rval.repr=function(){ +return [self.NAME,"(",map(m.repr,args).join(", "),")"].join(""); +}; +} +return rval; +}; +MochiKit.Format.formatLocale=function(_258){ +if(typeof (_258)=="undefined"||_258===null){ +_258="default"; +} +if(typeof (_258)=="string"){ +var rval=MochiKit.Format.LOCALE[_258]; +if(typeof (rval)=="string"){ +rval=arguments.callee(rval); +MochiKit.Format.LOCALE[_258]=rval; +} +return rval; +}else{ +return _258; +} +}; +MochiKit.Format.twoDigitAverage=function(_25a,_25b){ +if(_25b){ +var res=_25a/_25b; +if(!isNaN(res)){ +return MochiKit.Format.twoDigitFloat(_25a/_25b); +} +} +return "0"; +}; +MochiKit.Format.twoDigitFloat=function(_25d){ +var sign=(_25d<0?"-":""); +var s=Math.floor(Math.abs(_25d)*100).toString(); +if(s=="0"){ +return s; +} +if(s.length<3){ +while(s.charAt(s.length-1)=="0"){ +s=s.substring(0,s.length-1); +} +return sign+"0."+s; +} +var head=sign+s.substring(0,s.length-2); +var tail=s.substring(s.length-2,s.length); +if(tail=="00"){ +return head; +}else{ +if(tail.charAt(1)=="0"){ +return head+"."+tail.charAt(0); +}else{ +return head+"."+tail; +} +} +}; +MochiKit.Format.lstrip=function(str,_263){ +str=str+""; +if(typeof (str)!="string"){ +return null; +} +if(!_263){ +return str.replace(/^\s+/,""); +}else{ +return str.replace(new RegExp("^["+_263+"]+"),""); +} +}; +MochiKit.Format.rstrip=function(str,_265){ +str=str+""; +if(typeof (str)!="string"){ +return null; +} +if(!_265){ +return str.replace(/\s+$/,""); +}else{ +return str.replace(new RegExp("["+_265+"]+$"),""); +} +}; +MochiKit.Format.strip=function(str,_267){ +var self=MochiKit.Format; +return self.rstrip(self.lstrip(str,_267),_267); +}; +MochiKit.Format.truncToFixed=function(_269,_26a){ +_269=Math.floor(_269*Math.pow(10,_26a)); +var res=(_269*Math.pow(10,-_26a)).toFixed(_26a); +if(res.charAt(0)=="."){ +res="0"+res; +} +return res; +}; +MochiKit.Format.roundToFixed=function(_26c,_26d){ +return MochiKit.Format.truncToFixed(_26c+0.5*Math.pow(10,-_26d),_26d); +}; +MochiKit.Format.percentFormat=function(_26e){ +return MochiKit.Format.twoDigitFloat(100*_26e)+"%"; +}; +MochiKit.Format.EXPORT=["truncToFixed","roundToFixed","numberFormatter","formatLocale","twoDigitAverage","twoDigitFloat","percentFormat","lstrip","rstrip","strip"]; +MochiKit.Format.LOCALE={en_US:{separator:",",decimal:".",percent:"%"},de_DE:{separator:".",decimal:",",percent:"%"},fr_FR:{separator:" ",decimal:",",percent:"%"},"default":"en_US"}; +MochiKit.Format.EXPORT_OK=[]; +MochiKit.Format.EXPORT_TAGS={":all":MochiKit.Format.EXPORT,":common":MochiKit.Format.EXPORT}; +MochiKit.Format.__new__=function(){ +var base=this.NAME+"."; +var k,v,o; +for(k in this.LOCALE){ +o=this.LOCALE[k]; +if(typeof (o)=="object"){ +o.repr=function(){ +return this.NAME; +}; +o.NAME=base+"LOCALE."+k; +} +} +for(k in this){ +o=this[k]; +if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){ +try{ +o.NAME=base+k; +} +catch(e){ +} +} +} +}; +MochiKit.Format.__new__(); +if(typeof (MochiKit.Base)!="undefined"){ +MochiKit.Base._exportSymbols(this,MochiKit.Format); +}else{ +(function(_273,_274){ +if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){ +var all=_274.EXPORT_TAGS[":all"]; +for(var i=0;i1){ +fn=MochiKit.Base.partial.apply(null,arguments); +} +return this.addCallbacks(fn,fn); +},addCallback:function(fn){ +if(arguments.length>1){ +fn=MochiKit.Base.partial.apply(null,arguments); +} +return this.addCallbacks(fn,null); +},addErrback:function(fn){ +if(arguments.length>1){ +fn=MochiKit.Base.partial.apply(null,arguments); +} +return this.addCallbacks(null,fn); +},addCallbacks:function(cb,eb){ +if(this.chained){ +throw new Error("Chained Deferreds can not be re-used"); +} +this.chain.push([cb,eb]); +if(this.fired>=0){ +this._fire(); +} +return this; +},_fire:function(){ +var _283=this.chain; +var _284=this.fired; +var res=this.results[_284]; +var self=this; +var cb=null; +while(_283.length>0&&this.paused===0){ +var pair=_283.shift(); +var f=pair[_284]; +if(f===null){ +continue; +} +try{ +res=f(res); +_284=((res instanceof Error)?1:0); +if(res instanceof MochiKit.Async.Deferred){ +cb=function(res){ +self._resback(res); +self.paused--; +if((self.paused===0)&&(self.fired>=0)){ +self._fire(); +} +}; +this.paused++; +} +} +catch(err){ +_284=1; +if(!(err instanceof Error)){ +err=new MochiKit.Async.GenericError(err); +} +res=err; +} +} +this.fired=_284; +this.results[_284]=res; +if(cb&&this.paused){ +res.addBoth(cb); +res.chained=true; +} +}}; +MochiKit.Base.update(MochiKit.Async,{evalJSONRequest:function(){ +return eval("("+arguments[0].responseText+")"); +},succeed:function(_28b){ +var d=new MochiKit.Async.Deferred(); +d.callback.apply(d,arguments); +return d; +},fail:function(_28d){ +var d=new MochiKit.Async.Deferred(); +d.errback.apply(d,arguments); +return d; +},getXMLHttpRequest:function(){ +var self=arguments.callee; +if(!self.XMLHttpRequest){ +var _290=[function(){ +return new XMLHttpRequest(); +},function(){ +return new ActiveXObject("Msxml2.XMLHTTP"); +},function(){ +return new ActiveXObject("Microsoft.XMLHTTP"); +},function(){ +return new ActiveXObject("Msxml2.XMLHTTP.4.0"); +},function(){ +throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest"); +}]; +for(var i=0;i<_290.length;i++){ +var func=_290[i]; +try{ +self.XMLHttpRequest=func; +return func(); +} +catch(e){ +} +} +} +return self.XMLHttpRequest(); +},_xhr_onreadystatechange:function(d){ +var m=MochiKit.Base; +if(this.readyState==4){ +try{ +this.onreadystatechange=null; +} +catch(e){ +try{ +this.onreadystatechange=m.noop; +} +catch(e){ +} +} +var _295=null; +try{ +_295=this.status; +if(!_295&&m.isNotEmpty(this.responseText)){ +_295=304; +} +} +catch(e){ +} +if(_295==200||_295==201||_295==204||_295==304||_295==1223){ +d.callback(this); +}else{ +var err=new MochiKit.Async.XMLHttpRequestError(this,"Request failed"); +if(err.number){ +d.errback(err); +}else{ +d.errback(err); +} +} +} +},_xhr_canceller:function(req){ +try{ +req.onreadystatechange=null; +} +catch(e){ +try{ +req.onreadystatechange=MochiKit.Base.noop; +} +catch(e){ +} +} +req.abort(); +},sendXMLHttpRequest:function(req,_299){ +if(typeof (_299)=="undefined"||_299===null){ +_299=""; +} +var m=MochiKit.Base; +var self=MochiKit.Async; +var d=new self.Deferred(m.partial(self._xhr_canceller,req)); +try{ +req.onreadystatechange=m.bind(self._xhr_onreadystatechange,req,d); +req.send(_299); +} +catch(e){ +try{ +req.onreadystatechange=null; +} +catch(ignore){ +} +d.errback(e); +} +return d; +},doXHR:function(url,opts){ +var self=MochiKit.Async; +return self.callLater(0,self._doXHR,url,opts); +},_doXHR:function(url,opts){ +var m=MochiKit.Base; +opts=m.update({method:"GET",sendContent:""},opts); +var self=MochiKit.Async; +var req=self.getXMLHttpRequest(); +if(opts.queryString){ +var qs=m.queryString(opts.queryString); +if(qs){ +url+="?"+qs; +} +} +if("username" in opts){ +req.open(opts.method,url,true,opts.username,opts.password); +}else{ +req.open(opts.method,url,true); +} +if(req.overrideMimeType&&opts.mimeType){ +req.overrideMimeType(opts.mimeType); +} +if(opts.headers){ +var _2a6=opts.headers; +if(!m.isArrayLike(_2a6)){ +_2a6=m.items(_2a6); +} +for(var i=0;i<_2a6.length;i++){ +var _2a8=_2a6[i]; +var name=_2a8[0]; +var _2aa=_2a8[1]; +req.setRequestHeader(name,_2aa); +} +} +return self.sendXMLHttpRequest(req,opts.sendContent); +},_buildURL:function(url){ +if(arguments.length>1){ +var m=MochiKit.Base; +var qs=m.queryString.apply(null,m.extend(null,arguments,1)); +if(qs){ +return url+"?"+qs; +} +} +return url; +},doSimpleXMLHttpRequest:function(url){ +var self=MochiKit.Async; +url=self._buildURL.apply(self,arguments); +return self.doXHR(url); +},loadJSONDoc:function(url){ +var self=MochiKit.Async; +url=self._buildURL.apply(self,arguments); +var d=self.doXHR(url,{"mimeType":"text/plain","headers":[["Accept","application/json"]]}); +d=d.addCallback(self.evalJSONRequest); +return d; +},wait:function(_2b3,_2b4){ +var d=new MochiKit.Async.Deferred(); +var m=MochiKit.Base; +if(typeof (_2b4)!="undefined"){ +d.addCallback(function(){ +return _2b4; +}); +} +var _2b7=setTimeout(m.bind("callback",d),Math.floor(_2b3*1000)); +d.canceller=function(){ +try{ +clearTimeout(_2b7); +} +catch(e){ +} +}; +return d; +},callLater:function(_2b8,func){ +var m=MochiKit.Base; +var _2bb=m.partial.apply(m,m.extend(null,arguments,1)); +return MochiKit.Async.wait(_2b8).addCallback(function(res){ +return _2bb(); +}); +}}); +MochiKit.Async.DeferredLock=function(){ +this.waiting=[]; +this.locked=false; +this.id=this._nextId(); +}; +MochiKit.Async.DeferredLock.prototype={__class__:MochiKit.Async.DeferredLock,acquire:function(){ +var d=new MochiKit.Async.Deferred(); +if(this.locked){ +this.waiting.push(d); +}else{ +this.locked=true; +d.callback(this); +} +return d; +},release:function(){ +if(!this.locked){ +throw TypeError("Tried to release an unlocked DeferredLock"); +} +this.locked=false; +if(this.waiting.length>0){ +this.locked=true; +this.waiting.shift().callback(this); +} +},_nextId:MochiKit.Base.counter(),repr:function(){ +var _2be; +if(this.locked){ +_2be="locked, "+this.waiting.length+" waiting"; +}else{ +_2be="unlocked"; +} +return "DeferredLock("+this.id+", "+_2be+")"; +},toString:MochiKit.Base.forwardCall("repr")}; +MochiKit.Async.DeferredList=function(list,_2c0,_2c1,_2c2,_2c3){ +MochiKit.Async.Deferred.apply(this,[_2c3]); +this.list=list; +var _2c4=[]; +this.resultList=_2c4; +this.finishedCount=0; +this.fireOnOneCallback=_2c0; +this.fireOnOneErrback=_2c1; +this.consumeErrors=_2c2; +var cb=MochiKit.Base.bind(this._cbDeferred,this); +for(var i=0;i=0){ +var opt=elem.options[elem.selectedIndex]; +var v=opt.value; +if(!v){ +var h=opt.outerHTML; +if(h&&!h.match(/^[^>]+\svalue\s*=/i)){ +v=opt.text; +} +} +_2e3.push(name); +_2e4.push(v); +return null; +} +_2e3.push(name); +_2e4.push(""); +return null; +}else{ +var opts=elem.options; +if(!opts.length){ +_2e3.push(name); +_2e4.push(""); +return null; +} +for(var i=0;i]+\svalue\s*=/i)){ +v=opt.text; +} +} +_2e3.push(name); +_2e4.push(v); +} +return null; +} +} +if(_2e9==="FORM"||_2e9==="P"||_2e9==="SPAN"||_2e9==="DIV"){ +return elem.childNodes; +} +_2e3.push(name); +_2e4.push(elem.value||""); +return null; +} +return elem.childNodes; +}); +return [_2e3,_2e4]; +},withDocument:function(doc,func){ +var self=MochiKit.DOM; +var _2f2=self._document; +var rval; +try{ +self._document=doc; +rval=func(); +} +catch(e){ +self._document=_2f2; +throw e; +} +self._document=_2f2; +return rval; +},registerDOMConverter:function(name,_2f5,wrap,_2f7){ +MochiKit.DOM.domConverters.register(name,_2f5,wrap,_2f7); +},coerceToDOM:function(node,ctx){ +var m=MochiKit.Base; +var im=MochiKit.Iter; +var self=MochiKit.DOM; +if(im){ +var iter=im.iter; +var _2fe=im.repeat; +var map=m.map; +} +var _300=self.domConverters; +var _301=arguments.callee; +var _302=m.NotFound; +while(true){ +if(typeof (node)=="undefined"||node===null){ +return null; +} +if(typeof (node)=="function"&&typeof (node.length)=="number"&&!(node instanceof Function)){ +node=im.list(node); +} +if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){ +return node; +} +if(typeof (node)=="number"||typeof (node)=="boolean"){ +node=node.toString(); +} +if(typeof (node)=="string"){ +return self._document.createTextNode(node); +} +if(typeof (node.__dom__)=="function"){ +node=node.__dom__(ctx); +continue; +} +if(typeof (node.dom)=="function"){ +node=node.dom(ctx); +continue; +} +if(typeof (node)=="function"){ +node=node.apply(ctx,[ctx]); +continue; +} +if(im){ +var _303=null; +try{ +_303=iter(node); +} +catch(e){ +} +if(_303){ +return map(_301,_303,_2fe(ctx)); +} +} +try{ +node=_300.match(node,ctx); +continue; +} +catch(e){ +if(e!=_302){ +throw e; +} +} +return self._document.createTextNode(node.toString()); +} +return undefined; +},isChildNode:function(node,_305){ +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +node=self.getElement(node); +} +if(typeof (_305)=="string"){ +_305=self.getElement(_305); +} +if(node===_305){ +return true; +} +while(node&&node.tagName.toUpperCase()!="BODY"){ +node=node.parentNode; +if(node===_305){ +return true; +} +} +return false; +},setNodeAttribute:function(node,attr,_309){ +var o={}; +o[attr]=_309; +try{ +return MochiKit.DOM.updateNodeAttributes(node,o); +} +catch(e){ +} +return null; +},getNodeAttribute:function(node,attr){ +var self=MochiKit.DOM; +var _30e=self.attributeArray.renames[attr]; +node=self.getElement(node); +try{ +if(_30e){ +return node[_30e]; +} +return node.getAttribute(attr); +} +catch(e){ +} +return null; +},removeNodeAttribute:function(node,attr){ +var self=MochiKit.DOM; +var _312=self.attributeArray.renames[attr]; +node=self.getElement(node); +try{ +if(_312){ +return node[_312]; +} +return node.removeAttribute(attr); +} +catch(e){ +} +return null; +},updateNodeAttributes:function(node,_314){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +} +if(_314){ +var _317=MochiKit.Base.updatetree; +if(self.attributeArray.compliant){ +for(var k in _314){ +var v=_314[k]; +if(typeof (v)=="object"&&typeof (elem[k])=="object"){ +if(k=="style"&&MochiKit.Style){ +MochiKit.Style.setStyle(elem,v); +}else{ +_317(elem[k],v); +} +}else{ +if(k.substring(0,2)=="on"){ +if(typeof (v)=="string"){ +v=new Function(v); +} +elem[k]=v; +}else{ +elem.setAttribute(k,v); +} +} +} +}else{ +var _31a=self.attributeArray.renames; +for(var k in _314){ +v=_314[k]; +var _31b=_31a[k]; +if(k=="style"&&typeof (v)=="string"){ +elem.style.cssText=v; +}else{ +if(typeof (_31b)=="string"){ +elem[_31b]=v; +}else{ +if(typeof (elem[k])=="object"&&typeof (v)=="object"){ +if(k=="style"&&MochiKit.Style){ +MochiKit.Style.setStyle(elem,v); +}else{ +_317(elem[k],v); +} +}else{ +if(k.substring(0,2)=="on"){ +if(typeof (v)=="string"){ +v=new Function(v); +} +elem[k]=v; +}else{ +elem.setAttribute(k,v); +} +} +} +} +} +} +} +return elem; +},appendChildNodes:function(node){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +} +var _31f=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)]; +var _320=MochiKit.Base.concat; +while(_31f.length){ +var n=_31f.shift(); +if(typeof (n)=="undefined"||n===null){ +}else{ +if(typeof (n.nodeType)=="number"){ +elem.appendChild(n); +}else{ +_31f=_320(n,_31f); +} +} +} +return elem; +},insertSiblingNodesBefore:function(node){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +} +var _325=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)]; +var _326=elem.parentNode; +var _327=MochiKit.Base.concat; +while(_325.length){ +var n=_325.shift(); +if(typeof (n)=="undefined"||n===null){ +}else{ +if(typeof (n.nodeType)=="number"){ +_326.insertBefore(n,elem); +}else{ +_325=_327(n,_325); +} +} +} +return _326; +},insertSiblingNodesAfter:function(node){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +} +var _32c=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)]; +if(elem.nextSibling){ +return self.insertSiblingNodesBefore(elem.nextSibling,_32c); +}else{ +return self.appendChildNodes(elem.parentNode,_32c); +} +},replaceChildNodes:function(node){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +arguments[0]=elem; +} +var _330; +while((_330=elem.firstChild)){ +elem.removeChild(_330); +} +if(arguments.length<2){ +return elem; +}else{ +return self.appendChildNodes.apply(this,arguments); +} +},createDOM:function(name,_332){ +var elem; +var self=MochiKit.DOM; +var m=MochiKit.Base; +if(typeof (_332)=="string"||typeof (_332)=="number"){ +var args=m.extend([name,null],arguments,1); +return arguments.callee.apply(this,args); +} +if(typeof (name)=="string"){ +var _337=self._xhtml; +if(_332&&!self.attributeArray.compliant){ +var _338=""; +if("name" in _332){ +_338+=" name=\""+self.escapeHTML(_332.name)+"\""; +} +if(name=="input"&&"type" in _332){ +_338+=" type=\""+self.escapeHTML(_332.type)+"\""; +} +if(_338){ +name="<"+name+_338+">"; +_337=false; +} +} +var d=self._document; +if(_337&&d===document){ +elem=d.createElementNS("http://www.w3.org/1999/xhtml",name); +}else{ +elem=d.createElement(name); +} +}else{ +elem=name; +} +if(_332){ +self.updateNodeAttributes(elem,_332); +} +if(arguments.length<=2){ +return elem; +}else{ +var args=m.extend([elem],arguments,2); +return self.appendChildNodes.apply(this,args); +} +},createDOMFunc:function(){ +var m=MochiKit.Base; +return m.partial.apply(this,m.extend([MochiKit.DOM.createDOM],arguments)); +},removeElement:function(elem){ +var e=MochiKit.DOM.getElement(elem); +e.parentNode.removeChild(e); +return e; +},swapDOM:function(dest,src){ +var self=MochiKit.DOM; +dest=self.getElement(dest); +var _340=dest.parentNode; +if(src){ +src=self.getElement(src); +_340.replaceChild(src,dest); +}else{ +_340.removeChild(dest); +} +return src; +},getElement:function(id){ +var self=MochiKit.DOM; +if(arguments.length==1){ +return ((typeof (id)=="string")?self._document.getElementById(id):id); +}else{ +return MochiKit.Base.map(self.getElement,arguments); +} +},getElementsByTagAndClassName:function(_343,_344,_345){ +var self=MochiKit.DOM; +if(typeof (_343)=="undefined"||_343===null){ +_343="*"; +} +if(typeof (_345)=="undefined"||_345===null){ +_345=self._document; +} +_345=self.getElement(_345); +var _347=(_345.getElementsByTagName(_343)||self._document.all); +if(typeof (_344)=="undefined"||_344===null){ +return MochiKit.Base.extend(null,_347); +} +var _348=[]; +for(var i=0;i<_347.length;i++){ +var _34a=_347[i]; +var cls=_34a.className; +if(!cls){ +continue; +} +var _34c=cls.split(" "); +for(var j=0;j<_34c.length;j++){ +if(_34c[j]==_344){ +_348.push(_34a); +break; +} +} +} +return _348; +},_newCallStack:function(path,once){ +var rval=function(){ +var _351=arguments.callee.callStack; +for(var i=0;i<_351.length;i++){ +if(_351[i].apply(this,arguments)===false){ +break; +} +} +if(once){ +try{ +this[path]=null; +} +catch(e){ +} +} +}; +rval.callStack=[]; +return rval; +},addToCallStack:function(_353,path,func,once){ +var self=MochiKit.DOM; +var _358=_353[path]; +var _359=_358; +if(!(typeof (_358)=="function"&&typeof (_358.callStack)=="object"&&_358.callStack!==null)){ +_359=self._newCallStack(path,once); +if(typeof (_358)=="function"){ +_359.callStack.push(_358); +} +_353[path]=_359; +} +_359.callStack.push(func); +},addLoadEvent:function(func){ +var self=MochiKit.DOM; +self.addToCallStack(self._window,"onload",func,true); +},focusOnLoad:function(_35c){ +var self=MochiKit.DOM; +self.addLoadEvent(function(){ +_35c=self.getElement(_35c); +if(_35c){ +_35c.focus(); +} +}); +},setElementClass:function(_35e,_35f){ +var self=MochiKit.DOM; +var obj=self.getElement(_35e); +if(self.attributeArray.compliant){ +obj.setAttribute("class",_35f); +}else{ +obj.setAttribute("className",_35f); +} +},toggleElementClass:function(_362){ +var self=MochiKit.DOM; +for(var i=1;i/g,">"); +},toHTML:function(dom){ +return MochiKit.DOM.emitHTML(dom).join(""); +},emitHTML:function(dom,lst){ +if(typeof (lst)=="undefined"||lst===null){ +lst=[]; +} +var _385=[dom]; +var self=MochiKit.DOM; +var _387=self.escapeHTML; +var _388=self.attributeArray; +while(_385.length){ +dom=_385.pop(); +if(typeof (dom)=="string"){ +lst.push(dom); +}else{ +if(dom.nodeType==1){ +lst.push("<"+dom.tagName.toLowerCase()); +var _389=[]; +var _38a=_388(dom); +for(var i=0;i<_38a.length;i++){ +var a=_38a[i]; +_389.push([" ",a.name,"=\"",_387(a.value),"\""]); +} +_389.sort(); +for(i=0;i<_389.length;i++){ +var _38d=_389[i]; +for(var j=0;j<_38d.length;j++){ +lst.push(_38d[j]); +} +} +if(dom.hasChildNodes()){ +lst.push(">"); +_385.push(""); +var _38f=dom.childNodes; +for(i=_38f.length-1;i>=0;i--){ +_385.push(_38f[i]); +} +}else{ +lst.push("/>"); +} +}else{ +if(dom.nodeType==3){ +lst.push(_387(dom.nodeValue)); +} +} +} +} +return lst; +},scrapeText:function(node,_391){ +var rval=[]; +(function(node){ +var cn=node.childNodes; +if(cn){ +for(var i=0;i0){ +var _3b8=m.filter; +_3b7=function(node){ +return _3b8(_3b7.ignoreAttrFilter,node.attributes); +}; +_3b7.ignoreAttr={}; +var _3ba=_3b6.attributes; +var _3bb=_3b7.ignoreAttr; +for(var i=0;i<_3ba.length;i++){ +var a=_3ba[i]; +_3bb[a.name]=a.value; +} +_3b7.ignoreAttrFilter=function(a){ +return (_3b7.ignoreAttr[a.name]!=a.value); +}; +_3b7.compliant=false; +_3b7.renames={"class":"className","checked":"defaultChecked","usemap":"useMap","for":"htmlFor","readonly":"readOnly","colspan":"colSpan","bgcolor":"bgColor","cellspacing":"cellSpacing","cellpadding":"cellPadding"}; +}else{ +_3b7=function(node){ +return node.attributes; +}; +_3b7.compliant=true; +_3b7.renames={}; +} +this.attributeArray=_3b7; +var _3c0=function(_3c1,arr){ +var _3c3=arr[1].split("."); +var str=""; +var obj={}; +str+="if (!MochiKit."+_3c3[1]+") { throw new Error(\""; +str+="This function has been deprecated and depends on MochiKit."; +str+=_3c3[1]+".\");}"; +str+="return MochiKit."+_3c3[1]+"."+arr[0]; +str+=".apply(this, arguments);"; +obj[_3c3[2]]=new Function(str); +MochiKit.Base.update(MochiKit[_3c1],obj); +}; +for(var i;i0){ +abort(repr(expr)); +} +},buildMatchExpression:function(){ +var repr=MochiKit.Base.repr; +var _3d1=this.params; +var _3d2=[]; +var _3d3,i; +function childElements(_3d5){ +return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, "+_3d5+".childNodes)"; +} +if(_3d1.wildcard){ +_3d2.push("true"); +} +if(_3d3=_3d1.id){ +_3d2.push("element.id == "+repr(_3d3)); +} +if(_3d3=_3d1.tagName){ +_3d2.push("element.tagName.toUpperCase() == "+repr(_3d3)); +} +if((_3d3=_3d1.classNames).length>0){ +for(i=0;i<_3d3.length;i++){ +_3d2.push("MochiKit.DOM.hasElementClass(element, "+repr(_3d3[i])+")"); +} +} +if((_3d3=_3d1.pseudoClassNames).length>0){ +for(i=0;i<_3d3.length;i++){ +var _3d6=_3d3[i].match(/^([^(]+)(?:\((.*)\))?$/); +var _3d7=_3d6[1]; +var _3d8=_3d6[2]; +switch(_3d7){ +case "root": +_3d2.push("element.nodeType == 9 || element === element.ownerDocument.documentElement"); +break; +case "nth-child": +case "nth-last-child": +case "nth-of-type": +case "nth-last-of-type": +_3d6=_3d8.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/); +if(!_3d6){ +throw "Invalid argument to pseudo element nth-child: "+_3d8; +} +var a,b; +if(_3d6[0]=="odd"){ +a=2; +b=1; +}else{ +if(_3d6[0]=="even"){ +a=2; +b=0; +}else{ +a=_3d6[2]&&parseInt(_3d6)||null; +b=parseInt(_3d6[3]); +} +} +_3d2.push("this.nthChild(element,"+a+","+b+","+!!_3d7.match("^nth-last")+","+!!_3d7.match("of-type$")+")"); +break; +case "first-child": +_3d2.push("this.nthChild(element, null, 1)"); +break; +case "last-child": +_3d2.push("this.nthChild(element, null, 1, true)"); +break; +case "first-of-type": +_3d2.push("this.nthChild(element, null, 1, false, true)"); +break; +case "last-of-type": +_3d2.push("this.nthChild(element, null, 1, true, true)"); +break; +case "only-child": +_3d2.push(childElements("element.parentNode")+".length == 1"); +break; +case "only-of-type": +_3d2.push("MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, "+childElements("element.parentNode")+").length == 1"); +break; +case "empty": +_3d2.push("element.childNodes.length == 0"); +break; +case "enabled": +_3d2.push("(this.isUIElement(element) && element.disabled === false)"); +break; +case "disabled": +_3d2.push("(this.isUIElement(element) && element.disabled === true)"); +break; +case "checked": +_3d2.push("(this.isUIElement(element) && element.checked === true)"); +break; +case "not": +var _3db=new MochiKit.Selector.Selector(_3d8); +_3d2.push("!( "+_3db.buildMatchExpression()+")"); +break; +} +} +} +if(_3d3=_3d1.attributes){ +MochiKit.Base.map(function(_3dc){ +var _3dd="MochiKit.DOM.getNodeAttribute(element, "+repr(_3dc.name)+")"; +var _3de=function(_3df){ +return _3dd+".split("+repr(_3df)+")"; +}; +switch(_3dc.operator){ +case "=": +_3d2.push(_3dd+" == "+repr(_3dc.value)); +break; +case "~=": +_3d2.push(_3dd+" && MochiKit.Base.findValue("+_3de(" ")+", "+repr(_3dc.value)+") > -1"); +break; +case "^=": +_3d2.push(_3dd+".substring(0, "+_3dc.value.length+") == "+repr(_3dc.value)); +break; +case "$=": +_3d2.push(_3dd+".substring("+_3dd+".length - "+_3dc.value.length+") == "+repr(_3dc.value)); +break; +case "*=": +_3d2.push(_3dd+".match("+repr(_3dc.value)+")"); +break; +case "|=": +_3d2.push(_3dd+" && "+_3de("-")+"[0].toUpperCase() == "+repr(_3dc.value.toUpperCase())); +break; +case "!=": +_3d2.push(_3dd+" != "+repr(_3dc.value)); +break; +case "": +case undefined: +_3d2.push(_3dd+" != null"); +break; +default: +throw "Unknown operator "+_3dc.operator+" in selector"; +} +},_3d3); +} +return _3d2.join(" && "); +},compileMatcher:function(){ +this.match=new Function("element","if (!element.tagName) return false; return "+this.buildMatchExpression()); +},nthChild:function(_3e0,a,b,_3e3,_3e4){ +var _3e5=MochiKit.Base.filter(function(node){ +return node.nodeType==1; +},_3e0.parentNode.childNodes); +if(_3e4){ +_3e5=MochiKit.Base.filter(function(node){ +return node.tagName==_3e0.tagName; +},_3e5); +} +if(_3e3){ +_3e5=MochiKit.Iter.reversed(_3e5); +} +if(a){ +var _3e8=MochiKit.Base.findIdentical(_3e5,_3e0); +return ((_3e8+1-b)/a)%1==0; +}else{ +return b==MochiKit.Base.findIdentical(_3e5,_3e0)+1; +} +},isUIElement:function(_3e9){ +return MochiKit.Base.findValue(["input","button","select","option","textarea","object"],_3e9.tagName.toLowerCase())>-1; +},findElements:function(_3ea,axis){ +var _3ec; +if(axis==undefined){ +axis=""; +} +function inScope(_3ed,_3ee){ +if(axis==""){ +return MochiKit.DOM.isChildNode(_3ed,_3ee); +}else{ +if(axis==">"){ +return _3ed.parentNode==_3ee; +}else{ +if(axis=="+"){ +return _3ed==nextSiblingElement(_3ee); +}else{ +if(axis=="~"){ +var _3ef=_3ee; +while(_3ef=nextSiblingElement(_3ef)){ +if(_3ed==_3ef){ +return true; +} +} +return false; +}else{ +throw "Invalid axis: "+axis; +} +} +} +} +} +if(_3ec=MochiKit.DOM.getElement(this.params.id)){ +if(this.match(_3ec)){ +if(!_3ea||inScope(_3ec,_3ea)){ +return [_3ec]; +} +} +} +function nextSiblingElement(node){ +node=node.nextSibling; +while(node&&node.nodeType!=1){ +node=node.nextSibling; +} +return node; +} +if(axis==""){ +_3ea=(_3ea||MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName||"*"); +}else{ +if(axis==">"){ +if(!_3ea){ +throw "> combinator not allowed without preceeding expression"; +} +_3ea=MochiKit.Base.filter(function(node){ +return node.nodeType==1; +},_3ea.childNodes); +}else{ +if(axis=="+"){ +if(!_3ea){ +throw "+ combinator not allowed without preceeding expression"; +} +_3ea=nextSiblingElement(_3ea)&&[nextSiblingElement(_3ea)]; +}else{ +if(axis=="~"){ +if(!_3ea){ +throw "~ combinator not allowed without preceeding expression"; +} +var _3f2=[]; +while(nextSiblingElement(_3ea)){ +_3ea=nextSiblingElement(_3ea); +_3f2.push(_3ea); +} +_3ea=_3f2; +} +} +} +} +if(!_3ea){ +return []; +} +var _3f3=MochiKit.Base.filter(MochiKit.Base.bind(function(_3f4){ +return this.match(_3f4); +},this),_3ea); +return _3f3; +},repr:function(){ +return "Selector("+this.expression+")"; +},toString:MochiKit.Base.forwardCall("repr")}; +MochiKit.Base.update(MochiKit.Selector,{findChildElements:function(_3f5,_3f6){ +return MochiKit.Base.flattenArray(MochiKit.Base.map(function(_3f7){ +var _3f8=""; +return MochiKit.Iter.reduce(function(_3f9,expr){ +if(match=expr.match(/^[>+~]$/)){ +_3f8=match[0]; +return _3f9; +}else{ +var _3fb=new MochiKit.Selector.Selector(expr); +var _3fc=MochiKit.Iter.reduce(function(_3fd,_3fe){ +return MochiKit.Base.extend(_3fd,_3fb.findElements(_3fe||_3f5,_3f8)); +},_3f9,[]); +_3f8=""; +return _3fc; +} +},_3f7.replace(/(^\s+|\s+$)/g,"").split(/\s+/),[null]); +},_3f6)); +},findDocElements:function(){ +return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(),arguments); +},__new__:function(){ +var m=MochiKit.Base; +this.$$=this.findDocElements; +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}}); +MochiKit.Selector.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.Selector); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Style"); +dojo.require("MochiKit.Base"); +dojo.require("MochiKit.DOM"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Base",[]); +JSAN.use("MochiKit.DOM",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Style depends on MochiKit.Base!"; +} +try{ +if(typeof (MochiKit.DOM)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Style depends on MochiKit.DOM!"; +} +if(typeof (MochiKit.Style)=="undefined"){ +MochiKit.Style={}; +} +MochiKit.Style.NAME="MochiKit.Style"; +MochiKit.Style.VERSION="1.4"; +MochiKit.Style.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.Style.toString=function(){ +return this.__repr__(); +}; +MochiKit.Style.EXPORT_OK=[]; +MochiKit.Style.EXPORT=["setStyle","setOpacity","getStyle","getElementDimensions","elementDimensions","setElementDimensions","getElementPosition","elementPosition","setElementPosition","setDisplayForElement","hideElement","showElement","getViewportDimensions","getViewportPosition","Dimensions","Coordinates"]; +MochiKit.Style.Dimensions=function(w,h){ +this.w=w; +this.h=h; +}; +MochiKit.Style.Dimensions.prototype.__repr__=function(){ +var repr=MochiKit.Base.repr; +return "{w: "+repr(this.w)+", h: "+repr(this.h)+"}"; +}; +MochiKit.Style.Dimensions.prototype.toString=function(){ +return this.__repr__(); +}; +MochiKit.Style.Coordinates=function(x,y){ +this.x=x; +this.y=y; +}; +MochiKit.Style.Coordinates.prototype.__repr__=function(){ +var repr=MochiKit.Base.repr; +return "{x: "+repr(this.x)+", y: "+repr(this.y)+"}"; +}; +MochiKit.Style.Coordinates.prototype.toString=function(){ +return this.__repr__(); +}; +MochiKit.Base.update(MochiKit.Style,{getStyle:function(elem,_407){ +var dom=MochiKit.DOM; +var d=dom._document; +elem=dom.getElement(elem); +_407=MochiKit.Base.camelize(_407); +if(!elem||elem==d){ +return undefined; +} +if(_407=="opacity"&&elem.filters){ +var _40a=(MochiKit.Style.getStyle(elem,"filter")||"").match(/alpha\(opacity=(.*)\)/); +if(_40a&&_40a[1]){ +return parseFloat(_40a[1])/100; +} +return 1; +} +var _40b=elem.style?elem.style[_407]:null; +if(!_40b){ +if(d.defaultView&&d.defaultView.getComputedStyle){ +var css=d.defaultView.getComputedStyle(elem,null); +_407=_407.replace(/([A-Z])/g,"-$1").toLowerCase(); +_40b=css?css.getPropertyValue(_407):null; +}else{ +if(elem.currentStyle){ +_40b=elem.currentStyle[_407]; +} +} +} +if(_407=="opacity"){ +_40b=parseFloat(_40b); +} +if(/Opera/.test(navigator.userAgent)&&(MochiKit.Base.find(["left","top","right","bottom"],_407)!=-1)){ +if(MochiKit.Style.getStyle(elem,"position")=="static"){ +_40b="auto"; +} +} +return _40b=="auto"?null:_40b; +},setStyle:function(elem,_40e){ +elem=MochiKit.DOM.getElement(elem); +for(var name in _40e){ +if(name=="opacity"){ +MochiKit.Style.setOpacity(elem,_40e[name]); +}else{ +elem.style[MochiKit.Base.camelize(name)]=_40e[name]; +} +} +},setOpacity:function(elem,o){ +elem=MochiKit.DOM.getElement(elem); +var self=MochiKit.Style; +if(o==1){ +var _413=/Gecko/.test(navigator.userAgent)&&!(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)); +elem.style["opacity"]=_413?0.999999:1; +if(/MSIE/.test(navigator.userAgent)){ +elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,""); +} +}else{ +if(o<0.00001){ +o=0; +} +elem.style["opacity"]=o; +if(/MSIE/.test(navigator.userAgent)){ +elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"")+"alpha(opacity="+o*100+")"; +} +} +},getElementPosition:function(elem,_415){ +var self=MochiKit.Style; +var dom=MochiKit.DOM; +elem=dom.getElement(elem); +if(!elem||(!(elem.x&&elem.y)&&(!elem.parentNode===null||self.getStyle(elem,"display")=="none"))){ +return undefined; +} +var c=new self.Coordinates(0,0); +var box=null; +var _41a=null; +var d=MochiKit.DOM._document; +var de=d.documentElement; +var b=d.body; +if(!elem.parentNode&&elem.x&&elem.y){ +c.x+=elem.x||0; +c.y+=elem.y||0; +}else{ +if(elem.getBoundingClientRect){ +box=elem.getBoundingClientRect(); +c.x+=box.left+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0); +c.y+=box.top+(de.scrollTop||b.scrollTop)-(de.clientTop||0); +}else{ +if(elem.offsetParent){ +c.x+=elem.offsetLeft; +c.y+=elem.offsetTop; +_41a=elem.offsetParent; +if(_41a!=elem){ +while(_41a){ +c.x+=_41a.offsetLeft; +c.y+=_41a.offsetTop; +_41a=_41a.offsetParent; +} +} +var ua=navigator.userAgent.toLowerCase(); +if((typeof (opera)!="undefined"&&parseFloat(opera.version())<9)||(ua.indexOf("AppleWebKit")!=-1&&self.getStyle(elem,"position")=="absolute")){ +c.x-=b.offsetLeft; +c.y-=b.offsetTop; +} +} +} +} +if(typeof (_415)!="undefined"){ +_415=arguments.callee(_415); +if(_415){ +c.x-=(_415.x||0); +c.y-=(_415.y||0); +} +} +if(elem.parentNode){ +_41a=elem.parentNode; +}else{ +_41a=null; +} +while(_41a){ +var _41f=_41a.tagName.toUpperCase(); +if(_41f==="BODY"||_41f==="HTML"){ +break; +} +var disp=self.getStyle(_41a,"display"); +if(disp!="inline"&&disp!="table-row"){ +c.x-=_41a.scrollLeft; +c.y-=_41a.scrollTop; +} +if(_41a.parentNode){ +_41a=_41a.parentNode; +}else{ +_41a=null; +} +} +return c; +},setElementPosition:function(elem,_422,_423){ +elem=MochiKit.DOM.getElement(elem); +if(typeof (_423)=="undefined"){ +_423="px"; +} +var _424={}; +var _425=MochiKit.Base.isUndefinedOrNull; +if(!_425(_422.x)){ +_424["left"]=_422.x+_423; +} +if(!_425(_422.y)){ +_424["top"]=_422.y+_423; +} +MochiKit.DOM.updateNodeAttributes(elem,{"style":_424}); +},getElementDimensions:function(elem){ +var self=MochiKit.Style; +var dom=MochiKit.DOM; +if(typeof (elem.w)=="number"||typeof (elem.h)=="number"){ +return new self.Dimensions(elem.w||0,elem.h||0); +} +elem=dom.getElement(elem); +if(!elem){ +return undefined; +} +var disp=self.getStyle(elem,"display"); +if(disp!="none"&&disp!==""&&typeof (disp)!="undefined"){ +return new self.Dimensions(elem.offsetWidth||0,elem.offsetHeight||0); +} +var s=elem.style; +var _42b=s.visibility; +var _42c=s.position; +s.visibility="hidden"; +s.position="absolute"; +s.display=""; +var _42d=elem.offsetWidth; +var _42e=elem.offsetHeight; +s.display="none"; +s.position=_42c; +s.visibility=_42b; +return new self.Dimensions(_42d,_42e); +},setElementDimensions:function(elem,_430,_431){ +elem=MochiKit.DOM.getElement(elem); +if(typeof (_431)=="undefined"){ +_431="px"; +} +var _432={}; +var _433=MochiKit.Base.isUndefinedOrNull; +if(!_433(_430.w)){ +_432["width"]=_430.w+_431; +} +if(!_433(_430.h)){ +_432["height"]=_430.h+_431; +} +MochiKit.DOM.updateNodeAttributes(elem,{"style":_432}); +},setDisplayForElement:function(_434,_435){ +var _436=MochiKit.Base.extend(null,arguments,1); +var _437=MochiKit.DOM.getElement; +for(var i=0;i<_436.length;i++){ +_435=_437(_436[i]); +if(_435){ +_435.style.display=_434; +} +} +},getViewportDimensions:function(){ +var d=new MochiKit.Style.Dimensions(); +var w=MochiKit.DOM._window; +var b=MochiKit.DOM._document.body; +if(w.innerWidth){ +d.w=w.innerWidth; +d.h=w.innerHeight; +}else{ +if(b.parentElement.clientWidth){ +d.w=b.parentElement.clientWidth; +d.h=b.parentElement.clientHeight; +}else{ +if(b&&b.clientWidth){ +d.w=b.clientWidth; +d.h=b.clientHeight; +} +} +} +return d; +},getViewportPosition:function(){ +var c=new MochiKit.Style.Coordinates(0,0); +var d=MochiKit.DOM._document; +var de=d.documentElement; +var db=d.body; +if(de&&(de.scrollTop||de.scrollLeft)){ +c.x=de.scrollLeft; +c.y=de.scrollTop; +}else{ +if(db){ +c.x=db.scrollLeft; +c.y=db.scrollTop; +} +} +return c; +},__new__:function(){ +var m=MochiKit.Base; +this.elementPosition=this.getElementPosition; +this.elementDimensions=this.getElementDimensions; +this.hideElement=m.partial(this.setDisplayForElement,"none"); +this.showElement=m.partial(this.setDisplayForElement,"block"); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}}); +MochiKit.Style.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.Style); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.LoggingPane"); +dojo.require("MochiKit.Logging"); +dojo.require("MochiKit.Base"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Logging",[]); +JSAN.use("MochiKit.Base",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.Logging)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.LoggingPane depends on MochiKit.Base and MochiKit.Logging!"; +} +if(typeof (MochiKit.LoggingPane)=="undefined"){ +MochiKit.LoggingPane={}; +} +MochiKit.LoggingPane.NAME="MochiKit.LoggingPane"; +MochiKit.LoggingPane.VERSION="1.4"; +MochiKit.LoggingPane.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.LoggingPane.toString=function(){ +return this.__repr__(); +}; +MochiKit.LoggingPane.createLoggingPane=function(_441){ +var m=MochiKit.LoggingPane; +_441=!(!_441); +if(m._loggingPane&&m._loggingPane.inline!=_441){ +m._loggingPane.closePane(); +m._loggingPane=null; +} +if(!m._loggingPane||m._loggingPane.closed){ +m._loggingPane=new m.LoggingPane(_441,MochiKit.Logging.logger); +} +return m._loggingPane; +}; +MochiKit.LoggingPane.LoggingPane=function(_443,_444){ +if(typeof (_444)=="undefined"||_444===null){ +_444=MochiKit.Logging.logger; +} +this.logger=_444; +var _445=MochiKit.Base.update; +var _446=MochiKit.Base.updatetree; +var bind=MochiKit.Base.bind; +var _448=MochiKit.Base.clone; +var win=window; +var uid="_MochiKit_LoggingPane"; +if(typeof (MochiKit.DOM)!="undefined"){ +win=MochiKit.DOM.currentWindow(); +} +if(!_443){ +var url=win.location.href.split("?")[0].replace(/[#:\/.><&-]/g,"_"); +var name=uid+"_"+url; +var nwin=win.open("",name,"dependent,resizable,height=200"); +if(!nwin){ +alert("Not able to open debugging window due to pop-up blocking."); +return undefined; +} +nwin.document.write(""+"[MochiKit.LoggingPane]"+""); +nwin.document.close(); +nwin.document.title+=" "+win.document.title; +win=nwin; +} +var doc=win.document; +this.doc=doc; +var _44f=doc.getElementById(uid); +var _450=!!_44f; +if(_44f&&typeof (_44f.loggingPane)!="undefined"){ +_44f.loggingPane.logger=this.logger; +_44f.loggingPane.buildAndApplyFilter(); +return _44f.loggingPane; +} +if(_450){ +var _451; +while((_451=_44f.firstChild)){ +_44f.removeChild(_451); +} +}else{ +_44f=doc.createElement("div"); +_44f.id=uid; +} +_44f.loggingPane=this; +var _452=doc.createElement("input"); +var _453=doc.createElement("input"); +var _454=doc.createElement("button"); +var _455=doc.createElement("button"); +var _456=doc.createElement("button"); +var _457=doc.createElement("button"); +var _458=doc.createElement("div"); +var _459=doc.createElement("div"); +var _45a=uid+"_Listener"; +this.colorTable=_448(this.colorTable); +var _45b=[]; +var _45c=null; +var _45d=function(msg){ +var _45f=msg.level; +if(typeof (_45f)=="number"){ +_45f=MochiKit.Logging.LogLevel[_45f]; +} +return _45f; +}; +var _460=function(msg){ +return msg.info.join(" "); +}; +var _462=bind(function(msg){ +var _464=_45d(msg); +var text=_460(msg); +var c=this.colorTable[_464]; +var p=doc.createElement("span"); +p.className="MochiKit-LogMessage MochiKit-LogLevel-"+_464; +p.style.cssText="margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: "+c; +p.appendChild(doc.createTextNode(_464+": "+text)); +_459.appendChild(p); +_459.appendChild(doc.createElement("br")); +if(_458.offsetHeight>_458.scrollHeight){ +_458.scrollTop=0; +}else{ +_458.scrollTop=_458.scrollHeight; +} +},this); +var _468=function(msg){ +_45b[_45b.length]=msg; +_462(msg); +}; +var _46a=function(){ +var _46b,_46c; +try{ +_46b=new RegExp(_452.value); +_46c=new RegExp(_453.value); +} +catch(e){ +logDebug("Error in filter regex: "+e.message); +return null; +} +return function(msg){ +return (_46b.test(_45d(msg))&&_46c.test(_460(msg))); +}; +}; +var _46e=function(){ +while(_459.firstChild){ +_459.removeChild(_459.firstChild); +} +}; +var _46f=function(){ +_45b=[]; +_46e(); +}; +var _470=bind(function(){ +if(this.closed){ +return; +} +this.closed=true; +if(MochiKit.LoggingPane._loggingPane==this){ +MochiKit.LoggingPane._loggingPane=null; +} +this.logger.removeListener(_45a); +try{ +try{ +_44f.loggingPane=null; +} +catch(e){ +logFatal("Bookmarklet was closed incorrectly."); +} +if(_443){ +_44f.parentNode.removeChild(_44f); +}else{ +this.win.close(); +} +} +catch(e){ +} +},this); +var _471=function(){ +_46e(); +for(var i=0;i<_45b.length;i++){ +var msg=_45b[i]; +if(_45c===null||_45c(msg)){ +_462(msg); +} +} +}; +this.buildAndApplyFilter=function(){ +_45c=_46a(); +_471(); +this.logger.removeListener(_45a); +this.logger.addListener(_45a,_45c,_468); +}; +var _474=bind(function(){ +_45b=this.logger.getMessages(); +_471(); +},this); +var _475=bind(function(_476){ +_476=_476||window.event; +key=_476.which||_476.keyCode; +if(key==13){ +this.buildAndApplyFilter(); +} +},this); +var _477="display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: "+this.logFont; +if(_443){ +_477+="; height: 10em; border-top: 2px solid black"; +}else{ +_477+="; height: 100%;"; +} +_44f.style.cssText=_477; +if(!_450){ +doc.body.appendChild(_44f); +} +_477={"cssText":"width: 33%; display: inline; font: "+this.logFont}; +_446(_452,{"value":"FATAL|ERROR|WARNING|INFO|DEBUG","onkeypress":_475,"style":_477}); +_44f.appendChild(_452); +_446(_453,{"value":".*","onkeypress":_475,"style":_477}); +_44f.appendChild(_453); +_477="width: 8%; display:inline; font: "+this.logFont; +_454.appendChild(doc.createTextNode("Filter")); +_454.onclick=bind("buildAndApplyFilter",this); +_454.style.cssText=_477; +_44f.appendChild(_454); +_455.appendChild(doc.createTextNode("Load")); +_455.onclick=_474; +_455.style.cssText=_477; +_44f.appendChild(_455); +_456.appendChild(doc.createTextNode("Clear")); +_456.onclick=_46f; +_456.style.cssText=_477; +_44f.appendChild(_456); +_457.appendChild(doc.createTextNode("Close")); +_457.onclick=_470; +_457.style.cssText=_477; +_44f.appendChild(_457); +_458.style.cssText="overflow: auto; width: 100%"; +_459.style.cssText="width: 100%; height: "+(_443?"8em":"100%"); +_458.appendChild(_459); +_44f.appendChild(_458); +this.buildAndApplyFilter(); +_474(); +if(_443){ +this.win=undefined; +}else{ +this.win=win; +} +this.inline=_443; +this.closePane=_470; +this.closed=false; +return this; +}; +MochiKit.LoggingPane.LoggingPane.prototype={"logFont":"8pt Verdana,sans-serif","colorTable":{"ERROR":"red","FATAL":"darkred","WARNING":"blue","INFO":"black","DEBUG":"green"}}; +MochiKit.LoggingPane.EXPORT_OK=["LoggingPane"]; +MochiKit.LoggingPane.EXPORT=["createLoggingPane"]; +MochiKit.LoggingPane.__new__=function(){ +this.EXPORT_TAGS={":common":this.EXPORT,":all":MochiKit.Base.concat(this.EXPORT,this.EXPORT_OK)}; +MochiKit.Base.nameFunctions(this); +MochiKit.LoggingPane._loggingPane=null; +}; +MochiKit.LoggingPane.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.LoggingPane); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Color"); +dojo.require("MochiKit.Base"); +dojo.require("MochiKit.DOM"); +dojo.require("MochiKit.Style"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Base",[]); +JSAN.use("MochiKit.DOM",[]); +JSAN.use("MochiKit.Style",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Color depends on MochiKit.Base"; +} +try{ +if(typeof (MochiKit.DOM)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Color depends on MochiKit.DOM"; +} +try{ +if(typeof (MochiKit.Style)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Color depends on MochiKit.Style"; +} +if(typeof (MochiKit.Color)=="undefined"){ +MochiKit.Color={}; +} +MochiKit.Color.NAME="MochiKit.Color"; +MochiKit.Color.VERSION="1.4"; +MochiKit.Color.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.Color.toString=function(){ +return this.__repr__(); +}; +MochiKit.Color.Color=function(red,_479,blue,_47b){ +if(typeof (_47b)=="undefined"||_47b===null){ +_47b=1; +} +this.rgb={r:red,g:_479,b:blue,a:_47b}; +}; +MochiKit.Color.Color.prototype={__class__:MochiKit.Color.Color,colorWithAlpha:function(_47c){ +var rgb=this.rgb; +var m=MochiKit.Color; +return m.Color.fromRGB(rgb.r,rgb.g,rgb.b,_47c); +},colorWithHue:function(hue){ +var hsl=this.asHSL(); +hsl.h=hue; +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},colorWithSaturation:function(_482){ +var hsl=this.asHSL(); +hsl.s=_482; +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},colorWithLightness:function(_485){ +var hsl=this.asHSL(); +hsl.l=_485; +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},darkerColorWithLevel:function(_488){ +var hsl=this.asHSL(); +hsl.l=Math.max(hsl.l-_488,0); +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},lighterColorWithLevel:function(_48b){ +var hsl=this.asHSL(); +hsl.l=Math.min(hsl.l+_48b,1); +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},blendedColor:function(_48e,_48f){ +if(typeof (_48f)=="undefined"||_48f===null){ +_48f=0.5; +} +var sf=1-_48f; +var s=this.rgb; +var d=_48e.rgb; +var df=_48f; +return MochiKit.Color.Color.fromRGB((s.r*sf)+(d.r*df),(s.g*sf)+(d.g*df),(s.b*sf)+(d.b*df),(s.a*sf)+(d.a*df)); +},compareRGB:function(_494){ +var a=this.asRGB(); +var b=_494.asRGB(); +return MochiKit.Base.compare([a.r,a.g,a.b,a.a],[b.r,b.g,b.b,b.a]); +},isLight:function(){ +return this.asHSL().b>0.5; +},isDark:function(){ +return (!this.isLight()); +},toHSLString:function(){ +var c=this.asHSL(); +var ccc=MochiKit.Color.clampColorComponent; +var rval=this._hslString; +if(!rval){ +var mid=(ccc(c.h,360).toFixed(0)+","+ccc(c.s,100).toPrecision(4)+"%"+","+ccc(c.l,100).toPrecision(4)+"%"); +var a=c.a; +if(a>=1){ +a=1; +rval="hsl("+mid+")"; +}else{ +if(a<=0){ +a=0; +} +rval="hsla("+mid+","+a+")"; +} +this._hslString=rval; +} +return rval; +},toRGBString:function(){ +var c=this.rgb; +var ccc=MochiKit.Color.clampColorComponent; +var rval=this._rgbString; +if(!rval){ +var mid=(ccc(c.r,255).toFixed(0)+","+ccc(c.g,255).toFixed(0)+","+ccc(c.b,255).toFixed(0)); +if(c.a!=1){ +rval="rgba("+mid+","+c.a+")"; +}else{ +rval="rgb("+mid+")"; +} +this._rgbString=rval; +} +return rval; +},asRGB:function(){ +return MochiKit.Base.clone(this.rgb); +},toHexString:function(){ +var m=MochiKit.Color; +var c=this.rgb; +var ccc=MochiKit.Color.clampColorComponent; +var rval=this._hexString; +if(!rval){ +rval=("#"+m.toColorPart(ccc(c.r,255))+m.toColorPart(ccc(c.g,255))+m.toColorPart(ccc(c.b,255))); +this._hexString=rval; +} +return rval; +},asHSV:function(){ +var hsv=this.hsv; +var c=this.rgb; +if(typeof (hsv)=="undefined"||hsv===null){ +hsv=MochiKit.Color.rgbToHSV(this.rgb); +this.hsv=hsv; +} +return MochiKit.Base.clone(hsv); +},asHSL:function(){ +var hsl=this.hsl; +var c=this.rgb; +if(typeof (hsl)=="undefined"||hsl===null){ +hsl=MochiKit.Color.rgbToHSL(this.rgb); +this.hsl=hsl; +} +return MochiKit.Base.clone(hsl); +},toString:function(){ +return this.toRGBString(); +},repr:function(){ +var c=this.rgb; +var col=[c.r,c.g,c.b,c.a]; +return this.__class__.NAME+"("+col.join(", ")+")"; +}}; +MochiKit.Base.update(MochiKit.Color.Color,{fromRGB:function(red,_4ab,blue,_4ad){ +var _4ae=MochiKit.Color.Color; +if(arguments.length==1){ +var rgb=red; +red=rgb.r; +_4ab=rgb.g; +blue=rgb.b; +if(typeof (rgb.a)=="undefined"){ +_4ad=undefined; +}else{ +_4ad=rgb.a; +} +} +return new _4ae(red,_4ab,blue,_4ad); +},fromHSL:function(hue,_4b1,_4b2,_4b3){ +var m=MochiKit.Color; +return m.Color.fromRGB(m.hslToRGB.apply(m,arguments)); +},fromHSV:function(hue,_4b6,_4b7,_4b8){ +var m=MochiKit.Color; +return m.Color.fromRGB(m.hsvToRGB.apply(m,arguments)); +},fromName:function(name){ +var _4bb=MochiKit.Color.Color; +if(name.charAt(0)=="\""){ +name=name.substr(1,name.length-2); +} +var _4bc=_4bb._namedColors[name.toLowerCase()]; +if(typeof (_4bc)=="string"){ +return _4bb.fromHexString(_4bc); +}else{ +if(name=="transparent"){ +return _4bb.transparentColor(); +} +} +return null; +},fromString:function(_4bd){ +var self=MochiKit.Color.Color; +var _4bf=_4bd.substr(0,3); +if(_4bf=="rgb"){ +return self.fromRGBString(_4bd); +}else{ +if(_4bf=="hsl"){ +return self.fromHSLString(_4bd); +}else{ +if(_4bd.charAt(0)=="#"){ +return self.fromHexString(_4bd); +} +} +} +return self.fromName(_4bd); +},fromHexString:function(_4c0){ +if(_4c0.charAt(0)=="#"){ +_4c0=_4c0.substring(1); +} +var _4c1=[]; +var i,hex; +if(_4c0.length==3){ +for(i=0;i<3;i++){ +hex=_4c0.substr(i,1); +_4c1.push(parseInt(hex+hex,16)/255); +} +}else{ +for(i=0;i<6;i+=2){ +hex=_4c0.substr(i,2); +_4c1.push(parseInt(hex,16)/255); +} +} +var _4c4=MochiKit.Color.Color; +return _4c4.fromRGB.apply(_4c4,_4c1); +},_fromColorString:function(pre,_4c6,_4c7,_4c8){ +if(_4c8.indexOf(pre)===0){ +_4c8=_4c8.substring(_4c8.indexOf("(",3)+1,_4c8.length-1); +} +var _4c9=_4c8.split(/\s*,\s*/); +var _4ca=[]; +for(var i=0;i<_4c9.length;i++){ +var c=_4c9[i]; +var val; +var _4ce=c.substring(c.length-3); +if(c.charAt(c.length-1)=="%"){ +val=0.01*parseFloat(c.substring(0,c.length-1)); +}else{ +if(_4ce=="deg"){ +val=parseFloat(c)/360; +}else{ +if(_4ce=="rad"){ +val=parseFloat(c)/(Math.PI*2); +}else{ +val=_4c7[i]*parseFloat(c); +} +} +} +_4ca.push(val); +} +return this[_4c6].apply(this,_4ca); +},fromComputedStyle:function(elem,_4d0){ +var d=MochiKit.DOM; +var cls=MochiKit.Color.Color; +for(elem=d.getElement(elem);elem;elem=elem.parentNode){ +var _4d3=MochiKit.Style.getStyle.apply(d,arguments); +if(!_4d3){ +continue; +} +var _4d4=cls.fromString(_4d3); +if(!_4d4){ +break; +} +if(_4d4.asRGB().a>0){ +return _4d4; +} +} +return null; +},fromBackground:function(elem){ +var cls=MochiKit.Color.Color; +return cls.fromComputedStyle(elem,"backgroundColor","background-color")||cls.whiteColor(); +},fromText:function(elem){ +var cls=MochiKit.Color.Color; +return cls.fromComputedStyle(elem,"color","color")||cls.blackColor(); +},namedColors:function(){ +return MochiKit.Base.clone(MochiKit.Color.Color._namedColors); +}}); +MochiKit.Base.update(MochiKit.Color,{clampColorComponent:function(v,_4da){ +v*=_4da; +if(v<0){ +return 0; +}else{ +if(v>_4da){ +return _4da; +}else{ +return v; +} +} +},_hslValue:function(n1,n2,hue){ +if(hue>6){ +hue-=6; +}else{ +if(hue<0){ +hue+=6; +} +} +var val; +if(hue<1){ +val=n1+(n2-n1)*hue; +}else{ +if(hue<3){ +val=n2; +}else{ +if(hue<4){ +val=n1+(n2-n1)*(4-hue); +}else{ +val=n1; +} +} +} +return val; +},hsvToRGB:function(hue,_4e0,_4e1,_4e2){ +if(arguments.length==1){ +var hsv=hue; +hue=hsv.h; +_4e0=hsv.s; +_4e1=hsv.v; +_4e2=hsv.a; +} +var red; +var _4e5; +var blue; +if(_4e0===0){ +red=_4e1; +_4e5=_4e1; +blue=_4e1; +}else{ +var i=Math.floor(hue*6); +var f=(hue*6)-i; +var p=_4e1*(1-_4e0); +var q=_4e1*(1-(_4e0*f)); +var t=_4e1*(1-(_4e0*(1-f))); +switch(i){ +case 1: +red=q; +_4e5=_4e1; +blue=p; +break; +case 2: +red=p; +_4e5=_4e1; +blue=t; +break; +case 3: +red=p; +_4e5=q; +blue=_4e1; +break; +case 4: +red=t; +_4e5=p; +blue=_4e1; +break; +case 5: +red=_4e1; +_4e5=p; +blue=q; +break; +case 6: +case 0: +red=_4e1; +_4e5=t; +blue=p; +break; +} +} +return {r:red,g:_4e5,b:blue,a:_4e2}; +},hslToRGB:function(hue,_4ed,_4ee,_4ef){ +if(arguments.length==1){ +var hsl=hue; +hue=hsl.h; +_4ed=hsl.s; +_4ee=hsl.l; +_4ef=hsl.a; +} +var red; +var _4f2; +var blue; +if(_4ed===0){ +red=_4ee; +_4f2=_4ee; +blue=_4ee; +}else{ +var m2; +if(_4ee<=0.5){ +m2=_4ee*(1+_4ed); +}else{ +m2=_4ee+_4ed-(_4ee*_4ed); +} +var m1=(2*_4ee)-m2; +var f=MochiKit.Color._hslValue; +var h6=hue*6; +red=f(m1,m2,h6+2); +_4f2=f(m1,m2,h6); +blue=f(m1,m2,h6-2); +} +return {r:red,g:_4f2,b:blue,a:_4ef}; +},rgbToHSV:function(red,_4f9,blue,_4fb){ +if(arguments.length==1){ +var rgb=red; +red=rgb.r; +_4f9=rgb.g; +blue=rgb.b; +_4fb=rgb.a; +} +var max=Math.max(Math.max(red,_4f9),blue); +var min=Math.min(Math.min(red,_4f9),blue); +var hue; +var _500; +var _501=max; +if(min==max){ +hue=0; +_500=0; +}else{ +var _502=(max-min); +_500=_502/max; +if(red==max){ +hue=(_4f9-blue)/_502; +}else{ +if(_4f9==max){ +hue=2+((blue-red)/_502); +}else{ +hue=4+((red-_4f9)/_502); +} +} +hue/=6; +if(hue<0){ +hue+=1; +} +if(hue>1){ +hue-=1; +} +} +return {h:hue,s:_500,v:_501,a:_4fb}; +},rgbToHSL:function(red,_504,blue,_506){ +if(arguments.length==1){ +var rgb=red; +red=rgb.r; +_504=rgb.g; +blue=rgb.b; +_506=rgb.a; +} +var max=Math.max(red,Math.max(_504,blue)); +var min=Math.min(red,Math.min(_504,blue)); +var hue; +var _50b; +var _50c=(max+min)/2; +var _50d=max-min; +if(_50d===0){ +hue=0; +_50b=0; +}else{ +if(_50c<=0.5){ +_50b=_50d/(max+min); +}else{ +_50b=_50d/(2-max-min); +} +if(red==max){ +hue=(_504-blue)/_50d; +}else{ +if(_504==max){ +hue=2+((blue-red)/_50d); +}else{ +hue=4+((red-_504)/_50d); +} +} +hue/=6; +if(hue<0){ +hue+=1; +} +if(hue>1){ +hue-=1; +} +} +return {h:hue,s:_50b,l:_50c,a:_506}; +},toColorPart:function(num){ +num=Math.round(num); +var _50f=num.toString(16); +if(num<16){ +return "0"+_50f; +} +return _50f; +},__new__:function(){ +var m=MochiKit.Base; +this.Color.fromRGBString=m.bind(this.Color._fromColorString,this.Color,"rgb","fromRGB",[1/255,1/255,1/255,1]); +this.Color.fromHSLString=m.bind(this.Color._fromColorString,this.Color,"hsl","fromHSL",[1/360,0.01,0.01,1]); +var _511=1/3; +var _512={black:[0,0,0],blue:[0,0,1],brown:[0.6,0.4,0.2],cyan:[0,1,1],darkGray:[_511,_511,_511],gray:[0.5,0.5,0.5],green:[0,1,0],lightGray:[2*_511,2*_511,2*_511],magenta:[1,0,1],orange:[1,0.5,0],purple:[0.5,0,0.5],red:[1,0,0],transparent:[0,0,0,0],white:[1,1,1],yellow:[1,1,0]}; +var _513=function(name,r,g,b,a){ +var rval=this.fromRGB(r,g,b,a); +this[name]=function(){ +return rval; +}; +return rval; +}; +for(var k in _512){ +var name=k+"Color"; +var _51c=m.concat([_513,this.Color,name],_512[k]); +this.Color[name]=m.bind.apply(null,_51c); +} +var _51d=function(){ +for(var i=0;i1){ +var src=MochiKit.DOM.getElement(arguments[0]); +var sig=arguments[1]; +var obj=arguments[2]; +var func=arguments[3]; +for(var i=_55f.length-1;i>=0;i--){ +var o=_55f[i]; +if(o.source===src&&o.signal===sig&&o.objOrFunc===obj&&o.funcOrStr===func){ +self._disconnect(o); +if(!self._lock){ +_55f.splice(i,1); +}else{ +self._dirty=true; +} +return true; +} +} +}else{ +var idx=m.findIdentical(_55f,_55d); +if(idx>=0){ +self._disconnect(_55d); +if(!self._lock){ +_55f.splice(idx,1); +}else{ +self._dirty=true; +} +return true; +} +} +return false; +},disconnectAllTo:function(_568,_569){ +var self=MochiKit.Signal; +var _56b=self._observers; +var _56c=self._disconnect; +var _56d=self._lock; +var _56e=self._dirty; +if(typeof (_569)==="undefined"){ +_569=null; +} +for(var i=_56b.length-1;i>=0;i--){ +var _570=_56b[i]; +if(_570.objOrFunc===_568&&(_569===null||_570.funcOrStr===_569)){ +_56c(_570); +if(_56d){ +_56e=true; +}else{ +_56b.splice(i,1); +} +} +} +self._dirty=_56e; +},disconnectAll:function(src,sig){ +src=MochiKit.DOM.getElement(src); +var m=MochiKit.Base; +var _574=m.flattenArguments(m.extend(null,arguments,1)); +var self=MochiKit.Signal; +var _576=self._disconnect; +var _577=self._observers; +var i,_579; +var _57a=self._lock; +var _57b=self._dirty; +if(_574.length===0){ +for(i=_577.length-1;i>=0;i--){ +_579=_577[i]; +if(_579.source===src){ +_576(_579); +if(!_57a){ +_577.splice(i,1); +}else{ +_57b=true; +} +} +} +}else{ +var sigs={}; +for(i=0;i<_574.length;i++){ +sigs[_574[i]]=true; +} +for(i=_577.length-1;i>=0;i--){ +_579=_577[i]; +if(_579.source===src&&_579.signal in sigs){ +_576(_579); +if(!_57a){ +_577.splice(i,1); +}else{ +_57b=true; +} +} +} +} +self._dirty=_57b; +},signal:function(src,sig){ +var self=MochiKit.Signal; +var _580=self._observers; +src=MochiKit.DOM.getElement(src); +var args=MochiKit.Base.extend(null,arguments,2); +var _582=[]; +self._lock=true; +for(var i=0;i<_580.length;i++){ +var _584=_580[i]; +if(_584.source===src&&_584.signal===sig){ +try{ +_584.listener.apply(src,args); +} +catch(e){ +_582.push(e); +} +} +} +self._lock=false; +if(self._dirty){ +self._dirty=false; +for(var i=_580.length-1;i>=0;i--){ +if(!_580[i].connected){ +_580.splice(i,1); +} +} +} +if(_582.length==1){ +throw _582[0]; +}else{ +if(_582.length>1){ +var e=new Error("Multiple errors thrown in handling 'sig', see errors property"); +e.errors=_582; +throw e; +} +} +}}); +MochiKit.Signal.EXPORT_OK=[]; +MochiKit.Signal.EXPORT=["connect","disconnect","signal","disconnectAll","disconnectAllTo"]; +MochiKit.Signal.__new__=function(win){ +var m=MochiKit.Base; +this._document=document; +this._window=win; +this._lock=false; +this._dirty=false; +try{ +this.connect(window,"onunload",this._unloadCache); +} +catch(e){ +} +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}; +MochiKit.Signal.__new__(this); +if(MochiKit.__export__){ +connect=MochiKit.Signal.connect; +disconnect=MochiKit.Signal.disconnect; +disconnectAll=MochiKit.Signal.disconnectAll; +signal=MochiKit.Signal.signal; +} +MochiKit.Base._exportSymbols(this,MochiKit.Signal); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Position"); +dojo.require("MochiKit.Base"); +dojo.require("MochiKit.DOM"); +dojo.require("MochiKit.Style"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Base",[]); +JSAN.use("MochiKit.DOM",[]); +JSAN.use("MochiKit.Style",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.Style)=="undefined"||typeof (MochiKit.DOM)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Style depends on MochiKit.Base, MochiKit.DOM, and MochiKit.Style!"; +} +if(typeof (MochiKit.Position)=="undefined"){ +MochiKit.Position={}; +} +MochiKit.Position.NAME="MochiKit.Position"; +MochiKit.Position.VERSION="1.4"; +MochiKit.Position.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.Position.toString=function(){ +return this.__repr__(); +}; +MochiKit.Position.EXPORT_OK=[]; +MochiKit.Position.EXPORT=[]; +MochiKit.Base.update(MochiKit.Position,{includeScrollOffsets:false,prepare:function(){ +var _588=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0; +var _589=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0; +this.windowOffset=new MochiKit.Style.Coordinates(_588,_589); +},cumulativeOffset:function(_58a){ +var _58b=0; +var _58c=0; +do{ +_58b+=_58a.offsetTop||0; +_58c+=_58a.offsetLeft||0; +_58a=_58a.offsetParent; +}while(_58a); +return new MochiKit.Style.Coordinates(_58c,_58b); +},realOffset:function(_58d){ +var _58e=0; +var _58f=0; +do{ +_58e+=_58d.scrollTop||0; +_58f+=_58d.scrollLeft||0; +_58d=_58d.parentNode; +}while(_58d); +return new MochiKit.Style.Coordinates(_58f,_58e); +},within:function(_590,x,y){ +if(this.includeScrollOffsets){ +return this.withinIncludingScrolloffsets(_590,x,y); +} +this.xcomp=x; +this.ycomp=y; +this.offset=this.cumulativeOffset(_590); +if(_590.style.position=="fixed"){ +this.offset.x+=this.windowOffset.x; +this.offset.y+=this.windowOffset.y; +} +return (y>=this.offset.y&&y=this.offset.x&&x=this.offset.y&&this.ycomp=this.offset.x&&this.xcomp"+el.innerHTML+""; +},_roundTopCorners:function(el,_5c2,_5c3){ +var _5c4=this._createCorner(_5c3); +for(var i=0;i=0;i--){ +_5c9.appendChild(this._createCornerSlice(_5c7,_5c8,i,"bottom")); +} +el.style.paddingBottom=0; +el.appendChild(_5c9); +},_createCorner:function(_5cb){ +var dom=MochiKit.DOM; +return dom.DIV({style:{backgroundColor:_5cb.toString()}}); +},_createCornerSlice:function(_5cd,_5ce,n,_5d0){ +var _5d1=MochiKit.DOM.SPAN(); +var _5d2=_5d1.style; +_5d2.backgroundColor=_5cd.toString(); +_5d2.display="block"; +_5d2.height="1px"; +_5d2.overflow="hidden"; +_5d2.fontSize="1px"; +var _5d3=this._borderColor(_5cd,_5ce); +if(this.options.border&&n===0){ +_5d2.borderTopStyle="solid"; +_5d2.borderTopWidth="1px"; +_5d2.borderLeftWidth="0px"; +_5d2.borderRightWidth="0px"; +_5d2.borderBottomWidth="0px"; +_5d2.height="0px"; +_5d2.borderColor=_5d3.toString(); +}else{ +if(_5d3){ +_5d2.borderColor=_5d3.toString(); +_5d2.borderStyle="solid"; +_5d2.borderWidth="0px 1px"; +} +} +if(!this.options.compact&&(n==(this.options.numSlices-1))){ +_5d2.height="2px"; +} +this._setMargin(_5d1,n,_5d0); +this._setBorder(_5d1,n,_5d0); +return _5d1; +},_setOptions:function(_5d4){ +this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false,__unstable__wrapElement:false}; +MochiKit.Base.update(this.options,_5d4); +this.options.numSlices=(this.options.compact?2:4); +},_whichSideTop:function(){ +var _5d5=this.options.corners; +if(this._hasString(_5d5,"all","top")){ +return ""; +} +var _5d6=(_5d5.indexOf("tl")!=-1); +var _5d7=(_5d5.indexOf("tr")!=-1); +if(_5d6&&_5d7){ +return ""; +} +if(_5d6){ +return "left"; +} +if(_5d7){ +return "right"; +} +return ""; +},_whichSideBottom:function(){ +var _5d8=this.options.corners; +if(this._hasString(_5d8,"all","bottom")){ +return ""; +} +var _5d9=(_5d8.indexOf("bl")!=-1); +var _5da=(_5d8.indexOf("br")!=-1); +if(_5d9&&_5da){ +return ""; +} +if(_5d9){ +return "left"; +} +if(_5da){ +return "right"; +} +return ""; +},_borderColor:function(_5db,_5dc){ +if(_5db=="transparent"){ +return _5dc; +}else{ +if(this.options.border){ +return this.options.border; +}else{ +if(this.options.blend){ +return _5dc.blendedColor(_5db); +} +} +} +return ""; +},_setMargin:function(el,n,_5df){ +var _5e0=this._marginSize(n)+"px"; +var _5e1=(_5df=="top"?this._whichSideTop():this._whichSideBottom()); +var _5e2=el.style; +if(_5e1=="left"){ +_5e2.marginLeft=_5e0; +_5e2.marginRight="0px"; +}else{ +if(_5e1=="right"){ +_5e2.marginRight=_5e0; +_5e2.marginLeft="0px"; +}else{ +_5e2.marginLeft=_5e0; +_5e2.marginRight=_5e0; +} +} +},_setBorder:function(el,n,_5e5){ +var _5e6=this._borderSize(n)+"px"; +var _5e7=(_5e5=="top"?this._whichSideTop():this._whichSideBottom()); +var _5e8=el.style; +if(_5e7=="left"){ +_5e8.borderLeftWidth=_5e6; +_5e8.borderRightWidth="0px"; +}else{ +if(_5e7=="right"){ +_5e8.borderRightWidth=_5e6; +_5e8.borderLeftWidth="0px"; +}else{ +_5e8.borderLeftWidth=_5e6; +_5e8.borderRightWidth=_5e6; +} +} +},_marginSize:function(n){ +if(this.isTransparent){ +return 0; +} +var o=this.options; +if(o.compact&&o.blend){ +var _5eb=[1,0]; +return _5eb[n]; +}else{ +if(o.compact){ +var _5ec=[2,1]; +return _5ec[n]; +}else{ +if(o.blend){ +var _5ed=[3,2,1,0]; +return _5ed[n]; +}else{ +var _5ee=[5,3,2,1]; +return _5ee[n]; +} +} +} +},_borderSize:function(n){ +var o=this.options; +var _5f1; +if(o.compact&&(o.blend||this.isTransparent)){ +return 1; +}else{ +if(o.compact){ +_5f1=[1,0]; +}else{ +if(o.blend){ +_5f1=[2,1,1,1]; +}else{ +if(o.border){ +_5f1=[0,2,0,0]; +}else{ +if(this.isTransparent){ +_5f1=[5,3,2,1]; +}else{ +return 0; +} +} +} +} +} +return _5f1[n]; +},_hasString:function(str){ +for(var i=1;i=(_61c||i)){ +_61c=i; +} +},this.effects); +_618=_61c||_618; +break; +case "break": +ma(function(e){ +e.finalize(); +},this.effects); +break; +} +_617.startOn+=_618; +_617.finishOn+=_618; +if(!_617.options.queue.limit||this.effects.length<_617.options.queue.limit){ +this.effects.push(_617); +} +if(!this.interval){ +this.interval=this.startLoop(MochiKit.Base.bind(this.loop,this),40); +} +},startLoop:function(func,_621){ +return setInterval(func,_621); +},remove:function(_622){ +this.effects=MochiKit.Base.filter(function(e){ +return e!=_622; +},this.effects); +if(!this.effects.length){ +this.stopLoop(this.interval); +this.interval=null; +} +},stopLoop:function(_624){ +clearInterval(_624); +},loop:function(){ +var _625=new Date().getTime(); +MochiKit.Base.map(function(_626){ +_626.loop(_625); +},this.effects); +}}); +MochiKit.Visual.Queues={instances:{},get:function(_627){ +if(typeof (_627)!="string"){ +return _627; +} +if(!this.instances[_627]){ +this.instances[_627]=new MochiKit.Visual.ScopedQueue(); +} +return this.instances[_627]; +}}; +MochiKit.Visual.Queue=MochiKit.Visual.Queues.get("global"); +MochiKit.Visual.DefaultOptions={transition:MochiKit.Visual.Transitions.sinoidal,duration:1,fps:25,sync:false,from:0,to:1,delay:0,queue:"parallel"}; +MochiKit.Visual.Base=function(){ +}; +MochiKit.Visual.Base.prototype={__class__:MochiKit.Visual.Base,start:function(_628){ +var v=MochiKit.Visual; +this.options=MochiKit.Base.setdefault(_628||{},v.DefaultOptions); +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){ +v.Queues.get(typeof (this.options.queue)=="string"?"global":this.options.queue.scope).add(this); +} +},loop:function(_62a){ +if(_62a>=this.startOn){ +if(_62a>=this.finishOn){ +return this.finalize(); +} +var pos=(_62a-this.startOn)/(this.finishOn-this.startOn); +var _62c=Math.round(pos*this.options.fps*this.options.duration); +if(_62c>this.currentFrame){ +this.render(pos); +this.currentFrame=_62c; +} +} +},render:function(pos){ +if(this.state=="idle"){ +this.state="running"; +this.event("beforeSetup"); +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.event("beforeUpdate"); +this.update(pos); +this.event("afterUpdate"); +} +},cancel:function(){ +if(!this.options.sync){ +MochiKit.Visual.Queues.get(typeof (this.options.queue)=="string"?"global":this.options.queue.scope).remove(this); +} +this.state="finished"; +},finalize:function(){ +this.render(1); +this.cancel(); +this.event("beforeFinish"); +this.finish(); +this.event("afterFinish"); +},setup:function(){ +},finish:function(){ +},update:function(_62e){ +},event:function(_62f){ +if(this.options[_62f+"Internal"]){ +this.options[_62f+"Internal"](this); +} +if(this.options[_62f]){ +this.options[_62f](this); +} +},repr:function(){ +return "["+this.__class__.NAME+", options:"+MochiKit.Base.repr(this.options)+"]"; +}}; +MochiKit.Visual.Parallel=function(_630,_631){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_630,_631); +} +this.__init__(_630,_631); +}; +MochiKit.Visual.Parallel.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Parallel.prototype,{__class__:MochiKit.Visual.Parallel,__init__:function(_633,_634){ +this.effects=_633||[]; +this.start(_634); +},update:function(_635){ +MochiKit.Base.map(function(_636){ +_636.render(_635); +},this.effects); +},finish:function(){ +MochiKit.Base.map(function(_637){ +_637.finalize(); +},this.effects); +}}); +MochiKit.Visual.Opacity=function(_638,_639){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_638,_639); +} +this.__init__(_638,_639); +}; +MochiKit.Visual.Opacity.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Opacity.prototype,{__class__:MochiKit.Visual.Opacity,__init__:function(_63b,_63c){ +var b=MochiKit.Base; +var s=MochiKit.Style; +this.element=MochiKit.DOM.getElement(_63b); +if(this.element.currentStyle&&(!this.element.currentStyle.hasLayout)){ +s.setStyle(this.element,{zoom:1}); +} +_63c=b.update({from:s.getStyle(this.element,"opacity")||0,to:1},_63c||{}); +this.start(_63c); +},update:function(_63f){ +MochiKit.Style.setStyle(this.element,{"opacity":_63f}); +}}); +MochiKit.Visual.Move=function(_640,_641){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_640,_641); +} +this.__init__(_640,_641); +}; +MochiKit.Visual.Move.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Move.prototype,{__class__:MochiKit.Visual.Move,__init__:function(_643,_644){ +this.element=MochiKit.DOM.getElement(_643); +_644=MochiKit.Base.update({x:0,y:0,mode:"relative"},_644||{}); +this.start(_644); +},setup:function(){ +MochiKit.DOM.makePositioned(this.element); +var s=this.element.style; +var _646=s.visibility; +var _647=s.display; +if(_647=="none"){ +s.visibility="hidden"; +s.display=""; +} +this.originalLeft=parseFloat(MochiKit.Style.getStyle(this.element,"left")||"0"); +this.originalTop=parseFloat(MochiKit.Style.getStyle(this.element,"top")||"0"); +if(this.options.mode=="absolute"){ +this.options.x-=this.originalLeft; +this.options.y-=this.originalTop; +} +if(_647=="none"){ +s.visibility=_646; +s.display=_647; +} +},update:function(_648){ +MochiKit.Style.setStyle(this.element,{left:Math.round(this.options.x*_648+this.originalLeft)+"px",top:Math.round(this.options.y*_648+this.originalTop)+"px"}); +}}); +MochiKit.Visual.Scale=function(_649,_64a,_64b){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_649,_64a,_64b); +} +this.__init__(_649,_64a,_64b); +}; +MochiKit.Visual.Scale.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Scale.prototype,{__class__:MochiKit.Visual.Scale,__init__:function(_64d,_64e,_64f){ +this.element=MochiKit.DOM.getElement(_64d); +_64f=MochiKit.Base.update({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:_64e},_64f||{}); +this.start(_64f); +},setup:function(){ +this.restoreAfterFinish=this.options.restoreAfterFinish||false; +this.elementPositioning=MochiKit.Style.getStyle(this.element,"position"); +var ma=MochiKit.Base.map; +var b=MochiKit.Base.bind; +this.originalStyle={}; +ma(b(function(k){ +this.originalStyle[k]=this.element.style[k]; +},this),["top","left","width","height","fontSize"]); +this.originalTop=this.element.offsetTop; +this.originalLeft=this.element.offsetLeft; +var _653=MochiKit.Style.getStyle(this.element,"font-size")||"100%"; +ma(b(function(_654){ +if(_653.indexOf(_654)>0){ +this.fontSize=parseFloat(_653); +this.fontSizeType=_654; +} +},this),["em","px","%"]); +this.factor=(this.options.scaleTo-this.options.scaleFrom)/100; +if(/^content/.test(this.options.scaleMode)){ +this.dims=[this.element.scrollHeight,this.element.scrollWidth]; +}else{ +if(this.options.scaleMode=="box"){ +this.dims=[this.element.offsetHeight,this.element.offsetWidth]; +}else{ +this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth]; +} +} +},update:function(_655){ +var _656=(this.options.scaleFrom/100)+(this.factor*_655); +if(this.options.scaleContent&&this.fontSize){ +MochiKit.Style.setStyle(this.element,{fontSize:this.fontSize*_656+this.fontSizeType}); +} +this.setDimensions(this.dims[0]*_656,this.dims[1]*_656); +},finish:function(){ +if(this.restoreAfterFinish){ +MochiKit.Style.setStyle(this.element,this.originalStyle); +} +},setDimensions:function(_657,_658){ +var d={}; +var r=Math.round; +if(/MSIE/.test(navigator.userAgent)){ +r=Math.ceil; +} +if(this.options.scaleX){ +d.width=r(_658)+"px"; +} +if(this.options.scaleY){ +d.height=r(_657)+"px"; +} +if(this.options.scaleFromCenter){ +var topd=(_657-this.dims[0])/2; +var _65c=(_658-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-_65c+"px"; +} +}else{ +if(this.options.scaleY){ +d.top=-topd+"px"; +} +if(this.options.scaleX){ +d.left=-_65c+"px"; +} +} +} +MochiKit.Style.setStyle(this.element,d); +}}); +MochiKit.Visual.Highlight=function(_65d,_65e){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_65d,_65e); +} +this.__init__(_65d,_65e); +}; +MochiKit.Visual.Highlight.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Highlight.prototype,{__class__:MochiKit.Visual.Highlight,__init__:function(_660,_661){ +this.element=MochiKit.DOM.getElement(_660); +_661=MochiKit.Base.update({startcolor:"#ffff99"},_661||{}); +this.start(_661); +},setup:function(){ +var b=MochiKit.Base; +var s=MochiKit.Style; +if(s.getStyle(this.element,"display")=="none"){ +this.cancel(); +return; +} +this.oldStyle={backgroundImage:s.getStyle(this.element,"background-image")}; +s.setStyle(this.element,{backgroundImage:"none"}); +if(!this.options.endcolor){ +this.options.endcolor=MochiKit.Color.Color.fromBackground(this.element).toHexString(); +} +if(b.isUndefinedOrNull(this.options.restorecolor)){ +this.options.restorecolor=s.getStyle(this.element,"background-color"); +} +this._base=b.map(b.bind(function(i){ +return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16); +},this),[0,1,2]); +this._delta=b.map(b.bind(function(i){ +return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]; +},this),[0,1,2]); +},update:function(_666){ +var m="#"; +MochiKit.Base.map(MochiKit.Base.bind(function(i){ +m+=MochiKit.Color.toColorPart(Math.round(this._base[i]+this._delta[i]*_666)); +},this),[0,1,2]); +MochiKit.Style.setStyle(this.element,{backgroundColor:m}); +},finish:function(){ +MochiKit.Style.setStyle(this.element,MochiKit.Base.update(this.oldStyle,{backgroundColor:this.options.restorecolor})); +}}); +MochiKit.Visual.ScrollTo=function(_669,_66a){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_669,_66a); +} +this.__init__(_669,_66a); +}; +MochiKit.Visual.ScrollTo.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.ScrollTo.prototype,{__class__:MochiKit.Visual.ScrollTo,__init__:function(_66c,_66d){ +this.element=MochiKit.DOM.getElement(_66c); +this.start(_66d||{}); +},setup:function(){ +var p=MochiKit.Position; +p.prepare(); +var _66f=p.cumulativeOffset(this.element); +if(this.options.offset){ +_66f.y+=this.options.offset; +} +var max; +if(window.innerHeight){ +max=window.innerHeight-window.height; +}else{ +if(document.documentElement&&document.documentElement.clientHeight){ +max=document.documentElement.clientHeight-document.body.scrollHeight; +}else{ +if(document.body){ +max=document.body.clientHeight-document.body.scrollHeight; +} +} +} +this.scrollStart=p.windowOffset.y; +this.delta=(_66f.y>max?max:_66f.y)-this.scrollStart; +},update:function(_671){ +var p=MochiKit.Position; +p.prepare(); +window.scrollTo(p.windowOffset.x,this.scrollStart+(_671*this.delta)); +}}); +MochiKit.Visual.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; +MochiKit.Visual.Morph=function(_673,_674){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_673,_674); +} +this.__init__(_673,_674); +}; +MochiKit.Visual.Morph.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Morph.prototype,{__class__:MochiKit.Visual.Morph,__init__:function(_676,_677){ +this.element=MochiKit.DOM.getElement(_676); +this.start(_677||{}); +},setup:function(){ +var b=MochiKit.Base; +var _679=this.options.style; +this.styleStart={}; +this.styleEnd={}; +this.units={}; +var _67a,unit; +for(var s in _679){ +_67a=_679[s]; +s=b.camelize(s); +if(MochiKit.Visual.CSS_LENGTH.test(_67a)){ +var _67d=_67a.match(/^([\+\-]?[0-9\.]+)(.*)$/); +_67a=parseFloat(_67d[1]); +unit=(_67d.length==3)?_67d[2]:null; +this.styleEnd[s]=_67a; +this.units[s]=unit; +_67a=MochiKit.Style.getStyle(this.element,s); +_67d=_67a.match(/^([\+\-]?[0-9\.]+)(.*)$/); +_67a=parseFloat(_67d[1]); +this.styleStart[s]=_67a; +}else{ +var c=MochiKit.Color.Color; +_67a=c.fromString(_67a); +if(_67a){ +this.units[s]="color"; +this.styleEnd[s]=_67a.toHexString(); +_67a=MochiKit.Style.getStyle(this.element,s); +this.styleStart[s]=c.fromString(_67a).toHexString(); +this.styleStart[s]=b.map(b.bind(function(i){ +return parseInt(this.styleStart[s].slice(i*2+1,i*2+3),16); +},this),[0,1,2]); +this.styleEnd[s]=b.map(b.bind(function(i){ +return parseInt(this.styleEnd[s].slice(i*2+1,i*2+3),16); +},this),[0,1,2]); +} +} +} +},update:function(_681){ +var _682; +for(var s in this.styleStart){ +if(this.units[s]=="color"){ +var m="#"; +var _685=this.styleStart[s]; +var end=this.styleEnd[s]; +MochiKit.Base.map(MochiKit.Base.bind(function(i){ +m+=MochiKit.Color.toColorPart(Math.round(_685[i]+(end[i]-_685[i])*_681)); +},this),[0,1,2]); +this.element.style[s]=m; +}else{ +_682=this.styleStart[s]+Math.round((this.styleEnd[s]-this.styleStart[s])*_681*1000)/1000+this.units[s]; +this.element.style[s]=_682; +} +} +}}); +MochiKit.Visual.fade=function(_688,_689){ +var s=MochiKit.Style; +var _68b=s.getStyle(_688,"opacity"); +_689=MochiKit.Base.update({from:s.getStyle(_688,"opacity")||1,to:0,afterFinishInternal:function(_68c){ +if(_68c.options.to!==0){ +return; +} +s.hideElement(_68c.element); +s.setStyle(_68c.element,{"opacity":_68b}); +}},_689||{}); +return new MochiKit.Visual.Opacity(_688,_689); +}; +MochiKit.Visual.appear=function(_68d,_68e){ +var s=MochiKit.Style; +var v=MochiKit.Visual; +_68e=MochiKit.Base.update({from:(s.getStyle(_68d,"display")=="none"?0:s.getStyle(_68d,"opacity")||0),to:1,afterFinishInternal:function(_691){ +v.forceRerendering(_691.element); +},beforeSetupInternal:function(_692){ +s.setStyle(_692.element,{"opacity":_692.options.from}); +s.showElement(_692.element); +}},_68e||{}); +return new v.Opacity(_68d,_68e); +}; +MochiKit.Visual.puff=function(_693,_694){ +var s=MochiKit.Style; +var v=MochiKit.Visual; +_693=MochiKit.DOM.getElement(_693); +var _697={position:s.getStyle(_693,"position"),top:_693.style.top,left:_693.style.left,width:_693.style.width,height:_693.style.height,opacity:s.getStyle(_693,"opacity")}; +_694=MochiKit.Base.update({beforeSetupInternal:function(_698){ +MochiKit.Position.absolutize(_698.effects[0].element); +},afterFinishInternal:function(_699){ +s.hideElement(_699.effects[0].element); +s.setStyle(_699.effects[0].element,_697); +},scaleContent:true,scaleFromCenter:true},_694||{}); +return new v.Parallel([new v.Scale(_693,200,{sync:true,scaleFromCenter:_694.scaleFromCenter,scaleContent:_694.scaleContent,restoreAfterFinish:true}),new v.Opacity(_693,{sync:true,to:0})],_694); +}; +MochiKit.Visual.blindUp=function(_69a,_69b){ +var d=MochiKit.DOM; +_69a=d.getElement(_69a); +var _69d=d.makeClipping(_69a); +_69b=MochiKit.Base.update({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(_69e){ +MochiKit.Style.hideElement(_69e.element); +d.undoClipping(_69e.element,_69d); +}},_69b||{}); +return new MochiKit.Visual.Scale(_69a,0,_69b); +}; +MochiKit.Visual.blindDown=function(_69f,_6a0){ +var d=MochiKit.DOM; +var s=MochiKit.Style; +_69f=d.getElement(_69f); +var _6a3=s.getElementDimensions(_69f); +var _6a4; +_6a0=MochiKit.Base.update({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_6a3.h,originalWidth:_6a3.w},restoreAfterFinish:true,afterSetupInternal:function(_6a5){ +_6a4=d.makeClipping(_6a5.element); +s.setStyle(_6a5.element,{height:"0px"}); +s.showElement(_6a5.element); +},afterFinishInternal:function(_6a6){ +d.undoClipping(_6a6.element,_6a4); +}},_6a0||{}); +return new MochiKit.Visual.Scale(_69f,100,_6a0); +}; +MochiKit.Visual.switchOff=function(_6a7,_6a8){ +var d=MochiKit.DOM; +_6a7=d.getElement(_6a7); +var _6aa=MochiKit.Style.getStyle(_6a7,"opacity"); +var _6ab; +_6a8=MochiKit.Base.update({duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetupInternal:function(_6ac){ +d.makePositioned(_6ac.element); +_6ab=d.makeClipping(_6ac.element); +},afterFinishInternal:function(_6ad){ +MochiKit.Style.hideElement(_6ad.element); +d.undoClipping(_6ad.element,_6ab); +d.undoPositioned(_6ad.element); +MochiKit.Style.setStyle(_6ad.element,{"opacity":_6aa}); +}},_6a8||{}); +var v=MochiKit.Visual; +return new v.appear(_6a7,{duration:0.4,from:0,transition:v.Transitions.flicker,afterFinishInternal:function(_6af){ +new v.Scale(_6af.element,1,_6a8); +}}); +}; +MochiKit.Visual.dropOut=function(_6b0,_6b1){ +var d=MochiKit.DOM; +var s=MochiKit.Style; +_6b0=d.getElement(_6b0); +var _6b4={top:s.getStyle(_6b0,"top"),left:s.getStyle(_6b0,"left"),opacity:s.getStyle(_6b0,"opacity")}; +_6b1=MochiKit.Base.update({duration:0.5,distance:100,beforeSetupInternal:function(_6b5){ +d.makePositioned(_6b5.effects[0].element); +},afterFinishInternal:function(_6b6){ +s.hideElement(_6b6.effects[0].element); +d.undoPositioned(_6b6.effects[0].element); +s.setStyle(_6b6.effects[0].element,_6b4); +}},_6b1||{}); +var v=MochiKit.Visual; +return new v.Parallel([new v.Move(_6b0,{x:0,y:_6b1.distance,sync:true}),new v.Opacity(_6b0,{sync:true,to:0})],_6b1); +}; +MochiKit.Visual.shake=function(_6b8,_6b9){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var s=MochiKit.Style; +_6b8=d.getElement(_6b8); +_6b9=MochiKit.Base.update({x:-20,y:0,duration:0.05,afterFinishInternal:function(_6bd){ +d.undoPositioned(_6bd.element); +s.setStyle(_6bd.element,_6be); +}},_6b9||{}); +var _6be={top:s.getStyle(_6b8,"top"),left:s.getStyle(_6b8,"left")}; +return new v.Move(_6b8,{x:20,y:0,duration:0.05,afterFinishInternal:function(_6bf){ +new v.Move(_6bf.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(_6c0){ +new v.Move(_6c0.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(_6c1){ +new v.Move(_6c1.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(_6c2){ +new v.Move(_6c2.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(_6c3){ +new v.Move(_6c3.element,_6b9); +}}); +}}); +}}); +}}); +}}); +}; +MochiKit.Visual.slideDown=function(_6c4,_6c5){ +var d=MochiKit.DOM; +var b=MochiKit.Base; +var s=MochiKit.Style; +_6c4=d.getElement(_6c4); +if(!_6c4.firstChild){ +throw "MochiKit.Visual.slideDown must be used on a element with a child"; +} +d.removeEmptyTextNodes(_6c4); +var _6c9=s.getStyle(_6c4.firstChild,"bottom")||0; +var _6ca=s.getElementDimensions(_6c4); +var _6cb; +_6c5=b.update({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_6ca.h,originalWidth:_6ca.w},restoreAfterFinish:true,afterSetupInternal:function(_6cc){ +d.makePositioned(_6cc.element); +d.makePositioned(_6cc.element.firstChild); +if(/Opera/.test(navigator.userAgent)){ +s.setStyle(_6cc.element,{top:""}); +} +_6cb=d.makeClipping(_6cc.element); +s.setStyle(_6cc.element,{height:"0px"}); +s.showElement(_6cc.element); +},afterUpdateInternal:function(_6cd){ +s.setStyle(_6cd.element.firstChild,{bottom:(_6cd.dims[0]-_6cd.element.clientHeight)+"px"}); +},afterFinishInternal:function(_6ce){ +d.undoClipping(_6ce.element,_6cb); +if(/MSIE/.test(navigator.userAgent)){ +d.undoPositioned(_6ce.element); +d.undoPositioned(_6ce.element.firstChild); +}else{ +d.undoPositioned(_6ce.element.firstChild); +d.undoPositioned(_6ce.element); +} +s.setStyle(_6ce.element.firstChild,{bottom:_6c9}); +}},_6c5||{}); +return new MochiKit.Visual.Scale(_6c4,100,_6c5); +}; +MochiKit.Visual.slideUp=function(_6cf,_6d0){ +var d=MochiKit.DOM; +var b=MochiKit.Base; +var s=MochiKit.Style; +_6cf=d.getElement(_6cf); +if(!_6cf.firstChild){ +throw "MochiKit.Visual.slideUp must be used on a element with a child"; +} +d.removeEmptyTextNodes(_6cf); +var _6d4=s.getStyle(_6cf.firstChild,"bottom"); +var _6d5; +_6d0=b.update({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,restoreAfterFinish:true,beforeStartInternal:function(_6d6){ +d.makePositioned(_6d6.element); +d.makePositioned(_6d6.element.firstChild); +if(/Opera/.test(navigator.userAgent)){ +s.setStyle(_6d6.element,{top:""}); +} +_6d5=d.makeClipping(_6d6.element); +s.showElement(_6d6.element); +},afterUpdateInternal:function(_6d7){ +s.setStyle(_6d7.element.firstChild,{bottom:(_6d7.dims[0]-_6d7.element.clientHeight)+"px"}); +},afterFinishInternal:function(_6d8){ +s.hideElement(_6d8.element); +d.undoClipping(_6d8.element,_6d5); +d.undoPositioned(_6d8.element.firstChild); +d.undoPositioned(_6d8.element); +s.setStyle(_6d8.element.firstChild,{bottom:_6d4}); +}},_6d0||{}); +return new MochiKit.Visual.Scale(_6cf,0,_6d0); +}; +MochiKit.Visual.squish=function(_6d9,_6da){ +var d=MochiKit.DOM; +var b=MochiKit.Base; +var _6dd; +_6da=b.update({restoreAfterFinish:true,beforeSetupInternal:function(_6de){ +_6dd=d.makeClipping(_6de.element); +},afterFinishInternal:function(_6df){ +MochiKit.Style.hideElement(_6df.element); +d.undoClipping(_6df.element,_6dd); +}},_6da||{}); +return new MochiKit.Visual.Scale(_6d9,/Opera/.test(navigator.userAgent)?1:0,_6da); +}; +MochiKit.Visual.grow=function(_6e0,_6e1){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var s=MochiKit.Style; +_6e0=d.getElement(_6e0); +_6e1=MochiKit.Base.update({direction:"center",moveTransition:v.Transitions.sinoidal,scaleTransition:v.Transitions.sinoidal,opacityTransition:v.Transitions.full,scaleContent:true,scaleFromCenter:false},_6e1||{}); +var _6e5={top:_6e0.style.top,left:_6e0.style.left,height:_6e0.style.height,width:_6e0.style.width,opacity:s.getStyle(_6e0,"opacity")}; +var dims=s.getElementDimensions(_6e0); +var _6e7,_6e8; +var _6e9,_6ea; +switch(_6e1.direction){ +case "top-left": +_6e7=_6e8=_6e9=_6ea=0; +break; +case "top-right": +_6e7=dims.w; +_6e8=_6ea=0; +_6e9=-dims.w; +break; +case "bottom-left": +_6e7=_6e9=0; +_6e8=dims.h; +_6ea=-dims.h; +break; +case "bottom-right": +_6e7=dims.w; +_6e8=dims.h; +_6e9=-dims.w; +_6ea=-dims.h; +break; +case "center": +_6e7=dims.w/2; +_6e8=dims.h/2; +_6e9=-dims.w/2; +_6ea=-dims.h/2; +break; +} +var _6eb=MochiKit.Base.update({beforeSetupInternal:function(_6ec){ +s.setStyle(_6ec.effects[0].element,{height:"0px"}); +s.showElement(_6ec.effects[0].element); +},afterFinishInternal:function(_6ed){ +d.undoClipping(_6ed.effects[0].element); +d.undoPositioned(_6ed.effects[0].element); +s.setStyle(_6ed.effects[0].element,_6e5); +}},_6e1||{}); +return new v.Move(_6e0,{x:_6e7,y:_6e8,duration:0.01,beforeSetupInternal:function(_6ee){ +s.hideElement(_6ee.element); +d.makeClipping(_6ee.element); +d.makePositioned(_6ee.element); +},afterFinishInternal:function(_6ef){ +new v.Parallel([new v.Opacity(_6ef.element,{sync:true,to:1,from:0,transition:_6e1.opacityTransition}),new v.Move(_6ef.element,{x:_6e9,y:_6ea,sync:true,transition:_6e1.moveTransition}),new v.Scale(_6ef.element,100,{scaleMode:{originalHeight:dims.h,originalWidth:dims.w},sync:true,scaleFrom:/Opera/.test(navigator.userAgent)?1:0,transition:_6e1.scaleTransition,scaleContent:_6e1.scaleContent,scaleFromCenter:_6e1.scaleFromCenter,restoreAfterFinish:true})],_6eb); +}}); +}; +MochiKit.Visual.shrink=function(_6f0,_6f1){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var s=MochiKit.Style; +_6f0=d.getElement(_6f0); +_6f1=MochiKit.Base.update({direction:"center",moveTransition:v.Transitions.sinoidal,scaleTransition:v.Transitions.sinoidal,opacityTransition:v.Transitions.none,scaleContent:true,scaleFromCenter:false},_6f1||{}); +var _6f5={top:_6f0.style.top,left:_6f0.style.left,height:_6f0.style.height,width:_6f0.style.width,opacity:s.getStyle(_6f0,"opacity")}; +var dims=s.getElementDimensions(_6f0); +var _6f7,_6f8; +switch(_6f1.direction){ +case "top-left": +_6f7=_6f8=0; +break; +case "top-right": +_6f7=dims.w; +_6f8=0; +break; +case "bottom-left": +_6f7=0; +_6f8=dims.h; +break; +case "bottom-right": +_6f7=dims.w; +_6f8=dims.h; +break; +case "center": +_6f7=dims.w/2; +_6f8=dims.h/2; +break; +} +var _6f9; +var _6fa=MochiKit.Base.update({beforeStartInternal:function(_6fb){ +_6f9=d.makePositioned(_6fb.effects[0].element); +d.makeClipping(_6fb.effects[0].element); +},afterFinishInternal:function(_6fc){ +s.hideElement(_6fc.effects[0].element); +d.undoClipping(_6fc.effects[0].element,_6f9); +d.undoPositioned(_6fc.effects[0].element); +s.setStyle(_6fc.effects[0].element,_6f5); +}},_6f1||{}); +return new v.Parallel([new v.Opacity(_6f0,{sync:true,to:0,from:1,transition:_6f1.opacityTransition}),new v.Scale(_6f0,/Opera/.test(navigator.userAgent)?1:0,{sync:true,transition:_6f1.scaleTransition,scaleContent:_6f1.scaleContent,scaleFromCenter:_6f1.scaleFromCenter,restoreAfterFinish:true}),new v.Move(_6f0,{x:_6f7,y:_6f8,sync:true,transition:_6f1.moveTransition})],_6fa); +}; +MochiKit.Visual.pulsate=function(_6fd,_6fe){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var b=MochiKit.Base; +var _702=MochiKit.Style.getStyle(_6fd,"opacity"); +_6fe=b.update({duration:3,from:0,afterFinishInternal:function(_703){ +MochiKit.Style.setStyle(_703.element,{"opacity":_702}); +}},_6fe||{}); +var _704=_6fe.transition||v.Transitions.sinoidal; +var _705=b.bind(function(pos){ +return _704(1-v.Transitions.pulse(pos,_6fe.pulses)); +},_704); +b.bind(_705,_704); +return new v.Opacity(_6fd,b.update({transition:_705},_6fe)); +}; +MochiKit.Visual.fold=function(_707,_708){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var s=MochiKit.Style; +_707=d.getElement(_707); +var _70c={top:_707.style.top,left:_707.style.left,width:_707.style.width,height:_707.style.height}; +var _70d=d.makeClipping(_707); +_708=MochiKit.Base.update({scaleContent:false,scaleX:false,afterFinishInternal:function(_70e){ +new v.Scale(_707,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(_70f){ +s.hideElement(_70f.element); +d.undoClipping(_70f.element,_70d); +s.setStyle(_70f.element,_70c); +}}); +}},_708||{}); +return new v.Scale(_707,5,_708); +}; +MochiKit.Visual.Color=MochiKit.Color.Color; +MochiKit.Visual.getElementsComputedStyle=MochiKit.DOM.computedStyle; +MochiKit.Visual.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +MochiKit.Visual.EXPORT=["roundElement","roundClass","tagifyText","multiple","toggle","Parallel","Opacity","Move","Scale","Highlight","ScrollTo","Morph","fade","appear","puff","blindUp","blindDown","switchOff","dropOut","shake","slideDown","slideUp","squish","grow","shrink","pulsate","fold"]; +MochiKit.Visual.EXPORT_OK=["Base","PAIRS"]; +MochiKit.Visual.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.Visual); +if(typeof (MochiKit)=="undefined"){ +MochiKit={}; +} +if(typeof (MochiKit.MochiKit)=="undefined"){ +MochiKit.MochiKit={}; +} +MochiKit.MochiKit.NAME="MochiKit.MochiKit"; +MochiKit.MochiKit.VERSION="1.4"; +MochiKit.MochiKit.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.MochiKit.toString=function(){ +return this.__repr__(); +}; +MochiKit.MochiKit.SUBMODULES=["Base","Iter","Logging","DateTime","Format","Async","DOM","Selector","Style","LoggingPane","Color","Signal","Position","Visual"]; +if(typeof (JSAN)!="undefined"||typeof (dojo)!="undefined"){ +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.MochiKit"); +dojo.require("MochiKit.*"); +} +if(typeof (JSAN)!="undefined"){ +(function(lst){ +for(var i=0;i"); +} +} +})(); +} + + +/*** + + PlotKit.PlotKit 0.9.1 : PACKED VERSION + + THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please + diff against the source tree, not this file. + + For more information, . + + Copyright (c) 2006. Alastair Tse. + +***/ + +try{ +if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.DOM)=="undefined"||typeof (MochiKit.Color)=="undefined"||typeof (MochiKit.Format)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format}"; +} +MochiKit.Base.update(MochiKit.Color.Color.prototype,{asFillColor:function(){ +return this.lighterColorWithLevel(0.3); +},asStrokeColor:function(){ +return this.darkerColorWithLevel(0.1); +},asPointColor:function(){ +return this.lighterColorWithLevel(0.1); +}}); +if(typeof (PlotKit)=="undefined"){ +PlotKit={}; +} +PlotKit.NAME="PlotKit"; +PlotKit.VERSION="0.8"; +PlotKit.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.toString=function(){ +return this.__repr__(); +}; +if(typeof (PlotKit.Base)=="undefined"){ +PlotKit.Base={}; +} +PlotKit.Base.NAME="PlotKit.Base"; +PlotKit.Base.VERSION=PlotKit.VERSION; +PlotKit.Base.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.Base.toString=function(){ +return this.__repr__(); +}; +PlotKit.Base.usingPrototype=function(){ +try{ +return (typeof (Object.extend)=="function"); +} +catch(e){ +return false; +} +}; +MochiKit.Base.update(PlotKit.Base,{roundInterval:function(_1,_2,_3){ +var _4=MochiKit.Format.roundToFixed; +var _5=_1/_2; +return parseFloat(_4(_5,_3)); +},collapse:function(_6){ +var m=MochiKit.Base; +var _8=new Array(); +for(var i=0;i<_6.length;i++){ +_8=m.concat(_8,_6[i]); +} +if(PlotKit.Base.usingPrototype()){ +delete _8.extend; +delete _8.from; +delete _8.inspect; +} +return _8; +},uniq:function(_10){ +var m=MochiKit.Base; +if(!m.isArrayLike(_10)||(_10.length<1)){ +return new Array(); +} +var _11=new Array(); +var _12=_10[0]; +_11.push(_10[0]); +for(var i=1;i<_10.length;i++){ +if(m.compare(_10[i],_12)!=0){ +_12=_10[i]; +_11.push(_10[i]); +} +} +return _11; +},colorScheme:function(){ +var mb=MochiKit.Base; +var mc=MochiKit.Color; +var _15=["red","orange","yellow","green","cyan","blue","purple","magenta"]; +var _16=function(_17){ +return mc.Color[_17+"Color"](); +}; +return mb.map(_16,_15); +},baseDarkPrimaryColors:function(){ +var _18=MochiKit.Color.Color.fromHexString; +return [_18("#ad3f40"),_18("#ddac2c"),_18("#dfdd0c"),_18("#5276c4"),_18("#739c5a")]; +},basePrimaryColors:function(){ +var _19=MochiKit.Color.Color.fromHexString; +return [_19("#d24c4d"),_19("#f2b32f"),_19("#ece90e"),_19("#5d83da"),_19("#78a15d")]; +},baseBlueColors:function(){ +var _20=MochiKit.Color.Color.fromHexString; +return [_20("#4b6b94"),_20("#5d81b4"),_20("#acbad2")]; +},palette:function(_21,_22,_23,_24){ +var _25=MochiKit.Base.isUndefinedOrNull; +var _26=new Array(); +if(_25(_24)){ +_24=0.1; +} +if(_25(_23)){ +_23=0.4; +} +if(_25(_22)){ +_22=-0.2; +} +var _27=_22; +while(_27<=_23){ +_26.push(_27); +_27+=_24; +} +var _28=function(_29,_30){ +return _29.lighterColorWithLevel(_30); +}; +return MochiKit.Base.map(partial(_28,_21),_26); +},excanvasSupported:function(){ +if(/MSIE/.test(navigator.userAgent)&&!window.opera){ +return true; +} +return false; +},findPosX:function(obj){ +var _32=0; +if(obj.offsetParent){ +while(obj.offsetParent){ +_32+=obj.offsetLeft; +obj=obj.offsetParent; +} +}else{ +if(obj.x){ +_32+=obj.x; +} +} +return _32; +},findPosY:function(obj){ +var _33=0; +if(obj.offsetParent){ +while(obj.offsetParent){ +_33+=obj.offsetTop; +obj=obj.offsetParent; +} +}else{ +if(obj.y){ +_33+=obj.y; +} +} +return _33; +},isFuncLike:function(obj){ +return (typeof (obj)=="function"); +}}); +PlotKit.Base.map=function(fn,lst){ +if(PlotKit.Base.usingPrototype()){ +var _36=[]; +for(var x in lst){ +if(typeof (lst[x])=="function"){ +continue; +} +_36.push(fn(lst[x])); +} +return _36; +}else{ +return MochiKit.Base.map(fn,lst); +} +}; +PlotKit.Base.items=function(lst){ +if(PlotKit.Base.usingPrototype()){ +var _38=[]; +for(var x in lst){ +if(typeof (lst[x])=="function"){ +continue; +} +_38.push([x,lst[x]]); +} +return _38; +}else{ +return MochiKit.Base.items(lst); +} +}; +PlotKit.Base.keys=function(lst){ +if(PlotKit.Base.usingPrototype()){ +var _39=[]; +for(var x in lst){ +if(typeof (lst[x])=="function"){ +continue; +} +_39.push(x); +} +return _39; +}else{ +return MochiKit.Base.keys(lst); +} +}; +PlotKit.Base.baseColors=function(){ +var _40=MochiKit.Color.Color.fromHexString; +return [_40("#476fb2"),_40("#be2c2b"),_40("#85b730"),_40("#734a99"),_40("#26a1c5"),_40("#fb8707"),_40("#000000")]; +}; +PlotKit.Base.officeBaseStyle={"axisLineWidth":2,"axisLabelColor":Color.grayColor(),"axisLineColor":Color.whiteColor(),"padding":{top:5,bottom:10,left:30,right:30}}; +MochiKit.Base.update(PlotKit.Base,{officeBlue:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"backgroundColor":PlotKit.Base.baseColors()[0].lighterColorWithLevel(0.45)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeRed:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[1]),"backgroundColor":PlotKit.Base.baseColors()[1].lighterColorWithLevel(0.5)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeGreen:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[2]),"backgroundColor":PlotKit.Base.baseColors()[2].lighterColorWithLevel(0.5)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officePurple:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[3]),"backgroundColor":PlotKit.Base.baseColors()[3].lighterColorWithLevel(0.5)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeCyan:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[4]),"backgroundColor":PlotKit.Base.baseColors()[4].lighterColorWithLevel(0.5)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeOrange:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[5]),"backgroundColor":PlotKit.Base.baseColors()[5].lighterColorWithLevel(0.4)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeBlack:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[6],0,0.6),"backgroundColor":PlotKit.Base.baseColors()[6].lighterColorWithLevel(0.9)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +}}); +PlotKit.Base.EXPORT=["baseColors","collapse","colorScheme","findPosX","findPosY","officeBaseStyle","officeBlue","officeRed","officeGreen","officePurple","officeCyan","officeOrange","officeBlack","roundInterval","uniq","isFuncLike","excanvasSupported"]; +PlotKit.Base.EXPORT_OK=[]; +PlotKit.Base.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.Base.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.Base); +try{ +if(typeof (PlotKit.Base)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Base"; +} +if(typeof (PlotKit.Layout)=="undefined"){ +PlotKit.Layout={}; +} +PlotKit.Layout.NAME="PlotKit.Layout"; +PlotKit.Layout.VERSION=PlotKit.VERSION; +PlotKit.Layout.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.Layout.toString=function(){ +return this.__repr__(); +}; +PlotKit.Layout.valid_styles=["bar","line","pie","point"]; +PlotKit.Layout=function(_42,_43){ +this.options={"barWidthFillFraction":0.75,"barOrientation":"vertical","xOriginIsZero":true,"yOriginIsZero":true,"xAxis":null,"yAxis":null,"xTicks":null,"yTicks":null,"xNumberOfTicks":10,"yNumberOfTicks":5,"xTickPrecision":1,"yTickPrecision":1,"pieRadius":0.4}; +this.style=_42; +MochiKit.Base.update(this.options,_43?_43:{}); +if(!MochiKit.Base.isUndefinedOrNull(this.options.xAxis)){ +this.minxval=this.options.xAxis[0]; +this.maxxval=this.options.xAxis[1]; +this.xscale=this.maxxval-this.minxval; +}else{ +this.minxval=0; +this.maxxval=null; +this.xscale=null; +} +if(!MochiKit.Base.isUndefinedOrNull(this.options.yAxis)){ +this.minyval=this.options.yAxis[0]; +this.maxyval=this.options.yAxis[1]; +this.yscale=this.maxyval-this.minyval; +}else{ +this.minyval=0; +this.maxyval=null; +this.yscale=null; +} +this.bars=new Array(); +this.points=new Array(); +this.slices=new Array(); +this.xticks=new Array(); +this.yticks=new Array(); +this.datasets=new Array(); +this.minxdelta=0; +this.xrange=1; +this.yrange=1; +this.hitTestCache={x2maxy:null}; +}; +PlotKit.Layout.prototype.addDataset=function(_44,_45){ +this.datasets[_44]=_45; +}; +PlotKit.Layout.prototype.removeDataset=function(_46,_47){ +delete this.datasets[_46]; +}; +PlotKit.Layout.prototype.addDatasetFromTable=function(_48,_49,_50,_51,_52){ +var _53=MochiKit.Base.isUndefinedOrNull; +var _54=MochiKit.DOM.scrapeText; +var _55=MochiKit.Format.strip; +if(_53(_50)){ +_50=0; +} +if(_53(_51)){ +_51=1; +} +if(_53(_52)){ +_52=-1; +} +var _56=_49.tBodies[0].rows; +var _57=new Array(); +var _58=new Array(); +if(!_53(_56)){ +for(var i=0;i<_56.length;i++){ +_57.push([parseFloat(_55(_54(_56[i].cells[_50]))),parseFloat(_55(_54(_56[i].cells[_51])))]); +if(_52>=0){ +_58.push({v:parseFloat(_55(_54(_56[i].cells[_50]))),label:_55(_54(_56[i].cells[_52]))}); +} +} +this.addDataset(_48,_57); +if(_52>=0){ +this.options.xTicks=_58; +} +return true; +} +return false; +}; +PlotKit.Layout.prototype.evaluate=function(){ +this._evaluateLimits(); +this._evaluateScales(); +if(this.style=="bar"){ +if(this.options.barOrientation=="horizontal"){ +this._evaluateHorizBarCharts(); +}else{ +this._evaluateBarCharts(); +} +this._evaluateBarTicks(); +}else{ +if(this.style=="line"){ +this._evaluateLineCharts(); +this._evaluateLineTicks(); +}else{ +if(this.style=="pie"){ +this._evaluatePieCharts(); +this._evaluatePieTicks(); +} +} +} +}; +PlotKit.Layout.prototype.hitTest=function(x,y){ +var f=MochiKit.Format.twoDigitFloat; +if((this.style=="bar")&&this.bars&&(this.bars.length>0)){ +for(var i=0;i=bar.x)&&(x<=bar.x+bar.w)&&(y>=bar.y)&&(y-bar.y<=bar.h)){ +return bar; +} +} +}else{ +if(this.style=="line"){ +if(this.hitTestCache.x2maxy==null){ +this._regenerateHitTestCache(); +} +var _62=x/this.xscale; +var _63=this.hitTestCache.xvalues; +var _64=null; +var _65=null; +for(var i=1;i<_63.length;i++){ +if(_63[i]>_62){ +_64=_63[i-1]; +_65=_63[i]; +break; +} +} +if((_64!=null)){ +var _66=this.hitTestCache.x2maxy[_64]; +var _67=this.hitTestCache.x2maxy[_65]; +var _68=(1-y)/this.yscale; +var _69=(_67-_66)/(_65-_64); +var _70=_66+_69*(_62-_64); +if(_70>=_68){ +var obj={xval:_62,yval:_68,xafter:_65,yafter:_67,xbefore:_64,ybefore:_66,yprojected:_70}; +return obj; +} +} +}else{ +if(this.style=="pie"){ +var _71=Math.sqrt((y-0.5)*(y-0.5)+(x-0.5)*(x-0.5)); +if(_71>this.options.pieRadius){ +return null; +} +var _72=Math.atan2(y-0.5,x-0.5)-Math.PI/2; +for(var i=0;i=_72){ +return _73; +} +} +} +} +} +return null; +}; +PlotKit.Layout.prototype.rectForX=function(x){ +return null; +}; +PlotKit.Layout.prototype.angleRangeForX=function(x){ +return null; +}; +PlotKit.Layout.prototype._evaluateLimits=function(){ +var map=PlotKit.Base.map; +var _75=PlotKit.Base.items; +var _76=MochiKit.Base.itemgetter; +var _77=PlotKit.Base.collapse; +var _78=MochiKit.Base.listMin; +var _79=MochiKit.Base.listMax; +var _80=MochiKit.Base.isUndefinedOrNull; +var all=_77(map(_76(1),_75(this.datasets))); +if(_80(this.options.xAxis)){ +if(this.options.xOriginIsZero){ +this.minxval=0; +}else{ +this.minxval=_78(map(parseFloat,map(_76(0),all))); +} +this.maxxval=_79(map(parseFloat,map(_76(0),all))); +}else{ +this.minxval=this.options.xAxis[0]; +this.maxxval=this.options.xAxis[1]; +this.xscale=this.maxval-this.minxval; +} +if(_80(this.options.yAxis)){ +if(this.options.yOriginIsZero){ +this.minyval=0; +}else{ +this.minyval=_78(map(parseFloat,map(_76(1),all))); +} +this.maxyval=_79(map(parseFloat,map(_76(1),all))); +}else{ +this.minyval=this.options.yAxis[0]; +this.maxyval=this.options.yAxis[1]; +this.yscale=this.maxyval-this.minyval; +} +}; +PlotKit.Layout.prototype._evaluateScales=function(){ +var _82=MochiKit.Base.isUndefinedOrNull; +this.xrange=this.maxxval-this.minxval; +if(this.xrange==0){ +this.xscale=1; +}else{ +this.xscale=1/this.xrange; +} +this.yrange=this.maxyval-this.minyval; +if(this.yrange==0){ +this.yscale=1; +}else{ +this.yscale=1/this.yrange; +} +}; +PlotKit.Layout.prototype._uniqueXValues=function(){ +var _83=PlotKit.Base.collapse; +var map=PlotKit.Base.map; +var _84=PlotKit.Base.uniq; +var _85=MochiKit.Base.itemgetter; +var _86=PlotKit.Base.items; +var _87=map(parseFloat,map(_85(0),_83(map(_85(1),_86(this.datasets))))); +_87.sort(MochiKit.Base.compare); +return _84(_87); +}; +PlotKit.Layout.prototype._evaluateBarCharts=function(){ +var _88=PlotKit.Base.items; +var _89=_88(this.datasets).length; +var _90=10000000; +var _91=this._uniqueXValues(); +for(var i=1;i<_91.length;i++){ +_90=Math.min(Math.abs(_91[i]-_91[i-1]),_90); +} +var _92=0; +var _93=0; +var _94=0; +if(_91.length==1){ +_90=1; +this.xscale=1; +this.minxval=_91[0]; +_92=1*this.options.barWidthFillFraction; +_93=_92/_89; +_94=(1-this.options.barWidthFillFraction)/2; +}else{ +if(this.xrange==1){ +this.xscale=0.5; +}else{ +if(this.xrange==2){ +this.xscale=1/3; +}else{ +this.xscale=(1-_90/this.xrange)/this.xrange; +} +} +_92=_90*this.xscale*this.options.barWidthFillFraction; +_93=_92/_89; +_94=_90*this.xscale*(1-this.options.barWidthFillFraction)/2; +} +this.minxdelta=_90; +this.bars=new Array(); +var i=0; +for(var _95 in this.datasets){ +var _96=this.datasets[_95]; +if(PlotKit.Base.isFuncLike(_96)){ +continue; +} +for(var j=0;j<_96.length;j++){ +var _98=_96[j]; +var _99={x:((parseFloat(_98[0])-this.minxval)*this.xscale)+(i*_93)+_94,y:1-((parseFloat(_98[1])-this.minyval)*this.yscale),w:_93,h:((parseFloat(_98[1])-this.minyval)*this.yscale),xval:parseFloat(_98[0]),yval:parseFloat(_98[1]),name:_95}; +if((_99.x>=0)&&(_99.x<=1)&&(_99.y>=0)&&(_99.y<=1)){ +this.bars.push(_99); +} +} +i++; +} +}; +PlotKit.Layout.prototype._evaluateHorizBarCharts=function(){ +var _100=PlotKit.Base.items; +var _101=_100(this.datasets).length; +var _102=10000000; +var _103=this._uniqueXValues(); +for(var i=1;i<_103.length;i++){ +_102=Math.min(Math.abs(_103[i]-_103[i-1]),_102); +} +var _104=0; +var _105=0; +var _106=0; +if(_103.length==1){ +_102=1; +this.xscale=1; +this.minxval=_103[0]; +_104=1*this.options.barWidthFillFraction; +_105=_104/_101; +_106=(1-this.options.barWidthFillFraction)/2; +}else{ +this.xscale=(1-_102/this.xrange)/this.xrange; +_104=_102*this.xscale*this.options.barWidthFillFraction; +_105=_104/_101; +_106=_102*this.xscale*(1-this.options.barWidthFillFraction)/2; +} +this.minxdelta=_102; +this.bars=new Array(); +var i=0; +for(var _107 in this.datasets){ +var _108=this.datasets[_107]; +if(PlotKit.Base.isFuncLike(_108)){ +continue; +} +for(var j=0;j<_108.length;j++){ +var item=_108[j]; +var rect={y:((parseFloat(item[0])-this.minxval)*this.xscale)+(i*_105)+_106,x:0,h:_105,w:((parseFloat(item[1])-this.minyval)*this.yscale),xval:parseFloat(item[0]),yval:parseFloat(item[1]),name:_107}; +if(rect.y<=0){ +rect.y=0; +} +if(rect.y>=1){ +rect.y=1; +} +if((rect.x>=0)&&(rect.x<=1)){ +this.bars.push(rect); +} +} +i++; +} +}; +PlotKit.Layout.prototype._evaluateLineCharts=function(){ +var _111=PlotKit.Base.items; +var _112=_111(this.datasets).length; +this.points=new Array(); +var i=0; +for(var _113 in this.datasets){ +var _114=this.datasets[_113]; +if(PlotKit.Base.isFuncLike(_114)){ +continue; +} +_114.sort(function(a,b){ +return compare(parseFloat(a[0]),parseFloat(b[0])); +}); +for(var j=0;j<_114.length;j++){ +var item=_114[j]; +var _117={x:((parseFloat(item[0])-this.minxval)*this.xscale),y:1-((parseFloat(item[1])-this.minyval)*this.yscale),xval:parseFloat(item[0]),yval:parseFloat(item[1]),name:_113}; +if(_117.y<=0){ +_117.y=0; +} +if(_117.y>=1){ +_117.y=1; +} +if((_117.x>=0)&&(_117.x<=1)){ +this.points.push(_117); +} +} +i++; +} +}; +PlotKit.Layout.prototype._evaluatePieCharts=function(){ +var _118=PlotKit.Base.items; +var sum=MochiKit.Iter.sum; +var _120=MochiKit.Base.itemgetter; +var _121=_118(this.datasets).length; +var _122=_118(this.datasets)[0][1]; +var _123=sum(map(_120(1),_122)); +this.slices=new Array(); +var _124=0; +for(var i=0;i<_122.length;i++){ +var _125=_122[i][1]/_123; +var _126=_124*Math.PI*2; +var _127=(_124+_125)*Math.PI*2; +var _128={fraction:_125,xval:_122[i][0],yval:_122[i][1],startAngle:_126,endAngle:_127}; +if(_122[i][1]!=0){ +this.slices.push(_128); +} +_124+=_125; +} +}; +PlotKit.Layout.prototype._evaluateLineTicksForXAxis=function(){ +var _129=MochiKit.Base.isUndefinedOrNull; +if(this.options.xTicks){ +this.xticks=new Array(); +var _130=function(tick){ +var _132=tick.label; +if(_129(_132)){ +_132=tick.v.toString(); +} +var pos=this.xscale*(tick.v-this.minxval); +if((pos>=0)&&(pos<=1)){ +this.xticks.push([pos,_132]); +} +}; +MochiKit.Iter.forEach(this.options.xTicks,bind(_130,this)); +}else{ +if(this.options.xNumberOfTicks){ +var _134=this._uniqueXValues(); +var _135=this.xrange/this.options.xNumberOfTicks; +var _136=0; +this.xticks=new Array(); +for(var i=0;i<=_134.length;i++){ +if((_134[i]-this.minxval)>=(_136*_135)){ +var pos=this.xscale*(_134[i]-this.minxval); +if((pos>1)||(pos<0)){ +continue; +} +this.xticks.push([pos,_134[i]]); +_136++; +} +if(_136>this.options.xNumberOfTicks){ +break; +} +} +} +} +}; +PlotKit.Layout.prototype._evaluateLineTicksForYAxis=function(){ +var _137=MochiKit.Base.isUndefinedOrNull; +if(this.options.yTicks){ +this.yticks=new Array(); +var _138=function(tick){ +var _139=tick.label; +if(_137(_139)){ +_139=tick.v.toString(); +} +var pos=1-(this.yscale*(tick.v-this.minyval)); +if((pos>=0)&&(pos<=1)){ +this.yticks.push([pos,_139]); +} +}; +MochiKit.Iter.forEach(this.options.yTicks,bind(_138,this)); +}else{ +if(this.options.yNumberOfTicks){ +this.yticks=new Array(); +var _140=PlotKit.Base.roundInterval; +var prec=this.options.yTickPrecision; +var _142=_140(this.yrange,this.options.yNumberOfTicks,prec); +for(var i=0;i<=this.options.yNumberOfTicks;i++){ +var yval=this.minyval+(i*_142); +var pos=1-((yval-this.minyval)*this.yscale); +if((pos>1)||(pos<0)){ +continue; +} +this.yticks.push([pos,MochiKit.Format.roundToFixed(yval,prec)]); +} +} +} +}; +PlotKit.Layout.prototype._evaluateLineTicks=function(){ +this._evaluateLineTicksForXAxis(); +this._evaluateLineTicksForYAxis(); +}; +PlotKit.Layout.prototype._evaluateBarTicks=function(){ +this._evaluateLineTicks(); +var _144=function(tick){ +return [tick[0]+(this.minxdelta*this.xscale)/2,tick[1]]; +}; +this.xticks=MochiKit.Base.map(bind(_144,this),this.xticks); +if(this.options.barOrientation=="horizontal"){ +var _145=this.xticks; +this.xticks=this.yticks; +this.yticks=_145; +var _146=function(tick){ +return [1-tick[0],tick[1]]; +}; +this.xticks=MochiKit.Base.map(_146,this.xticks); +} +}; +PlotKit.Layout.prototype._evaluatePieTicks=function(){ +var _147=MochiKit.Base.isUndefinedOrNull; +var _148=MochiKit.Format.numberFormatter("#%"); +this.xticks=new Array(); +if(this.options.xTicks){ +var _149=new Array(); +for(var i=0;i0){ +this.__init__(_158,_159,_160); +} +}; +PlotKit.CanvasRenderer.prototype.__init__=function(_161,_162,_163){ +var _164=MochiKit.Base.isUndefinedOrNull; +var _165=MochiKit.Color.Color; +this.options={"drawBackground":true,"backgroundColor":_165.whiteColor(),"padding":{left:30,right:30,top:5,bottom:10},"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"strokeColor":_165.whiteColor(),"strokeColorTransform":"asStrokeColor","strokeWidth":0.5,"shouldFill":true,"shouldStroke":true,"drawXAxis":true,"drawYAxis":true,"axisLineColor":_165.blackColor(),"axisLineWidth":0.5,"axisTickSize":3,"axisLabelColor":_165.blackColor(),"axisLabelFont":"Arial","axisLabelFontSize":9,"axisLabelWidth":50,"pieRadius":0.4,"enableEvents":true}; +MochiKit.Base.update(this.options,_163?_163:{}); +this.layout=_162; +this.element=MochiKit.DOM.getElement(_161); +this.container=this.element.parentNode; +this.isIE=PlotKit.Base.excanvasSupported(); +if(this.isIE&&!_164(G_vmlCanvasManager)){ +this.IEDelay=0.5; +this.maxTries=5; +this.renderDelay=null; +this.clearDelay=null; +this.element=G_vmlCanvasManager.initElement(this.element); +} +this.height=this.element.height; +this.width=this.element.width; +if(_164(this.element)){ +throw "CanvasRenderer() - passed canvas is not found"; +} +if(!this.isIE&&!(PlotKit.CanvasRenderer.isSupported(this.element))){ +throw "CanvasRenderer() - Canvas is not supported."; +} +if(_164(this.container)||(this.container.nodeName.toLowerCase()!="div")){ +throw "CanvasRenderer() - needs to be enclosed in
"; +} +this.xlabels=new Array(); +this.ylabels=new Array(); +this.isFirstRender=true; +this.area={x:this.options.padding.left,y:this.options.padding.top,w:this.width-this.options.padding.left-this.options.padding.right,h:this.height-this.options.padding.top-this.options.padding.bottom}; +MochiKit.DOM.updateNodeAttributes(this.container,{"style":{"position":"relative","width":this.width+"px"}}); +}; +PlotKit.CanvasRenderer.prototype.render=function(){ +if(this.isIE){ +try{ +if(this.renderDelay){ +this.renderDelay.cancel(); +this.renderDelay=null; +} +var _166=this.element.getContext("2d"); +} +catch(e){ +this.isFirstRender=false; +if(this.maxTries-->0){ +this.renderDelay=MochiKit.Async.wait(this.IEDelay); +this.renderDelay.addCallback(bind(this.render,this)); +} +return; +} +} +if(this.options.drawBackground){ +this._renderBackground(); +} +if(this.layout.style=="bar"){ +this._renderBarChart(); +this._renderBarAxis(); +}else{ +if(this.layout.style=="pie"){ +this._renderPieChart(); +this._renderPieAxis(); +}else{ +if(this.layout.style=="line"){ +this._renderLineChart(); +this._renderLineAxis(); +} +} +} +}; +PlotKit.CanvasRenderer.prototype._renderBarChartWrap=function(data,_168){ +var _169=this.element.getContext("2d"); +var _170=this.options.colorScheme.length; +var _171=this.options.colorScheme; +var _172=MochiKit.Base.keys(this.layout.datasets); +var _173=_172.length; +for(var i=0;i<_173;i++){ +var _174=_172[i]; +var _175=_171[i%_170]; +_169.save(); +_169.fillStyle=_175.toRGBString(); +if(this.options.strokeColor){ +_169.strokeStyle=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_169.strokeStyle=_175[this.options.strokeColorTransform]().toRGBString(); +} +} +_169.lineWidth=this.options.strokeWidth; +var _176=function(obj){ +if(obj.name==_174){ +_168(_169,obj); +} +}; +MochiKit.Iter.forEach(data,bind(_176,this)); +_169.restore(); +} +}; +PlotKit.CanvasRenderer.prototype._renderBarChart=function(){ +var bind=MochiKit.Base.bind; +var _178=function(_179,bar){ +var x=this.area.w*bar.x+this.area.x; +var y=this.area.h*bar.y+this.area.y; +var w=this.area.w*bar.w; +var h=this.area.h*bar.h; +if((w<1)||(h<1)){ +return; +} +if(this.options.shouldFill){ +_179.fillRect(x,y,w,h); +} +if(this.options.shouldStroke){ +_179.strokeRect(x,y,w,h); +} +}; +this._renderBarChartWrap(this.layout.bars,bind(_178,this)); +}; +PlotKit.CanvasRenderer.prototype._renderLineChart=function(){ +var _182=this.element.getContext("2d"); +var _183=this.options.colorScheme.length; +var _184=this.options.colorScheme; +var _185=MochiKit.Base.keys(this.layout.datasets); +var _186=_185.length; +var bind=MochiKit.Base.bind; +var _187=MochiKit.Base.partial; +for(var i=0;i<_186;i++){ +var _188=_185[i]; +var _189=_184[i%_183]; +var _190=this.options.strokeColorTransform; +_182.save(); +_182.fillStyle=_189.toRGBString(); +if(this.options.strokeColor){ +_182.strokeStyle=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_182.strokeStyle=_189[_190]().toRGBString(); +} +} +_182.lineWidth=this.options.strokeWidth; +var _191=function(ctx){ +ctx.beginPath(); +ctx.moveTo(this.area.x,this.area.y+this.area.h); +var _193=function(ctx_,_195){ +if(_195.name==_188){ +ctx_.lineTo(this.area.w*_195.x+this.area.x,this.area.h*_195.y+this.area.y); +} +}; +MochiKit.Iter.forEach(this.layout.points,_187(_193,ctx),this); +ctx.lineTo(this.area.w+this.area.x,this.area.h+this.area.y); +ctx.lineTo(this.area.x,this.area.y+this.area.h); +ctx.closePath(); +}; +if(this.options.shouldFill){ +bind(_191,this)(_182); +_182.fill(); +} +if(this.options.shouldStroke){ +bind(_191,this)(_182); +_182.stroke(); +} +_182.restore(); +} +}; +PlotKit.CanvasRenderer.prototype._renderPieChart=function(){ +var _196=this.element.getContext("2d"); +var _197=this.options.colorScheme.length; +var _198=this.layout.slices; +var _199=this.area.x+this.area.w*0.5; +var _200=this.area.y+this.area.h*0.5; +var _201=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius); +if(this.isIE){ +_199=parseInt(_199); +_200=parseInt(_200); +_201=parseInt(_201); +} +for(var i=0;i<_198.length;i++){ +var _202=this.options.colorScheme[i%_197]; +_196.save(); +_196.fillStyle=_202.toRGBString(); +var _203=function(){ +_196.beginPath(); +_196.moveTo(_199,_200); +_196.arc(_199,_200,_201,_198[i].startAngle-Math.PI/2,_198[i].endAngle-Math.PI/2,false); +_196.lineTo(_199,_200); +_196.closePath(); +}; +if(Math.abs(_198[i].startAngle-_198[i].endAngle)>0.001){ +if(this.options.shouldFill){ +_203(); +_196.fill(); +} +if(this.options.shouldStroke){ +_203(); +_196.lineWidth=this.options.strokeWidth; +if(this.options.strokeColor){ +_196.strokeStyle=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_196.strokeStyle=_202[this.options.strokeColorTransform]().toRGBString(); +} +} +_196.stroke(); +} +} +_196.restore(); +} +}; +PlotKit.CanvasRenderer.prototype._renderBarAxis=function(){ +this._renderAxis(); +}; +PlotKit.CanvasRenderer.prototype._renderLineAxis=function(){ +this._renderAxis(); +}; +PlotKit.CanvasRenderer.prototype._renderAxis=function(){ +if(!this.options.drawXAxis&&!this.options.drawYAxis){ +return; +} +var _204=this.element.getContext("2d"); +var _205={"style":{"position":"absolute","fontSize":this.options.axisLabelFontSize+"px","zIndex":10,"color":this.options.axisLabelColor.toRGBString(),"width":this.options.axisLabelWidth+"px","overflow":"hidden"}}; +_204.save(); +_204.strokeStyle=this.options.axisLineColor.toRGBString(); +_204.lineWidth=this.options.axisLineWidth; +if(this.options.drawYAxis){ +if(this.layout.yticks){ +var _206=function(tick){ +if(typeof (tick)=="function"){ +return; +} +var x=this.area.x; +var y=this.area.y+tick[0]*this.area.h; +_204.beginPath(); +_204.moveTo(x,y); +_204.lineTo(x-this.options.axisTickSize,y); +_204.closePath(); +_204.stroke(); +var _207=DIV(_205,tick[1]); +_207.style.top=(y-this.options.axisLabelFontSize)+"px"; +_207.style.left=(x-this.options.padding.left-this.options.axisTickSize)+"px"; +_207.style.textAlign="right"; +_207.style.width=(this.options.padding.left-this.options.axisTickSize*2)+"px"; +MochiKit.DOM.appendChildNodes(this.container,_207); +this.ylabels.push(_207); +}; +MochiKit.Iter.forEach(this.layout.yticks,bind(_206,this)); +} +_204.beginPath(); +_204.moveTo(this.area.x,this.area.y); +_204.lineTo(this.area.x,this.area.y+this.area.h); +_204.closePath(); +_204.stroke(); +} +if(this.options.drawXAxis){ +if(this.layout.xticks){ +var _206=function(tick){ +if(typeof (dataset)=="function"){ +return; +} +var x=this.area.x+tick[0]*this.area.w; +var y=this.area.y+this.area.h; +_204.beginPath(); +_204.moveTo(x,y); +_204.lineTo(x,y+this.options.axisTickSize); +_204.closePath(); +_204.stroke(); +var _208=DIV(_205,tick[1]); +_208.style.top=(y+this.options.axisTickSize)+"px"; +_208.style.left=(x-this.options.axisLabelWidth/2)+"px"; +_208.style.textAlign="center"; +_208.style.width=this.options.axisLabelWidth+"px"; +MochiKit.DOM.appendChildNodes(this.container,_208); +this.xlabels.push(_208); +}; +MochiKit.Iter.forEach(this.layout.xticks,bind(_206,this)); +} +_204.beginPath(); +_204.moveTo(this.area.x,this.area.y+this.area.h); +_204.lineTo(this.area.x+this.area.w,this.area.y+this.area.h); +_204.closePath(); +_204.stroke(); +} +_204.restore(); +}; +PlotKit.CanvasRenderer.prototype._renderPieAxis=function(){ +if(!this.options.drawXAxis){ +return; +} +if(this.layout.xticks){ +var _209=new Array(); +for(var i=0;iMath.PI*2){ +_216=_216-Math.PI*2; +}else{ +if(_216<0){ +_216=_216+Math.PI*2; +} +} +var _217=_210+Math.sin(_216)*(_212+10); +var _218=_211-Math.cos(_216)*(_212+10); +var _219={"position":"absolute","zIndex":11,"width":_213+"px","fontSize":this.options.axisLabelFontSize+"px","overflow":"hidden","color":this.options.axisLabelColor.toHexString()}; +if(_216<=Math.PI*0.5){ +_219["textAlign"]="left"; +_219["verticalAlign"]="top"; +_219["left"]=_217+"px"; +_219["top"]=(_218-this.options.axisLabelFontSize)+"px"; +}else{ +if((_216>Math.PI*0.5)&&(_216<=Math.PI)){ +_219["textAlign"]="left"; +_219["verticalAlign"]="bottom"; +_219["left"]=_217+"px"; +_219["top"]=_218+"px"; +}else{ +if((_216>Math.PI)&&(_216<=Math.PI*1.5)){ +_219["textAlign"]="right"; +_219["verticalAlign"]="bottom"; +_219["left"]=(_217-_213)+"px"; +_219["top"]=_218+"px"; +}else{ +_219["textAlign"]="right"; +_219["verticalAlign"]="bottom"; +_219["left"]=(_217-_213)+"px"; +_219["top"]=(_218-this.options.axisLabelFontSize)+"px"; +} +} +} +var _220=DIV({"style":_219},this.layout.xticks[i][1]); +this.xlabels.push(_220); +MochiKit.DOM.appendChildNodes(this.container,_220); +} +} +}; +PlotKit.CanvasRenderer.prototype._renderBackground=function(){ +var _221=this.element.getContext("2d"); +_221.save(); +_221.fillStyle=this.options.backgroundColor.toRGBString(); +_221.fillRect(0,0,this.width,this.height); +_221.restore(); +}; +PlotKit.CanvasRenderer.prototype.clear=function(){ +if(this.isIE){ +try{ +if(this.clearDelay){ +this.clearDelay.cancel(); +this.clearDelay=null; +} +var _222=this.element.getContext("2d"); +} +catch(e){ +this.isFirstRender=false; +this.clearDelay=MochiKit.Async.wait(this.IEDelay); +this.clearDelay.addCallback(bind(this.clear,this)); +return; +} +} +var _222=this.element.getContext("2d"); +_222.clearRect(0,0,this.width,this.height); +MochiKit.Iter.forEach(this.xlabels,MochiKit.DOM.removeElement); +MochiKit.Iter.forEach(this.ylabels,MochiKit.DOM.removeElement); +this.xlabels=new Array(); +this.ylabels=new Array(); +}; +PlotKit.CanvasRenderer.prototype._initialiseEvents=function(){ +var _223=MochiKit.Signal.connect; +var bind=MochiKit.Base.bind; +_223(this.element,"onclick",bind(this.onclick,this)); +}; +PlotKit.CanvasRenderer.prototype._resolveObject=function(e){ +var x=(e.mouse().page.x-PlotKit.Base.findPosX(this.element)-this.area.x)/this.area.w; +var y=(e.mouse().page.y-PlotKit.Base.findPosY(this.element)-this.area.y)/this.area.h; +var _225=this.layout.hitTest(x,y); +if(_225){ +return _225; +} +return null; +}; +PlotKit.CanvasRenderer.prototype._createEventObject=function(_226,e){ +if(_226==null){ +return null; +} +e.chart=_226; +return e; +}; +PlotKit.CanvasRenderer.prototype.onclick=function(e){ +var _227=this._resolveObject(e); +var _228=this._createEventObject(_227,e); +if(_228!=null){ +MochiKit.Signal.signal(this,"onclick",_228); +} +}; +PlotKit.CanvasRenderer.prototype.onmouseover=function(e){ +var _229=this._resolveObject(e); +var _230=this._createEventObject(_229,e); +if(_230!=null){ +signal(this,"onmouseover",_230); +} +}; +PlotKit.CanvasRenderer.prototype.onmouseout=function(e){ +var _231=this._resolveObject(e); +var _232=this._createEventObject(_231,e); +if(_232==null){ +signal(this,"onmouseout",e); +}else{ +signal(this,"onmouseout",_232); +} +}; +PlotKit.CanvasRenderer.prototype.onmousemove=function(e){ +var _233=this._resolveObject(e); +var _234=this._createEventObject(_233,e); +if((_233==null)&&(this.event_isinside==null)){ +return; +} +if((_233!=null)&&(this.event_isinside==null)){ +signal(this,"onmouseover",_234); +} +if((_233==null)&&(this.event_isinside!=null)){ +signal(this,"onmouseout",_234); +} +if((_233!=null)&&(this.event_isinside!=null)){ +signal(this,"onmousemove",_234); +} +this.event_isinside=_233; +}; +PlotKit.CanvasRenderer.isSupported=function(_235){ +var _236=null; +try{ +if(MochiKit.Base.isUndefinedOrNull(_235)){ +_236=MochiKit.DOM.CANVAS({}); +}else{ +_236=MochiKit.DOM.getElement(_235); +} +var _237=_236.getContext("2d"); +} +catch(e){ +var ie=navigator.appVersion.match(/MSIE (\d\.\d)/); +var _239=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1); +if((!ie)||(ie[1]<6)||(_239)){ +return false; +} +return true; +} +return true; +}; +PlotKit.Canvas={}; +PlotKit.Canvas.CanvasRenderer=PlotKit.CanvasRenderer; +PlotKit.Canvas.EXPORT=["CanvasRenderer"]; +PlotKit.Canvas.EXPORT_OK=["CanvasRenderer"]; +PlotKit.Canvas.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.Canvas.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.Canvas); +try{ +if(typeof (PlotKit.Layout)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Layout"; +} +PlotKit.SVGRenderer=function(_240,_241,_242){ +if(arguments.length>0){ +this.__init__(_240,_241,_242); +} +}; +PlotKit.SVGRenderer.NAME="PlotKit.SVGRenderer"; +PlotKit.SVGRenderer.VERSION=PlotKit.VERSION; +PlotKit.SVGRenderer.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.SVGRenderer.toString=function(){ +return this.__repr__(); +}; +PlotKit.SVGRenderer.SVGNS="http://www.w3.org/2000/svg"; +PlotKit.SVGRenderer.prototype.__init__=function(_243,_244,_245){ +var _246=MochiKit.Base.isUndefinedOrNull; +this.options={"drawBackground":true,"backgroundColor":Color.whiteColor(),"padding":{left:30,right:30,top:5,bottom:10},"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[1]),"strokeColor":Color.whiteColor(),"strokeColorTransform":"asStrokeColor","strokeWidth":0.5,"shouldFill":true,"shouldStroke":true,"drawXAxis":true,"drawYAxis":true,"axisLineColor":Color.blackColor(),"axisLineWidth":0.5,"axisTickSize":3,"axisLabelColor":Color.blackColor(),"axisLabelFont":"Arial","axisLabelFontSize":9,"axisLabelWidth":50,"axisLabelUseDiv":true,"pieRadius":0.4,"enableEvents":true}; +MochiKit.Base.update(this.options,_245?_245:{}); +this.layout=_244; +this.element=MochiKit.DOM.getElement(_243); +this.container=this.element.parentNode; +this.height=parseInt(this.element.getAttribute("height")); +this.width=parseInt(this.element.getAttribute("width")); +this.document=document; +this.root=this.element; +try{ +this.document=this.element.getSVGDocument(); +this.root=_246(this.document.documentElement)?this.element:this.document.documentElement; +} +catch(e){ +} +this.element.style.zIndex=1; +if(_246(this.element)){ +throw "SVGRenderer() - passed SVG object is not found"; +} +if(_246(this.container)||this.container.nodeName.toLowerCase()!="div"){ +throw "SVGRenderer() - No DIV's around the SVG."; +} +this.xlabels=new Array(); +this.ylabels=new Array(); +this.defs=this.createSVGElement("defs"); +this.area={x:this.options.padding.left,y:this.options.padding.top,w:this.width-this.options.padding.left-this.options.padding.right,h:this.height-this.options.padding.top-this.options.padding.bottom}; +MochiKit.DOM.updateNodeAttributes(this.container,{"style":{"position":"relative","width":this.width+"px"}}); +}; +PlotKit.SVGRenderer.prototype.render=function(){ +if(this.options.drawBackground){ +this._renderBackground(); +} +if(this.layout.style=="bar"){ +this._renderBarChart(); +this._renderBarAxis(); +}else{ +if(this.layout.style=="pie"){ +this._renderPieChart(); +this._renderPieAxis(); +}else{ +if(this.layout.style=="line"){ +this._renderLineChart(); +this._renderLineAxis(); +} +} +} +}; +PlotKit.SVGRenderer.prototype._renderBarOrLine=function(data,_247,_248,_249){ +var _250=this.options.colorScheme.length; +var _251=this.options.colorScheme; +var _252=MochiKit.Base.keys(this.layout.datasets); +var _253=_252.length; +for(var i=0;i<_253;i++){ +var _254=_252[i]; +var _255=new Array(); +var _256=_251[i%_250]; +if(this.options.shouldFill){ +_255["fill"]=_256.toRGBString(); +}else{ +_255["fill"]="none"; +} +if(this.options.shouldStroke&&(this.options.strokeColor||this.options.strokeColorTransform)){ +if(this.options.strokeColor){ +_255["stroke"]=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_255["stroke"]=_256[this.options.strokeColorTransform]().toRGBString(); +} +} +_255["strokeWidth"]=this.options.strokeWidth; +} +if(_248){ +_248(_255); +} +var _257=function(obj){ +if(obj.name==_254){ +_247(_255,obj); +} +}; +MochiKit.Iter.forEach(data,bind(_257,this)); +if(_249){ +_249(_255); +} +} +}; +PlotKit.SVGRenderer.prototype._renderBarChart=function(){ +var bind=MochiKit.Base.bind; +var _258=function(_259,bar){ +var x=this.area.w*bar.x+this.area.x; +var y=this.area.h*bar.y+this.area.y; +var w=this.area.w*bar.w; +var h=this.area.h*bar.h; +this._drawRect(x,y,w,h,_259); +}; +this._renderBarOrLine(this.layout.bars,bind(_258,this)); +}; +PlotKit.SVGRenderer.prototype._renderLineChart=function(){ +var bind=MochiKit.Base.bind; +var _260=function(_261,_262){ +this._tempPointsBuffer+=(this.area.w*_262.x+this.area.x)+","+(this.area.h*_262.y+this.area.y)+" "; +}; +var _263=function(_264){ +this._tempPointsBuffer=""; +this._tempPointsBuffer+=(this.area.x)+","+(this.area.y+this.area.h)+" "; +}; +var _265=function(_266){ +this._tempPointsBuffer+=(this.area.w+this.area.x)+","+(this.area.h+this.area.y); +_266["points"]=this._tempPointsBuffer; +var elem=this.createSVGElement("polygon",_266); +this.root.appendChild(elem); +}; +this._renderBarOrLine(this.layout.points,bind(_260,this),bind(_263,this),bind(_265,this)); +}; +PlotKit.SVGRenderer.prototype._renderPieChart=function(){ +var _268=this.options.colorScheme.length; +var _269=this.layout.slices; +var _270=this.area.x+this.area.w*0.5; +var _271=this.area.y+this.area.h*0.5; +var _272=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius); +if(_269.length==1&&(Math.abs(_269[0].startAngle)-Math.abs(_269[0].endAngle)<0.1)){ +var _273={"cx":_270,"cy":_271,"r":_272}; +var _274=this.options.colorScheme[0]; +if(this.options.shouldFill){ +_273["fill"]=_274.toRGBString(); +}else{ +_273["fill"]="none"; +} +if(this.options.shouldStroke&&(this.options.strokeColor||this.options.strokeColorTransform)){ +if(this.options.strokeColor){ +_273["stroke"]=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_273["stroke"]=_274[this.options.strokeColorTransform]().toRGBString(); +} +} +_273["style"]="stroke-width: "+this.options.strokeWidth; +} +this.root.appendChild(this.createSVGElement("circle",_273)); +return; +} +for(var i=0;i<_269.length;i++){ +var _273=new Array(); +var _274=this.options.colorScheme[i%_268]; +if(this.options.shouldFill){ +_273["fill"]=_274.toRGBString(); +}else{ +_273["fill"]="none"; +} +if(this.options.shouldStroke&&(this.options.strokeColor||this.options.strokeColorTransform)){ +if(this.options.strokeColor){ +_273["stroke"]=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_273["stroke"]=_274[this.options.strokeColorTransform]().toRGBString(); +} +} +_273["style"]="stroke-width:"+this.options.strokeWidth; +} +var _275=0; +if(Math.abs(_269[i].endAngle-_269[i].startAngle)>Math.PI){ +_275=1; +} +var x1=Math.cos(_269[i].startAngle-Math.PI/2)*_272; +var y1=Math.sin(_269[i].startAngle-Math.PI/2)*_272; +var x2=Math.cos(_269[i].endAngle-Math.PI/2)*_272; +var y2=Math.sin(_269[i].endAngle-Math.PI/2)*_272; +var rx=x2-x1; +var ry=y2-y1; +var _282="M"+_270+","+_271+" "; +_282+="l"+x1+","+y1+" "; +_282+="a"+_272+","+_272+" 0 "+_275+",1 "+rx+","+ry+" z"; +_273["d"]=_282; +var elem=this.createSVGElement("path",_273); +this.root.appendChild(elem); +} +}; +PlotKit.SVGRenderer.prototype._renderBarAxis=function(){ +this._renderAxis(); +}; +PlotKit.SVGRenderer.prototype._renderLineAxis=function(){ +this._renderAxis(); +}; +PlotKit.SVGRenderer.prototype._renderAxis=function(){ +if(!this.options.drawXAxis&&!this.options.drawYAxis){ +return; +} +var _283={"style":{"position":"absolute","textAlign":"center","fontSize":this.options.axisLabelFontSize+"px","zIndex":10,"color":this.options.axisLabelColor.toRGBString(),"width":this.options.axisLabelWidth+"px","overflow":"hidden"}}; +var _284={"stroke":this.options.axisLineColor.toRGBString(),"strokeWidth":this.options.axisLineWidth}; +if(this.options.drawYAxis){ +if(this.layout.yticks){ +var _285=function(tick){ +var x=this.area.x; +var y=this.area.y+tick[0]*this.area.h; +this._drawLine(x,y,x-3,y,_284); +if(this.options.axisLabelUseDiv){ +var _286=DIV(_283,tick[1]); +_286.style.top=(y-this.options.axisLabelFontSize)+"px"; +_286.style.left=(x-this.options.padding.left+this.options.axisTickSize)+"px"; +_286.style.textAlign="left"; +_286.style.width=(this.options.padding.left-3)+"px"; +MochiKit.DOM.appendChildNodes(this.container,_286); +this.ylabels.push(_286); +}else{ +var _287={y:y+3,x:(x-this.options.padding.left+3),width:(this.options.padding.left-this.options.axisTickSize)+"px",height:(this.options.axisLabelFontSize+3)+"px",fontFamily:"Arial",fontSize:this.options.axisLabelFontSize+"px",fill:this.options.axisLabelColor.toRGBString()}; +var _286=this.createSVGElement("text",_287); +_286.appendChild(this.document.createTextNode(tick[1])); +this.root.appendChild(_286); +} +}; +MochiKit.Iter.forEach(this.layout.yticks,bind(_285,this)); +} +this._drawLine(this.area.x,this.area.y,this.area.x,this.area.y+this.area.h,_284); +} +if(this.options.drawXAxis){ +if(this.layout.xticks){ +var _285=function(tick){ +var x=this.area.x+tick[0]*this.area.w; +var y=this.area.y+this.area.h; +this._drawLine(x,y,x,y+this.options.axisTickSize,_284); +if(this.options.axisLabelUseDiv){ +var _288=DIV(_283,tick[1]); +_288.style.top=(y+this.options.axisTickSize)+"px"; +_288.style.left=(x-this.options.axisLabelWidth/2)+"px"; +_288.style.textAlign="center"; +_288.style.width=this.options.axisLabelWidth+"px"; +MochiKit.DOM.appendChildNodes(this.container,_288); +this.xlabels.push(_288); +}else{ +var _289={y:(y+this.options.axisTickSize+this.options.axisLabelFontSize),x:x-3,width:this.options.axisLabelWidth+"px",height:(this.options.axisLabelFontSize+3)+"px",fontFamily:"Arial",fontSize:this.options.axisLabelFontSize+"px",fill:this.options.axisLabelColor.toRGBString(),textAnchor:"middle"}; +var _288=this.createSVGElement("text",_289); +_288.appendChild(this.document.createTextNode(tick[1])); +this.root.appendChild(_288); +} +}; +MochiKit.Iter.forEach(this.layout.xticks,bind(_285,this)); +} +this._drawLine(this.area.x,this.area.y+this.area.h,this.area.x+this.area.w,this.area.y+this.area.h,_284); +} +}; +PlotKit.SVGRenderer.prototype._renderPieAxis=function(){ +if(this.layout.xticks){ +var _290=new Array(); +for(var i=0;iMath.PI*2){ +_297=_297-Math.PI*2; +}else{ +if(_297<0){ +_297=_297+Math.PI*2; +} +} +var _298=_291+Math.sin(_297)*(_293+10); +var _299=_292-Math.cos(_297)*(_293+10); +var _300={"position":"absolute","zIndex":11,"width":_294+"px","fontSize":this.options.axisLabelFontSize+"px","overflow":"hidden","color":this.options.axisLabelColor.toHexString()}; +var _301={"width":_294+"px","fontSize":this.options.axisLabelFontSize+"px","height":(this.options.axisLabelFontSize+3)+"px","fill":this.options.axisLabelColor.toRGBString()}; +if(_297<=Math.PI*0.5){ +MochiKit.Base.update(_300,{"textAlign":"left","verticalAlign":"top","left":_298+"px","top":(_299-this.options.axisLabelFontSize)+"px"}); +MochiKit.Base.update(_301,{"x":_298,"y":(_299-this.options.axisLabelFontSize),"textAnchor":"left"}); +}else{ +if((_297>Math.PI*0.5)&&(_297<=Math.PI)){ +MochiKit.Base.update(_300,{"textAlign":"left","verticalAlign":"bottom","left":_298+"px","top":_299+"px"}); +MochiKit.Base.update(_301,{"textAnchor":"left","x":_298,"y":_299}); +}else{ +if((_297>Math.PI)&&(_297<=Math.PI*1.5)){ +MochiKit.Base.update(_300,{"textAlign":"right","verticalAlign":"bottom","left":_298+"px","top":_299+"px"}); +MochiKit.Base.update(_301,{"textAnchor":"right","x":_298-_294,"y":_299}); +}else{ +MochiKit.Base.update(_300,{"textAlign":"left","verticalAlign":"bottom","left":_298+"px","top":_299+"px"}); +MochiKit.Base.update(_301,{"textAnchor":"left","x":_298-_294,"y":_299-this.options.axisLabelFontSize}); +} +} +} +if(this.options.axisLabelUseDiv){ +var _302=DIV({"style":_300},this.layout.xticks[i][1]); +this.xlabels.push(_302); +MochiKit.DOM.appendChildNodes(this.container,_302); +}else{ +var _302=this.createSVGElement("text",_301); +_302.appendChild(this.document.createTextNode(this.layout.xticks[i][1])); +this.root.appendChild(_302); +} +} +} +}; +PlotKit.SVGRenderer.prototype._renderBackground=function(){ +var opts={"stroke":"none","fill":this.options.backgroundColor.toRGBString()}; +this._drawRect(0,0,this.width,this.height,opts); +}; +PlotKit.SVGRenderer.prototype._drawRect=function(x,y,w,h,_304){ +var _305={x:x+"px",y:y+"px",width:w+"px",height:h+"px"}; +if(_304){ +MochiKit.Base.update(_305,_304); +} +var elem=this.createSVGElement("rect",_305); +this.root.appendChild(elem); +}; +PlotKit.SVGRenderer.prototype._drawLine=function(x1,y1,x2,y2,_306){ +var _307={x1:x1+"px",y1:y1+"px",x2:x2+"px",y2:y2+"px"}; +if(_306){ +MochiKit.Base.update(_307,_306); +} +var elem=this.createSVGElement("line",_307); +this.root.appendChild(elem); +}; +PlotKit.SVGRenderer.prototype.clear=function(){ +while(this.element.firstChild){ +this.element.removeChild(this.element.firstChild); +} +if(this.options.axisLabelUseDiv){ +for(var i=0;i=6)&&(!_313)){ +var _314=_312["width"]?_312["width"]:"100"; +var _315=_312["height"]?_312["height"]:"100"; +var eid=_312["id"]?_312["id"]:"notunique"; +var html=""; +var _318=document.createElement(html); +var _319=_318.getSVGDocument().createElementNS(PlotKit.SVGRenderer.SVGNS,"svg"); +_319.setAttribute("width",_314); +_319.setAttribute("height",_315); +_318.getSVGDocument().appendChild(_319); +return _318; +}else{ +return PlotKit.SVGRenderer.prototype.createSVGElement("svg",_312); +} +}; +PlotKit.SVGRenderer.isSupported=function(){ +var _320=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1); +var _321=navigator.appVersion.match(/MSIE (\d\.\d)/); +var _322=navigator.userAgent.match(/AppleWebKit\/(\d+)/); +var _323=navigator.userAgent.match(/Opera\/(\d*\.\d*)/); +var _324=navigator.userAgent.match(/rv:(\d*\.\d*).*Gecko/); +var _325="http://www.w3.org/TR/SVG11/feature#SVG"; +if(_321&&(_321[1]>=6)&&!_320){ +return document.implementation.hasFeature(_325,"1.1"); +} +if(_323&&(_323[1]>8.9)){ +return true; +} +if(_324&&(_324>1.7)){ +return true; +} +return false; +}; +PlotKit.SVG={}; +PlotKit.SVG.SVGRenderer=PlotKit.SVGRenderer; +PlotKit.SVG.EXPORT=["SVGRenderer"]; +PlotKit.SVG.EXPORT_OK=["SVGRenderer"]; +PlotKit.SVG.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.SVG.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.SVG); +try{ +if(typeof (PlotKit.CanvasRenderer)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "SweetCanvas depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Layout, Canvas}"; +} +if(typeof (PlotKit.SweetCanvasRenderer)=="undefined"){ +PlotKit.SweetCanvasRenderer={}; +} +PlotKit.SweetCanvasRenderer=function(_326,_327,_328){ +if(arguments.length>0){ +this.__init__(_326,_327,_328); +} +}; +PlotKit.SweetCanvasRenderer.NAME="PlotKit.SweetCanvasRenderer"; +PlotKit.SweetCanvasRenderer.VERSION=PlotKit.VERSION; +PlotKit.SweetCanvasRenderer.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.SweetCanvasRenderer.toString=function(){ +return this.__repr__(); +}; +PlotKit.SweetCanvasRenderer.prototype=new PlotKit.CanvasRenderer(); +PlotKit.SweetCanvasRenderer.prototype.constructor=PlotKit.SweetCanvasRenderer; +PlotKit.SweetCanvasRenderer.__super__=PlotKit.CanvasRenderer.prototype; +PlotKit.SweetCanvasRenderer.prototype.__init__=function(el,_330,opts){ +var _331=PlotKit.Base.officeBlue(); +MochiKit.Base.update(_331,opts); +PlotKit.SweetCanvasRenderer.__super__.__init__.call(this,el,_330,_331); +}; +PlotKit.SweetCanvasRenderer.prototype._renderBarChart=function(){ +var bind=MochiKit.Base.bind; +var _332=Color.blackColor().colorWithAlpha(0.1).toRGBString(); +var _333=function(_334,x,y,w,h){ +_334.fillStyle=_332; +_334.fillRect(x-2,y-2,w+4,h+2); +_334.fillStyle=_332; +_334.fillRect(x-1,y-1,w+2,h+1); +}; +var _335=this.options.colorScheme.length; +var _336=this.options.colorScheme; +var _337=PlotKit.Base.keys(this.layout.datasets); +var _338=_337.length; +var _339=function(name){ +for(var i=0;i<_338;i++){ +if(name==_337[i]){ +return _336[i%_335]; +} +} +return _336[0]; +}; +var _340=function(_341,bar){ +var x=this.area.w*bar.x+this.area.x; +var y=this.area.h*bar.y+this.area.y; +var w=this.area.w*bar.w; +var h=this.area.h*bar.h; +if((w<1)||(h<1)){ +return; +} +_341.save(); +_341.shadowBlur=5; +_341.shadowColor=Color.fromHexString("#888888").toRGBString(); +if(this.isIE){ +_341.save(); +_341.fillStyle="#cccccc"; +_341.fillRect(x-2,y-2,w+4,h+2); +_341.restore(); +}else{ +_333(_341,x,y,w,h); +} +if(this.options.shouldFill){ +_341.fillStyle=_339(bar.name).toRGBString(); +_341.fillRect(x,y,w,h); +} +_341.shadowBlur=0; +_341.strokeStyle=Color.whiteColor().toRGBString(); +_341.lineWidth=2; +if(this.options.shouldStroke){ +_341.strokeRect(x,y,w,h); +} +_341.restore(); +}; +this._renderBarChartWrap(this.layout.bars,bind(_340,this)); +}; +PlotKit.SweetCanvasRenderer.prototype._renderLineChart=function(){ +var _342=this.element.getContext("2d"); +var _343=this.options.colorScheme.length; +var _344=this.options.colorScheme; +var _345=PlotKit.Base.keys(this.layout.datasets); +var _346=_345.length; +var bind=MochiKit.Base.bind; +for(var i=0;i<_346;i++){ +var _347=_345[i]; +var _348=_344[i%_343]; +var _349=this.options.strokeColorTransform; +_342.save(); +var _350=function(ctx){ +ctx.beginPath(); +ctx.moveTo(this.area.x,this.area.y+this.area.h); +var _351=function(ctx_,_352){ +if(_352.name==_347){ +ctx_.lineTo(this.area.w*_352.x+this.area.x,this.area.h*_352.y+this.area.y); +} +}; +MochiKit.Iter.forEach(this.layout.points,partial(_351,ctx),this); +ctx.lineTo(this.area.w+this.area.x,this.area.h+this.area.y); +ctx.lineTo(this.area.x,this.area.y+this.area.h); +ctx.closePath(); +}; +if(this.options.shouldFill){ +_342.save(); +if(this.isIE){ +_342.fillStyle="#cccccc"; +}else{ +_342.fillStyle=Color.blackColor().colorWithAlpha(0.2).toRGBString(); +} +_342.translate(-1,-2); +bind(_350,this)(_342); +if(this.options.shouldFill){ +_342.fill(); +} +_342.restore(); +} +_342.shadowBlur=5; +_342.shadowColor=Color.fromHexString("#888888").toRGBString(); +_342.fillStyle=_348.toRGBString(); +_342.lineWidth=2; +_342.strokeStyle=Color.whiteColor().toRGBString(); +if(this.options.shouldFill){ +bind(_350,this)(_342); +_342.fill(); +} +if(this.options.shouldStroke){ +bind(_350,this)(_342); +_342.stroke(); +} +_342.restore(); +} +}; +PlotKit.SweetCanvasRenderer.prototype._renderPieChart=function(){ +var _353=this.element.getContext("2d"); +var _354=this.options.colorScheme.length; +var _355=this.layout.slices; +var _356=this.area.x+this.area.w*0.5; +var _357=this.area.y+this.area.h*0.5; +var _358=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius); +if(this.isIE){ +_356=parseInt(_356); +_357=parseInt(_357); +_358=parseInt(_358); +} +if(!this.isIE){ +_353.save(); +var _359=Color.blackColor().colorWithAlpha(0.2); +_353.fillStyle=_359.toRGBString(); +_353.shadowBlur=5; +_353.shadowColor=Color.fromHexString("#888888").toRGBString(); +_353.translate(1,1); +_353.beginPath(); +_353.moveTo(_356,_357); +_353.arc(_356,_357,_358+2,0,Math.PI*2,false); +_353.closePath(); +_353.fill(); +_353.restore(); +} +_353.save(); +_353.strokeStyle=Color.whiteColor().toRGBString(); +_353.lineWidth=2; +for(var i=0;i<_355.length;i++){ +var _360=this.options.colorScheme[i%_354]; +_353.fillStyle=_360.toRGBString(); +var _361=function(){ +_353.beginPath(); +_353.moveTo(_356,_357); +_353.arc(_356,_357,_358,_355[i].startAngle-Math.PI/2,_355[i].endAngle-Math.PI/2,false); +_353.lineTo(_356,_357); +_353.closePath(); +}; +if(Math.abs(_355[i].startAngle-_355[i].endAngle)>0.0001){ +if(this.options.shouldFill){ +_361(); +_353.fill(); +} +if(this.options.shouldStroke){ +_361(); +_353.stroke(); +} +} +} +_353.restore(); +}; +PlotKit.SweetCanvasRenderer.prototype._renderBackground=function(){ +var _362=this.element.getContext("2d"); +if(this.layout.style=="bar"||this.layout.style=="line"){ +_362.save(); +_362.fillStyle=this.options.backgroundColor.toRGBString(); +_362.fillRect(this.area.x,this.area.y,this.area.w,this.area.h); +_362.strokeStyle=this.options.axisLineColor.toRGBString(); +_362.lineWidth=1; +var _363=this.layout.yticks; +var _364=false; +if(this.layout.style=="bar"&&this.layout.options.barOrientation=="horizontal"){ +_363=this.layout.xticks; +_364=true; +} +for(var i=0;i<_363.length;i++){ +var x1=0; +var y1=0; +var x2=0; +var y2=0; +if(_364){ +x1=_363[i][0]*this.area.w+this.area.x; +y1=this.area.y; +x2=x1; +y2=y1+this.area.h; +}else{ +x1=this.area.x; +y1=_363[i][0]*this.area.h+this.area.y; +x2=x1+this.area.w; +y2=y1; +} +_362.beginPath(); +_362.moveTo(x1,y1); +_362.lineTo(x2,y2); +_362.closePath(); +_362.stroke(); +} +_362.restore(); +}else{ +PlotKit.SweetCanvasRenderer.__super__._renderBackground.call(this); +} +}; +PlotKit.SweetCanvas={}; +PlotKit.SweetCanvas.SweetCanvasRenderer=PlotKit.SweetCanvasRenderer; +PlotKit.SweetCanvas.EXPORT=["SweetCanvasRenderer"]; +PlotKit.SweetCanvas.EXPORT_OK=["SweetCanvasRenderer"]; +PlotKit.SweetCanvas.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.SweetCanvas.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.SweetCanvas); +try{ +if(typeof (PlotKit.SVGRenderer)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "SweetSVG depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Layout, SVG}"; +} +if(typeof (PlotKit.SweetSVGRenderer)=="undefined"){ +PlotKit.SweetSVGRenderer={}; +} +PlotKit.SweetSVGRenderer=function(_365,_366,_367){ +if(arguments.length>0){ +this.__init__(_365,_366,_367); +} +}; +PlotKit.SweetSVGRenderer.NAME="PlotKit.SweetSVGRenderer"; +PlotKit.SweetSVGRenderer.VERSION=PlotKit.VERSION; +PlotKit.SweetSVGRenderer.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.SweetSVGRenderer.toString=function(){ +return this.__repr__(); +}; +PlotKit.SweetSVGRenderer.prototype=new PlotKit.SVGRenderer(); +PlotKit.SweetSVGRenderer.prototype.constructor=PlotKit.SweetSVGRenderer; +PlotKit.SweetSVGRenderer.__super__=PlotKit.SVGRenderer.prototype; +PlotKit.SweetSVGRenderer.prototype.__init__=function(_368,_369,_370){ +var _371=PlotKit.Base.officeBlue(); +MochiKit.Base.update(_371,_370); +PlotKit.SweetSVGRenderer.__super__.__init__.call(this,_368,_369,_371); +}; +PlotKit.SweetSVGRenderer.prototype._addDropShadowFilter=function(){ +var _372=this.createSVGElement("filter",{x:0,y:0,"id":"dropShadow"}); +var _373=this.createSVGElement("feOffset",{"in":"SourceGraphic","dx":0,"dy":0,"result":"topCopy"}); +var blur=this.createSVGElement("feGaussianBlur",{"in":"SourceAlpha","StdDeviation":2,"result":"shadow"}); +var _375=this.createSVGElement("feOffset",{"in":"shadow","dx":-1,"dy":-2,"result":"movedShadow"}); +var _376=this.createSVGElement("feMerge"); +var _377=this.createSVGElement("feMergeNode",{"in":"topCopy"}); +var _378=this.createSVGElement("feMergeNode",{"in":"movedShadow"}); +_376.appendChild(_377); +_376.appendChild(_378); +_372.appendChild(_373); +_372.appendChild(blur); +_372.appendChild(_375); +_372.appendChild(_376); +this.defs.appendChild(_372); +}; +PlotKit.SweetSVGRenderer.prototype._renderBarChart=function(){ +var bind=MochiKit.Base.bind; +var _379=Color.blackColor().toRGBString(); +var _380="fill:"+_379+";fill-opacity:0.15"; +var _381="stroke-width: 2.0; stroke:"+Color.whiteColor().toRGBString(); +var _382=function(_383,bar){ +var x=this.area.w*bar.x+this.area.x; +var y=this.area.h*bar.y+this.area.y; +var w=this.area.w*bar.w; +var h=this.area.h*bar.h; +if((w<1)||(h<1)){ +return; +} +_383["style"]=_381; +this._drawRect(x-2,y-1,w+4,h+2,{"style":_380}); +this._drawRect(x,y,w,h,_383); +}; +this._renderBarOrLine(this.layout.bars,bind(_382,this)); +}; +PlotKit.SweetSVGRenderer.prototype._renderLineChart=function(){ +var bind=MochiKit.Base.bind; +var _384=Color.blackColor().toRGBString(); +var _385="fill:"+_384+";fill-opacity:0.15"; +var _386="stroke-width: 2.0; stroke:"+Color.whiteColor().toRGBString(); +var _387=function(_388,_389){ +this._tempPointsBuffer+=(this.area.w*_389.x+this.area.x)+","+(this.area.h*_389.y+this.area.y)+" "; +}; +var _390=function(_391){ +this._tempPointsBuffer=""; +this._tempPointsBuffer+=(this.area.x)+","+(this.area.y+this.area.h)+" "; +}; +var _392=function(_393){ +this._tempPointsBuffer+=(this.area.w+this.area.x)+","+(this.area.h+this.area.y); +_393["points"]=this._tempPointsBuffer; +_393["stroke"]="none"; +_393["transform"]="translate(-2, -1)"; +_393["style"]=_385; +var _394=this.createSVGElement("polygon",_393); +this.root.appendChild(_394); +_393["transform"]=""; +_393["style"]=_386; +var elem=this.createSVGElement("polygon",_393); +this.root.appendChild(elem); +}; +this._renderBarOrLine(this.layout.points,bind(_387,this),bind(_390,this),bind(_392,this)); +}; +PlotKit.SweetSVGRenderer.prototype._renderPieChart=function(){ +var _395=this.area.x+this.area.w*0.5; +var _396=this.area.y+this.area.h*0.5; +var _397=Color.blackColor().toRGBString(); +var _398=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius); +var _399="fill:"+_397+";fill-opacity:0.15"; +var _400=this.createSVGElement("circle",{"style":_399,"cx":_395+1,"cy":_396+1,"r":_398+1}); +this.root.appendChild(_400); +PlotKit.SweetSVGRenderer.__super__._renderPieChart.call(this); +}; +PlotKit.SweetSVGRenderer.prototype._renderBackground=function(){ +var _401={"fill":this.options.backgroundColor.toRGBString(),"stroke":"none"}; +if(this.layout.style=="bar"||this.layout.style=="line"){ +this._drawRect(this.area.x,this.area.y,this.area.w,this.area.h,_401); +var _402=this.layout.yticks; +var _403=false; +if(this.layout.style=="bar"&&this.layout.options.barOrientation=="horizontal"){ +_402=this.layout.xticks; +_403=true; +} +for(var i=0;i<_402.length;i++){ +var x=0; +var y=0; +var w=0; +var h=0; +if(_403){ +x=_402[i][0]*this.area.w+this.area.x; +y=this.area.y; +w=1; +h=this.area.w; +}else{ +x=this.area.x; +y=_402[i][0]*this.area.h+this.area.y; +w=this.area.w; +h=1; +} +this._drawRect(x,y,w,h,{"fill":this.options.axisLineColor.toRGBString()}); +} +}else{ +PlotKit.SweetSVGRenderer.__super__._renderBackground.call(this); +} +}; +PlotKit.SweetSVG={}; +PlotKit.SweetSVG.SweetSVGRenderer=PlotKit.SweetSVGRenderer; +PlotKit.SweetSVG.EXPORT=["SweetSVGRenderer"]; +PlotKit.SweetSVG.EXPORT_OK=["SweetSVGRenderer"]; +PlotKit.SweetSVG.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.SweetSVG.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.SweetSVG); +try{ +if(typeof (PlotKit.CanvasRenderer)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "PlotKit.EasyPlot depends on all of PlotKit's components"; +} +if(typeof (PlotKit.EasyPlot)=="undefined"){ +PlotKit.EasyPlot={}; +} +PlotKit.EasyPlot.NAME="PlotKit.EasyPlot"; +PlotKit.EasyPlot.VERSION=PlotKit.VERSION; +PlotKit.EasyPlot.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.EasyPlot.toString=function(){ +return this.__repr__(); +}; +PlotKit.EasyPlot=function(_404,_405,_406,_407){ +this.layout=new Layout(_404,_405); +this.divElem=_406; +this.width=parseInt(_406.getAttribute("width")); +this.height=parseInt(_406.getAttribute("height")); +this.deferredCount=0; +if(this.width<1){ +this.width=this.divElem.width?this.divElem.width:300; +} +if(this.height<1){ +this.height=this.divElem.height?this.divElem.height:300; +} +if(isArrayLike(_407)){ +for(var i=0;i<_407.length;i++){ +if(typeof (_407[i])=="string"){ +this.deferredCount++; +var d=MochiKit.Async.doSimpleXMLHttpRequest(_407[i]); +d.addCallback(MochiKit.Base.bind(PlotKit.EasyPlot.onDataLoaded,this)); +}else{ +if(isArrayLike(_407[i])){ +this.layout.addDataset("data-"+i,_407[i]); +} +} +} +}else{ +if(!isUndefinedOrNull(_407)){ +throw "Passed datasources are not Array like"; +} +} +if(CanvasRenderer.isSupported()){ +this.element=CANVAS({"id":this.divElem.getAttribute("id")+"-canvas","width":this.width,"height":this.height},""); +this.divElem.appendChild(this.element); +this.renderer=new SweetCanvasRenderer(this.element,this.layout,_405); +}else{ +if(SVGRenderer.isSupported()){ +this.element=SVGRenderer.SVG({"id":this.divElem.getAttribute("id")+"-svg","width":this.width,"height":this.height,"version":"1.1","baseProfile":"full"},""); +this.divElem.appendChild(this.element); +this.renderer=new SweetSVGRenderer(this.element,this.layout,_405); +} +} +if((this.deferredCount==0)&&(PlotKit.Base.keys(this.layout.datasets).length>0)){ +this.layout.evaluate(); +this.renderer.clear(); +this.renderer.render(); +} +}; +PlotKit.EasyPlot.onDataLoaded=function(_409){ +var _410=new Array(); +var _411=_409.responseText.split("\n"); +for(var i=0;i<_411.length;i++){ +var _412=MochiKit.Format.strip(_411[i]); +if((_412.length>1)&&(_412.charAt(0)!="#")){ +_410.push(_412.split(",")); +} +} +this.layout.addDataset("data-ajax-"+this.deferredCount,_410); +this.deferredCount--; +if((this.deferredCount==0)&&(PlotKit.Base.keys(this.layout.datasets).length>0)){ +this.layout.evaluate(); +this.renderer.clear(); +this.renderer.render(); +} +}; +PlotKit.EasyPlot.prototype.reload=function(){ +this.layout.evaluate(); +this.renderer.clear(); +this.renderer.render(); +}; +PlotKit.EasyPlotModule={}; +PlotKit.EasyPlotModule.EasyPlot=PlotKit.EasyPlot; +PlotKit.EasyPlotModule.EXPORT=["EasyPlot"]; +PlotKit.EasyPlotModule.EXPORT_OK=[]; +PlotKit.EasyPlotModule.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.EasyPlotModule.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.EasyPlotModule); + + +// Copyright 2006 Dan Vanderkam (danvdk@gmail.com) +// All Rights Reserved. + +/** + * @fileoverview Subclasses various parts of PlotKit to meet the additional + * needs of DateGraph: grid overlays and error bars + */ + +// Subclass PlotKit.Layout to add: +// 1. Sigma/errorBars properties +// 2. Copy error terms for PlotKit.CanvasRenderer._renderLineChart + +/** + * Creates a new DateGraphLayout object. Options are the same as those allowed + * by the PlotKit.Layout constructor. + * @param {Object} options Options for PlotKit.Layout + * @return {Object} The DateGraphLayout object + */ +DateGraphLayout = function(options) { + PlotKit.Layout.call(this, "line", options); +}; +DateGraphLayout.prototype = new PlotKit.Layout(); + +/** + * Behaves the same way as PlotKit.Layout, but also copies the errors + * @private + */ +DateGraphLayout.prototype.evaluateWithError = function() { + this.evaluate(); + if (!this.options.errorBars) return; + + // Copy over the error terms + var i = 0; // index in this.points + for (var setName in this.datasets) { + var j = 0; + var dataset = this.datasets[setName]; + if (PlotKit.Base.isFuncLike(dataset)) continue; + for (var j = 0; j < dataset.length; j++, i++) { + var item = dataset[j]; + var xv = parseFloat(item[0]); + var yv = parseFloat(item[1]); + + if (xv == this.points[i].xval && + yv == this.points[i].yval) { + this.points[i].errorMinus = parseFloat(item[2]); + this.points[i].errorPlus = parseFloat(item[3]); + } + } + } +}; + +/** + * Convenience function to remove all the data sets from a graph + */ +DateGraphLayout.prototype.removeAllDatasets = function() { + delete this.datasets; + this.datasets = new Array(); +}; + +/** + * Change the values of various layout options + * @param {Object} new_options an associative array of new properties + */ +DateGraphLayout.prototype.updateOptions = function(new_options) { + MochiKit.Base.update(this.options, new_options ? new_options : {}); +}; + +// Subclass PlotKit.CanvasRenderer to add: +// 1. X/Y grid overlay +// 2. Ability to draw error bars (if required) + +/** + * Sets some PlotKit.CanvasRenderer options + * @param {Object} element The canvas to attach to + * @param {Layout} layout The DateGraphLayout object for this graph. + * @param {Object} options Options to pass on to CanvasRenderer + */ +DateGraphCanvasRenderer = function(element, layout, options) { + PlotKit.CanvasRenderer.call(this, element, layout, options); + this.options.shouldFill = false; + this.options.shouldStroke = true; + this.options.drawYGrid = true; + this.options.drawXGrid = true; + this.options.gridLineColor = MochiKit.Color.Color.grayColor(); + MochiKit.Base.update(this.options, options); + + // TODO(danvk) This shouldn't be necessary: effects should be overlaid + this.options.drawBackground = false; +}; +DateGraphCanvasRenderer.prototype = new PlotKit.CanvasRenderer(); + +/** + * Draw an X/Y grid on top of the existing plot + */ +DateGraphCanvasRenderer.prototype.render = function() { + // Do the ordinary rendering, as before + // TODO(danvk) Call super.render() + this._renderLineChart(); + this._renderLineAxis(); + + // Draw the new X/Y grid + var ctx = this.element.getContext("2d"); + if (this.options.drawYGrid) { + var ticks = this.layout.yticks; + ctx.save(); + ctx.strokeStyle = this.options.gridLineColor.toRGBString(); + ctx.lineWidth = this.options.axisLineWidth; + for (var i = 0; i < ticks.length; i++) { + var x = this.area.x; + var y = this.area.y + ticks[i][0] * this.area.h; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + this.area.w, y); + ctx.closePath(); + ctx.stroke(); + } + } + + if (this.options.drawXGrid) { + var ticks = this.layout.xticks; + ctx.save(); + ctx.strokeStyle = this.options.gridLineColor.toRGBString(); + ctx.lineWidth = this.options.axisLineWidth; + for (var i=0; i= 0) { + ctx_.moveTo(prevX, prevYs[0]); + ctx_.lineTo(point.canvasx, newYs[0]); + ctx_.lineTo(point.canvasx, newYs[1]); + ctx_.lineTo(prevX, prevYs[1]); + ctx_.closePath(); + } + prevYs[0] = newYs[0]; + prevYs[1] = newYs[1]; + prevX = point.canvasx; + } + }; + // should be same color as the lines + var err_color = color.colorWithAlpha(0.15); + ctx.fillStyle = err_color.toRGBString(); + ctx.beginPath(); + MochiKit.Iter.forEach(this.layout.points, partial(errorTrapezoid, ctx), this); + ctx.fill(); + } + }; + + if (errorBars) + bind(makeErrorBars, this)(context); + bind(makePath, this)(context); + context.restore(); +}; +// Copyright 2006 Dan Vanderkam (danvdk@gmail.com) +// All Rights Reserved. + +/** + * @fileoverview Creates an interactive, zoomable graph based on a CSV file or + * string. DateGraph can handle multiple series with or without error bars. The + * date/value ranges will be automatically set. DateGraph uses the + * <canvas> tag, so it only works in FF1.5+. + * @author danvdk@gmail.com (Dan Vanderkam) + + Usage: +
+ + + The CSV file is of the form + + YYYYMMDD,A1,B1,C1 + YYYYMMDD,A2,B2,C2 + + If null is passed as the third parameter (series names), then the first line + of the CSV file is assumed to contain names for each series. + + If the 'errorBars' option is set in the constructor, the input should be of + the form + + YYYYMMDD,A1,sigmaA1,B1,sigmaB1,... + YYYYMMDD,A2,sigmaA2,B2,sigmaB2,... + + If the 'fractions' option is set, the input should be of the form: + + YYYYMMDD,A1/B1,A2/B2,... + YYYYMMDD,A1/B1,A2/B2,... + + And error bars will be calculated automatically using a binomial distribution. + + For further documentation and examples, see http://www/~danvk/dg/ + + */ + +/** + * An interactive, zoomable graph + * @param {String | Function} file A file containing CSV data or a function that + * returns this data. The expected format for each line is + * YYYYMMDD,val1,val2,... or, if attrs.errorBars is set, + * YYYYMMDD,val1,stddev1,val2,stddev2,... + * @param {Array.} labels Labels for the data series + * @param {Object} attrs Various other attributes, e.g. errorBars determines + * whether the input data contains error ranges. + */ +DateGraph = function(div, file, labels, attrs) { + if (arguments.length > 0) + this.__init__(div, file, labels, attrs); +}; + +DateGraph.NAME = "DateGraph"; +DateGraph.VERSION = "1.1"; +DateGraph.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; +DateGraph.toString = function() { + return this.__repr__(); +}; + +// Various default values +DateGraph.DEFAULT_ROLL_PERIOD = 1; +DateGraph.DEFAULT_WIDTH = 480; +DateGraph.DEFAULT_HEIGHT = 320; +DateGraph.DEFAULT_STROKE_WIDTH = 1.0; +DateGraph.AXIS_LINE_WIDTH = 0.3; + +/** + * Initializes the DateGraph. This creates a new DIV and constructs the PlotKit + * and interaction <canvas> inside of it. See the constructor for details + * on the parameters. + * @param {String | Function} file Source data + * @param {Array.} labels Names of the data series + * @param {Object} attrs Miscellaneous other options + * @private + */ +DateGraph.prototype.__init__ = function(div, file, labels, attrs) { + // Copy the important bits into the object + this.maindiv_ = div; + this.labels_ = labels; + this.file_ = file; + this.rollPeriod_ = attrs.rollPeriod || DateGraph.DEFAULT_ROLL_PERIOD; + this.previousVerticalX_ = -1; + this.width_ = parseInt(div.style.width, 10); + this.height_ = parseInt(div.style.height, 10); + this.errorBars_ = attrs.errorBars || false; + this.fractions_ = attrs.fractions || false; + this.strokeWidth_ = attrs.strokeWidth || DateGraph.DEFAULT_STROKE_WIDTH; + this.dateWindow_ = attrs.dateWindow || null; + this.valueRange_ = attrs.valueRange || null; + this.labelsSeparateLines = attrs.labelsSeparateLines || false; + this.labelsDiv_ = attrs.labelsDiv || null; + this.labelsKMB_ = attrs.labelsKMB || false; + this.minTickSize_ = attrs.minTickSize || 0; + this.xValueParser_ = attrs.xValueParser || DateGraph.prototype.dateParser; + this.xValueFormatter_ = attrs.xValueFormatter || + DateGraph.prototype.dateString_; + this.xTicker_ = attrs.xTicker || DateGraph.prototype.dateTicker; + this.sigma_ = attrs.sigma || 2.0; + this.wilsonInterval_ = attrs.wilsonInterval || true; + this.customBars_ = attrs.customBars || false; + this.attrs_ = attrs; + + // Make a note of whether labels will be pulled from the CSV file. + this.labelsFromCSV_ = (this.labels_ == null); + if (this.labels_ == null) + this.labels_ = []; + + // Prototype of the callback is "void clickCallback(event, date)" + this.clickCallback_ = attrs.clickCallback || null; + + // Prototype of zoom callback is "void dragCallback(minDate, maxDate)" + this.zoomCallback_ = attrs.zoomCallback || null; + + // Create the containing DIV and other interactive elements + this.createInterface_(); + + // Create the PlotKit grapher + this.layoutOptions_ = { 'errorBars': (this.errorBars_ || this.customBars_), + 'xOriginIsZero': false }; + MochiKit.Base.update(this.layoutOptions_, attrs); + this.setColors_(attrs); + + this.layout_ = new DateGraphLayout(this.layoutOptions_); + + this.renderOptions_ = { colorScheme: this.colors_, + strokeColor: null, + strokeWidth: this.strokeWidth_, + axisLabelFontSize: 14, + axisLineWidth: DateGraph.AXIS_LINE_WIDTH }; + MochiKit.Base.update(this.renderOptions_, attrs); + this.plotter_ = new DateGraphCanvasRenderer(this.hidden_, this.layout_, + this.renderOptions_); + + this.createStatusMessage_(); + this.createRollInterface_(); + this.createDragInterface_(); + + MochiKit.DOM.addLoadEvent(this.start_()); +}; + +/** + * Returns the current rolling period, as set by the user or an option. + * @return {Number} The number of days in the rolling window + */ +DateGraph.prototype.rollPeriod = function() { + return this.rollPeriod_; +} + +/** + * Generates interface elements for the DateGraph: a containing div, a div to + * display the current point, and a textbox to adjust the rolling average + * period. + * @private + */ +DateGraph.prototype.createInterface_ = function() { + // Create the all-enclosing graph div + var enclosing = this.maindiv_; + + this.graphDiv = MochiKit.DOM.DIV( { style: { 'width': this.width_ + "px", + 'height': this.height_ + "px" + }}); + appendChildNodes(enclosing, this.graphDiv); + + // Create the canvas to store + var canvas = MochiKit.DOM.CANVAS; + this.canvas_ = canvas( { style: { 'position': 'absolute' }, + width: this.width_, + height: this.height_}); + appendChildNodes(this.graphDiv, this.canvas_); + + this.hidden_ = this.createPlotKitCanvas_(this.canvas_); + connect(this.hidden_, 'onmousemove', this, function(e) { this.mouseMove_(e) }); + connect(this.hidden_, 'onmouseout', this, function(e) { this.mouseOut_(e) }); +} + +/** + * Creates the canvas containing the PlotKit graph. Only plotkit ever draws on + * this particular canvas. All DateGraph work is done on this.canvas_. + * @param {Object} canvas The DateGraph canvas to over which to overlay the plot + * @return {Object} The newly-created canvas + * @private + */ +DateGraph.prototype.createPlotKitCanvas_ = function(canvas) { + var h = document.createElement("canvas"); + h.style.position = "absolute"; + h.style.top = canvas.style.top; + h.style.left = canvas.style.left; + h.width = this.width_; + h.height = this.height_; + MochiKit.DOM.appendChildNodes(this.graphDiv, h); + return h; +}; + +/** + * Generate a set of distinct colors for the data series. This is done with a + * color wheel. Saturation/Value are customizable, and the hue is + * equally-spaced around the color wheel. If a custom set of colors is + * specified, that is used instead. + * @param {Object} attrs Various attributes, e.g. saturation and value + * @private + */ +DateGraph.prototype.setColors_ = function(attrs) { + var num = this.labels_.length; + this.colors_ = []; + if (!attrs.colors) { + var sat = attrs.colorSaturation || 1.0; + var val = attrs.colorValue || 0.5; + for (var i = 1; i <= num; i++) { + var hue = (1.0*i/(1+num)); + this.colors_.push( MochiKit.Color.Color.fromHSV(hue, sat, val) ); + } + } else { + for (var i = 0; i < num; i++) { + var colorStr = attrs.colors[i % attrs.colors.length]; + this.colors_.push( MochiKit.Color.Color.fromString(colorStr) ); + } + } +} + +/** + * Create the div that contains information on the selected point(s) + * This goes in the top right of the canvas, unless an external div has already + * been specified. + * @private + */ +DateGraph.prototype.createStatusMessage_ = function(){ + if (!this.labelsDiv_) { + var divWidth = 250; + var messagestyle = { "style": { + "position": "absolute", + "fontSize": "14px", + "zIndex": 10, + "width": divWidth + "px", + "top": "0px", + "left": this.width_ - divWidth + "px", + "background": "white", + "textAlign": "left", + "overflow": "hidden"}}; + this.labelsDiv_ = MochiKit.DOM.DIV(messagestyle); + MochiKit.DOM.appendChildNodes(this.graphDiv, this.labelsDiv_); + } +}; + +/** + * Create the text box to adjust the averaging period + * @return {Object} The newly-created text box + * @private + */ +DateGraph.prototype.createRollInterface_ = function() { + var padding = this.plotter_.options.padding; + var textAttr = { "type": "text", + "size": "2", + "value": this.rollPeriod_, + "style": { "position": "absolute", + "zIndex": 10, + "top": (this.height_ - 25 - padding.bottom) + "px", + "left": (padding.left+1) + "px" } + }; + var roller = MochiKit.DOM.INPUT(textAttr); + var pa = this.graphDiv; + MochiKit.DOM.appendChildNodes(pa, roller); + connect(roller, 'onchange', this, + function() { this.adjustRoll(roller.value); }); + return roller; +} + +/** + * Set up all the mouse handlers needed to capture dragging behavior for zoom + * events. Uses MochiKit.Signal to attach all the event handlers. + * @private + */ +DateGraph.prototype.createDragInterface_ = function() { + var self = this; + + // Tracks whether the mouse is down right now + var mouseDown = false; + var dragStartX = null; + var dragStartY = null; + var dragEndX = null; + var dragEndY = null; + var prevEndX = null; + + // Utility function to convert page-wide coordinates to canvas coords + var px = PlotKit.Base.findPosX(this.canvas_); + var py = PlotKit.Base.findPosY(this.canvas_); + var getX = function(e) { return e.mouse().page.x - px }; + var getY = function(e) { return e.mouse().page.y - py }; + + // Draw zoom rectangles when the mouse is down and the user moves around + connect(this.hidden_, 'onmousemove', function(event) { + if (mouseDown) { + dragEndX = getX(event); + dragEndY = getY(event); + + self.drawZoomRect_(dragStartX, dragEndX, prevEndX); + prevEndX = dragEndX; + } + }); + + // Track the beginning of drag events + connect(this.hidden_, 'onmousedown', function(event) { + mouseDown = true; + dragStartX = getX(event); + dragStartY = getY(event); + }); + + // If the user releases the mouse button during a drag, but not over the + // canvas, then it doesn't count as a zooming action. + connect(document, 'onmouseup', this, function(event) { + if (mouseDown) { + mouseDown = false; + dragStartX = null; + dragStartY = null; + } + }); + + // Temporarily cancel the dragging event when the mouse leaves the graph + connect(this.hidden_, 'onmouseout', this, function(event) { + if (mouseDown) { + dragEndX = null; + dragEndY = null; + } + }); + + // If the mouse is released on the canvas during a drag event, then it's a + // zoom. Only do the zoom if it's over a large enough area (>= 10 pixels) + connect(this.hidden_, 'onmouseup', this, function(event) { + if (mouseDown) { + mouseDown = false; + dragEndX = getX(event); + dragEndY = getY(event); + var regionWidth = Math.abs(dragEndX - dragStartX); + var regionHeight = Math.abs(dragEndY - dragStartY); + + if (regionWidth < 2 && regionHeight < 2 && + self.clickCallback_ != null && + self.lastx_ != undefined) { + self.clickCallback_(event, new Date(self.lastx_)); + } + + if (regionWidth >= 10) { + self.doZoom_(Math.min(dragStartX, dragEndX), + Math.max(dragStartX, dragEndX)); + } else { + self.canvas_.getContext("2d").clearRect(0, 0, + self.canvas_.width, + self.canvas_.height); + } + + dragStartX = null; + dragStartY = null; + } + }); + + // Double-clicking zooms back out + connect(this.hidden_, 'ondblclick', this, function(event) { + self.dateWindow_ = null; + self.drawGraph_(self.rawData_); + var minDate = self.rawData_[0][0]; + var maxDate = self.rawData_[self.rawData_.length - 1][0]; + self.zoomCallback_(minDate, maxDate); + }); +}; + +/** + * Draw a gray zoom rectangle over the desired area of the canvas. Also clears + * up any previous zoom rectangles that were drawn. This could be optimized to + * avoid extra redrawing, but it's tricky to avoid interactions with the status + * dots. + * @param {Number} startX The X position where the drag started, in canvas + * coordinates. + * @param {Number} endX The current X position of the drag, in canvas coords. + * @param {Number} prevEndX The value of endX on the previous call to this + * function. Used to avoid excess redrawing + * @private + */ +DateGraph.prototype.drawZoomRect_ = function(startX, endX, prevEndX) { + var ctx = this.canvas_.getContext("2d"); + + // Clean up from the previous rect if necessary + if (prevEndX) { + ctx.clearRect(Math.min(startX, prevEndX), 0, + Math.abs(startX - prevEndX), this.height_); + } + + // Draw a light-grey rectangle to show the new viewing area + if (endX && startX) { + ctx.fillStyle = "rgba(128,128,128,0.33)"; + ctx.fillRect(Math.min(startX, endX), 0, + Math.abs(endX - startX), this.height_); + } +}; + +/** + * Zoom to something containing [lowX, highX]. These are pixel coordinates + * in the canvas. The exact zoom window may be slightly larger if there are no + * data points near lowX or highX. This function redraws the graph. + * @param {Number} lowX The leftmost pixel value that should be visible. + * @param {Number} highX The rightmost pixel value that should be visible. + * @private + */ +DateGraph.prototype.doZoom_ = function(lowX, highX) { + // Find the earliest and latest dates contained in this canvasx range. + var points = this.layout_.points; + var minDate = null; + var maxDate = null; + // Find the nearest [minDate, maxDate] that contains [lowX, highX] + for (var i = 0; i < points.length; i++) { + var cx = points[i].canvasx; + var x = points[i].xval; + if (cx < lowX && (minDate == null || x > minDate)) minDate = x; + if (cx > highX && (maxDate == null || x < maxDate)) maxDate = x; + } + // Use the extremes if either is missing + if (minDate == null) minDate = points[0].xval; + if (maxDate == null) maxDate = points[points.length-1].xval; + + this.dateWindow_ = [minDate, maxDate]; + this.drawGraph_(this.rawData_); + this.zoomCallback_(minDate, maxDate); +}; + +/** + * When the mouse moves in the canvas, display information about a nearby data + * point and draw dots over those points in the data series. This function + * takes care of cleanup of previously-drawn dots. + * @param {Object} event The mousemove event from the browser. + * @private + */ +DateGraph.prototype.mouseMove_ = function(event) { + var canvasx = event.mouse().page.x - PlotKit.Base.findPosX(this.hidden_); + var points = this.layout_.points; + + var lastx = -1; + var lasty = -1; + + // Loop through all the points and find the date nearest to our current + // location. + var minDist = 1e+100; + var idx = -1; + for (var i = 0; i < points.length; i++) { + var dist = Math.abs(points[i].canvasx - canvasx); + if (dist > minDist) break; + minDist = dist; + idx = i; + } + if (idx >= 0) lastx = points[idx].xval; + // Check that you can really highlight the last day's data + if (canvasx > points[points.length-1].canvasx) + lastx = points[points.length-1].xval; + + // Extract the points we've selected + var selPoints = []; + for (var i = 0; i < points.length; i++) { + if (points[i].xval == lastx) { + selPoints.push(points[i]); + } + } + + // Clear the previously drawn vertical, if there is one + var circleSize = 3; + var ctx = this.canvas_.getContext("2d"); + if (this.previousVerticalX_ >= 0) { + var px = this.previousVerticalX_; + ctx.clearRect(px - circleSize - 1, 0, 2 * circleSize + 2, this.height_); + } + + if (selPoints.length > 0) { + var canvasx = selPoints[0].canvasx; + + // Set the status message to indicate the selected point(s) + var replace = this.xValueFormatter_(lastx) + ":"; + var clen = this.colors_.length; + for (var i = 0; i < selPoints.length; i++) { + if (this.labelsSeparateLines) { + replace += "
"; + } + var point = selPoints[i]; + replace += " " + + point.name + ":" + + this.round_(point.yval, 2); + } + this.labelsDiv_.innerHTML = replace; + + // Save last x position for callbacks. + this.lastx_ = lastx; + + // Draw colored circles over the center of each selected point + ctx.save() + for (var i = 0; i < selPoints.length; i++) { + ctx.beginPath(); + ctx.fillStyle = this.colors_[i%clen].toRGBString(); + ctx.arc(canvasx, selPoints[i%clen].canvasy, circleSize, 0, 360, false); + ctx.fill(); + } + ctx.restore(); + + this.previousVerticalX_ = canvasx; + } +}; + +/** + * The mouse has left the canvas. Clear out whatever artifacts remain + * @param {Object} event the mouseout event from the browser. + * @private + */ +DateGraph.prototype.mouseOut_ = function(event) { + // Get rid of the overlay data + var ctx = this.canvas_.getContext("2d"); + ctx.clearRect(0, 0, this.width_, this.height_); + this.labelsDiv_.innerHTML = ""; +}; + +/** + * Convert a JS date (millis since epoch) to YYYY/MM/DD + * @param {Number} date The JavaScript date (ms since epoch) + * @return {String} A date of the form "YYYY/MM/DD" + * @private + */ +DateGraph.prototype.dateString_ = function(date) { + var d = new Date(date); + + // Get the year: + var year = "" + d.getFullYear(); + // Get a 0 padded month string + var month = "" + (d.getMonth() + 1); //months are 0-offset, sigh + if (month.length < 2) month = "0" + month; + // Get a 0 padded day string + var day = "" + d.getDate(); + if (day.length < 2) day = "0" + day; + + return year + "/" + month + "/" + day; +}; + +/** + * Round a number to the specified number of digits past the decimal point. + * @param {Number} num The number to round + * @param {Number} places The number of decimals to which to round + * @return {Number} The rounded number + * @private + */ +DateGraph.prototype.round_ = function(num, places) { + var shift = Math.pow(10, places); + return Math.round(num * shift)/shift; +}; + +/** + * Fires when there's data available to be graphed. + * @param {String} data Raw CSV data to be plotted + * @private + */ +DateGraph.prototype.loadedEvent_ = function(data) { + this.rawData_ = this.parseCSV_(data); + this.drawGraph_(this.rawData_); +}; + +DateGraph.prototype.months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +DateGraph.prototype.quarters = ["Jan", "Apr", "Jul", "Oct"]; + +/** + * Add ticks on the x-axis representing years, months, quarters, weeks, or days + * @private + */ +DateGraph.prototype.addXTicks_ = function() { + // Determine the correct ticks scale on the x-axis: quarterly, monthly, ... + var startDate, endDate; + if (this.dateWindow_) { + startDate = this.dateWindow_[0]; + endDate = this.dateWindow_[1]; + } else { + startDate = this.rawData_[0][0]; + endDate = this.rawData_[this.rawData_.length - 1][0]; + } + + var xTicks = this.xTicker_(startDate, endDate); + this.layout_.updateOptions({xTicks: xTicks}); +} + +/** + * Add ticks to the x-axis based on a date range. + * @param {Number} startDate Start of the date window (millis since epoch) + * @param {Number} endDate End of the date window (millis since epoch) + * @return {Array.} Array of {label, value} tuples. + * @public + */ +DateGraph.prototype.dateTicker = function(startDate, endDate) { + var ONE_DAY = 24*60*60*1000; + startDate = startDate / ONE_DAY; + endDate = endDate / ONE_DAY; + var dateSpan = endDate - startDate; + + var scale = []; + var isMonthly = false; + var yearMod = 1; + if (dateSpan > 30 * 366) { // decadal + isMonthly = true; + scale = ["Jan"]; + yearMod = 10; + } else if (dateSpan > 4*366) { // annual + scale = ["Jan"]; + isMonthly = true; + } else if (dateSpan > 366) { // quarterly + scale = this.quarters; + isMonthly = true; + } else if (dateSpan > 40) { // monthly + scale = this.months; + isMonthly = true; + } else if (dateSpan > 10) { // weekly + for (var week = startDate - 14; week < endDate + 14; week += 7) { + scale.push(week * ONE_DAY); + } + } else { // daily + for (var day = startDate - 14; day < endDate + 14; day += 1) { + scale.push(day * ONE_DAY); + } + } + + var xTicks = []; + + if (isMonthly) { + var startYear = 1900 + (new Date(startDate* ONE_DAY)).getYear(); + var endYear = 1900 + (new Date(endDate * ONE_DAY)).getYear(); + for (var i = startYear; i <= endYear; i++) { + if (i % yearMod != 0) continue; + for (var j = 0; j < scale.length; j++ ) { + var date = Date.parse(scale[j] + " 1, " + i); + xTicks.push( {label: scale[j] + "'" + ("" + i).substr(2,2), v: date } ); + } + } + } else { + for (var i = 0; i < scale.length; i++) { + var date = new Date(scale[i]); + var year = date.getFullYear().toString(); + var label = this.months[date.getMonth()] + date.getDate(); + label += "'" + year.substr(year.length - 2, 2); + xTicks.push( {label: label, v: date} ); + } + } + return xTicks; +}; + +/** + * Add ticks when the x axis has numbers on it (instead of dates) + * @param {Number} startDate Start of the date window (millis since epoch) + * @param {Number} endDate End of the date window (millis since epoch) + * @return {Array.} Array of {label, value} tuples. + * @public + */ +DateGraph.prototype.numericTicks = function(minV, maxV) { + var scale; + if (maxV <= 0.0) { + scale = 1.0; + } else { + scale = Math.pow( 10, Math.floor(Math.log(maxV)/Math.log(10.0)) ); + } + + // Add a smallish number of ticks at human-friendly points + var nTicks = (maxV - minV) / scale; + while (2 * nTicks < 20) { + nTicks *= 2; + } + if ((maxV - minV) / nTicks < this.minTickSize_) { + nTicks = this.round_((maxV - minV) / this.minTickSize_, 1); + } + + // Construct labels for the ticks + var ticks = []; + for (var i = 0; i <= nTicks; i++) { + var tickV = minV + i * (maxV - minV) / nTicks; + var label = this.round_(tickV, 2); + if (this.labelsKMB_) { + var k = 1000; + if (tickV >= k*k*k) { + label = this.round_(tickV/(k*k*k), 1) + "B"; + } else if (tickV >= k*k) { + label = this.round_(tickV/(k*k), 1) + "M"; + } else if (tickV >= k) { + label = this.round_(tickV/k, 1) + "K"; + } + } + ticks.push( {label: label, v: tickV} ); + } + return ticks; +}; + +/** + * Adds appropriate ticks on the y-axis + * @param {Number} minY The minimum Y value in the data set + * @param {Number} maxY The maximum Y value in the data set + * @private + */ +DateGraph.prototype.addYTicks_ = function(minY, maxY) { + // Set the number of ticks so that the labels are human-friendly. + var ticks = this.numericTicks(minY, maxY); + this.layout_.updateOptions( { yAxis: [minY, maxY], + yTicks: ticks } ); +}; + +/** + * Update the graph with new data. Data is in the format + * [ [date1, val1, val2, ...], [date2, val1, val2, ...] if errorBars=false + * or, if errorBars=true, + * [ [date1, [val1,stddev1], [val2,stddev2], ...], [date2, ...], ...] + * @param {Array.} data The data (see above) + * @private + */ +DateGraph.prototype.drawGraph_ = function(data) { + var maxY = null; + this.layout_.removeAllDatasets(); + // Loop over all fields in the dataset + for (var i = 1; i < data[0].length; i++) { + var series = []; + for (var j = 0; j < data.length; j++) { + var date = data[j][0]; + series[j] = [date, data[j][i]]; + } + series = this.rollingAverage(series, this.rollPeriod_); + + // Prune down to the desired range, if necessary (for zooming) + var bars = this.errorBars_ || this.customBars_; + if (this.dateWindow_) { + var low = this.dateWindow_[0]; + var high= this.dateWindow_[1]; + var pruned = []; + for (var k = 0; k < series.length; k++) { + if (series[k][0] >= low && series[k][0] <= high) { + pruned.push(series[k]); + var y = bars ? series[k][1][0] : series[k][1]; + if (maxY == null || y > maxY) maxY = y; + } + } + series = pruned; + } else { + for (var j = 0; j < series.length; j++) { + var y = bars ? series[j][1][0] : series[j][1]; + if (maxY == null || y > maxY) { + maxY = bars ? y + series[j][1][1] : y; + } + } + } + + if (bars) { + var vals = []; + for (var j=0; j= 0) { + num -= originalData[i - rollPeriod][1][0]; + den -= originalData[i - rollPeriod][1][1]; + } + + var date = originalData[i][0]; + var value = den ? num / den : 0.0; + if (this.errorBars_) { + if (this.wilsonInterval_) { + // For more details on this confidence interval, see: + // http://en.wikipedia.org/wiki/Binomial_confidence_interval + if (den) { + var p = value < 0 ? 0 : value, n = den; + var pm = sigma * Math.sqrt(p*(1-p)/n + sigma*sigma/(4*n*n)); + var denom = 1 + sigma * sigma / den; + var low = (p + sigma * sigma / (2 * den) - pm) / denom; + var high = (p + sigma * sigma / (2 * den) + pm) / denom; + rollingData[i] = [date, + [p * mult, (p - low) * mult, (high - p) * mult]]; + } else { + rollingData[i] = [date, [0, 0, 0]]; + } + } else { + var stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0; + rollingData[i] = [date, [mult * value, mult * stddev, mult * stddev]]; + } + } else { + rollingData[i] = [date, mult * value]; + } + } + } else if (this.customBars_) { + // just ignore the rolling for now. + // TODO(danvk): do something reasonable. + for (var i = 0; i < originalData.length; i++) { + var data = originalData[i][1]; + var y = data[1]; + rollingData[i] = [originalData[i][0], [y, y - data[0], data[2] - y]]; + } + } else { + // Calculate the rolling average for the first rollPeriod - 1 points where + // there is not enough data to roll over the full number of days + var num_init_points = Math.min(rollPeriod - 1, originalData.length - 2); + if (!this.errorBars_){ + for (var i = 0; i < num_init_points; i++) { + var sum = 0; + for (var j = 0; j < i + 1; j++) + sum += originalData[j][1]; + rollingData[i] = [originalData[i][0], sum / (i + 1)]; + } + // Calculate the rolling average for the remaining points + for (var i = Math.min(rollPeriod - 1, originalData.length - 2); + i < originalData.length; + i++) { + var sum = 0; + for (var j = i - rollPeriod + 1; j < i + 1; j++) + sum += originalData[j][1]; + rollingData[i] = [originalData[i][0], sum / rollPeriod]; + } + } else { + for (var i = 0; i < num_init_points; i++) { + var sum = 0; + var variance = 0; + for (var j = 0; j < i + 1; j++) { + sum += originalData[j][1][0]; + variance += Math.pow(originalData[j][1][1], 2); + } + var stddev = Math.sqrt(variance)/(i+1); + rollingData[i] = [originalData[i][0], + [sum/(i+1), sigma * stddev, sigma * stddev]]; + } + // Calculate the rolling average for the remaining points + for (var i = Math.min(rollPeriod - 1, originalData.length - 2); + i < originalData.length; + i++) { + var sum = 0; + var variance = 0; + for (var j = i - rollPeriod + 1; j < i + 1; j++) { + sum += originalData[j][1][0]; + variance += Math.pow(originalData[j][1][1], 2); + } + var stddev = Math.sqrt(variance) / rollPeriod; + rollingData[i] = [originalData[i][0], + [sum / rollPeriod, sigma * stddev, sigma * stddev]]; + } + } + } + + return rollingData; +}; + +/** + * Parses a date, returning the number of milliseconds since epoch. This can be + * passed in as an xValueParser in the DateGraph constructor. + * @param {String} A date in YYYYMMDD format. + * @return {Number} Milliseconds since epoch. + * @public + */ +DateGraph.prototype.dateParser = function(dateStr) { + var dateStrSlashed; + if (dateStr.search("-") != -1) { + dateStrSlashed = dateStr.replace("-", "/", "g"); + } else if (dateStr.search("/") != -1) { + return Date.parse(dateStr); + } else { + dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2) + + "/" + dateStr.substr(6,2); + } + return Date.parse(dateStrSlashed); +}; + +/** + * Parses a string in a special csv format. We expect a csv file where each + * line is a date point, and the first field in each line is the date string. + * We also expect that all remaining fields represent series. + * if this.errorBars_ is set, then interpret the fields as: + * date, series1, stddev1, series2, stddev2, ... + * @param {Array.} data See above. + * @private + */ +DateGraph.prototype.parseCSV_ = function(data) { + var ret = []; + var lines = data.split("\n"); + var start = this.labelsFromCSV_ ? 1 : 0; + if (this.labelsFromCSV_) { + var labels = lines[0].split(","); + labels.shift(); // a "date" parameter is assumed. + this.labels_ = labels; + // regenerate automatic colors. + this.setColors_(this.attrs_); + this.renderOptions_.colorScheme = this.colors_; + MochiKit.Base.update(this.plotter_.options, this.renderOptions_); + MochiKit.Base.update(this.layoutOptions_, this.attrs_); + } + + for (var i = start; i < lines.length; i++) { + var line = lines[i]; + if (line.length == 0) continue; // skip blank lines + var inFields = line.split(','); + if (inFields.length < 2) + continue; + + var fields = []; + fields[0] = this.xValueParser_(inFields[0]); + + // If fractions are expected, parse the numbers as "A/B" + if (this.fractions_) { + for (var j = 1; j < inFields.length; j++) { + // TODO(danvk): figure out an appropriate way to flag parse errors. + var vals = inFields[j].split("/"); + fields[j] = [parseFloat(vals[0]), parseFloat(vals[1])]; + } + } else if (this.errorBars_) { + // If there are error bars, values are (value, stddev) pairs + for (var j = 1; j < inFields.length; j += 2) + fields[(j + 1) / 2] = [parseFloat(inFields[j]), + parseFloat(inFields[j + 1])]; + } else if (this.customBars_) { + // Bars are a low;center;high tuple + for (var j = 1; j < inFields.length; j++) { + var vals = inFields[j].split(";"); + fields[j] = [ parseFloat(vals[0]), + parseFloat(vals[1]), + parseFloat(vals[2]) ]; + } + } else { + // Values are just numbers + for (var j = 1; j < inFields.length; j++) + fields[j] = parseFloat(inFields[j]); + } + ret.push(fields); + } + return ret; +}; + +/** + * Get the CSV data. If it's in a function, call that function. If it's in a + * file, do an XMLHttpRequest to get it. + * @private + */ +DateGraph.prototype.start_ = function() { + if (typeof this.file_ == 'function') { + // Stubbed out to allow this to run off a filesystem + this.loadedEvent_(this.file_()); + } else { + var req = new XMLHttpRequest(); + var caller = this; + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status == 200) { + caller.loadedEvent_(req.responseText); + } + } + }; + + req.open("GET", this.file_, true); + req.send(null); + } +}; + +/** + * Changes various properties of the graph. These can include: + *
    + *
  • file: changes the source data for the graph
  • + *
  • errorBars: changes whether the data contains stddev
  • + *
+ * @param {Object} attrs The new properties and values + */ +DateGraph.prototype.updateOptions = function(attrs) { + if (attrs.errorBars) { + this.errorBars_ = attrs.errorBars; + } + if (attrs.customBars) { + this.customBars_ = attrs.customBars; + } + if (attrs.strokeWidth) { + this.strokeWidth_ = attrs.strokeWidth; + } + if (attrs.rollPeriod) { + this.rollPeriod_ = attrs.rollPeriod; + } + if (attrs.dateWindow) { + this.dateWindow_ = attrs.dateWindow; + } + if (attrs.valueRange) { + this.valueRange_ = attrs.valueRange; + } + if (attrs.minTickSize) { + this.minTickSize_ = attrs.minTickSize; + } + if (typeof(attrs.labels) != 'undefined') { + this.labels_ = attrs.labels; + this.labelsFromCSV_ = (attrs.labels == null); + } + this.layout_.updateOptions({ 'errorBars': this.errorBars_ }); + if (attrs['file'] && attrs['file'] != this.file_) { + this.file_ = attrs['file']; + this.start_(); + } else { + this.drawGraph_(this.rawData_); + } +}; + +/** + * Adjusts the number of days in the rolling average. Updates the graph to + * reflect the new averaging period. + * @param {Number} length Number of days over which to average the data. + */ +DateGraph.prototype.adjustRoll = function(length) { + this.rollPeriod_ = length; + this.drawGraph_(this.rawData_); +}; diff --git a/dygraph.js b/dygraph.js new file mode 100644 index 0000000..6369f11 --- /dev/null +++ b/dygraph.js @@ -0,0 +1,1063 @@ +// Copyright 2006 Dan Vanderkam (danvdk@gmail.com) +// All Rights Reserved. + +/** + * @fileoverview Creates an interactive, zoomable graph based on a CSV file or + * string. DateGraph can handle multiple series with or without error bars. The + * date/value ranges will be automatically set. DateGraph uses the + * <canvas> tag, so it only works in FF1.5+. + * @author danvdk@gmail.com (Dan Vanderkam) + + Usage: +
+ + + The CSV file is of the form + + YYYYMMDD,A1,B1,C1 + YYYYMMDD,A2,B2,C2 + + If null is passed as the third parameter (series names), then the first line + of the CSV file is assumed to contain names for each series. + + If the 'errorBars' option is set in the constructor, the input should be of + the form + + YYYYMMDD,A1,sigmaA1,B1,sigmaB1,... + YYYYMMDD,A2,sigmaA2,B2,sigmaB2,... + + If the 'fractions' option is set, the input should be of the form: + + YYYYMMDD,A1/B1,A2/B2,... + YYYYMMDD,A1/B1,A2/B2,... + + And error bars will be calculated automatically using a binomial distribution. + + For further documentation and examples, see http://www/~danvk/dg/ + + */ + +/** + * An interactive, zoomable graph + * @param {String | Function} file A file containing CSV data or a function that + * returns this data. The expected format for each line is + * YYYYMMDD,val1,val2,... or, if attrs.errorBars is set, + * YYYYMMDD,val1,stddev1,val2,stddev2,... + * @param {Array.} labels Labels for the data series + * @param {Object} attrs Various other attributes, e.g. errorBars determines + * whether the input data contains error ranges. + */ +DateGraph = function(div, file, labels, attrs) { + if (arguments.length > 0) + this.__init__(div, file, labels, attrs); +}; + +DateGraph.NAME = "DateGraph"; +DateGraph.VERSION = "1.1"; +DateGraph.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; +DateGraph.toString = function() { + return this.__repr__(); +}; + +// Various default values +DateGraph.DEFAULT_ROLL_PERIOD = 1; +DateGraph.DEFAULT_WIDTH = 480; +DateGraph.DEFAULT_HEIGHT = 320; +DateGraph.DEFAULT_STROKE_WIDTH = 1.0; +DateGraph.AXIS_LINE_WIDTH = 0.3; + +/** + * Initializes the DateGraph. This creates a new DIV and constructs the PlotKit + * and interaction <canvas> inside of it. See the constructor for details + * on the parameters. + * @param {String | Function} file Source data + * @param {Array.} labels Names of the data series + * @param {Object} attrs Miscellaneous other options + * @private + */ +DateGraph.prototype.__init__ = function(div, file, labels, attrs) { + // Copy the important bits into the object + this.maindiv_ = div; + this.labels_ = labels; + this.file_ = file; + this.rollPeriod_ = attrs.rollPeriod || DateGraph.DEFAULT_ROLL_PERIOD; + this.previousVerticalX_ = -1; + this.width_ = parseInt(div.style.width, 10); + this.height_ = parseInt(div.style.height, 10); + this.errorBars_ = attrs.errorBars || false; + this.fractions_ = attrs.fractions || false; + this.strokeWidth_ = attrs.strokeWidth || DateGraph.DEFAULT_STROKE_WIDTH; + this.dateWindow_ = attrs.dateWindow || null; + this.valueRange_ = attrs.valueRange || null; + this.labelsSeparateLines = attrs.labelsSeparateLines || false; + this.labelsDiv_ = attrs.labelsDiv || null; + this.labelsKMB_ = attrs.labelsKMB || false; + this.minTickSize_ = attrs.minTickSize || 0; + this.xValueParser_ = attrs.xValueParser || DateGraph.prototype.dateParser; + this.xValueFormatter_ = attrs.xValueFormatter || + DateGraph.prototype.dateString_; + this.xTicker_ = attrs.xTicker || DateGraph.prototype.dateTicker; + this.sigma_ = attrs.sigma || 2.0; + this.wilsonInterval_ = attrs.wilsonInterval || true; + this.customBars_ = attrs.customBars || false; + this.attrs_ = attrs; + + // Make a note of whether labels will be pulled from the CSV file. + this.labelsFromCSV_ = (this.labels_ == null); + if (this.labels_ == null) + this.labels_ = []; + + // Prototype of the callback is "void clickCallback(event, date)" + this.clickCallback_ = attrs.clickCallback || null; + + // Prototype of zoom callback is "void dragCallback(minDate, maxDate)" + this.zoomCallback_ = attrs.zoomCallback || null; + + // Create the containing DIV and other interactive elements + this.createInterface_(); + + // Create the PlotKit grapher + this.layoutOptions_ = { 'errorBars': (this.errorBars_ || this.customBars_), + 'xOriginIsZero': false }; + MochiKit.Base.update(this.layoutOptions_, attrs); + this.setColors_(attrs); + + this.layout_ = new DateGraphLayout(this.layoutOptions_); + + this.renderOptions_ = { colorScheme: this.colors_, + strokeColor: null, + strokeWidth: this.strokeWidth_, + axisLabelFontSize: 14, + axisLineWidth: DateGraph.AXIS_LINE_WIDTH }; + MochiKit.Base.update(this.renderOptions_, attrs); + this.plotter_ = new DateGraphCanvasRenderer(this.hidden_, this.layout_, + this.renderOptions_); + + this.createStatusMessage_(); + this.createRollInterface_(); + this.createDragInterface_(); + + MochiKit.DOM.addLoadEvent(this.start_()); +}; + +/** + * Returns the current rolling period, as set by the user or an option. + * @return {Number} The number of days in the rolling window + */ +DateGraph.prototype.rollPeriod = function() { + return this.rollPeriod_; +} + +/** + * Generates interface elements for the DateGraph: a containing div, a div to + * display the current point, and a textbox to adjust the rolling average + * period. + * @private + */ +DateGraph.prototype.createInterface_ = function() { + // Create the all-enclosing graph div + var enclosing = this.maindiv_; + + this.graphDiv = MochiKit.DOM.DIV( { style: { 'width': this.width_ + "px", + 'height': this.height_ + "px" + }}); + appendChildNodes(enclosing, this.graphDiv); + + // Create the canvas to store + var canvas = MochiKit.DOM.CANVAS; + this.canvas_ = canvas( { style: { 'position': 'absolute' }, + width: this.width_, + height: this.height_}); + appendChildNodes(this.graphDiv, this.canvas_); + + this.hidden_ = this.createPlotKitCanvas_(this.canvas_); + connect(this.hidden_, 'onmousemove', this, function(e) { this.mouseMove_(e) }); + connect(this.hidden_, 'onmouseout', this, function(e) { this.mouseOut_(e) }); +} + +/** + * Creates the canvas containing the PlotKit graph. Only plotkit ever draws on + * this particular canvas. All DateGraph work is done on this.canvas_. + * @param {Object} canvas The DateGraph canvas to over which to overlay the plot + * @return {Object} The newly-created canvas + * @private + */ +DateGraph.prototype.createPlotKitCanvas_ = function(canvas) { + var h = document.createElement("canvas"); + h.style.position = "absolute"; + h.style.top = canvas.style.top; + h.style.left = canvas.style.left; + h.width = this.width_; + h.height = this.height_; + MochiKit.DOM.appendChildNodes(this.graphDiv, h); + return h; +}; + +/** + * Generate a set of distinct colors for the data series. This is done with a + * color wheel. Saturation/Value are customizable, and the hue is + * equally-spaced around the color wheel. If a custom set of colors is + * specified, that is used instead. + * @param {Object} attrs Various attributes, e.g. saturation and value + * @private + */ +DateGraph.prototype.setColors_ = function(attrs) { + var num = this.labels_.length; + this.colors_ = []; + if (!attrs.colors) { + var sat = attrs.colorSaturation || 1.0; + var val = attrs.colorValue || 0.5; + for (var i = 1; i <= num; i++) { + var hue = (1.0*i/(1+num)); + this.colors_.push( MochiKit.Color.Color.fromHSV(hue, sat, val) ); + } + } else { + for (var i = 0; i < num; i++) { + var colorStr = attrs.colors[i % attrs.colors.length]; + this.colors_.push( MochiKit.Color.Color.fromString(colorStr) ); + } + } +} + +/** + * Create the div that contains information on the selected point(s) + * This goes in the top right of the canvas, unless an external div has already + * been specified. + * @private + */ +DateGraph.prototype.createStatusMessage_ = function(){ + if (!this.labelsDiv_) { + var divWidth = 250; + var messagestyle = { "style": { + "position": "absolute", + "fontSize": "14px", + "zIndex": 10, + "width": divWidth + "px", + "top": "0px", + "left": this.width_ - divWidth + "px", + "background": "white", + "textAlign": "left", + "overflow": "hidden"}}; + this.labelsDiv_ = MochiKit.DOM.DIV(messagestyle); + MochiKit.DOM.appendChildNodes(this.graphDiv, this.labelsDiv_); + } +}; + +/** + * Create the text box to adjust the averaging period + * @return {Object} The newly-created text box + * @private + */ +DateGraph.prototype.createRollInterface_ = function() { + var padding = this.plotter_.options.padding; + var textAttr = { "type": "text", + "size": "2", + "value": this.rollPeriod_, + "style": { "position": "absolute", + "zIndex": 10, + "top": (this.height_ - 25 - padding.bottom) + "px", + "left": (padding.left+1) + "px" } + }; + var roller = MochiKit.DOM.INPUT(textAttr); + var pa = this.graphDiv; + MochiKit.DOM.appendChildNodes(pa, roller); + connect(roller, 'onchange', this, + function() { this.adjustRoll(roller.value); }); + return roller; +} + +/** + * Set up all the mouse handlers needed to capture dragging behavior for zoom + * events. Uses MochiKit.Signal to attach all the event handlers. + * @private + */ +DateGraph.prototype.createDragInterface_ = function() { + var self = this; + + // Tracks whether the mouse is down right now + var mouseDown = false; + var dragStartX = null; + var dragStartY = null; + var dragEndX = null; + var dragEndY = null; + var prevEndX = null; + + // Utility function to convert page-wide coordinates to canvas coords + var px = PlotKit.Base.findPosX(this.canvas_); + var py = PlotKit.Base.findPosY(this.canvas_); + var getX = function(e) { return e.mouse().page.x - px }; + var getY = function(e) { return e.mouse().page.y - py }; + + // Draw zoom rectangles when the mouse is down and the user moves around + connect(this.hidden_, 'onmousemove', function(event) { + if (mouseDown) { + dragEndX = getX(event); + dragEndY = getY(event); + + self.drawZoomRect_(dragStartX, dragEndX, prevEndX); + prevEndX = dragEndX; + } + }); + + // Track the beginning of drag events + connect(this.hidden_, 'onmousedown', function(event) { + mouseDown = true; + dragStartX = getX(event); + dragStartY = getY(event); + }); + + // If the user releases the mouse button during a drag, but not over the + // canvas, then it doesn't count as a zooming action. + connect(document, 'onmouseup', this, function(event) { + if (mouseDown) { + mouseDown = false; + dragStartX = null; + dragStartY = null; + } + }); + + // Temporarily cancel the dragging event when the mouse leaves the graph + connect(this.hidden_, 'onmouseout', this, function(event) { + if (mouseDown) { + dragEndX = null; + dragEndY = null; + } + }); + + // If the mouse is released on the canvas during a drag event, then it's a + // zoom. Only do the zoom if it's over a large enough area (>= 10 pixels) + connect(this.hidden_, 'onmouseup', this, function(event) { + if (mouseDown) { + mouseDown = false; + dragEndX = getX(event); + dragEndY = getY(event); + var regionWidth = Math.abs(dragEndX - dragStartX); + var regionHeight = Math.abs(dragEndY - dragStartY); + + if (regionWidth < 2 && regionHeight < 2 && + self.clickCallback_ != null && + self.lastx_ != undefined) { + self.clickCallback_(event, new Date(self.lastx_)); + } + + if (regionWidth >= 10) { + self.doZoom_(Math.min(dragStartX, dragEndX), + Math.max(dragStartX, dragEndX)); + } else { + self.canvas_.getContext("2d").clearRect(0, 0, + self.canvas_.width, + self.canvas_.height); + } + + dragStartX = null; + dragStartY = null; + } + }); + + // Double-clicking zooms back out + connect(this.hidden_, 'ondblclick', this, function(event) { + self.dateWindow_ = null; + self.drawGraph_(self.rawData_); + var minDate = self.rawData_[0][0]; + var maxDate = self.rawData_[self.rawData_.length - 1][0]; + self.zoomCallback_(minDate, maxDate); + }); +}; + +/** + * Draw a gray zoom rectangle over the desired area of the canvas. Also clears + * up any previous zoom rectangles that were drawn. This could be optimized to + * avoid extra redrawing, but it's tricky to avoid interactions with the status + * dots. + * @param {Number} startX The X position where the drag started, in canvas + * coordinates. + * @param {Number} endX The current X position of the drag, in canvas coords. + * @param {Number} prevEndX The value of endX on the previous call to this + * function. Used to avoid excess redrawing + * @private + */ +DateGraph.prototype.drawZoomRect_ = function(startX, endX, prevEndX) { + var ctx = this.canvas_.getContext("2d"); + + // Clean up from the previous rect if necessary + if (prevEndX) { + ctx.clearRect(Math.min(startX, prevEndX), 0, + Math.abs(startX - prevEndX), this.height_); + } + + // Draw a light-grey rectangle to show the new viewing area + if (endX && startX) { + ctx.fillStyle = "rgba(128,128,128,0.33)"; + ctx.fillRect(Math.min(startX, endX), 0, + Math.abs(endX - startX), this.height_); + } +}; + +/** + * Zoom to something containing [lowX, highX]. These are pixel coordinates + * in the canvas. The exact zoom window may be slightly larger if there are no + * data points near lowX or highX. This function redraws the graph. + * @param {Number} lowX The leftmost pixel value that should be visible. + * @param {Number} highX The rightmost pixel value that should be visible. + * @private + */ +DateGraph.prototype.doZoom_ = function(lowX, highX) { + // Find the earliest and latest dates contained in this canvasx range. + var points = this.layout_.points; + var minDate = null; + var maxDate = null; + // Find the nearest [minDate, maxDate] that contains [lowX, highX] + for (var i = 0; i < points.length; i++) { + var cx = points[i].canvasx; + var x = points[i].xval; + if (cx < lowX && (minDate == null || x > minDate)) minDate = x; + if (cx > highX && (maxDate == null || x < maxDate)) maxDate = x; + } + // Use the extremes if either is missing + if (minDate == null) minDate = points[0].xval; + if (maxDate == null) maxDate = points[points.length-1].xval; + + this.dateWindow_ = [minDate, maxDate]; + this.drawGraph_(this.rawData_); + this.zoomCallback_(minDate, maxDate); +}; + +/** + * When the mouse moves in the canvas, display information about a nearby data + * point and draw dots over those points in the data series. This function + * takes care of cleanup of previously-drawn dots. + * @param {Object} event The mousemove event from the browser. + * @private + */ +DateGraph.prototype.mouseMove_ = function(event) { + var canvasx = event.mouse().page.x - PlotKit.Base.findPosX(this.hidden_); + var points = this.layout_.points; + + var lastx = -1; + var lasty = -1; + + // Loop through all the points and find the date nearest to our current + // location. + var minDist = 1e+100; + var idx = -1; + for (var i = 0; i < points.length; i++) { + var dist = Math.abs(points[i].canvasx - canvasx); + if (dist > minDist) break; + minDist = dist; + idx = i; + } + if (idx >= 0) lastx = points[idx].xval; + // Check that you can really highlight the last day's data + if (canvasx > points[points.length-1].canvasx) + lastx = points[points.length-1].xval; + + // Extract the points we've selected + var selPoints = []; + for (var i = 0; i < points.length; i++) { + if (points[i].xval == lastx) { + selPoints.push(points[i]); + } + } + + // Clear the previously drawn vertical, if there is one + var circleSize = 3; + var ctx = this.canvas_.getContext("2d"); + if (this.previousVerticalX_ >= 0) { + var px = this.previousVerticalX_; + ctx.clearRect(px - circleSize - 1, 0, 2 * circleSize + 2, this.height_); + } + + if (selPoints.length > 0) { + var canvasx = selPoints[0].canvasx; + + // Set the status message to indicate the selected point(s) + var replace = this.xValueFormatter_(lastx) + ":"; + var clen = this.colors_.length; + for (var i = 0; i < selPoints.length; i++) { + if (this.labelsSeparateLines) { + replace += "
"; + } + var point = selPoints[i]; + replace += " " + + point.name + ":" + + this.round_(point.yval, 2); + } + this.labelsDiv_.innerHTML = replace; + + // Save last x position for callbacks. + this.lastx_ = lastx; + + // Draw colored circles over the center of each selected point + ctx.save() + for (var i = 0; i < selPoints.length; i++) { + ctx.beginPath(); + ctx.fillStyle = this.colors_[i%clen].toRGBString(); + ctx.arc(canvasx, selPoints[i%clen].canvasy, circleSize, 0, 360, false); + ctx.fill(); + } + ctx.restore(); + + this.previousVerticalX_ = canvasx; + } +}; + +/** + * The mouse has left the canvas. Clear out whatever artifacts remain + * @param {Object} event the mouseout event from the browser. + * @private + */ +DateGraph.prototype.mouseOut_ = function(event) { + // Get rid of the overlay data + var ctx = this.canvas_.getContext("2d"); + ctx.clearRect(0, 0, this.width_, this.height_); + this.labelsDiv_.innerHTML = ""; +}; + +/** + * Convert a JS date (millis since epoch) to YYYY/MM/DD + * @param {Number} date The JavaScript date (ms since epoch) + * @return {String} A date of the form "YYYY/MM/DD" + * @private + */ +DateGraph.prototype.dateString_ = function(date) { + var d = new Date(date); + + // Get the year: + var year = "" + d.getFullYear(); + // Get a 0 padded month string + var month = "" + (d.getMonth() + 1); //months are 0-offset, sigh + if (month.length < 2) month = "0" + month; + // Get a 0 padded day string + var day = "" + d.getDate(); + if (day.length < 2) day = "0" + day; + + return year + "/" + month + "/" + day; +}; + +/** + * Round a number to the specified number of digits past the decimal point. + * @param {Number} num The number to round + * @param {Number} places The number of decimals to which to round + * @return {Number} The rounded number + * @private + */ +DateGraph.prototype.round_ = function(num, places) { + var shift = Math.pow(10, places); + return Math.round(num * shift)/shift; +}; + +/** + * Fires when there's data available to be graphed. + * @param {String} data Raw CSV data to be plotted + * @private + */ +DateGraph.prototype.loadedEvent_ = function(data) { + this.rawData_ = this.parseCSV_(data); + this.drawGraph_(this.rawData_); +}; + +DateGraph.prototype.months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +DateGraph.prototype.quarters = ["Jan", "Apr", "Jul", "Oct"]; + +/** + * Add ticks on the x-axis representing years, months, quarters, weeks, or days + * @private + */ +DateGraph.prototype.addXTicks_ = function() { + // Determine the correct ticks scale on the x-axis: quarterly, monthly, ... + var startDate, endDate; + if (this.dateWindow_) { + startDate = this.dateWindow_[0]; + endDate = this.dateWindow_[1]; + } else { + startDate = this.rawData_[0][0]; + endDate = this.rawData_[this.rawData_.length - 1][0]; + } + + var xTicks = this.xTicker_(startDate, endDate); + this.layout_.updateOptions({xTicks: xTicks}); +} + +/** + * Add ticks to the x-axis based on a date range. + * @param {Number} startDate Start of the date window (millis since epoch) + * @param {Number} endDate End of the date window (millis since epoch) + * @return {Array.} Array of {label, value} tuples. + * @public + */ +DateGraph.prototype.dateTicker = function(startDate, endDate) { + var ONE_DAY = 24*60*60*1000; + startDate = startDate / ONE_DAY; + endDate = endDate / ONE_DAY; + var dateSpan = endDate - startDate; + + var scale = []; + var isMonthly = false; + var yearMod = 1; + if (dateSpan > 30 * 366) { // decadal + isMonthly = true; + scale = ["Jan"]; + yearMod = 10; + } else if (dateSpan > 4*366) { // annual + scale = ["Jan"]; + isMonthly = true; + } else if (dateSpan > 366) { // quarterly + scale = this.quarters; + isMonthly = true; + } else if (dateSpan > 40) { // monthly + scale = this.months; + isMonthly = true; + } else if (dateSpan > 10) { // weekly + for (var week = startDate - 14; week < endDate + 14; week += 7) { + scale.push(week * ONE_DAY); + } + } else { // daily + for (var day = startDate - 14; day < endDate + 14; day += 1) { + scale.push(day * ONE_DAY); + } + } + + var xTicks = []; + + if (isMonthly) { + var startYear = 1900 + (new Date(startDate* ONE_DAY)).getYear(); + var endYear = 1900 + (new Date(endDate * ONE_DAY)).getYear(); + for (var i = startYear; i <= endYear; i++) { + if (i % yearMod != 0) continue; + for (var j = 0; j < scale.length; j++ ) { + var date = Date.parse(scale[j] + " 1, " + i); + xTicks.push( {label: scale[j] + "'" + ("" + i).substr(2,2), v: date } ); + } + } + } else { + for (var i = 0; i < scale.length; i++) { + var date = new Date(scale[i]); + var year = date.getFullYear().toString(); + var label = this.months[date.getMonth()] + date.getDate(); + label += "'" + year.substr(year.length - 2, 2); + xTicks.push( {label: label, v: date} ); + } + } + return xTicks; +}; + +/** + * Add ticks when the x axis has numbers on it (instead of dates) + * @param {Number} startDate Start of the date window (millis since epoch) + * @param {Number} endDate End of the date window (millis since epoch) + * @return {Array.} Array of {label, value} tuples. + * @public + */ +DateGraph.prototype.numericTicks = function(minV, maxV) { + var scale; + if (maxV <= 0.0) { + scale = 1.0; + } else { + scale = Math.pow( 10, Math.floor(Math.log(maxV)/Math.log(10.0)) ); + } + + // Add a smallish number of ticks at human-friendly points + var nTicks = (maxV - minV) / scale; + while (2 * nTicks < 20) { + nTicks *= 2; + } + if ((maxV - minV) / nTicks < this.minTickSize_) { + nTicks = this.round_((maxV - minV) / this.minTickSize_, 1); + } + + // Construct labels for the ticks + var ticks = []; + for (var i = 0; i <= nTicks; i++) { + var tickV = minV + i * (maxV - minV) / nTicks; + var label = this.round_(tickV, 2); + if (this.labelsKMB_) { + var k = 1000; + if (tickV >= k*k*k) { + label = this.round_(tickV/(k*k*k), 1) + "B"; + } else if (tickV >= k*k) { + label = this.round_(tickV/(k*k), 1) + "M"; + } else if (tickV >= k) { + label = this.round_(tickV/k, 1) + "K"; + } + } + ticks.push( {label: label, v: tickV} ); + } + return ticks; +}; + +/** + * Adds appropriate ticks on the y-axis + * @param {Number} minY The minimum Y value in the data set + * @param {Number} maxY The maximum Y value in the data set + * @private + */ +DateGraph.prototype.addYTicks_ = function(minY, maxY) { + // Set the number of ticks so that the labels are human-friendly. + var ticks = this.numericTicks(minY, maxY); + this.layout_.updateOptions( { yAxis: [minY, maxY], + yTicks: ticks } ); +}; + +/** + * Update the graph with new data. Data is in the format + * [ [date1, val1, val2, ...], [date2, val1, val2, ...] if errorBars=false + * or, if errorBars=true, + * [ [date1, [val1,stddev1], [val2,stddev2], ...], [date2, ...], ...] + * @param {Array.} data The data (see above) + * @private + */ +DateGraph.prototype.drawGraph_ = function(data) { + var maxY = null; + this.layout_.removeAllDatasets(); + // Loop over all fields in the dataset + for (var i = 1; i < data[0].length; i++) { + var series = []; + for (var j = 0; j < data.length; j++) { + var date = data[j][0]; + series[j] = [date, data[j][i]]; + } + series = this.rollingAverage(series, this.rollPeriod_); + + // Prune down to the desired range, if necessary (for zooming) + var bars = this.errorBars_ || this.customBars_; + if (this.dateWindow_) { + var low = this.dateWindow_[0]; + var high= this.dateWindow_[1]; + var pruned = []; + for (var k = 0; k < series.length; k++) { + if (series[k][0] >= low && series[k][0] <= high) { + pruned.push(series[k]); + var y = bars ? series[k][1][0] : series[k][1]; + if (maxY == null || y > maxY) maxY = y; + } + } + series = pruned; + } else { + for (var j = 0; j < series.length; j++) { + var y = bars ? series[j][1][0] : series[j][1]; + if (maxY == null || y > maxY) { + maxY = bars ? y + series[j][1][1] : y; + } + } + } + + if (bars) { + var vals = []; + for (var j=0; j= 0) { + num -= originalData[i - rollPeriod][1][0]; + den -= originalData[i - rollPeriod][1][1]; + } + + var date = originalData[i][0]; + var value = den ? num / den : 0.0; + if (this.errorBars_) { + if (this.wilsonInterval_) { + // For more details on this confidence interval, see: + // http://en.wikipedia.org/wiki/Binomial_confidence_interval + if (den) { + var p = value < 0 ? 0 : value, n = den; + var pm = sigma * Math.sqrt(p*(1-p)/n + sigma*sigma/(4*n*n)); + var denom = 1 + sigma * sigma / den; + var low = (p + sigma * sigma / (2 * den) - pm) / denom; + var high = (p + sigma * sigma / (2 * den) + pm) / denom; + rollingData[i] = [date, + [p * mult, (p - low) * mult, (high - p) * mult]]; + } else { + rollingData[i] = [date, [0, 0, 0]]; + } + } else { + var stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0; + rollingData[i] = [date, [mult * value, mult * stddev, mult * stddev]]; + } + } else { + rollingData[i] = [date, mult * value]; + } + } + } else if (this.customBars_) { + // just ignore the rolling for now. + // TODO(danvk): do something reasonable. + for (var i = 0; i < originalData.length; i++) { + var data = originalData[i][1]; + var y = data[1]; + rollingData[i] = [originalData[i][0], [y, y - data[0], data[2] - y]]; + } + } else { + // Calculate the rolling average for the first rollPeriod - 1 points where + // there is not enough data to roll over the full number of days + var num_init_points = Math.min(rollPeriod - 1, originalData.length - 2); + if (!this.errorBars_){ + for (var i = 0; i < num_init_points; i++) { + var sum = 0; + for (var j = 0; j < i + 1; j++) + sum += originalData[j][1]; + rollingData[i] = [originalData[i][0], sum / (i + 1)]; + } + // Calculate the rolling average for the remaining points + for (var i = Math.min(rollPeriod - 1, originalData.length - 2); + i < originalData.length; + i++) { + var sum = 0; + for (var j = i - rollPeriod + 1; j < i + 1; j++) + sum += originalData[j][1]; + rollingData[i] = [originalData[i][0], sum / rollPeriod]; + } + } else { + for (var i = 0; i < num_init_points; i++) { + var sum = 0; + var variance = 0; + for (var j = 0; j < i + 1; j++) { + sum += originalData[j][1][0]; + variance += Math.pow(originalData[j][1][1], 2); + } + var stddev = Math.sqrt(variance)/(i+1); + rollingData[i] = [originalData[i][0], + [sum/(i+1), sigma * stddev, sigma * stddev]]; + } + // Calculate the rolling average for the remaining points + for (var i = Math.min(rollPeriod - 1, originalData.length - 2); + i < originalData.length; + i++) { + var sum = 0; + var variance = 0; + for (var j = i - rollPeriod + 1; j < i + 1; j++) { + sum += originalData[j][1][0]; + variance += Math.pow(originalData[j][1][1], 2); + } + var stddev = Math.sqrt(variance) / rollPeriod; + rollingData[i] = [originalData[i][0], + [sum / rollPeriod, sigma * stddev, sigma * stddev]]; + } + } + } + + return rollingData; +}; + +/** + * Parses a date, returning the number of milliseconds since epoch. This can be + * passed in as an xValueParser in the DateGraph constructor. + * @param {String} A date in YYYYMMDD format. + * @return {Number} Milliseconds since epoch. + * @public + */ +DateGraph.prototype.dateParser = function(dateStr) { + var dateStrSlashed; + if (dateStr.search("-") != -1) { + dateStrSlashed = dateStr.replace("-", "/", "g"); + } else if (dateStr.search("/") != -1) { + return Date.parse(dateStr); + } else { + dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2) + + "/" + dateStr.substr(6,2); + } + return Date.parse(dateStrSlashed); +}; + +/** + * Parses a string in a special csv format. We expect a csv file where each + * line is a date point, and the first field in each line is the date string. + * We also expect that all remaining fields represent series. + * if this.errorBars_ is set, then interpret the fields as: + * date, series1, stddev1, series2, stddev2, ... + * @param {Array.} data See above. + * @private + */ +DateGraph.prototype.parseCSV_ = function(data) { + var ret = []; + var lines = data.split("\n"); + var start = this.labelsFromCSV_ ? 1 : 0; + if (this.labelsFromCSV_) { + var labels = lines[0].split(","); + labels.shift(); // a "date" parameter is assumed. + this.labels_ = labels; + // regenerate automatic colors. + this.setColors_(this.attrs_); + this.renderOptions_.colorScheme = this.colors_; + MochiKit.Base.update(this.plotter_.options, this.renderOptions_); + MochiKit.Base.update(this.layoutOptions_, this.attrs_); + } + + for (var i = start; i < lines.length; i++) { + var line = lines[i]; + if (line.length == 0) continue; // skip blank lines + var inFields = line.split(','); + if (inFields.length < 2) + continue; + + var fields = []; + fields[0] = this.xValueParser_(inFields[0]); + + // If fractions are expected, parse the numbers as "A/B" + if (this.fractions_) { + for (var j = 1; j < inFields.length; j++) { + // TODO(danvk): figure out an appropriate way to flag parse errors. + var vals = inFields[j].split("/"); + fields[j] = [parseFloat(vals[0]), parseFloat(vals[1])]; + } + } else if (this.errorBars_) { + // If there are error bars, values are (value, stddev) pairs + for (var j = 1; j < inFields.length; j += 2) + fields[(j + 1) / 2] = [parseFloat(inFields[j]), + parseFloat(inFields[j + 1])]; + } else if (this.customBars_) { + // Bars are a low;center;high tuple + for (var j = 1; j < inFields.length; j++) { + var vals = inFields[j].split(";"); + fields[j] = [ parseFloat(vals[0]), + parseFloat(vals[1]), + parseFloat(vals[2]) ]; + } + } else { + // Values are just numbers + for (var j = 1; j < inFields.length; j++) + fields[j] = parseFloat(inFields[j]); + } + ret.push(fields); + } + return ret; +}; + +/** + * Get the CSV data. If it's in a function, call that function. If it's in a + * file, do an XMLHttpRequest to get it. + * @private + */ +DateGraph.prototype.start_ = function() { + if (typeof this.file_ == 'function') { + // Stubbed out to allow this to run off a filesystem + this.loadedEvent_(this.file_()); + } else { + var req = new XMLHttpRequest(); + var caller = this; + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status == 200) { + caller.loadedEvent_(req.responseText); + } + } + }; + + req.open("GET", this.file_, true); + req.send(null); + } +}; + +/** + * Changes various properties of the graph. These can include: + *
    + *
  • file: changes the source data for the graph
  • + *
  • errorBars: changes whether the data contains stddev
  • + *
+ * @param {Object} attrs The new properties and values + */ +DateGraph.prototype.updateOptions = function(attrs) { + if (attrs.errorBars) { + this.errorBars_ = attrs.errorBars; + } + if (attrs.customBars) { + this.customBars_ = attrs.customBars; + } + if (attrs.strokeWidth) { + this.strokeWidth_ = attrs.strokeWidth; + } + if (attrs.rollPeriod) { + this.rollPeriod_ = attrs.rollPeriod; + } + if (attrs.dateWindow) { + this.dateWindow_ = attrs.dateWindow; + } + if (attrs.valueRange) { + this.valueRange_ = attrs.valueRange; + } + if (attrs.minTickSize) { + this.minTickSize_ = attrs.minTickSize; + } + if (typeof(attrs.labels) != 'undefined') { + this.labels_ = attrs.labels; + this.labelsFromCSV_ = (attrs.labels == null); + } + this.layout_.updateOptions({ 'errorBars': this.errorBars_ }); + if (attrs['file'] && attrs['file'] != this.file_) { + this.file_ = attrs['file']; + this.start_(); + } else { + this.drawGraph_(this.rawData_); + } +}; + +/** + * Adjusts the number of days in the rolling average. Updates the graph to + * reflect the new averaging period. + * @param {Number} length Number of days over which to average the data. + */ +DateGraph.prototype.adjustRoll = function(length) { + this.rollPeriod_ = length; + this.drawGraph_(this.rawData_); +}; diff --git a/generate-combined.sh b/generate-combined.sh new file mode 100755 index 0000000..b118250 --- /dev/null +++ b/generate-combined.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# Generates a single JS file that's easier to include. +# This packed JS includes a partial copy of MochiKit and PlotKit. +cat \ +mochikit_v14/packed/MochiKit/MochiKit.js \ +plotkit_v091/PlotKit/PlotKit_Packed.js \ +dygraph-canvas.js \ +dygraph.js \ +> dygraph-combined.js diff --git a/mochikit_v14/LICENSE.txt b/mochikit_v14/LICENSE.txt new file mode 100644 index 0000000..4d0065b --- /dev/null +++ b/mochikit_v14/LICENSE.txt @@ -0,0 +1,69 @@ +MochiKit is dual-licensed software. It is available under the terms of the +MIT License, or the Academic Free License version 2.1. The full text of +each license is included below. + +MIT License +=========== + +Copyright (c) 2005 Bob Ippolito. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Academic Free License v. 2.1 +============================ + +Copyright (c) 2005 Bob Ippolito. All rights reserved. + +This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: + +Licensed under the Academic Free License version 2.1 + +1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license to do the following: + +a) to reproduce the Original Work in copies; + +b) to prepare derivative works ("Derivative Works") based upon the Original Work; + +c) to distribute copies of the Original Work and Derivative Works to the public; + +d) to perform the Original Work publicly; and + +e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work, and by publishing the address of that information repository in a notice immediately following the copyright notice that applies to the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the licensed claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license. + +5) This section intentionally omitted. + +6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately proceeding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to Original Work is granted hereunder except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + +9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. + +10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. + +12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + +13) Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + +This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. + + + diff --git a/mochikit_v14/MochiKit/Async.js b/mochikit_v14/MochiKit/Async.js new file mode 100644 index 0000000..c4bc6f5 --- /dev/null +++ b/mochikit_v14/MochiKit/Async.js @@ -0,0 +1,699 @@ +/*** + +MochiKit.Async 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide("MochiKit.Async"); + dojo.require("MochiKit.Base"); +} +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Async depends on MochiKit.Base!"; +} + +if (typeof(MochiKit.Async) == 'undefined') { + MochiKit.Async = {}; +} + +MochiKit.Async.NAME = "MochiKit.Async"; +MochiKit.Async.VERSION = "1.4"; +MochiKit.Async.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; +MochiKit.Async.toString = function () { + return this.__repr__(); +}; + +/** @id MochiKit.Async.Deferred */ +MochiKit.Async.Deferred = function (/* optional */ canceller) { + this.chain = []; + this.id = this._nextId(); + this.fired = -1; + this.paused = 0; + this.results = [null, null]; + this.canceller = canceller; + this.silentlyCancelled = false; + this.chained = false; +}; + +MochiKit.Async.Deferred.prototype = { + /** @id MochiKit.Async.Deferred.prototype.repr */ + repr: function () { + var state; + if (this.fired == -1) { + state = 'unfired'; + } else if (this.fired === 0) { + state = 'success'; + } else { + state = 'error'; + } + return 'Deferred(' + this.id + ', ' + state + ')'; + }, + + toString: MochiKit.Base.forwardCall("repr"), + + _nextId: MochiKit.Base.counter(), + + /** @id MochiKit.Async.Deferred.prototype.cancel */ + cancel: function () { + var self = MochiKit.Async; + if (this.fired == -1) { + if (this.canceller) { + this.canceller(this); + } else { + this.silentlyCancelled = true; + } + if (this.fired == -1) { + this.errback(new self.CancelledError(this)); + } + } else if ((this.fired === 0) && (this.results[0] instanceof self.Deferred)) { + this.results[0].cancel(); + } + }, + + _resback: function (res) { + /*** + + The primitive that means either callback or errback + + ***/ + this.fired = ((res instanceof Error) ? 1 : 0); + this.results[this.fired] = res; + this._fire(); + }, + + _check: function () { + if (this.fired != -1) { + if (!this.silentlyCancelled) { + throw new MochiKit.Async.AlreadyCalledError(this); + } + this.silentlyCancelled = false; + return; + } + }, + + /** @id MochiKit.Async.Deferred.prototype.callback */ + callback: function (res) { + this._check(); + if (res instanceof MochiKit.Async.Deferred) { + throw new Error("Deferred instances can only be chained if they are the result of a callback"); + } + this._resback(res); + }, + + /** @id MochiKit.Async.Deferred.prototype.errback */ + errback: function (res) { + this._check(); + var self = MochiKit.Async; + if (res instanceof self.Deferred) { + throw new Error("Deferred instances can only be chained if they are the result of a callback"); + } + if (!(res instanceof Error)) { + res = new self.GenericError(res); + } + this._resback(res); + }, + + /** @id MochiKit.Async.Deferred.prototype.addBoth */ + addBoth: function (fn) { + if (arguments.length > 1) { + fn = MochiKit.Base.partial.apply(null, arguments); + } + return this.addCallbacks(fn, fn); + }, + + /** @id MochiKit.Async.Deferred.prototype.addCallback */ + addCallback: function (fn) { + if (arguments.length > 1) { + fn = MochiKit.Base.partial.apply(null, arguments); + } + return this.addCallbacks(fn, null); + }, + + /** @id MochiKit.Async.Deferred.prototype.addErrback */ + addErrback: function (fn) { + if (arguments.length > 1) { + fn = MochiKit.Base.partial.apply(null, arguments); + } + return this.addCallbacks(null, fn); + }, + + /** @id MochiKit.Async.Deferred.prototype.addCallbacks */ + addCallbacks: function (cb, eb) { + if (this.chained) { + throw new Error("Chained Deferreds can not be re-used"); + } + this.chain.push([cb, eb]); + if (this.fired >= 0) { + this._fire(); + } + return this; + }, + + _fire: function () { + /*** + + Used internally to exhaust the callback sequence when a result + is available. + + ***/ + var chain = this.chain; + var fired = this.fired; + var res = this.results[fired]; + var self = this; + var cb = null; + while (chain.length > 0 && this.paused === 0) { + // Array + var pair = chain.shift(); + var f = pair[fired]; + if (f === null) { + continue; + } + try { + res = f(res); + fired = ((res instanceof Error) ? 1 : 0); + if (res instanceof MochiKit.Async.Deferred) { + cb = function (res) { + self._resback(res); + self.paused--; + if ((self.paused === 0) && (self.fired >= 0)) { + self._fire(); + } + }; + this.paused++; + } + } catch (err) { + fired = 1; + if (!(err instanceof Error)) { + err = new MochiKit.Async.GenericError(err); + } + res = err; + } + } + this.fired = fired; + this.results[fired] = res; + if (cb && this.paused) { + // this is for "tail recursion" in case the dependent deferred + // is already fired + res.addBoth(cb); + res.chained = true; + } + } +}; + +MochiKit.Base.update(MochiKit.Async, { + /** @id MochiKit.Async.evalJSONRequest */ + evalJSONRequest: function (/* req */) { + return eval('(' + arguments[0].responseText + ')'); + }, + + /** @id MochiKit.Async.succeed */ + succeed: function (/* optional */result) { + var d = new MochiKit.Async.Deferred(); + d.callback.apply(d, arguments); + return d; + }, + + /** @id MochiKit.Async.fail */ + fail: function (/* optional */result) { + var d = new MochiKit.Async.Deferred(); + d.errback.apply(d, arguments); + return d; + }, + + /** @id MochiKit.Async.getXMLHttpRequest */ + getXMLHttpRequest: function () { + var self = arguments.callee; + if (!self.XMLHttpRequest) { + var tryThese = [ + function () { return new XMLHttpRequest(); }, + function () { return new ActiveXObject('Msxml2.XMLHTTP'); }, + function () { return new ActiveXObject('Microsoft.XMLHTTP'); }, + function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }, + function () { + throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest"); + } + ]; + for (var i = 0; i < tryThese.length; i++) { + var func = tryThese[i]; + try { + self.XMLHttpRequest = func; + return func(); + } catch (e) { + // pass + } + } + } + return self.XMLHttpRequest(); + }, + + _xhr_onreadystatechange: function (d) { + // MochiKit.Logging.logDebug('this.readyState', this.readyState); + var m = MochiKit.Base; + if (this.readyState == 4) { + // IE SUCKS + try { + this.onreadystatechange = null; + } catch (e) { + try { + this.onreadystatechange = m.noop; + } catch (e) { + } + } + var status = null; + try { + status = this.status; + if (!status && m.isNotEmpty(this.responseText)) { + // 0 or undefined seems to mean cached or local + status = 304; + } + } catch (e) { + // pass + // MochiKit.Logging.logDebug('error getting status?', repr(items(e))); + } + // 200 is OK, 201 is CREATED, 204 is NO CONTENT + // 304 is NOT MODIFIED, 1223 is apparently a bug in IE + if (status == 200 || status == 201 || status == 204 || + status == 304 || status == 1223) { + d.callback(this); + } else { + var err = new MochiKit.Async.XMLHttpRequestError(this, "Request failed"); + if (err.number) { + // XXX: This seems to happen on page change + d.errback(err); + } else { + // XXX: this seems to happen when the server is unreachable + d.errback(err); + } + } + } + }, + + _xhr_canceller: function (req) { + // IE SUCKS + try { + req.onreadystatechange = null; + } catch (e) { + try { + req.onreadystatechange = MochiKit.Base.noop; + } catch (e) { + } + } + req.abort(); + }, + + + /** @id MochiKit.Async.sendXMLHttpRequest */ + sendXMLHttpRequest: function (req, /* optional */ sendContent) { + if (typeof(sendContent) == "undefined" || sendContent === null) { + sendContent = ""; + } + + var m = MochiKit.Base; + var self = MochiKit.Async; + var d = new self.Deferred(m.partial(self._xhr_canceller, req)); + + try { + req.onreadystatechange = m.bind(self._xhr_onreadystatechange, + req, d); + req.send(sendContent); + } catch (e) { + try { + req.onreadystatechange = null; + } catch (ignore) { + // pass + } + d.errback(e); + } + + return d; + + }, + + /** @id MochiKit.Async.doXHR */ + doXHR: function (url, opts) { + /* + Work around a Firefox bug by dealing with XHR during + the next event loop iteration. Maybe it's this one: + https://bugzilla.mozilla.org/show_bug.cgi?id=249843 + */ + var self = MochiKit.Async; + return self.callLater(0, self._doXHR, url, opts); + }, + + _doXHR: function (url, opts) { + var m = MochiKit.Base; + opts = m.update({ + method: 'GET', + sendContent: '' + /* + queryString: undefined, + username: undefined, + password: undefined, + headers: undefined, + mimeType: undefined + */ + }, opts); + var self = MochiKit.Async; + var req = self.getXMLHttpRequest(); + if (opts.queryString) { + var qs = m.queryString(opts.queryString); + if (qs) { + url += "?" + qs; + } + } + // Safari will send undefined:undefined, so we have to check. + // We can't use apply, since the function is native. + if ('username' in opts) { + req.open(opts.method, url, true, opts.username, opts.password); + } else { + req.open(opts.method, url, true); + } + if (req.overrideMimeType && opts.mimeType) { + req.overrideMimeType(opts.mimeType); + } + if (opts.headers) { + var headers = opts.headers; + if (!m.isArrayLike(headers)) { + headers = m.items(headers); + } + for (var i = 0; i < headers.length; i++) { + var header = headers[i]; + var name = header[0]; + var value = header[1]; + req.setRequestHeader(name, value); + } + } + return self.sendXMLHttpRequest(req, opts.sendContent); + }, + + _buildURL: function (url/*, ...*/) { + if (arguments.length > 1) { + var m = MochiKit.Base; + var qs = m.queryString.apply(null, m.extend(null, arguments, 1)); + if (qs) { + return url + "?" + qs; + } + } + return url; + }, + + /** @id MochiKit.Async.doSimpleXMLHttpRequest */ + doSimpleXMLHttpRequest: function (url/*, ...*/) { + var self = MochiKit.Async; + url = self._buildURL.apply(self, arguments); + return self.doXHR(url); + }, + + /** @id MochiKit.Async.loadJSONDoc */ + loadJSONDoc: function (url/*, ...*/) { + var self = MochiKit.Async; + url = self._buildURL.apply(self, arguments); + var d = self.doXHR(url, { + 'mimeType': 'text/plain', + 'headers': [['Accept', 'application/json']] + }); + d = d.addCallback(self.evalJSONRequest); + return d; + }, + + /** @id MochiKit.Async.wait */ + wait: function (seconds, /* optional */value) { + var d = new MochiKit.Async.Deferred(); + var m = MochiKit.Base; + if (typeof(value) != 'undefined') { + d.addCallback(function () { return value; }); + } + var timeout = setTimeout( + m.bind("callback", d), + Math.floor(seconds * 1000)); + d.canceller = function () { + try { + clearTimeout(timeout); + } catch (e) { + // pass + } + }; + return d; + }, + + /** @id MochiKit.Async.callLater */ + callLater: function (seconds, func) { + var m = MochiKit.Base; + var pfunc = m.partial.apply(m, m.extend(null, arguments, 1)); + return MochiKit.Async.wait(seconds).addCallback( + function (res) { return pfunc(); } + ); + } +}); + + +/** @id MochiKit.Async.DeferredLock */ +MochiKit.Async.DeferredLock = function () { + this.waiting = []; + this.locked = false; + this.id = this._nextId(); +}; + +MochiKit.Async.DeferredLock.prototype = { + __class__: MochiKit.Async.DeferredLock, + /** @id MochiKit.Async.DeferredLock.prototype.acquire */ + acquire: function () { + var d = new MochiKit.Async.Deferred(); + if (this.locked) { + this.waiting.push(d); + } else { + this.locked = true; + d.callback(this); + } + return d; + }, + /** @id MochiKit.Async.DeferredLock.prototype.release */ + release: function () { + if (!this.locked) { + throw TypeError("Tried to release an unlocked DeferredLock"); + } + this.locked = false; + if (this.waiting.length > 0) { + this.locked = true; + this.waiting.shift().callback(this); + } + }, + _nextId: MochiKit.Base.counter(), + repr: function () { + var state; + if (this.locked) { + state = 'locked, ' + this.waiting.length + ' waiting'; + } else { + state = 'unlocked'; + } + return 'DeferredLock(' + this.id + ', ' + state + ')'; + }, + toString: MochiKit.Base.forwardCall("repr") + +}; + +/** @id MochiKit.Async.DeferredList */ +MochiKit.Async.DeferredList = function (list, /* optional */fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) { + + // call parent constructor + MochiKit.Async.Deferred.apply(this, [canceller]); + + this.list = list; + var resultList = []; + this.resultList = resultList; + + this.finishedCount = 0; + this.fireOnOneCallback = fireOnOneCallback; + this.fireOnOneErrback = fireOnOneErrback; + this.consumeErrors = consumeErrors; + + var cb = MochiKit.Base.bind(this._cbDeferred, this); + for (var i = 0; i < list.length; i++) { + var d = list[i]; + resultList.push(undefined); + d.addCallback(cb, i, true); + d.addErrback(cb, i, false); + } + + if (list.length === 0 && !fireOnOneCallback) { + this.callback(this.resultList); + } + +}; + +MochiKit.Async.DeferredList.prototype = new MochiKit.Async.Deferred(); + +MochiKit.Async.DeferredList.prototype._cbDeferred = function (index, succeeded, result) { + this.resultList[index] = [succeeded, result]; + this.finishedCount += 1; + if (this.fired == -1) { + if (succeeded && this.fireOnOneCallback) { + this.callback([index, result]); + } else if (!succeeded && this.fireOnOneErrback) { + this.errback(result); + } else if (this.finishedCount == this.list.length) { + this.callback(this.resultList); + } + } + if (!succeeded && this.consumeErrors) { + result = null; + } + return result; +}; + +/** @id MochiKit.Async.gatherResults */ +MochiKit.Async.gatherResults = function (deferredList) { + var d = new MochiKit.Async.DeferredList(deferredList, false, true, false); + d.addCallback(function (results) { + var ret = []; + for (var i = 0; i < results.length; i++) { + ret.push(results[i][1]); + } + return ret; + }); + return d; +}; + +/** @id MochiKit.Async.maybeDeferred */ +MochiKit.Async.maybeDeferred = function (func) { + var self = MochiKit.Async; + var result; + try { + var r = func.apply(null, MochiKit.Base.extend([], arguments, 1)); + if (r instanceof self.Deferred) { + result = r; + } else if (r instanceof Error) { + result = self.fail(r); + } else { + result = self.succeed(r); + } + } catch (e) { + result = self.fail(e); + } + return result; +}; + + +MochiKit.Async.EXPORT = [ + "AlreadyCalledError", + "CancelledError", + "BrowserComplianceError", + "GenericError", + "XMLHttpRequestError", + "Deferred", + "succeed", + "fail", + "getXMLHttpRequest", + "doSimpleXMLHttpRequest", + "loadJSONDoc", + "wait", + "callLater", + "sendXMLHttpRequest", + "DeferredLock", + "DeferredList", + "gatherResults", + "maybeDeferred", + "doXHR" +]; + +MochiKit.Async.EXPORT_OK = [ + "evalJSONRequest" +]; + +MochiKit.Async.__new__ = function () { + var m = MochiKit.Base; + var ne = m.partial(m._newNamedError, this); + + ne("AlreadyCalledError", + /** @id MochiKit.Async.AlreadyCalledError */ + function (deferred) { + /*** + + Raised by the Deferred if callback or errback happens + after it was already fired. + + ***/ + this.deferred = deferred; + } + ); + + ne("CancelledError", + /** @id MochiKit.Async.CancelledError */ + function (deferred) { + /*** + + Raised by the Deferred cancellation mechanism. + + ***/ + this.deferred = deferred; + } + ); + + ne("BrowserComplianceError", + /** @id MochiKit.Async.BrowserComplianceError */ + function (msg) { + /*** + + Raised when the JavaScript runtime is not capable of performing + the given function. Technically, this should really never be + raised because a non-conforming JavaScript runtime probably + isn't going to support exceptions in the first place. + + ***/ + this.message = msg; + } + ); + + ne("GenericError", + /** @id MochiKit.Async.GenericError */ + function (msg) { + this.message = msg; + } + ); + + ne("XMLHttpRequestError", + /** @id MochiKit.Async.XMLHttpRequestError */ + function (req, msg) { + /*** + + Raised when an XMLHttpRequest does not complete for any reason. + + ***/ + this.req = req; + this.message = msg; + try { + // Strange but true that this can raise in some cases. + this.number = req.status; + } catch (e) { + // pass + } + } + ); + + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); + +}; + +MochiKit.Async.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Async); diff --git a/mochikit_v14/MochiKit/Base.js b/mochikit_v14/MochiKit/Base.js new file mode 100644 index 0000000..c526978 --- /dev/null +++ b/mochikit_v14/MochiKit/Base.js @@ -0,0 +1,1404 @@ +/*** + +MochiKit.Base 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide("MochiKit.Base"); +} +if (typeof(MochiKit) == 'undefined') { + MochiKit = {}; +} +if (typeof(MochiKit.Base) == 'undefined') { + MochiKit.Base = {}; +} +if (typeof(MochiKit.__export__) == "undefined") { + MochiKit.__export__ = (MochiKit.__compat__ || + (typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') + ); +} + +MochiKit.Base.VERSION = "1.4"; +MochiKit.Base.NAME = "MochiKit.Base"; +/** @id MochiKit.Base.update */ +MochiKit.Base.update = function (self, obj/*, ... */) { + if (self === null) { + self = {}; + } + for (var i = 1; i < arguments.length; i++) { + var o = arguments[i]; + if (typeof(o) != 'undefined' && o !== null) { + for (var k in o) { + self[k] = o[k]; + } + } + } + return self; +}; + +MochiKit.Base.update(MochiKit.Base, { + __repr__: function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + toString: function () { + return this.__repr__(); + }, + + /** @id MochiKit.Base.camelize */ + camelize: function (selector) { + /* from dojo.style.toCamelCase */ + var arr = selector.split('-'); + var cc = arr[0]; + for (var i = 1; i < arr.length; i++) { + cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1); + } + return cc; + }, + + /** @id MochiKit.Base.counter */ + counter: function (n/* = 1 */) { + if (arguments.length === 0) { + n = 1; + } + return function () { + return n++; + }; + }, + + /** @id MochiKit.Base.clone */ + clone: function (obj) { + var me = arguments.callee; + if (arguments.length == 1) { + me.prototype = obj; + return new me(); + } + }, + + _flattenArray: function (res, lst) { + for (var i = 0; i < lst.length; i++) { + var o = lst[i]; + if (o instanceof Array) { + arguments.callee(res, o); + } else { + res.push(o); + } + } + return res; + }, + + /** @id MochiKit.Base.flattenArray */ + flattenArray: function (lst) { + return MochiKit.Base._flattenArray([], lst); + }, + + /** @id MochiKit.Base.flattenArguments */ + flattenArguments: function (lst/* ...*/) { + var res = []; + var m = MochiKit.Base; + var args = m.extend(null, arguments); + while (args.length) { + var o = args.shift(); + if (o && typeof(o) == "object" && typeof(o.length) == "number") { + for (var i = o.length - 1; i >= 0; i--) { + args.unshift(o[i]); + } + } else { + res.push(o); + } + } + return res; + }, + + /** @id MochiKit.Base.extend */ + extend: function (self, obj, /* optional */skip) { + // Extend an array with an array-like object starting + // from the skip index + if (!skip) { + skip = 0; + } + if (obj) { + // allow iterable fall-through, but skip the full isArrayLike + // check for speed, this is called often. + var l = obj.length; + if (typeof(l) != 'number' /* !isArrayLike(obj) */) { + if (typeof(MochiKit.Iter) != "undefined") { + obj = MochiKit.Iter.list(obj); + l = obj.length; + } else { + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); + } + } + if (!self) { + self = []; + } + for (var i = skip; i < l; i++) { + self.push(obj[i]); + } + } + // This mutates, but it's convenient to return because + // it's often used like a constructor when turning some + // ghetto array-like to a real array + return self; + }, + + + /** @id MochiKit.Base.updatetree */ + updatetree: function (self, obj/*, ...*/) { + if (self === null) { + self = {}; + } + for (var i = 1; i < arguments.length; i++) { + var o = arguments[i]; + if (typeof(o) != 'undefined' && o !== null) { + for (var k in o) { + var v = o[k]; + if (typeof(self[k]) == 'object' && typeof(v) == 'object') { + arguments.callee(self[k], v); + } else { + self[k] = v; + } + } + } + } + return self; + }, + + /** @id MochiKit.Base.setdefault */ + setdefault: function (self, obj/*, ...*/) { + if (self === null) { + self = {}; + } + for (var i = 1; i < arguments.length; i++) { + var o = arguments[i]; + for (var k in o) { + if (!(k in self)) { + self[k] = o[k]; + } + } + } + return self; + }, + + /** @id MochiKit.Base.keys */ + keys: function (obj) { + var rval = []; + for (var prop in obj) { + rval.push(prop); + } + return rval; + }, + + /** @id MochiKit.Base.values */ + values: function (obj) { + var rval = []; + for (var prop in obj) { + rval.push(obj[prop]); + } + return rval; + }, + + /** @id MochiKit.Base.items */ + items: function (obj) { + var rval = []; + var e; + for (var prop in obj) { + var v; + try { + v = obj[prop]; + } catch (e) { + continue; + } + rval.push([prop, v]); + } + return rval; + }, + + + _newNamedError: function (module, name, func) { + func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name); + module[name] = func; + }, + + + /** @id MochiKit.Base.operator */ + operator: { + // unary logic operators + /** @id MochiKit.Base.truth */ + truth: function (a) { return !!a; }, + /** @id MochiKit.Base.lognot */ + lognot: function (a) { return !a; }, + /** @id MochiKit.Base.identity */ + identity: function (a) { return a; }, + + // bitwise unary operators + /** @id MochiKit.Base.not */ + not: function (a) { return ~a; }, + /** @id MochiKit.Base.neg */ + neg: function (a) { return -a; }, + + // binary operators + /** @id MochiKit.Base.add */ + add: function (a, b) { return a + b; }, + /** @id MochiKit.Base.sub */ + sub: function (a, b) { return a - b; }, + /** @id MochiKit.Base.div */ + div: function (a, b) { return a / b; }, + /** @id MochiKit.Base.mod */ + mod: function (a, b) { return a % b; }, + /** @id MochiKit.Base.mul */ + mul: function (a, b) { return a * b; }, + + // bitwise binary operators + /** @id MochiKit.Base.and */ + and: function (a, b) { return a & b; }, + /** @id MochiKit.Base.or */ + or: function (a, b) { return a | b; }, + /** @id MochiKit.Base.xor */ + xor: function (a, b) { return a ^ b; }, + /** @id MochiKit.Base.lshift */ + lshift: function (a, b) { return a << b; }, + /** @id MochiKit.Base.rshift */ + rshift: function (a, b) { return a >> b; }, + /** @id MochiKit.Base.zrshift */ + zrshift: function (a, b) { return a >>> b; }, + + // near-worthless built-in comparators + /** @id MochiKit.Base.eq */ + eq: function (a, b) { return a == b; }, + /** @id MochiKit.Base.ne */ + ne: function (a, b) { return a != b; }, + /** @id MochiKit.Base.gt */ + gt: function (a, b) { return a > b; }, + /** @id MochiKit.Base.ge */ + ge: function (a, b) { return a >= b; }, + /** @id MochiKit.Base.lt */ + lt: function (a, b) { return a < b; }, + /** @id MochiKit.Base.le */ + le: function (a, b) { return a <= b; }, + + // strict built-in comparators + seq: function (a, b) { return a === b; }, + sne: function (a, b) { return a !== b; }, + + // compare comparators + /** @id MochiKit.Base.ceq */ + ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; }, + /** @id MochiKit.Base.cne */ + cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; }, + /** @id MochiKit.Base.cgt */ + cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; }, + /** @id MochiKit.Base.cge */ + cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; }, + /** @id MochiKit.Base.clt */ + clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; }, + /** @id MochiKit.Base.cle */ + cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; }, + + // binary logical operators + /** @id MochiKit.Base.logand */ + logand: function (a, b) { return a && b; }, + /** @id MochiKit.Base.logor */ + logor: function (a, b) { return a || b; }, + /** @id MochiKit.Base.contains */ + contains: function (a, b) { return b in a; } + }, + + /** @id MochiKit.Base.forwardCall */ + forwardCall: function (func) { + return function () { + return this[func].apply(this, arguments); + }; + }, + + /** @id MochiKit.Base.itemgetter */ + itemgetter: function (func) { + return function (arg) { + return arg[func]; + }; + }, + + /** @id MochiKit.Base.typeMatcher */ + typeMatcher: function (/* typ */) { + var types = {}; + for (var i = 0; i < arguments.length; i++) { + var typ = arguments[i]; + types[typ] = typ; + } + return function () { + for (var i = 0; i < arguments.length; i++) { + if (!(typeof(arguments[i]) in types)) { + return false; + } + } + return true; + }; + }, + + /** @id MochiKit.Base.isNull */ + isNull: function (/* ... */) { + for (var i = 0; i < arguments.length; i++) { + if (arguments[i] !== null) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Base.isUndefinedOrNull */ + isUndefinedOrNull: function (/* ... */) { + for (var i = 0; i < arguments.length; i++) { + var o = arguments[i]; + if (!(typeof(o) == 'undefined' || o === null)) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Base.isEmpty */ + isEmpty: function (obj) { + return !MochiKit.Base.isNotEmpty.apply(this, arguments); + }, + + /** @id MochiKit.Base.isNotEmpty */ + isNotEmpty: function (obj) { + for (var i = 0; i < arguments.length; i++) { + var o = arguments[i]; + if (!(o && o.length)) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Base.isArrayLike */ + isArrayLike: function () { + for (var i = 0; i < arguments.length; i++) { + var o = arguments[i]; + var typ = typeof(o); + if ( + (typ != 'object' && !(typ == 'function' && typeof(o.item) == 'function')) || + o === null || + typeof(o.length) != 'number' || + o.nodeType === 3 + ) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Base.isDateLike */ + isDateLike: function () { + for (var i = 0; i < arguments.length; i++) { + var o = arguments[i]; + if (typeof(o) != "object" || o === null + || typeof(o.getTime) != 'function') { + return false; + } + } + return true; + }, + + + /** @id MochiKit.Base.xmap */ + xmap: function (fn/*, obj... */) { + if (fn === null) { + return MochiKit.Base.extend(null, arguments, 1); + } + var rval = []; + for (var i = 1; i < arguments.length; i++) { + rval.push(fn(arguments[i])); + } + return rval; + }, + + /** @id MochiKit.Base.map */ + map: function (fn, lst/*, lst... */) { + var m = MochiKit.Base; + var itr = MochiKit.Iter; + var isArrayLike = m.isArrayLike; + if (arguments.length <= 2) { + // allow an iterable to be passed + if (!isArrayLike(lst)) { + if (itr) { + // fast path for map(null, iterable) + lst = itr.list(lst); + if (fn === null) { + return lst; + } + } else { + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); + } + } + // fast path for map(null, lst) + if (fn === null) { + return m.extend(null, lst); + } + // disabled fast path for map(fn, lst) + /* + if (false && typeof(Array.prototype.map) == 'function') { + // Mozilla fast-path + return Array.prototype.map.call(lst, fn); + } + */ + var rval = []; + for (var i = 0; i < lst.length; i++) { + rval.push(fn(lst[i])); + } + return rval; + } else { + // default for map(null, ...) is zip(...) + if (fn === null) { + fn = Array; + } + var length = null; + for (i = 1; i < arguments.length; i++) { + // allow iterables to be passed + if (!isArrayLike(arguments[i])) { + if (itr) { + return itr.list(itr.imap.apply(null, arguments)); + } else { + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); + } + } + // find the minimum length + var l = arguments[i].length; + if (length === null || length > l) { + length = l; + } + } + rval = []; + for (i = 0; i < length; i++) { + var args = []; + for (var j = 1; j < arguments.length; j++) { + args.push(arguments[j][i]); + } + rval.push(fn.apply(this, args)); + } + return rval; + } + }, + + /** @id MochiKit.Base.xfilter */ + xfilter: function (fn/*, obj... */) { + var rval = []; + if (fn === null) { + fn = MochiKit.Base.operator.truth; + } + for (var i = 1; i < arguments.length; i++) { + var o = arguments[i]; + if (fn(o)) { + rval.push(o); + } + } + return rval; + }, + + /** @id MochiKit.Base.filter */ + filter: function (fn, lst, self) { + var rval = []; + // allow an iterable to be passed + var m = MochiKit.Base; + if (!m.isArrayLike(lst)) { + if (MochiKit.Iter) { + lst = MochiKit.Iter.list(lst); + } else { + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); + } + } + if (fn === null) { + fn = m.operator.truth; + } + if (typeof(Array.prototype.filter) == 'function') { + // Mozilla fast-path + return Array.prototype.filter.call(lst, fn, self); + } else if (typeof(self) == 'undefined' || self === null) { + for (var i = 0; i < lst.length; i++) { + var o = lst[i]; + if (fn(o)) { + rval.push(o); + } + } + } else { + for (i = 0; i < lst.length; i++) { + o = lst[i]; + if (fn.call(self, o)) { + rval.push(o); + } + } + } + return rval; + }, + + + _wrapDumbFunction: function (func) { + return function () { + // fast path! + switch (arguments.length) { + case 0: return func(); + case 1: return func(arguments[0]); + case 2: return func(arguments[0], arguments[1]); + case 3: return func(arguments[0], arguments[1], arguments[2]); + } + var args = []; + for (var i = 0; i < arguments.length; i++) { + args.push("arguments[" + i + "]"); + } + return eval("(func(" + args.join(",") + "))"); + }; + }, + + /** @id MochiKit.Base.methodcaller */ + methodcaller: function (func/*, args... */) { + var args = MochiKit.Base.extend(null, arguments, 1); + if (typeof(func) == "function") { + return function (obj) { + return func.apply(obj, args); + }; + } else { + return function (obj) { + return obj[func].apply(obj, args); + }; + } + }, + + /** @id MochiKit.Base.method */ + method: function (self, func) { + var m = MochiKit.Base; + return m.bind.apply(this, m.extend([func, self], arguments, 2)); + }, + + /** @id MochiKit.Base.compose */ + compose: function (f1, f2/*, f3, ... fN */) { + var fnlist = []; + var m = MochiKit.Base; + if (arguments.length === 0) { + throw new TypeError("compose() requires at least one argument"); + } + for (var i = 0; i < arguments.length; i++) { + var fn = arguments[i]; + if (typeof(fn) != "function") { + throw new TypeError(m.repr(fn) + " is not a function"); + } + fnlist.push(fn); + } + return function () { + var args = arguments; + for (var i = fnlist.length - 1; i >= 0; i--) { + args = [fnlist[i].apply(this, args)]; + } + return args[0]; + }; + }, + + /** @id MochiKit.Base.bind */ + bind: function (func, self/* args... */) { + if (typeof(func) == "string") { + func = self[func]; + } + var im_func = func.im_func; + var im_preargs = func.im_preargs; + var im_self = func.im_self; + var m = MochiKit.Base; + if (typeof(func) == "function" && typeof(func.apply) == "undefined") { + // this is for cases where JavaScript sucks ass and gives you a + // really dumb built-in function like alert() that doesn't have + // an apply + func = m._wrapDumbFunction(func); + } + if (typeof(im_func) != 'function') { + im_func = func; + } + if (typeof(self) != 'undefined') { + im_self = self; + } + if (typeof(im_preargs) == 'undefined') { + im_preargs = []; + } else { + im_preargs = im_preargs.slice(); + } + m.extend(im_preargs, arguments, 2); + var newfunc = function () { + var args = arguments; + var me = arguments.callee; + if (me.im_preargs.length > 0) { + args = m.concat(me.im_preargs, args); + } + var self = me.im_self; + if (!self) { + self = this; + } + return me.im_func.apply(self, args); + }; + newfunc.im_self = im_self; + newfunc.im_func = im_func; + newfunc.im_preargs = im_preargs; + return newfunc; + }, + + /** @id MochiKit.Base.bindMethods */ + bindMethods: function (self) { + var bind = MochiKit.Base.bind; + for (var k in self) { + var func = self[k]; + if (typeof(func) == 'function') { + self[k] = bind(func, self); + } + } + }, + + /** @id MochiKit.Base.registerComparator */ + registerComparator: function (name, check, comparator, /* optional */ override) { + MochiKit.Base.comparatorRegistry.register(name, check, comparator, override); + }, + + _primitives: {'boolean': true, 'string': true, 'number': true}, + + /** @id MochiKit.Base.compare */ + compare: function (a, b) { + if (a == b) { + return 0; + } + var aIsNull = (typeof(a) == 'undefined' || a === null); + var bIsNull = (typeof(b) == 'undefined' || b === null); + if (aIsNull && bIsNull) { + return 0; + } else if (aIsNull) { + return -1; + } else if (bIsNull) { + return 1; + } + var m = MochiKit.Base; + // bool, number, string have meaningful comparisons + var prim = m._primitives; + if (!(typeof(a) in prim && typeof(b) in prim)) { + try { + return m.comparatorRegistry.match(a, b); + } catch (e) { + if (e != m.NotFound) { + throw e; + } + } + } + if (a < b) { + return -1; + } else if (a > b) { + return 1; + } + // These types can't be compared + var repr = m.repr; + throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared"); + }, + + /** @id MochiKit.Base.compareDateLike */ + compareDateLike: function (a, b) { + return MochiKit.Base.compare(a.getTime(), b.getTime()); + }, + + /** @id MochiKit.Base.compareArrayLike */ + compareArrayLike: function (a, b) { + var compare = MochiKit.Base.compare; + var count = a.length; + var rval = 0; + if (count > b.length) { + rval = 1; + count = b.length; + } else if (count < b.length) { + rval = -1; + } + for (var i = 0; i < count; i++) { + var cmp = compare(a[i], b[i]); + if (cmp) { + return cmp; + } + } + return rval; + }, + + /** @id MochiKit.Base.registerRepr */ + registerRepr: function (name, check, wrap, /* optional */override) { + MochiKit.Base.reprRegistry.register(name, check, wrap, override); + }, + + /** @id MochiKit.Base.repr */ + repr: function (o) { + if (typeof(o) == "undefined") { + return "undefined"; + } else if (o === null) { + return "null"; + } + try { + if (typeof(o.__repr__) == 'function') { + return o.__repr__(); + } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) { + return o.repr(); + } + return MochiKit.Base.reprRegistry.match(o); + } catch (e) { + if (typeof(o.NAME) == 'string' && ( + o.toString == Function.prototype.toString || + o.toString == Object.prototype.toString + )) { + return o.NAME; + } + } + try { + var ostring = (o + ""); + } catch (e) { + return "[" + typeof(o) + "]"; + } + if (typeof(o) == "function") { + o = ostring.replace(/^\s+/, ""); + var idx = o.indexOf("{"); + if (idx != -1) { + o = o.substr(0, idx) + "{...}"; + } + } + return ostring; + }, + + /** @id MochiKit.Base.reprArrayLike */ + reprArrayLike: function (o) { + var m = MochiKit.Base; + return "[" + m.map(m.repr, o).join(", ") + "]"; + }, + + /** @id MochiKit.Base.reprString */ + reprString: function (o) { + return ('"' + o.replace(/(["\\])/g, '\\$1') + '"' + ).replace(/[\f]/g, "\\f" + ).replace(/[\b]/g, "\\b" + ).replace(/[\n]/g, "\\n" + ).replace(/[\t]/g, "\\t" + ).replace(/[\r]/g, "\\r"); + }, + + /** @id MochiKit.Base.reprNumber */ + reprNumber: function (o) { + return o + ""; + }, + + /** @id MochiKit.Base.registerJSON */ + registerJSON: function (name, check, wrap, /* optional */override) { + MochiKit.Base.jsonRegistry.register(name, check, wrap, override); + }, + + + /** @id MochiKit.Base.evalJSON */ + evalJSON: function () { + return eval("(" + arguments[0] + ")"); + }, + + /** @id MochiKit.Base.serializeJSON */ + serializeJSON: function (o) { + var objtype = typeof(o); + if (objtype == "number" || objtype == "boolean") { + return o + ""; + } else if (o === null) { + return "null"; + } + var m = MochiKit.Base; + var reprString = m.reprString; + if (objtype == "string") { + return reprString(o); + } + // recurse + var me = arguments.callee; + // short-circuit for objects that support "json" serialization + // if they return "self" then just pass-through... + var newObj; + if (typeof(o.__json__) == "function") { + newObj = o.__json__(); + if (o !== newObj) { + return me(newObj); + } + } + if (typeof(o.json) == "function") { + newObj = o.json(); + if (o !== newObj) { + return me(newObj); + } + } + // array + if (objtype != "function" && typeof(o.length) == "number") { + var res = []; + for (var i = 0; i < o.length; i++) { + var val = me(o[i]); + if (typeof(val) != "string") { + val = "undefined"; + } + res.push(val); + } + return "[" + res.join(", ") + "]"; + } + // look in the registry + try { + newObj = m.jsonRegistry.match(o); + if (o !== newObj) { + return me(newObj); + } + } catch (e) { + if (e != m.NotFound) { + // something really bad happened + throw e; + } + } + // undefined is outside of the spec + if (objtype == "undefined") { + throw new TypeError("undefined can not be serialized as JSON"); + } + // it's a function with no adapter, bad + if (objtype == "function") { + return null; + } + // generic object code path + res = []; + for (var k in o) { + var useKey; + if (typeof(k) == "number") { + useKey = '"' + k + '"'; + } else if (typeof(k) == "string") { + useKey = reprString(k); + } else { + // skip non-string or number keys + continue; + } + val = me(o[k]); + if (typeof(val) != "string") { + // skip non-serializable values + continue; + } + res.push(useKey + ":" + val); + } + return "{" + res.join(", ") + "}"; + }, + + + /** @id MochiKit.Base.objEqual */ + objEqual: function (a, b) { + return (MochiKit.Base.compare(a, b) === 0); + }, + + /** @id MochiKit.Base.arrayEqual */ + arrayEqual: function (self, arr) { + if (self.length != arr.length) { + return false; + } + return (MochiKit.Base.compare(self, arr) === 0); + }, + + /** @id MochiKit.Base.concat */ + concat: function (/* lst... */) { + var rval = []; + var extend = MochiKit.Base.extend; + for (var i = 0; i < arguments.length; i++) { + extend(rval, arguments[i]); + } + return rval; + }, + + /** @id MochiKit.Base.keyComparator */ + keyComparator: function (key/* ... */) { + // fast-path for single key comparisons + var m = MochiKit.Base; + var compare = m.compare; + if (arguments.length == 1) { + return function (a, b) { + return compare(a[key], b[key]); + }; + } + var compareKeys = m.extend(null, arguments); + return function (a, b) { + var rval = 0; + // keep comparing until something is inequal or we run out of + // keys to compare + for (var i = 0; (rval === 0) && (i < compareKeys.length); i++) { + var key = compareKeys[i]; + rval = compare(a[key], b[key]); + } + return rval; + }; + }, + + /** @id MochiKit.Base.reverseKeyComparator */ + reverseKeyComparator: function (key) { + var comparator = MochiKit.Base.keyComparator.apply(this, arguments); + return function (a, b) { + return comparator(b, a); + }; + }, + + /** @id MochiKit.Base.partial */ + partial: function (func) { + var m = MochiKit.Base; + return m.bind.apply(this, m.extend([func, undefined], arguments, 1)); + }, + + /** @id MochiKit.Base.listMinMax */ + listMinMax: function (which, lst) { + if (lst.length === 0) { + return null; + } + var cur = lst[0]; + var compare = MochiKit.Base.compare; + for (var i = 1; i < lst.length; i++) { + var o = lst[i]; + if (compare(o, cur) == which) { + cur = o; + } + } + return cur; + }, + + /** @id MochiKit.Base.objMax */ + objMax: function (/* obj... */) { + return MochiKit.Base.listMinMax(1, arguments); + }, + + /** @id MochiKit.Base.objMin */ + objMin: function (/* obj... */) { + return MochiKit.Base.listMinMax(-1, arguments); + }, + + /** @id MochiKit.Base.findIdentical */ + findIdentical: function (lst, value, start/* = 0 */, /* optional */end) { + if (typeof(end) == "undefined" || end === null) { + end = lst.length; + } + if (typeof(start) == "undefined" || start === null) { + start = 0; + } + for (var i = start; i < end; i++) { + if (lst[i] === value) { + return i; + } + } + return -1; + }, + + /** @id MochiKit.Base.mean */ + mean: function(/* lst... */) { + /* http://www.nist.gov/dads/HTML/mean.html */ + var sum = 0; + + var m = MochiKit.Base; + var args = m.extend(null, arguments); + var count = args.length; + + while (args.length) { + var o = args.shift(); + if (o && typeof(o) == "object" && typeof(o.length) == "number") { + count += o.length - 1; + for (var i = o.length - 1; i >= 0; i--) { + sum += o[i]; + } + } else { + sum += o; + } + } + + if (count <= 0) { + throw new TypeError('mean() requires at least one argument'); + } + + return sum/count; + }, + + /** @id MochiKit.Base.median */ + median: function(/* lst... */) { + /* http://www.nist.gov/dads/HTML/median.html */ + var data = MochiKit.Base.flattenArguments(arguments); + if (data.length === 0) { + throw new TypeError('median() requires at least one argument'); + } + data.sort(compare); + if (data.length % 2 == 0) { + var upper = data.length / 2; + return (data[upper] + data[upper - 1]) / 2; + } else { + return data[(data.length - 1) / 2]; + } + }, + + /** @id MochiKit.Base.findValue */ + findValue: function (lst, value, start/* = 0 */, /* optional */end) { + if (typeof(end) == "undefined" || end === null) { + end = lst.length; + } + if (typeof(start) == "undefined" || start === null) { + start = 0; + } + var cmp = MochiKit.Base.compare; + for (var i = start; i < end; i++) { + if (cmp(lst[i], value) === 0) { + return i; + } + } + return -1; + }, + + /** @id MochiKit.Base.nodeWalk */ + nodeWalk: function (node, visitor) { + var nodes = [node]; + var extend = MochiKit.Base.extend; + while (nodes.length) { + var res = visitor(nodes.shift()); + if (res) { + extend(nodes, res); + } + } + }, + + + /** @id MochiKit.Base.nameFunctions */ + nameFunctions: function (namespace) { + var base = namespace.NAME; + if (typeof(base) == 'undefined') { + base = ''; + } else { + base = base + '.'; + } + for (var name in namespace) { + var o = namespace[name]; + if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { + try { + o.NAME = base + name; + } catch (e) { + // pass + } + } + } + }, + + + /** @id MochiKit.Base.queryString */ + queryString: function (names, values) { + // check to see if names is a string or a DOM element, and if + // MochiKit.DOM is available. If so, drop it like it's a form + // Ugliest conditional in MochiKit? Probably! + if (typeof(MochiKit.DOM) != "undefined" && arguments.length == 1 + && (typeof(names) == "string" || ( + typeof(names.nodeType) != "undefined" && names.nodeType > 0 + )) + ) { + var kv = MochiKit.DOM.formContents(names); + names = kv[0]; + values = kv[1]; + } else if (arguments.length == 1) { + // Allow the return value of formContents to be passed directly + if (typeof(names.length) == "number" && names.length == 2) { + return arguments.callee(names[0], names[1]); + } + var o = names; + names = []; + values = []; + for (var k in o) { + var v = o[k]; + if (typeof(v) == "function") { + continue; + } else if (typeof(v) != "string" && + typeof(v.length) == "number") { + for (var i = 0; i < v.length; i++) { + names.push(k); + values.push(v[i]); + } + } else { + names.push(k); + values.push(v); + } + } + } + var rval = []; + var len = Math.min(names.length, values.length); + var urlEncode = MochiKit.Base.urlEncode; + for (var i = 0; i < len; i++) { + v = values[i]; + if (typeof(v) != 'undefined' && v !== null) { + rval.push(urlEncode(names[i]) + "=" + urlEncode(v)); + } + } + return rval.join("&"); + }, + + + /** @id MochiKit.Base.parseQueryString */ + parseQueryString: function (encodedString, useArrays) { + // strip a leading '?' from the encoded string + var qstr = (encodedString.charAt(0) == "?") + ? encodedString.substring(1) + : encodedString; + var pairs = qstr.replace(/\+/g, "%20").split(/(\&\;|\&\#38\;|\&|\&)/); + var o = {}; + var decode; + if (typeof(decodeURIComponent) != "undefined") { + decode = decodeURIComponent; + } else { + decode = unescape; + } + if (useArrays) { + for (var i = 0; i < pairs.length; i++) { + var pair = pairs[i].split("="); + var name = decode(pair.shift()); + if (!name) { + continue; + } + var arr = o[name]; + if (!(arr instanceof Array)) { + arr = []; + o[name] = arr; + } + arr.push(decode(pair.join("="))); + } + } else { + for (i = 0; i < pairs.length; i++) { + pair = pairs[i].split("="); + var name = pair.shift(); + if (!name) { + continue; + } + o[decode(name)] = decode(pair.join("=")); + } + } + return o; + } +}); + +/** @id MochiKit.Base.AdapterRegistry */ +MochiKit.Base.AdapterRegistry = function () { + this.pairs = []; +}; + +MochiKit.Base.AdapterRegistry.prototype = { + /** @id MochiKit.Base.AdapterRegistry.prototype.register */ + register: function (name, check, wrap, /* optional */ override) { + if (override) { + this.pairs.unshift([name, check, wrap]); + } else { + this.pairs.push([name, check, wrap]); + } + }, + + /** @id MochiKit.Base.AdapterRegistry.prototype.match */ + match: function (/* ... */) { + for (var i = 0; i < this.pairs.length; i++) { + var pair = this.pairs[i]; + if (pair[1].apply(this, arguments)) { + return pair[2].apply(this, arguments); + } + } + throw MochiKit.Base.NotFound; + }, + + /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */ + unregister: function (name) { + for (var i = 0; i < this.pairs.length; i++) { + var pair = this.pairs[i]; + if (pair[0] == name) { + this.pairs.splice(i, 1); + return true; + } + } + return false; + } +}; + + +MochiKit.Base.EXPORT = [ + "flattenArray", + "noop", + "camelize", + "counter", + "clone", + "extend", + "update", + "updatetree", + "setdefault", + "keys", + "values", + "items", + "NamedError", + "operator", + "forwardCall", + "itemgetter", + "typeMatcher", + "isCallable", + "isUndefined", + "isUndefinedOrNull", + "isNull", + "isEmpty", + "isNotEmpty", + "isArrayLike", + "isDateLike", + "xmap", + "map", + "xfilter", + "filter", + "methodcaller", + "compose", + "bind", + "bindMethods", + "NotFound", + "AdapterRegistry", + "registerComparator", + "compare", + "registerRepr", + "repr", + "objEqual", + "arrayEqual", + "concat", + "keyComparator", + "reverseKeyComparator", + "partial", + "merge", + "listMinMax", + "listMax", + "listMin", + "objMax", + "objMin", + "nodeWalk", + "zip", + "urlEncode", + "queryString", + "serializeJSON", + "registerJSON", + "evalJSON", + "parseQueryString", + "findValue", + "findIdentical", + "flattenArguments", + "method", + "average", + "mean", + "median" +]; + +MochiKit.Base.EXPORT_OK = [ + "nameFunctions", + "comparatorRegistry", + "reprRegistry", + "jsonRegistry", + "compareDateLike", + "compareArrayLike", + "reprArrayLike", + "reprString", + "reprNumber" +]; + +MochiKit.Base._exportSymbols = function (globals, module) { + if (!MochiKit.__export__) { + return; + } + var all = module.EXPORT_TAGS[":all"]; + for (var i = 0; i < all.length; i++) { + globals[all[i]] = module[all[i]]; + } +}; + +MochiKit.Base.__new__ = function () { + // A singleton raised when no suitable adapter is found + var m = this; + + // convenience + /** @id MochiKit.Base.noop */ + m.noop = m.operator.identity; + + // Backwards compat + m.forward = m.forwardCall; + m.find = m.findValue; + + if (typeof(encodeURIComponent) != "undefined") { + /** @id MochiKit.Base.urlEncode */ + m.urlEncode = function (unencoded) { + return encodeURIComponent(unencoded).replace(/\'/g, '%27'); + }; + } else { + m.urlEncode = function (unencoded) { + return escape(unencoded + ).replace(/\+/g, '%2B' + ).replace(/\"/g,'%22' + ).rval.replace(/\'/g, '%27'); + }; + } + + /** @id MochiKit.Base.NamedError */ + m.NamedError = function (name) { + this.message = name; + this.name = name; + }; + m.NamedError.prototype = new Error(); + m.update(m.NamedError.prototype, { + repr: function () { + if (this.message && this.message != this.name) { + return this.name + "(" + m.repr(this.message) + ")"; + } else { + return this.name + "()"; + } + }, + toString: m.forwardCall("repr") + }); + + /** @id MochiKit.Base.NotFound */ + m.NotFound = new m.NamedError("MochiKit.Base.NotFound"); + + + /** @id MochiKit.Base.listMax */ + m.listMax = m.partial(m.listMinMax, 1); + /** @id MochiKit.Base.listMin */ + m.listMin = m.partial(m.listMinMax, -1); + + /** @id MochiKit.Base.isCallable */ + m.isCallable = m.typeMatcher('function'); + /** @id MochiKit.Base.isUndefined */ + m.isUndefined = m.typeMatcher('undefined'); + + /** @id MochiKit.Base.merge */ + m.merge = m.partial(m.update, null); + /** @id MochiKit.Base.zip */ + m.zip = m.partial(m.map, null); + + /** @id MochiKit.Base.average */ + m.average = m.mean; + + /** @id MochiKit.Base.comparatorRegistry */ + m.comparatorRegistry = new m.AdapterRegistry(); + m.registerComparator("dateLike", m.isDateLike, m.compareDateLike); + m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike); + + /** @id MochiKit.Base.reprRegistry */ + m.reprRegistry = new m.AdapterRegistry(); + m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike); + m.registerRepr("string", m.typeMatcher("string"), m.reprString); + m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber); + + /** @id MochiKit.Base.jsonRegistry */ + m.jsonRegistry = new m.AdapterRegistry(); + + var all = m.concat(m.EXPORT, m.EXPORT_OK); + m.EXPORT_TAGS = { + ":common": m.concat(m.EXPORT_OK), + ":all": all + }; + + m.nameFunctions(this); + +}; + +MochiKit.Base.__new__(); + +// +// XXX: Internet Explorer blows +// +if (MochiKit.__export__) { + compare = MochiKit.Base.compare; + compose = MochiKit.Base.compose; + serializeJSON = MochiKit.Base.serializeJSON; +} + +MochiKit.Base._exportSymbols(this, MochiKit.Base); diff --git a/mochikit_v14/MochiKit/Color.js b/mochikit_v14/MochiKit/Color.js new file mode 100644 index 0000000..708f490 --- /dev/null +++ b/mochikit_v14/MochiKit/Color.js @@ -0,0 +1,902 @@ +/*** + +MochiKit.Color 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Color'); + dojo.require('MochiKit.Base'); + dojo.require('MochiKit.DOM'); + dojo.require('MochiKit.Style'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); + JSAN.use("MochiKit.DOM", []); + JSAN.use("MochiKit.Style", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Color depends on MochiKit.Base"; +} + +try { + if (typeof(MochiKit.DOM) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Color depends on MochiKit.DOM"; +} + +try { + if (typeof(MochiKit.Style) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Color depends on MochiKit.Style"; +} + +if (typeof(MochiKit.Color) == "undefined") { + MochiKit.Color = {}; +} + +MochiKit.Color.NAME = "MochiKit.Color"; +MochiKit.Color.VERSION = "1.4"; + +MochiKit.Color.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +MochiKit.Color.toString = function () { + return this.__repr__(); +}; + + +/** @id MochiKit.Color.Color */ +MochiKit.Color.Color = function (red, green, blue, alpha) { + if (typeof(alpha) == 'undefined' || alpha === null) { + alpha = 1.0; + } + this.rgb = { + r: red, + g: green, + b: blue, + a: alpha + }; +}; + + +// Prototype methods + +MochiKit.Color.Color.prototype = { + + __class__: MochiKit.Color.Color, + + /** @id MochiKit.Color.Color.prototype.colorWithAlpha */ + colorWithAlpha: function (alpha) { + var rgb = this.rgb; + var m = MochiKit.Color; + return m.Color.fromRGB(rgb.r, rgb.g, rgb.b, alpha); + }, + + /** @id MochiKit.Color.Color.prototype.colorWithHue */ + colorWithHue: function (hue) { + // get an HSL model, and set the new hue... + var hsl = this.asHSL(); + hsl.h = hue; + var m = MochiKit.Color; + // convert back to RGB... + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.colorWithSaturation */ + colorWithSaturation: function (saturation) { + // get an HSL model, and set the new hue... + var hsl = this.asHSL(); + hsl.s = saturation; + var m = MochiKit.Color; + // convert back to RGB... + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.colorWithLightness */ + colorWithLightness: function (lightness) { + // get an HSL model, and set the new hue... + var hsl = this.asHSL(); + hsl.l = lightness; + var m = MochiKit.Color; + // convert back to RGB... + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.darkerColorWithLevel */ + darkerColorWithLevel: function (level) { + var hsl = this.asHSL(); + hsl.l = Math.max(hsl.l - level, 0); + var m = MochiKit.Color; + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.lighterColorWithLevel */ + lighterColorWithLevel: function (level) { + var hsl = this.asHSL(); + hsl.l = Math.min(hsl.l + level, 1); + var m = MochiKit.Color; + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.blendedColor */ + blendedColor: function (other, /* optional */ fraction) { + if (typeof(fraction) == 'undefined' || fraction === null) { + fraction = 0.5; + } + var sf = 1.0 - fraction; + var s = this.rgb; + var d = other.rgb; + var df = fraction; + return MochiKit.Color.Color.fromRGB( + (s.r * sf) + (d.r * df), + (s.g * sf) + (d.g * df), + (s.b * sf) + (d.b * df), + (s.a * sf) + (d.a * df) + ); + }, + + /** @id MochiKit.Color.Color.prototype.compareRGB */ + compareRGB: function (other) { + var a = this.asRGB(); + var b = other.asRGB(); + return MochiKit.Base.compare( + [a.r, a.g, a.b, a.a], + [b.r, b.g, b.b, b.a] + ); + }, + + /** @id MochiKit.Color.Color.prototype.isLight */ + isLight: function () { + return this.asHSL().b > 0.5; + }, + + /** @id MochiKit.Color.Color.prototype.isDark */ + isDark: function () { + return (!this.isLight()); + }, + + /** @id MochiKit.Color.Color.prototype.toHSLString */ + toHSLString: function () { + var c = this.asHSL(); + var ccc = MochiKit.Color.clampColorComponent; + var rval = this._hslString; + if (!rval) { + var mid = ( + ccc(c.h, 360).toFixed(0) + + "," + ccc(c.s, 100).toPrecision(4) + "%" + + "," + ccc(c.l, 100).toPrecision(4) + "%" + ); + var a = c.a; + if (a >= 1) { + a = 1; + rval = "hsl(" + mid + ")"; + } else { + if (a <= 0) { + a = 0; + } + rval = "hsla(" + mid + "," + a + ")"; + } + this._hslString = rval; + } + return rval; + }, + + /** @id MochiKit.Color.Color.prototype.toRGBString */ + toRGBString: function () { + var c = this.rgb; + var ccc = MochiKit.Color.clampColorComponent; + var rval = this._rgbString; + if (!rval) { + var mid = ( + ccc(c.r, 255).toFixed(0) + + "," + ccc(c.g, 255).toFixed(0) + + "," + ccc(c.b, 255).toFixed(0) + ); + if (c.a != 1) { + rval = "rgba(" + mid + "," + c.a + ")"; + } else { + rval = "rgb(" + mid + ")"; + } + this._rgbString = rval; + } + return rval; + }, + + /** @id MochiKit.Color.Color.prototype.asRGB */ + asRGB: function () { + return MochiKit.Base.clone(this.rgb); + }, + + /** @id MochiKit.Color.Color.prototype.toHexString */ + toHexString: function () { + var m = MochiKit.Color; + var c = this.rgb; + var ccc = MochiKit.Color.clampColorComponent; + var rval = this._hexString; + if (!rval) { + rval = ("#" + + m.toColorPart(ccc(c.r, 255)) + + m.toColorPart(ccc(c.g, 255)) + + m.toColorPart(ccc(c.b, 255)) + ); + this._hexString = rval; + } + return rval; + }, + + /** @id MochiKit.Color.Color.prototype.asHSV */ + asHSV: function () { + var hsv = this.hsv; + var c = this.rgb; + if (typeof(hsv) == 'undefined' || hsv === null) { + hsv = MochiKit.Color.rgbToHSV(this.rgb); + this.hsv = hsv; + } + return MochiKit.Base.clone(hsv); + }, + + /** @id MochiKit.Color.Color.prototype.asHSL */ + asHSL: function () { + var hsl = this.hsl; + var c = this.rgb; + if (typeof(hsl) == 'undefined' || hsl === null) { + hsl = MochiKit.Color.rgbToHSL(this.rgb); + this.hsl = hsl; + } + return MochiKit.Base.clone(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.toString */ + toString: function () { + return this.toRGBString(); + }, + + /** @id MochiKit.Color.Color.prototype.repr */ + repr: function () { + var c = this.rgb; + var col = [c.r, c.g, c.b, c.a]; + return this.__class__.NAME + "(" + col.join(", ") + ")"; + } + +}; + +// Constructor methods + +MochiKit.Base.update(MochiKit.Color.Color, { + /** @id MochiKit.Color.Color.fromRGB */ + fromRGB: function (red, green, blue, alpha) { + // designated initializer + var Color = MochiKit.Color.Color; + if (arguments.length == 1) { + var rgb = red; + red = rgb.r; + green = rgb.g; + blue = rgb.b; + if (typeof(rgb.a) == 'undefined') { + alpha = undefined; + } else { + alpha = rgb.a; + } + } + return new Color(red, green, blue, alpha); + }, + + /** @id MochiKit.Color.Color.fromHSL */ + fromHSL: function (hue, saturation, lightness, alpha) { + var m = MochiKit.Color; + return m.Color.fromRGB(m.hslToRGB.apply(m, arguments)); + }, + + /** @id MochiKit.Color.Color.fromHSV */ + fromHSV: function (hue, saturation, value, alpha) { + var m = MochiKit.Color; + return m.Color.fromRGB(m.hsvToRGB.apply(m, arguments)); + }, + + /** @id MochiKit.Color.Color.fromName */ + fromName: function (name) { + var Color = MochiKit.Color.Color; + // Opera 9 seems to "quote" named colors(?!) + if (name.charAt(0) == '"') { + name = name.substr(1, name.length - 2); + } + var htmlColor = Color._namedColors[name.toLowerCase()]; + if (typeof(htmlColor) == 'string') { + return Color.fromHexString(htmlColor); + } else if (name == "transparent") { + return Color.transparentColor(); + } + return null; + }, + + /** @id MochiKit.Color.Color.fromString */ + fromString: function (colorString) { + var self = MochiKit.Color.Color; + var three = colorString.substr(0, 3); + if (three == "rgb") { + return self.fromRGBString(colorString); + } else if (three == "hsl") { + return self.fromHSLString(colorString); + } else if (colorString.charAt(0) == "#") { + return self.fromHexString(colorString); + } + return self.fromName(colorString); + }, + + + /** @id MochiKit.Color.Color.fromHexString */ + fromHexString: function (hexCode) { + if (hexCode.charAt(0) == '#') { + hexCode = hexCode.substring(1); + } + var components = []; + var i, hex; + if (hexCode.length == 3) { + for (i = 0; i < 3; i++) { + hex = hexCode.substr(i, 1); + components.push(parseInt(hex + hex, 16) / 255.0); + } + } else { + for (i = 0; i < 6; i += 2) { + hex = hexCode.substr(i, 2); + components.push(parseInt(hex, 16) / 255.0); + } + } + var Color = MochiKit.Color.Color; + return Color.fromRGB.apply(Color, components); + }, + + + _fromColorString: function (pre, method, scales, colorCode) { + // parses either HSL or RGB + if (colorCode.indexOf(pre) === 0) { + colorCode = colorCode.substring(colorCode.indexOf("(", 3) + 1, colorCode.length - 1); + } + var colorChunks = colorCode.split(/\s*,\s*/); + var colorFloats = []; + for (var i = 0; i < colorChunks.length; i++) { + var c = colorChunks[i]; + var val; + var three = c.substring(c.length - 3); + if (c.charAt(c.length - 1) == '%') { + val = 0.01 * parseFloat(c.substring(0, c.length - 1)); + } else if (three == "deg") { + val = parseFloat(c) / 360.0; + } else if (three == "rad") { + val = parseFloat(c) / (Math.PI * 2); + } else { + val = scales[i] * parseFloat(c); + } + colorFloats.push(val); + } + return this[method].apply(this, colorFloats); + }, + + /** @id MochiKit.Color.Color.fromComputedStyle */ + fromComputedStyle: function (elem, style) { + var d = MochiKit.DOM; + var cls = MochiKit.Color.Color; + for (elem = d.getElement(elem); elem; elem = elem.parentNode) { + var actualColor = MochiKit.Style.getStyle.apply(d, arguments); + if (!actualColor) { + continue; + } + var color = cls.fromString(actualColor); + if (!color) { + break; + } + if (color.asRGB().a > 0) { + return color; + } + } + return null; + }, + + /** @id MochiKit.Color.Color.fromBackground */ + fromBackground: function (elem) { + var cls = MochiKit.Color.Color; + return cls.fromComputedStyle( + elem, "backgroundColor", "background-color") || cls.whiteColor(); + }, + + /** @id MochiKit.Color.Color.fromText */ + fromText: function (elem) { + var cls = MochiKit.Color.Color; + return cls.fromComputedStyle( + elem, "color", "color") || cls.blackColor(); + }, + + /** @id MochiKit.Color.Color.namedColors */ + namedColors: function () { + return MochiKit.Base.clone(MochiKit.Color.Color._namedColors); + } +}); + + +// Module level functions + +MochiKit.Base.update(MochiKit.Color, { + /** @id MochiKit.Color.clampColorComponent */ + clampColorComponent: function (v, scale) { + v *= scale; + if (v < 0) { + return 0; + } else if (v > scale) { + return scale; + } else { + return v; + } + }, + + _hslValue: function (n1, n2, hue) { + if (hue > 6.0) { + hue -= 6.0; + } else if (hue < 0.0) { + hue += 6.0; + } + var val; + if (hue < 1.0) { + val = n1 + (n2 - n1) * hue; + } else if (hue < 3.0) { + val = n2; + } else if (hue < 4.0) { + val = n1 + (n2 - n1) * (4.0 - hue); + } else { + val = n1; + } + return val; + }, + + /** @id MochiKit.Color.hsvToRGB */ + hsvToRGB: function (hue, saturation, value, alpha) { + if (arguments.length == 1) { + var hsv = hue; + hue = hsv.h; + saturation = hsv.s; + value = hsv.v; + alpha = hsv.a; + } + var red; + var green; + var blue; + if (saturation === 0) { + red = value; + green = value; + blue = value; + } else { + var i = Math.floor(hue * 6); + var f = (hue * 6) - i; + var p = value * (1 - saturation); + var q = value * (1 - (saturation * f)); + var t = value * (1 - (saturation * (1 - f))); + switch (i) { + case 1: red = q; green = value; blue = p; break; + case 2: red = p; green = value; blue = t; break; + case 3: red = p; green = q; blue = value; break; + case 4: red = t; green = p; blue = value; break; + case 5: red = value; green = p; blue = q; break; + case 6: // fall through + case 0: red = value; green = t; blue = p; break; + } + } + return { + r: red, + g: green, + b: blue, + a: alpha + }; + }, + + /** @id MochiKit.Color.hslToRGB */ + hslToRGB: function (hue, saturation, lightness, alpha) { + if (arguments.length == 1) { + var hsl = hue; + hue = hsl.h; + saturation = hsl.s; + lightness = hsl.l; + alpha = hsl.a; + } + var red; + var green; + var blue; + if (saturation === 0) { + red = lightness; + green = lightness; + blue = lightness; + } else { + var m2; + if (lightness <= 0.5) { + m2 = lightness * (1.0 + saturation); + } else { + m2 = lightness + saturation - (lightness * saturation); + } + var m1 = (2.0 * lightness) - m2; + var f = MochiKit.Color._hslValue; + var h6 = hue * 6.0; + red = f(m1, m2, h6 + 2); + green = f(m1, m2, h6); + blue = f(m1, m2, h6 - 2); + } + return { + r: red, + g: green, + b: blue, + a: alpha + }; + }, + + /** @id MochiKit.Color.rgbToHSV */ + rgbToHSV: function (red, green, blue, alpha) { + if (arguments.length == 1) { + var rgb = red; + red = rgb.r; + green = rgb.g; + blue = rgb.b; + alpha = rgb.a; + } + var max = Math.max(Math.max(red, green), blue); + var min = Math.min(Math.min(red, green), blue); + var hue; + var saturation; + var value = max; + if (min == max) { + hue = 0; + saturation = 0; + } else { + var delta = (max - min); + saturation = delta / max; + + if (red == max) { + hue = (green - blue) / delta; + } else if (green == max) { + hue = 2 + ((blue - red) / delta); + } else { + hue = 4 + ((red - green) / delta); + } + hue /= 6; + if (hue < 0) { + hue += 1; + } + if (hue > 1) { + hue -= 1; + } + } + return { + h: hue, + s: saturation, + v: value, + a: alpha + }; + }, + + /** @id MochiKit.Color.rgbToHSL */ + rgbToHSL: function (red, green, blue, alpha) { + if (arguments.length == 1) { + var rgb = red; + red = rgb.r; + green = rgb.g; + blue = rgb.b; + alpha = rgb.a; + } + var max = Math.max(red, Math.max(green, blue)); + var min = Math.min(red, Math.min(green, blue)); + var hue; + var saturation; + var lightness = (max + min) / 2.0; + var delta = max - min; + if (delta === 0) { + hue = 0; + saturation = 0; + } else { + if (lightness <= 0.5) { + saturation = delta / (max + min); + } else { + saturation = delta / (2 - max - min); + } + if (red == max) { + hue = (green - blue) / delta; + } else if (green == max) { + hue = 2 + ((blue - red) / delta); + } else { + hue = 4 + ((red - green) / delta); + } + hue /= 6; + if (hue < 0) { + hue += 1; + } + if (hue > 1) { + hue -= 1; + } + + } + return { + h: hue, + s: saturation, + l: lightness, + a: alpha + }; + }, + + /** @id MochiKit.Color.toColorPart */ + toColorPart: function (num) { + num = Math.round(num); + var digits = num.toString(16); + if (num < 16) { + return '0' + digits; + } + return digits; + }, + + __new__: function () { + var m = MochiKit.Base; + /** @id MochiKit.Color.fromRGBString */ + this.Color.fromRGBString = m.bind( + this.Color._fromColorString, this.Color, "rgb", "fromRGB", + [1.0/255.0, 1.0/255.0, 1.0/255.0, 1] + ); + /** @id MochiKit.Color.fromHSLString */ + this.Color.fromHSLString = m.bind( + this.Color._fromColorString, this.Color, "hsl", "fromHSL", + [1.0/360.0, 0.01, 0.01, 1] + ); + + var third = 1.0 / 3.0; + /** @id MochiKit.Color.colors */ + var colors = { + // NSColor colors plus transparent + /** @id MochiKit.Color.blackColor */ + black: [0, 0, 0], + /** @id MochiKit.Color.blueColor */ + blue: [0, 0, 1], + /** @id MochiKit.Color.brownColor */ + brown: [0.6, 0.4, 0.2], + /** @id MochiKit.Color.cyanColor */ + cyan: [0, 1, 1], + /** @id MochiKit.Color.darkGrayColor */ + darkGray: [third, third, third], + /** @id MochiKit.Color.grayColor */ + gray: [0.5, 0.5, 0.5], + /** @id MochiKit.Color.greenColor */ + green: [0, 1, 0], + /** @id MochiKit.Color.lightGrayColor */ + lightGray: [2 * third, 2 * third, 2 * third], + /** @id MochiKit.Color.magentaColor */ + magenta: [1, 0, 1], + /** @id MochiKit.Color.orangeColor */ + orange: [1, 0.5, 0], + /** @id MochiKit.Color.purpleColor */ + purple: [0.5, 0, 0.5], + /** @id MochiKit.Color.redColor */ + red: [1, 0, 0], + /** @id MochiKit.Color.transparentColor */ + transparent: [0, 0, 0, 0], + /** @id MochiKit.Color.whiteColor */ + white: [1, 1, 1], + /** @id MochiKit.Color.yellowColor */ + yellow: [1, 1, 0] + }; + + var makeColor = function (name, r, g, b, a) { + var rval = this.fromRGB(r, g, b, a); + this[name] = function () { return rval; }; + return rval; + }; + + for (var k in colors) { + var name = k + "Color"; + var bindArgs = m.concat( + [makeColor, this.Color, name], + colors[k] + ); + this.Color[name] = m.bind.apply(null, bindArgs); + } + + var isColor = function () { + for (var i = 0; i < arguments.length; i++) { + if (!(arguments[i] instanceof Color)) { + return false; + } + } + return true; + }; + + var compareColor = function (a, b) { + return a.compareRGB(b); + }; + + m.nameFunctions(this); + + m.registerComparator(this.Color.NAME, isColor, compareColor); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; + + } +}); + +MochiKit.Color.EXPORT = [ + "Color" +]; + +MochiKit.Color.EXPORT_OK = [ + "clampColorComponent", + "rgbToHSL", + "hslToRGB", + "rgbToHSV", + "hsvToRGB", + "toColorPart" +]; + +MochiKit.Color.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Color); + +// Full table of css3 X11 colors + +MochiKit.Color.Color._namedColors = { + aliceblue: "#f0f8ff", + antiquewhite: "#faebd7", + aqua: "#00ffff", + aquamarine: "#7fffd4", + azure: "#f0ffff", + beige: "#f5f5dc", + bisque: "#ffe4c4", + black: "#000000", + blanchedalmond: "#ffebcd", + blue: "#0000ff", + blueviolet: "#8a2be2", + brown: "#a52a2a", + burlywood: "#deb887", + cadetblue: "#5f9ea0", + chartreuse: "#7fff00", + chocolate: "#d2691e", + coral: "#ff7f50", + cornflowerblue: "#6495ed", + cornsilk: "#fff8dc", + crimson: "#dc143c", + cyan: "#00ffff", + darkblue: "#00008b", + darkcyan: "#008b8b", + darkgoldenrod: "#b8860b", + darkgray: "#a9a9a9", + darkgreen: "#006400", + darkgrey: "#a9a9a9", + darkkhaki: "#bdb76b", + darkmagenta: "#8b008b", + darkolivegreen: "#556b2f", + darkorange: "#ff8c00", + darkorchid: "#9932cc", + darkred: "#8b0000", + darksalmon: "#e9967a", + darkseagreen: "#8fbc8f", + darkslateblue: "#483d8b", + darkslategray: "#2f4f4f", + darkslategrey: "#2f4f4f", + darkturquoise: "#00ced1", + darkviolet: "#9400d3", + deeppink: "#ff1493", + deepskyblue: "#00bfff", + dimgray: "#696969", + dimgrey: "#696969", + dodgerblue: "#1e90ff", + firebrick: "#b22222", + floralwhite: "#fffaf0", + forestgreen: "#228b22", + fuchsia: "#ff00ff", + gainsboro: "#dcdcdc", + ghostwhite: "#f8f8ff", + gold: "#ffd700", + goldenrod: "#daa520", + gray: "#808080", + green: "#008000", + greenyellow: "#adff2f", + grey: "#808080", + honeydew: "#f0fff0", + hotpink: "#ff69b4", + indianred: "#cd5c5c", + indigo: "#4b0082", + ivory: "#fffff0", + khaki: "#f0e68c", + lavender: "#e6e6fa", + lavenderblush: "#fff0f5", + lawngreen: "#7cfc00", + lemonchiffon: "#fffacd", + lightblue: "#add8e6", + lightcoral: "#f08080", + lightcyan: "#e0ffff", + lightgoldenrodyellow: "#fafad2", + lightgray: "#d3d3d3", + lightgreen: "#90ee90", + lightgrey: "#d3d3d3", + lightpink: "#ffb6c1", + lightsalmon: "#ffa07a", + lightseagreen: "#20b2aa", + lightskyblue: "#87cefa", + lightslategray: "#778899", + lightslategrey: "#778899", + lightsteelblue: "#b0c4de", + lightyellow: "#ffffe0", + lime: "#00ff00", + limegreen: "#32cd32", + linen: "#faf0e6", + magenta: "#ff00ff", + maroon: "#800000", + mediumaquamarine: "#66cdaa", + mediumblue: "#0000cd", + mediumorchid: "#ba55d3", + mediumpurple: "#9370db", + mediumseagreen: "#3cb371", + mediumslateblue: "#7b68ee", + mediumspringgreen: "#00fa9a", + mediumturquoise: "#48d1cc", + mediumvioletred: "#c71585", + midnightblue: "#191970", + mintcream: "#f5fffa", + mistyrose: "#ffe4e1", + moccasin: "#ffe4b5", + navajowhite: "#ffdead", + navy: "#000080", + oldlace: "#fdf5e6", + olive: "#808000", + olivedrab: "#6b8e23", + orange: "#ffa500", + orangered: "#ff4500", + orchid: "#da70d6", + palegoldenrod: "#eee8aa", + palegreen: "#98fb98", + paleturquoise: "#afeeee", + palevioletred: "#db7093", + papayawhip: "#ffefd5", + peachpuff: "#ffdab9", + peru: "#cd853f", + pink: "#ffc0cb", + plum: "#dda0dd", + powderblue: "#b0e0e6", + purple: "#800080", + red: "#ff0000", + rosybrown: "#bc8f8f", + royalblue: "#4169e1", + saddlebrown: "#8b4513", + salmon: "#fa8072", + sandybrown: "#f4a460", + seagreen: "#2e8b57", + seashell: "#fff5ee", + sienna: "#a0522d", + silver: "#c0c0c0", + skyblue: "#87ceeb", + slateblue: "#6a5acd", + slategray: "#708090", + slategrey: "#708090", + snow: "#fffafa", + springgreen: "#00ff7f", + steelblue: "#4682b4", + tan: "#d2b48c", + teal: "#008080", + thistle: "#d8bfd8", + tomato: "#ff6347", + turquoise: "#40e0d0", + violet: "#ee82ee", + wheat: "#f5deb3", + white: "#ffffff", + whitesmoke: "#f5f5f5", + yellow: "#ffff00", + yellowgreen: "#9acd32" +}; diff --git a/mochikit_v14/MochiKit/Controls.js b/mochikit_v14/MochiKit/Controls.js new file mode 100644 index 0000000..c044ef2 --- /dev/null +++ b/mochikit_v14/MochiKit/Controls.js @@ -0,0 +1,1388 @@ +/*** +Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) + (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan) + (c) 2005 Jon Tirsen (http://www.tirsen.com) +Contributors: + Richard Livsey + Rahul Bhargava + Rob Wills + Mochi-ized By Thomas Herve (_firstname_@nimail.org) + +See scriptaculous.js for full license. + +Autocompleter.Base handles all the autocompletion functionality +that's independent of the data source for autocompletion. This +includes drawing the autocompletion menu, observing keyboard +and mouse events, and similar. + +Specific autocompleters need to provide, at the very least, +a getUpdatedChoices function that will be invoked every time +the text inside the monitored textbox changes. This method +should get the text for which to provide autocompletion by +invoking this.getToken(), NOT by directly accessing +this.element.value. This is to allow incremental tokenized +autocompletion. Specific auto-completion logic (AJAX, etc) +belongs in getUpdatedChoices. + +Tokenized incremental autocompletion is enabled automatically +when an autocompleter is instantiated with the 'tokens' option +in the options parameter, e.g.: +new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); +will incrementally autocomplete with a comma as the token. +Additionally, ',' in the above example can be replaced with +a token array, e.g. { tokens: [',', '\n'] } which +enables autocompletion on multiple tokens. This is most +useful when one of the tokens is \n (a newline), as it +allows smart autocompletion after linebreaks. + +***/ + +MochiKit.Base.update(MochiKit.Base, { + ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', + +/** @id MochiKit.Base.stripScripts */ + stripScripts: function (str) { + return str.replace(new RegExp(MochiKit.Base.ScriptFragment, 'img'), ''); + }, + +/** @id MochiKit.Base.stripTags */ + stripTags: function(str) { + return str.replace(/<\/?[^>]+>/gi, ''); + }, + +/** @id MochiKit.Base.extractScripts */ + extractScripts: function (str) { + var matchAll = new RegExp(MochiKit.Base.ScriptFragment, 'img'); + var matchOne = new RegExp(MochiKit.Base.ScriptFragment, 'im'); + return MochiKit.Base.map(function (scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }, str.match(matchAll) || []); + }, + +/** @id MochiKit.Base.evalScripts */ + evalScripts: function (str) { + return MochiKit.Base.map(function (scr) { + eval(scr); + }, MochiKit.Base.extractScripts(str)); + } +}); + +MochiKit.Form = { + +/** @id MochiKit.Form.serialize */ + serialize: function (form) { + var elements = MochiKit.Form.getElements(form); + var queryComponents = []; + + for (var i = 0; i < elements.length; i++) { + var queryComponent = MochiKit.Form.serializeElement(elements[i]); + if (queryComponent) { + queryComponents.push(queryComponent); + } + } + + return queryComponents.join('&'); + }, + +/** @id MochiKit.Form.getElements */ + getElements: function (form) { + form = MochiKit.DOM.getElement(form); + var elements = []; + + for (var tagName in MochiKit.Form.Serializers) { + var tagElements = form.getElementsByTagName(tagName); + for (var j = 0; j < tagElements.length; j++) { + elements.push(tagElements[j]); + } + } + return elements; + }, + +/** @id MochiKit.Form.serializeElement */ + serializeElement: function (element) { + element = MochiKit.DOM.getElement(element); + var method = element.tagName.toLowerCase(); + var parameter = MochiKit.Form.Serializers[method](element); + + if (parameter) { + var key = encodeURIComponent(parameter[0]); + if (key.length === 0) { + return; + } + + if (!(parameter[1] instanceof Array)) { + parameter[1] = [parameter[1]]; + } + + return parameter[1].map(function (value) { + return key + '=' + encodeURIComponent(value); + }).join('&'); + } + } +}; + +MochiKit.Form.Serializers = { + +/** @id MochiKit.Form.Serializers.input */ + input: function (element) { + switch (element.type.toLowerCase()) { + case 'submit': + case 'hidden': + case 'password': + case 'text': + return MochiKit.Form.Serializers.textarea(element); + case 'checkbox': + case 'radio': + return MochiKit.Form.Serializers.inputSelector(element); + } + return false; + }, + +/** @id MochiKit.Form.Serializers.inputSelector */ + inputSelector: function (element) { + if (element.checked) { + return [element.name, element.value]; + } + }, + +/** @id MochiKit.Form.Serializers.textarea */ + textarea: function (element) { + return [element.name, element.value]; + }, + +/** @id MochiKit.Form.Serializers.select */ + select: function (element) { + return MochiKit.Form.Serializers[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + }, + +/** @id MochiKit.Form.Serializers.selectOne */ + 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]; + }, + +/** @id MochiKit.Form.Serializers.selectMany */ + selectMany: function (element) { + var value = []; + 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]; + } +}; + +/** @id Ajax */ +var Ajax = { + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + +/** @id Ajax.Responders.register */ + register: function (responderToAdd) { + if (MochiKit.Base.find(this.responders, responderToAdd) == -1) { + this.responders.push(responderToAdd); + } + }, + +/** @id Ajax.Responders.unregister */ + unregister: function (responderToRemove) { + this.responders = this.responders.without(responderToRemove); + }, + +/** @id Ajax.Responders.dispatch */ + dispatch: function (callback, request, transport, json) { + MochiKit.Iter.forEach(this.responders, function (responder) { + if (responder[callback] && + typeof(responder[callback]) == 'function') { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) {} + } + }); + } +}; + +Ajax.Responders.register({ + +/** @id Ajax.Responders.onCreate */ + onCreate: function () { + Ajax.activeRequestCount++; + }, + +/** @id Ajax.Responders.onComplete */ + onComplete: function () { + Ajax.activeRequestCount--; + } +}); + +/** @id Ajax.Base */ +Ajax.Base = function () {}; + +Ajax.Base.prototype = { + +/** @id Ajax.Base.prototype.setOptions */ + setOptions: function (options) { + this.options = { + method: 'post', + asynchronous: true, + parameters: '' + } + MochiKit.Base.update(this.options, options || {}); + }, + +/** @id Ajax.Base.prototype.responseIsSuccess */ + responseIsSuccess: function () { + return this.transport.status == undefined + || this.transport.status === 0 + || (this.transport.status >= 200 && this.transport.status < 300); + }, + +/** @id Ajax.Base.prototype.responseIsFailure */ + responseIsFailure: function () { + return !this.responseIsSuccess(); + } +}; + +/** @id Ajax.Request */ +Ajax.Request = function (url, options) { + this.__init__(url, options); +}; + +/** @id Ajax.Events */ +Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', + 'Interactive', 'Complete']; + +MochiKit.Base.update(Ajax.Request.prototype, Ajax.Base.prototype); + +MochiKit.Base.update(Ajax.Request.prototype, { + __init__: function (url, options) { + this.transport = MochiKit.Async.getXMLHttpRequest(); + this.setOptions(options); + this.request(url); + }, + +/** @id Ajax.Request.prototype.request */ + 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 = MochiKit.Base.bind(this.onStateChange, this); + setTimeout(MochiKit.Base.bind(function () { + this.respondToReadyState(1); + }, 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); + } + }, + +/** @id Ajax.Request.prototype.setRequestHeaders */ + setRequestHeaders: function () { + var requestHeaders = ['X-Requested-With', 'XMLHttpRequest']; + + 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 XMLHttpRequest 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]); + } + }, + +/** @id Ajax.Request.prototype.onStateChange */ + onStateChange: function () { + var readyState = this.transport.readyState; + if (readyState != 1) { + this.respondToReadyState(this.transport.readyState); + } + }, + +/** @id Ajax.Request.prototype.header */ + header: function (name) { + try { + return this.transport.getResponseHeader(name); + } catch (e) {} + }, + +/** @id Ajax.Request.prototype.evalJSON */ + evalJSON: function () { + try { + return eval(this.header('X-JSON')); + } catch (e) {} + }, + +/** @id Ajax.Request.prototype.evalResponse */ + evalResponse: function () { + try { + return eval(this.transport.responseText); + } catch (e) { + this.dispatchException(e); + } + }, + +/** @id Ajax.Request.prototype.respondToReadyState */ + 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')] + || MochiKit.Base.noop)(transport, json); + } catch (e) { + this.dispatchException(e); + } + + if ((this.header('Content-type') || '').match(/^text\/javascript/i)) { + this.evalResponse(); + } + } + + try { + (this.options['on' + event] || MochiKit.Base.noop)(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 = MochiKit.Base.noop; + } + }, + +/** @id Ajax.Request.prototype.dispatchException */ + dispatchException: function (exception) { + (this.options.onException || MochiKit.Base.noop)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +/** @id Ajax.Updater */ +Ajax.Updater = function (container, url, options) { + this.__init__(container, url, options); +}; + +MochiKit.Base.update(Ajax.Updater.prototype, Ajax.Request.prototype); + +MochiKit.Base.update(Ajax.Updater.prototype, { + __init__: function (container, url, options) { + this.containers = { + success: container.success ? MochiKit.DOM.getElement(container.success) : MochiKit.DOM.getElement(container), + failure: container.failure ? MochiKit.DOM.getElement(container.failure) : + (container.success ? null : MochiKit.DOM.getElement(container)) + } + this.transport = MochiKit.Async.getXMLHttpRequest(); + this.setOptions(options); + + var onComplete = this.options.onComplete || MochiKit.Base.noop; + this.options.onComplete = MochiKit.Base.bind(function (transport, object) { + this.updateContent(); + onComplete(transport, object); + }, this); + + this.request(url); + }, + +/** @id Ajax.Updater.prototype.updateContent */ + updateContent: function () { + var receiver = this.responseIsSuccess() ? + this.containers.success : this.containers.failure; + var response = this.transport.responseText; + + if (!this.options.evalScripts) { + response = MochiKit.Base.stripScripts(response); + } + + if (receiver) { + if (this.options.insertion) { + new this.options.insertion(receiver, response); + } else { + MochiKit.DOM.getElement(receiver).innerHTML = + MochiKit.Base.stripScripts(response); + setTimeout(function () { + MochiKit.Base.evalScripts(response); + }, 10); + } + } + + if (this.responseIsSuccess()) { + if (this.onComplete) { + setTimeout(MochiKit.Base.bind(this.onComplete, this), 10); + } + } + } +}); + +/** @id Field */ +var Field = { + +/** @id clear */ + clear: function () { + for (var i = 0; i < arguments.length; i++) { + MochiKit.DOM.getElement(arguments[i]).value = ''; + } + }, + +/** @id focus */ + focus: function (element) { + MochiKit.DOM.getElement(element).focus(); + }, + +/** @id present */ + present: function () { + for (var i = 0; i < arguments.length; i++) { + if (MochiKit.DOM.getElement(arguments[i]).value == '') { + return false; + } + } + return true; + }, + +/** @id select */ + select: function (element) { + MochiKit.DOM.getElement(element).select(); + }, + +/** @id activate */ + activate: function (element) { + element = MochiKit.DOM.getElement(element); + element.focus(); + if (element.select) { + element.select(); + } + }, + +/** @id scrollFreeActivate */ + scrollFreeActivate: function (field) { + setTimeout(function () { + Field.activate(field); + }, 1); + } +}; + + +/** @id Autocompleter */ +var Autocompleter = {}; + +/** @id Autocompleter.Base */ +Autocompleter.Base = function () {}; + +Autocompleter.Base.prototype = { + +/** @id Autocompleter.Base.prototype.baseInitialize */ + baseInitialize: function (element, update, options) { + this.element = MochiKit.DOM.getElement(element); + this.update = MochiKit.DOM.getElement(update); + this.hasFocus = false; + this.changed = false; + this.active = false; + this.index = 0; + this.entryCount = 0; + + if (this.setOptions) { + this.setOptions(options); + } + else { + this.options = options || {}; + } + + this.options.paramName = this.options.paramName || this.element.name; + this.options.tokens = this.options.tokens || []; + this.options.frequency = this.options.frequency || 0.4; + this.options.minChars = this.options.minChars || 1; + this.options.onShow = this.options.onShow || function (element, update) { + if (!update.style.position || update.style.position == 'absolute') { + update.style.position = 'absolute'; + MochiKit.Position.clone(element, update, { + setHeight: false, + offsetTop: element.offsetHeight + }); + } + MochiKit.Visual.appear(update, {duration:0.15}); + }; + this.options.onHide = this.options.onHide || function (element, update) { + MochiKit.Visual.fade(update, {duration: 0.15}); + }; + + if (typeof(this.options.tokens) == 'string') { + this.options.tokens = new Array(this.options.tokens); + } + + this.observer = null; + + this.element.setAttribute('autocomplete', 'off'); + + MochiKit.Style.hideElement(this.update); + + MochiKit.Signal.connect(this.element, 'onblur', this, this.onBlur); + MochiKit.Signal.connect(this.element, 'onkeypress', this, this.onKeyPress, this); + }, + +/** @id Autocompleter.Base.prototype.show */ + show: function () { + if (MochiKit.Style.getStyle(this.update, 'display') == 'none') { + this.options.onShow(this.element, this.update); + } + if (!this.iefix && /MSIE/.test(navigator.userAgent && + (MochiKit.Style.getStyle(this.update, 'position') == 'absolute'))) { + new Insertion.After(this.update, + ''); + this.iefix = MochiKit.DOM.getElement(this.update.id + '_iefix'); + } + if (this.iefix) { + setTimeout(MochiKit.Base.bind(this.fixIEOverlapping, this), 50); + } + }, + +/** @id Autocompleter.Base.prototype.fixIEOverlapping */ + fixIEOverlapping: function () { + MochiKit.Position.clone(this.update, this.iefix); + this.iefix.style.zIndex = 1; + this.update.style.zIndex = 2; + MochiKit.Style.showElement(this.iefix); + }, + +/** @id Autocompleter.Base.prototype.hide */ + hide: function () { + this.stopIndicator(); + if (MochiKit.Style.getStyle(this.update, 'display') != 'none') { + this.options.onHide(this.element, this.update); + } + if (this.iefix) { + MochiKit.Style.hideElement(this.iefix); + } + }, + +/** @id Autocompleter.Base.prototype.startIndicator */ + startIndicator: function () { + if (this.options.indicator) { + MochiKit.Style.showElement(this.options.indicator); + } + }, + +/** @id Autocompleter.Base.prototype.stopIndicator */ + stopIndicator: function () { + if (this.options.indicator) { + MochiKit.Style.hideElement(this.options.indicator); + } + }, + +/** @id Autocompleter.Base.prototype.onKeyPress */ + onKeyPress: function (event) { + if (this.active) { + if (event.key().string == "KEY_TAB" || event.key().string == "KEY_RETURN") { + this.selectEntry(); + MochiKit.Event.stop(event); + } else if (event.key().string == "KEY_ESCAPE") { + this.hide(); + this.active = false; + MochiKit.Event.stop(event); + return; + } else if (event.key().string == "KEY_LEFT" || event.key().string == "KEY_RIGHT") { + return; + } else if (event.key().string == "KEY_UP") { + this.markPrevious(); + this.render(); + if (/AppleWebKit'/.test(navigator.appVersion)) { + event.stop(); + } + return; + } else if (event.key().string == "KEY_DOWN") { + this.markNext(); + this.render(); + if (/AppleWebKit'/.test(navigator.appVersion)) { + event.stop(); + } + return; + } + } else { + if (event.key().string == "KEY_TAB" || event.key().string == "KEY_RETURN") { + return; + } + } + + this.changed = true; + this.hasFocus = true; + + if (this.observer) { + clearTimeout(this.observer); + } + this.observer = setTimeout(MochiKit.Base.bind(this.onObserverEvent, this), + this.options.frequency*1000); + }, + +/** @id Autocompleter.Base.prototype.findElement */ + findElement: function (event, tagName) { + var element = event.target; + while (element.parentNode && (!element.tagName || + (element.tagName.toUpperCase() != tagName.toUpperCase()))) { + element = element.parentNode; + } + return element; + }, + +/** @id Autocompleter.Base.prototype.hover */ + onHover: function (event) { + var element = this.findElement(event, 'LI'); + if (this.index != element.autocompleteIndex) { + this.index = element.autocompleteIndex; + this.render(); + } + event.stop(); + }, + +/** @id Autocompleter.Base.prototype.onClick */ + onClick: function (event) { + var element = this.findElement(event, 'LI'); + this.index = element.autocompleteIndex; + this.selectEntry(); + this.hide(); + }, + +/** @id Autocompleter.Base.prototype.onBlur */ + onBlur: function (event) { + // needed to make click events working + setTimeout(MochiKit.Base.bind(this.hide, this), 250); + this.hasFocus = false; + this.active = false; + }, + +/** @id Autocompleter.Base.prototype.render */ + render: function () { + if (this.entryCount > 0) { + for (var i = 0; i < this.entryCount; i++) { + this.index == i ? + MochiKit.DOM.addElementClass(this.getEntry(i), 'selected') : + MochiKit.DOM.removeElementClass(this.getEntry(i), 'selected'); + } + if (this.hasFocus) { + this.show(); + this.active = true; + } + } else { + this.active = false; + this.hide(); + } + }, + +/** @id Autocompleter.Base.prototype.markPrevious */ + markPrevious: function () { + if (this.index > 0) { + this.index-- + } else { + this.index = this.entryCount-1; + } + }, + +/** @id Autocompleter.Base.prototype.markNext */ + markNext: function () { + if (this.index < this.entryCount-1) { + this.index++ + } else { + this.index = 0; + } + }, + +/** @id Autocompleter.Base.prototype.getEntry */ + getEntry: function (index) { + return this.update.firstChild.childNodes[index]; + }, + +/** @id Autocompleter.Base.prototype.getCurrentEntry */ + getCurrentEntry: function () { + return this.getEntry(this.index); + }, + +/** @id Autocompleter.Base.prototype.selectEntry */ + selectEntry: function () { + this.active = false; + this.updateElement(this.getCurrentEntry()); + }, + +/** @id Autocompleter.Base.prototype.collectTextNodesIgnoreClass */ + collectTextNodesIgnoreClass: function (element, className) { + return MochiKit.Base.flattenArray(MochiKit.Base.map(function (node) { + if (node.nodeType == 3) { + return node.nodeValue; + } else if (node.hasChildNodes() && !MochiKit.DOM.hasElementClass(node, className)) { + return this.collectTextNodesIgnoreClass(node, className); + } + return ''; + }, MochiKit.DOM.getElement(element).childNodes)).join(''); + }, + +/** @id Autocompleter.Base.prototype.updateElement */ + updateElement: function (selectedElement) { + if (this.options.updateElement) { + this.options.updateElement(selectedElement); + return; + } + var value = ''; + if (this.options.select) { + var nodes = document.getElementsByClassName(this.options.select, selectedElement) || []; + if (nodes.length > 0) { + value = MochiKit.DOM.scrapeText(nodes[0]); + } + } else { + value = this.collectTextNodesIgnoreClass(selectedElement, 'informal'); + } + var lastTokenPos = this.findLastToken(); + if (lastTokenPos != -1) { + var newValue = this.element.value.substr(0, lastTokenPos + 1); + var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/); + if (whitespace) { + newValue += whitespace[0]; + } + this.element.value = newValue + value; + } else { + this.element.value = value; + } + this.element.focus(); + + if (this.options.afterUpdateElement) { + this.options.afterUpdateElement(this.element, selectedElement); + } + }, + +/** @id Autocompleter.Base.prototype.updateChoices */ + updateChoices: function (choices) { + if (!this.changed && this.hasFocus) { + this.update.innerHTML = choices; + var d = MochiKit.DOM; + d.removeEmptyTextNodes(this.update); + d.removeEmptyTextNodes(this.update.firstChild); + + if (this.update.firstChild && this.update.firstChild.childNodes) { + this.entryCount = this.update.firstChild.childNodes.length; + for (var i = 0; i < this.entryCount; i++) { + var entry = this.getEntry(i); + entry.autocompleteIndex = i; + this.addObservers(entry); + } + } else { + this.entryCount = 0; + } + + this.stopIndicator(); + + this.index = 0; + this.render(); + } + }, + +/** @id Autocompleter.Base.prototype.addObservers */ + addObservers: function (element) { + MochiKit.Signal.connect(element, 'onmouseover', this, this.onHover); + MochiKit.Signal.connect(element, 'onclick', this, this.onClick); + }, + +/** @id Autocompleter.Base.prototype.onObserverEvent */ + onObserverEvent: function () { + this.changed = false; + if (this.getToken().length >= this.options.minChars) { + this.startIndicator(); + this.getUpdatedChoices(); + } else { + this.active = false; + this.hide(); + } + }, + +/** @id Autocompleter.Base.prototype.getToken */ + getToken: function () { + var tokenPos = this.findLastToken(); + if (tokenPos != -1) { + var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,''); + } else { + var ret = this.element.value; + } + return /\n/.test(ret) ? '' : ret; + }, + +/** @id Autocompleter.Base.prototype.findLastToken */ + findLastToken: function () { + var lastTokenPos = -1; + + for (var i = 0; i < this.options.tokens.length; i++) { + var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]); + if (thisTokenPos > lastTokenPos) { + lastTokenPos = thisTokenPos; + } + } + return lastTokenPos; + } +} + +/** @id Ajax.Autocompleter */ +Ajax.Autocompleter = function (element, update, url, options) { + this.__init__(element, update, url, options); +}; + +MochiKit.Base.update(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype); + +MochiKit.Base.update(Ajax.Autocompleter.prototype, { + __init__: function (element, update, url, options) { + this.baseInitialize(element, update, options); + this.options.asynchronous = true; + this.options.onComplete = MochiKit.Base.bind(this.onComplete, this); + this.options.defaultParams = this.options.parameters || null; + this.url = url; + }, + +/** @id Ajax.Autocompleter.prototype.getUpdatedChoices */ + getUpdatedChoices: function () { + var entry = encodeURIComponent(this.options.paramName) + '=' + + encodeURIComponent(this.getToken()); + + this.options.parameters = this.options.callback ? + this.options.callback(this.element, entry) : entry; + + if (this.options.defaultParams) { + this.options.parameters += '&' + this.options.defaultParams; + } + new Ajax.Request(this.url, this.options); + }, + +/** @id Ajax.Autocompleter.prototype.onComplete */ + onComplete: function (request) { + this.updateChoices(request.responseText); + } +}); + +/*** + +The local array autocompleter. Used when you'd prefer to +inject an array of autocompletion options into the page, rather +than sending out Ajax queries, which can be quite slow sometimes. + +The constructor takes four parameters. The first two are, as usual, +the id of the monitored textbox, and id of the autocompletion menu. +The third is the array you want to autocomplete from, and the fourth +is the options block. + +Extra local autocompletion options: +- choices - How many autocompletion choices to offer + +- partialSearch - If false, the autocompleter will match entered + text only at the beginning of strings in the + autocomplete array. Defaults to true, which will + match text at the beginning of any *word* in the + strings in the autocomplete array. If you want to + search anywhere in the string, additionally set + the option fullSearch to true (default: off). + +- fullSsearch - Search anywhere in autocomplete array strings. + +- partialChars - How many characters to enter before triggering + a partial match (unlike minChars, which defines + how many characters are required to do any match + at all). Defaults to 2. + +- ignoreCase - Whether to ignore case when autocompleting. + Defaults to true. + +It's possible to pass in a custom function as the 'selector' +option, if you prefer to write your own autocompletion logic. +In that case, the other options above will not apply unless +you support them. + +***/ + +/** @id Autocompleter.Local */ +Autocompleter.Local = function (element, update, array, options) { + this.__init__(element, update, array, options); +}; + +MochiKit.Base.update(Autocompleter.Local.prototype, Autocompleter.Base.prototype); + +MochiKit.Base.update(Autocompleter.Local.prototype, { + __init__: function (element, update, array, options) { + this.baseInitialize(element, update, options); + this.options.array = array; + }, + +/** @id Autocompleter.Local.prototype.getUpdatedChoices */ + getUpdatedChoices: function () { + this.updateChoices(this.options.selector(this)); + }, + +/** @id Autocompleter.Local.prototype.setOptions */ + setOptions: function (options) { + this.options = MochiKit.Base.update({ + choices: 10, + partialSearch: true, + partialChars: 2, + ignoreCase: true, + fullSearch: false, + selector: function (instance) { + var ret = []; // Beginning matches + var partial = []; // Inside matches + var entry = instance.getToken(); + var count = 0; + + for (var i = 0; i < instance.options.array.length && + ret.length < instance.options.choices ; i++) { + + var elem = instance.options.array[i]; + var foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase()) : + elem.indexOf(entry); + + while (foundPos != -1) { + if (foundPos === 0 && elem.length != entry.length) { + ret.push('
  • ' + elem.substr(0, entry.length) + '' + + elem.substr(entry.length) + '
  • '); + break; + } else if (entry.length >= instance.options.partialChars && + instance.options.partialSearch && foundPos != -1) { + if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos - 1, 1))) { + partial.push('
  • ' + elem.substr(0, foundPos) + '' + + elem.substr(foundPos, entry.length) + '' + elem.substr( + foundPos + entry.length) + '
  • '); + break; + } + } + + foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : + elem.indexOf(entry, foundPos + 1); + + } + } + if (partial.length) { + ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)) + } + return '
      ' + ret.join('') + '
    '; + } + }, options || {}); + } +}); + +/*** + +AJAX in-place editor + +see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor + +Use this if you notice weird scrolling problems on some browsers, +the DOM might be a bit confused when this gets called so do this +waits 1 ms (with setTimeout) until it does the activation + +***/ + +/** @id Ajax.InPlaceEditor */ +Ajax.InPlaceEditor = function (element, url, options) { + this.__init__(element, url, options); +}; + +/** @id Ajax.InPlaceEditor.defaultHighlightColor */ +Ajax.InPlaceEditor.defaultHighlightColor = '#FFFF99'; + +Ajax.InPlaceEditor.prototype = { + __init__: function (element, url, options) { + this.url = url; + this.element = MochiKit.DOM.getElement(element); + + this.options = MochiKit.Base.update({ + okButton: true, + okText: 'ok', + cancelLink: true, + cancelText: 'cancel', + savingText: 'Saving...', + clickToEditText: 'Click to edit', + okText: 'ok', + rows: 1, + onComplete: function (transport, element) { + new MochiKit.Visual.Highlight(element, {startcolor: this.options.highlightcolor}); + }, + onFailure: function (transport) { + alert('Error communicating with the server: ' + MochiKit.Base.stripTags(transport.responseText)); + }, + callback: function (form) { + return MochiKit.DOM.formContents(form); + }, + handleLineBreaks: true, + loadingText: 'Loading...', + savingClassName: 'inplaceeditor-saving', + loadingClassName: 'inplaceeditor-loading', + formClassName: 'inplaceeditor-form', + highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor, + highlightendcolor: '#FFFFFF', + externalControl: null, + submitOnBlur: false, + ajaxOptions: {} + }, options || {}); + + if (!this.options.formId && this.element.id) { + this.options.formId = this.element.id + '-inplaceeditor'; + if (MochiKit.DOM.getElement(this.options.formId)) { + // there's already a form with that name, don't specify an id + this.options.formId = null; + } + } + + if (this.options.externalControl) { + this.options.externalControl = MochiKit.DOM.getElement(this.options.externalControl); + } + + this.originalBackground = MochiKit.Style.getStyle(this.element, 'background-color'); + if (!this.originalBackground) { + this.originalBackground = 'transparent'; + } + + this.element.title = this.options.clickToEditText; + + this.onclickListener = MochiKit.Signal.connect(this.element, 'onclick', this, this.enterEditMode); + this.mouseoverListener = MochiKit.Signal.connect(this.element, 'onmouseover', this, this.enterHover); + this.mouseoutListener = MochiKit.Signal.connect(this.element, 'onmouseout', this, this.leaveHover); + if (this.options.externalControl) { + this.onclickListenerExternal = MochiKit.Signal.connect(this.options.externalControl, + 'onclick', this, this.enterEditMode); + this.mouseoverListenerExternal = MochiKit.Signal.connect(this.options.externalControl, + 'onmouseover', this, this.enterHover); + this.mouseoutListenerExternal = MochiKit.Signal.connect(this.options.externalControl, + 'onmouseout', this, this.leaveHover); + } + }, + +/** @id Ajax.InPlaceEditor.prototype.enterEditMode */ + enterEditMode: function (evt) { + if (this.saving) { + return; + } + if (this.editing) { + return; + } + this.editing = true; + this.onEnterEditMode(); + if (this.options.externalControl) { + MochiKit.Style.hideElement(this.options.externalControl); + } + MochiKit.Style.hideElement(this.element); + this.createForm(); + this.element.parentNode.insertBefore(this.form, this.element); + Field.scrollFreeActivate(this.editField); + // stop the event to avoid a page refresh in Safari + if (evt) { + evt.stop(); + } + return false; + }, + +/** @id Ajax.InPlaceEditor.prototype.createForm */ + createForm: function () { + this.form = document.createElement('form'); + this.form.id = this.options.formId; + MochiKit.DOM.addElementClass(this.form, this.options.formClassName) + this.form.onsubmit = MochiKit.Base.bind(this.onSubmit, this); + + this.createEditField(); + + if (this.options.textarea) { + var br = document.createElement('br'); + this.form.appendChild(br); + } + + if (this.options.okButton) { + okButton = document.createElement('input'); + okButton.type = 'submit'; + okButton.value = this.options.okText; + this.form.appendChild(okButton); + } + + if (this.options.cancelLink) { + cancelLink = document.createElement('a'); + cancelLink.href = '#'; + cancelLink.appendChild(document.createTextNode(this.options.cancelText)); + cancelLink.onclick = MochiKit.Base.bind(this.onclickCancel, this); + this.form.appendChild(cancelLink); + } + }, + +/** @id Ajax.InPlaceEditor.prototype.hasHTMLLineBreaks */ + hasHTMLLineBreaks: function (string) { + if (!this.options.handleLineBreaks) { + return false; + } + return string.match(/
    /i); + }, + +/** @id Ajax.InPlaceEditor.prototype.convertHTMLLineBreaks */ + convertHTMLLineBreaks: function (string) { + return string.replace(/
    /gi, '\n').replace(//gi, '\n').replace(/<\/p>/gi, '\n').replace(/

    /gi, ''); + }, + +/** @id Ajax.InPlaceEditor.prototype.createEditField */ + createEditField: function () { + var text; + if (this.options.loadTextURL) { + text = this.options.loadingText; + } else { + text = this.getText(); + } + + var obj = this; + + if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) { + this.options.textarea = false; + var textField = document.createElement('input'); + textField.obj = this; + textField.type = 'text'; + textField.name = 'value'; + textField.value = text; + textField.style.backgroundColor = this.options.highlightcolor; + var size = this.options.size || this.options.cols || 0; + if (size !== 0) { + textField.size = size; + } + if (this.options.submitOnBlur) { + textField.onblur = MochiKit.Base.bind(this.onSubmit, this); + } + this.editField = textField; + } else { + this.options.textarea = true; + var textArea = document.createElement('textarea'); + textArea.obj = this; + textArea.name = 'value'; + textArea.value = this.convertHTMLLineBreaks(text); + textArea.rows = this.options.rows; + textArea.cols = this.options.cols || 40; + if (this.options.submitOnBlur) { + textArea.onblur = MochiKit.Base.bind(this.onSubmit, this); + } + this.editField = textArea; + } + + if (this.options.loadTextURL) { + this.loadExternalText(); + } + this.form.appendChild(this.editField); + }, + +/** @id Ajax.InPlaceEditor.prototype.getText */ + getText: function () { + return this.element.innerHTML; + }, + +/** @id Ajax.InPlaceEditor.prototype.loadExternalText */ + loadExternalText: function () { + MochiKit.DOM.addElementClass(this.form, this.options.loadingClassName); + this.editField.disabled = true; + new Ajax.Request( + this.options.loadTextURL, + MochiKit.Base.update({ + asynchronous: true, + onComplete: MochiKit.Base.bind(this.onLoadedExternalText, this) + }, this.options.ajaxOptions) + ); + }, + +/** @id Ajax.InPlaceEditor.prototype.onLoadedExternalText */ + onLoadedExternalText: function (transport) { + MochiKit.DOM.removeElementClass(this.form, this.options.loadingClassName); + this.editField.disabled = false; + this.editField.value = MochiKit.Base.stripTags(transport); + }, + +/** @id Ajax.InPlaceEditor.prototype.onclickCancel */ + onclickCancel: function () { + this.onComplete(); + this.leaveEditMode(); + return false; + }, + +/** @id Ajax.InPlaceEditor.prototype.onFailure */ + onFailure: function (transport) { + this.options.onFailure(transport); + if (this.oldInnerHTML) { + this.element.innerHTML = this.oldInnerHTML; + this.oldInnerHTML = null; + } + return false; + }, + +/** @id Ajax.InPlaceEditor.prototype.onSubmit */ + onSubmit: function () { + // onLoading resets these so we need to save them away for the Ajax call + var form = this.form; + var value = this.editField.value; + + // do this first, sometimes the ajax call returns before we get a + // chance to switch on Saving which means this will actually switch on + // Saving *after* we have left edit mode causing Saving to be + // displayed indefinitely + this.onLoading(); + + new Ajax.Updater( + { + success: this.element, + // dont update on failure (this could be an option) + failure: null + }, + this.url, + MochiKit.Base.update({ + parameters: this.options.callback(form, value), + onComplete: MochiKit.Base.bind(this.onComplete, this), + onFailure: MochiKit.Base.bind(this.onFailure, this) + }, this.options.ajaxOptions) + ); + // stop the event to avoid a page refresh in Safari + if (arguments.length > 1) { + arguments[0].stop(); + } + return false; + }, + +/** @id Ajax.InPlaceEditor.prototype.onLoading */ + onLoading: function () { + this.saving = true; + this.removeForm(); + this.leaveHover(); + this.showSaving(); + }, + +/** @id Ajax.InPlaceEditor.prototype.onSaving */ + showSaving: function () { + this.oldInnerHTML = this.element.innerHTML; + this.element.innerHTML = this.options.savingText; + MochiKit.DOM.addElementClass(this.element, this.options.savingClassName); + this.element.style.backgroundColor = this.originalBackground; + MochiKit.Style.showElement(this.element); + }, + +/** @id Ajax.InPlaceEditor.prototype.removeForm */ + removeForm: function () { + if (this.form) { + if (this.form.parentNode) { + MochiKit.DOM.removeElement(this.form); + } + this.form = null; + } + }, + +/** @id Ajax.InPlaceEditor.prototype.enterHover */ + enterHover: function () { + if (this.saving) { + return; + } + this.element.style.backgroundColor = this.options.highlightcolor; + if (this.effect) { + this.effect.cancel(); + } + MochiKit.DOM.addElementClass(this.element, this.options.hoverClassName) + }, + +/** @id Ajax.InPlaceEditor.prototype.leaveHover */ + leaveHover: function () { + if (this.options.backgroundColor) { + this.element.style.backgroundColor = this.oldBackground; + } + MochiKit.DOM.removeElementClass(this.element, this.options.hoverClassName) + if (this.saving) { + return; + } + this.effect = new MochiKit.Visual.Highlight(this.element, { + startcolor: this.options.highlightcolor, + endcolor: this.options.highlightendcolor, + restorecolor: this.originalBackground + }); + }, + +/** @id Ajax.InPlaceEditor.prototype.leaveEditMode */ + leaveEditMode: function () { + MochiKit.DOM.removeElementClass(this.element, this.options.savingClassName); + this.removeForm(); + this.leaveHover(); + this.element.style.backgroundColor = this.originalBackground; + MochiKit.Style.showElement(this.element); + if (this.options.externalControl) { + MochiKit.Style.showElement(this.options.externalControl); + } + this.editing = false; + this.saving = false; + this.oldInnerHTML = null; + this.onLeaveEditMode(); + }, + +/** @id Ajax.InPlaceEditor.prototype.onComplete */ + onComplete: function (transport) { + this.leaveEditMode(); + MochiKit.Base.bind(this.options.onComplete, this)(transport, this.element); + }, + +/** @id Ajax.InPlaceEditor.prototype.onEnterEditMode */ + onEnterEditMode: function () {}, + +/** @id Ajax.InPlaceEditor.prototype.onLeaveEditMode */ + onLeaveEditMode: function () {}, + + /** @id Ajax.InPlaceEditor.prototype.dispose */ + dispose: function () { + if (this.oldInnerHTML) { + this.element.innerHTML = this.oldInnerHTML; + } + this.leaveEditMode(); + MochiKit.Signal.disconnect(this.onclickListener); + MochiKit.Signal.disconnect(this.mouseoverListener); + MochiKit.Signal.disconnect(this.mouseoutListener); + if (this.options.externalControl) { + MochiKit.Signal.disconnect(this.onclickListenerExternal); + MochiKit.Signal.disconnect(this.mouseoverListenerExternal); + MochiKit.Signal.disconnect(this.mouseoutListenerExternal); + } + } +}; + diff --git a/mochikit_v14/MochiKit/DOM.js b/mochikit_v14/MochiKit/DOM.js new file mode 100644 index 0000000..02fe5bf --- /dev/null +++ b/mochikit_v14/MochiKit/DOM.js @@ -0,0 +1,1276 @@ +/*** + +MochiKit.DOM 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide("MochiKit.DOM"); + dojo.require("MochiKit.Base"); +} +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.DOM depends on MochiKit.Base!"; +} + +if (typeof(MochiKit.DOM) == 'undefined') { + MochiKit.DOM = {}; +} + +MochiKit.DOM.NAME = "MochiKit.DOM"; +MochiKit.DOM.VERSION = "1.4"; +MochiKit.DOM.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; +MochiKit.DOM.toString = function () { + return this.__repr__(); +}; + +MochiKit.DOM.EXPORT = [ + "removeEmptyTextNodes", + "formContents", + "currentWindow", + "currentDocument", + "withWindow", + "withDocument", + "registerDOMConverter", + "coerceToDOM", + "createDOM", + "createDOMFunc", + "isChildNode", + "getNodeAttribute", + "removeNodeAttribute", + "setNodeAttribute", + "updateNodeAttributes", + "appendChildNodes", + "insertSiblingNodesAfter", + "insertSiblingNodesBefore", + "replaceChildNodes", + "removeElement", + "swapDOM", + "BUTTON", + "TT", + "PRE", + "H1", + "H2", + "H3", + "BR", + "CANVAS", + "HR", + "LABEL", + "TEXTAREA", + "FORM", + "STRONG", + "SELECT", + "OPTION", + "OPTGROUP", + "LEGEND", + "FIELDSET", + "P", + "UL", + "OL", + "LI", + "TD", + "TR", + "THEAD", + "TBODY", + "TFOOT", + "TABLE", + "TH", + "INPUT", + "SPAN", + "A", + "DIV", + "IMG", + "getElement", + "$", + "getElementsByTagAndClassName", + "addToCallStack", + "addLoadEvent", + "focusOnLoad", + "setElementClass", + "toggleElementClass", + "addElementClass", + "removeElementClass", + "swapElementClass", + "hasElementClass", + "escapeHTML", + "toHTML", + "emitHTML", + "scrapeText", + "isParent", + "getFirstParentByTagAndClassName", + "makeClipping", + "undoClipping", + "makePositioned", + "undoPositioned", + "getFirstElementByTagAndClassName" +]; + +MochiKit.DOM.EXPORT_OK = [ + "domConverters" +]; + +MochiKit.DOM.DEPRECATED = [ + ['computedStyle', 'MochiKit.Style.getStyle', '1.4'], + /** @id MochiKit.DOM.elementDimensions */ + ['elementDimensions', 'MochiKit.Style.getElementDimensions', '1.4'], + /** @id MochiKit.DOM.elementPosition */ + ['elementPosition', 'MochiKit.Style.getElementPosition', '1.4'], + ['hideElement', 'MochiKit.Style.hideElement', '1.4'], + /** @id MochiKit.DOM.setElementDimensions */ + ['setElementDimensions', 'MochiKit.Style.setElementDimensions', '1.4'], + /** @id MochiKit.DOM.setElementPosition */ + ['setElementPosition', 'MochiKit.Style.setElementPosition', '1.4'], + ['setDisplayForElement', 'MochiKit.Style.setDisplayForElement', '1.4'], + /** @id MochiKit.DOM.setOpacity */ + ['setOpacity', 'MochiKit.Style.setOpacity', '1.4'], + ['showElement', 'MochiKit.Style.showElement', '1.4'], + /** @id MochiKit.DOM.Coordinates */ + ['Coordinates', 'MochiKit.Style.Coordinates', '1.4'], // FIXME: broken + /** @id MochiKit.DOM.Dimensions */ + ['Dimensions', 'MochiKit.Style.Dimensions', '1.4'] // FIXME: broken +]; + +/** @id MochiKit.DOM.getViewportDimensions */ +MochiKit.DOM.getViewportDimensions = new Function('' + + 'if (!MochiKit["Style"]) {' + + ' throw new Error("This function has been deprecated and depends on MochiKit.Style.");' + + '}' + + 'return MochiKit.Style.getViewportDimensions.apply(this, arguments);'); + +MochiKit.Base.update(MochiKit.DOM, { + + /** @id MochiKit.DOM.currentWindow */ + currentWindow: function () { + return MochiKit.DOM._window; + }, + + /** @id MochiKit.DOM.currentDocument */ + currentDocument: function () { + return MochiKit.DOM._document; + }, + + /** @id MochiKit.DOM.withWindow */ + withWindow: function (win, func) { + var self = MochiKit.DOM; + var oldDoc = self._document; + var oldWin = self._window; + var rval; + try { + self._window = win; + self._document = win.document; + rval = func(); + } catch (e) { + self._window = oldWin; + self._document = oldDoc; + throw e; + } + self._window = oldWin; + self._document = oldDoc; + return rval; + }, + + /** @id MochiKit.DOM.formContents */ + formContents: function (elem/* = document.body */) { + var names = []; + var values = []; + var m = MochiKit.Base; + var self = MochiKit.DOM; + if (typeof(elem) == "undefined" || elem === null) { + elem = self._document.body; + } else { + elem = self.getElement(elem); + } + m.nodeWalk(elem, function (elem) { + var name = elem.name; + if (m.isNotEmpty(name)) { + var tagName = elem.tagName.toUpperCase(); + if (tagName === "INPUT" + && (elem.type == "radio" || elem.type == "checkbox") + && !elem.checked + ) { + return null; + } + if (tagName === "SELECT") { + if (elem.type == "select-one") { + if (elem.selectedIndex >= 0) { + var opt = elem.options[elem.selectedIndex]; + var v = opt.value; + if (!v) { + var h = opt.outerHTML; + // internet explorer sure does suck. + if (h && !h.match(/^[^>]+\svalue\s*=/i)) { + v = opt.text; + } + } + names.push(name); + values.push(v); + return null; + } + // no form elements? + names.push(name); + values.push(""); + return null; + } else { + var opts = elem.options; + if (!opts.length) { + names.push(name); + values.push(""); + return null; + } + for (var i = 0; i < opts.length; i++) { + var opt = opts[i]; + if (!opt.selected) { + continue; + } + var v = opt.value; + if (!v) { + var h = opt.outerHTML; + // internet explorer sure does suck. + if (h && !h.match(/^[^>]+\svalue\s*=/i)) { + v = opt.text; + } + } + names.push(name); + values.push(v); + } + return null; + } + } + if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" + || tagName === "DIV" + ) { + return elem.childNodes; + } + names.push(name); + values.push(elem.value || ''); + return null; + } + return elem.childNodes; + }); + return [names, values]; + }, + + /** @id MochiKit.DOM.withDocument */ + withDocument: function (doc, func) { + var self = MochiKit.DOM; + var oldDoc = self._document; + var rval; + try { + self._document = doc; + rval = func(); + } catch (e) { + self._document = oldDoc; + throw e; + } + self._document = oldDoc; + return rval; + }, + + /** @id MochiKit.DOM.registerDOMConverter */ + registerDOMConverter: function (name, check, wrap, /* optional */override) { + MochiKit.DOM.domConverters.register(name, check, wrap, override); + }, + + /** @id MochiKit.DOM.coerceToDOM */ + coerceToDOM: function (node, ctx) { + var m = MochiKit.Base; + var im = MochiKit.Iter; + var self = MochiKit.DOM; + if (im) { + var iter = im.iter; + var repeat = im.repeat; + var map = m.map; + } + var domConverters = self.domConverters; + var coerceToDOM = arguments.callee; + var NotFound = m.NotFound; + while (true) { + if (typeof(node) == 'undefined' || node === null) { + return null; + } + // this is a safari childNodes object, avoiding crashes w/ attr + // lookup + if (typeof(node) == "function" && + typeof(node.length) == "number" && + !(node instanceof Function)) { + node = im.list(node); + } + if (typeof(node.nodeType) != 'undefined' && node.nodeType > 0) { + return node; + } + if (typeof(node) == 'number' || typeof(node) == 'boolean') { + node = node.toString(); + // FALL THROUGH + } + if (typeof(node) == 'string') { + return self._document.createTextNode(node); + } + if (typeof(node.__dom__) == 'function') { + node = node.__dom__(ctx); + continue; + } + if (typeof(node.dom) == 'function') { + node = node.dom(ctx); + continue; + } + if (typeof(node) == 'function') { + node = node.apply(ctx, [ctx]); + continue; + } + + if (im) { + // iterable + var iterNodes = null; + try { + iterNodes = iter(node); + } catch (e) { + // pass + } + if (iterNodes) { + return map(coerceToDOM, iterNodes, repeat(ctx)); + } + } + + // adapter + try { + node = domConverters.match(node, ctx); + continue; + } catch (e) { + if (e != NotFound) { + throw e; + } + } + + // fallback + return self._document.createTextNode(node.toString()); + } + // mozilla warnings aren't too bright + return undefined; + }, + + /** @id MochiKit.DOM.isChildNode */ + isChildNode: function (node, maybeparent) { + var self = MochiKit.DOM; + if (typeof(node) == "string") { + node = self.getElement(node); + } + if (typeof(maybeparent) == "string") { + maybeparent = self.getElement(maybeparent); + } + if (node === maybeparent) { + return true; + } + while (node && node.tagName.toUpperCase() != "BODY") { + node = node.parentNode; + if (node === maybeparent) { + return true; + } + } + return false; + }, + + /** @id MochiKit.DOM.setNodeAttribute */ + setNodeAttribute: function (node, attr, value) { + var o = {}; + o[attr] = value; + try { + return MochiKit.DOM.updateNodeAttributes(node, o); + } catch (e) { + // pass + } + return null; + }, + + /** @id MochiKit.DOM.getNodeAttribute */ + getNodeAttribute: function (node, attr) { + var self = MochiKit.DOM; + var rename = self.attributeArray.renames[attr]; + node = self.getElement(node); + try { + if (rename) { + return node[rename]; + } + return node.getAttribute(attr); + } catch (e) { + // pass + } + return null; + }, + + /** @id MochiKit.DOM.removeNodeAttribute */ + removeNodeAttribute: function (node, attr) { + var self = MochiKit.DOM; + var rename = self.attributeArray.renames[attr]; + node = self.getElement(node); + try { + if (rename) { + return node[rename]; + } + return node.removeAttribute(attr); + } catch (e) { + // pass + } + return null; + }, + + /** @id MochiKit.DOM.updateNodeAttributes */ + updateNodeAttributes: function (node, attrs) { + var elem = node; + var self = MochiKit.DOM; + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + if (attrs) { + var updatetree = MochiKit.Base.updatetree; + if (self.attributeArray.compliant) { + // not IE, good. + for (var k in attrs) { + var v = attrs[k]; + if (typeof(v) == 'object' && typeof(elem[k]) == 'object') { + if (k == "style" && MochiKit.Style) { + MochiKit.Style.setStyle(elem, v); + } else { + updatetree(elem[k], v); + } + } else if (k.substring(0, 2) == "on") { + if (typeof(v) == "string") { + v = new Function(v); + } + elem[k] = v; + } else { + elem.setAttribute(k, v); + } + } + } else { + // IE is insane in the membrane + var renames = self.attributeArray.renames; + for (var k in attrs) { + v = attrs[k]; + var renamed = renames[k]; + if (k == "style" && typeof(v) == "string") { + elem.style.cssText = v; + } else if (typeof(renamed) == "string") { + elem[renamed] = v; + } else if (typeof(elem[k]) == 'object' + && typeof(v) == 'object') { + if (k == "style" && MochiKit.Style) { + MochiKit.Style.setStyle(elem, v); + } else { + updatetree(elem[k], v); + } + } else if (k.substring(0, 2) == "on") { + if (typeof(v) == "string") { + v = new Function(v); + } + elem[k] = v; + } else { + elem.setAttribute(k, v); + } + } + } + } + return elem; + }, + + /** @id MochiKit.DOM.appendChildNodes */ + appendChildNodes: function (node/*, nodes...*/) { + var elem = node; + var self = MochiKit.DOM; + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + var nodeStack = [ + self.coerceToDOM( + MochiKit.Base.extend(null, arguments, 1), + elem + ) + ]; + var concat = MochiKit.Base.concat; + while (nodeStack.length) { + var n = nodeStack.shift(); + if (typeof(n) == 'undefined' || n === null) { + // pass + } else if (typeof(n.nodeType) == 'number') { + elem.appendChild(n); + } else { + nodeStack = concat(n, nodeStack); + } + } + return elem; + }, + + + /** @id MochiKit.DOM.insertSiblingNodesBefore */ + insertSiblingNodesBefore: function (node/*, nodes...*/) { + var elem = node; + var self = MochiKit.DOM; + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + var nodeStack = [ + self.coerceToDOM( + MochiKit.Base.extend(null, arguments, 1), + elem + ) + ]; + var parentnode = elem.parentNode; + var concat = MochiKit.Base.concat; + while (nodeStack.length) { + var n = nodeStack.shift(); + if (typeof(n) == 'undefined' || n === null) { + // pass + } else if (typeof(n.nodeType) == 'number') { + parentnode.insertBefore(n, elem); + } else { + nodeStack = concat(n, nodeStack); + } + } + return parentnode; + }, + + /** @id MochiKit.DOM.insertSiblingNodesAfter */ + insertSiblingNodesAfter: function (node/*, nodes...*/) { + var elem = node; + var self = MochiKit.DOM; + + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + var nodeStack = [ + self.coerceToDOM( + MochiKit.Base.extend(null, arguments, 1), + elem + ) + ]; + + if (elem.nextSibling) { + return self.insertSiblingNodesBefore(elem.nextSibling, nodeStack); + } + else { + return self.appendChildNodes(elem.parentNode, nodeStack); + } + }, + + /** @id MochiKit.DOM.replaceChildNodes */ + replaceChildNodes: function (node/*, nodes...*/) { + var elem = node; + var self = MochiKit.DOM; + if (typeof(node) == 'string') { + elem = self.getElement(node); + arguments[0] = elem; + } + var child; + while ((child = elem.firstChild)) { + elem.removeChild(child); + } + if (arguments.length < 2) { + return elem; + } else { + return self.appendChildNodes.apply(this, arguments); + } + }, + + /** @id MochiKit.DOM.createDOM */ + createDOM: function (name, attrs/*, nodes... */) { + var elem; + var self = MochiKit.DOM; + var m = MochiKit.Base; + if (typeof(attrs) == "string" || typeof(attrs) == "number") { + var args = m.extend([name, null], arguments, 1); + return arguments.callee.apply(this, args); + } + if (typeof(name) == 'string') { + // Internet Explorer is dumb + var xhtml = self._xhtml; + if (attrs && !self.attributeArray.compliant) { + // http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/name_2.asp + var contents = ""; + if ('name' in attrs) { + contents += ' name="' + self.escapeHTML(attrs.name) + '"'; + } + if (name == 'input' && 'type' in attrs) { + contents += ' type="' + self.escapeHTML(attrs.type) + '"'; + } + if (contents) { + name = "<" + name + contents + ">"; + xhtml = false; + } + } + var d = self._document; + if (xhtml && d === document) { + elem = d.createElementNS("http://www.w3.org/1999/xhtml", name); + } else { + elem = d.createElement(name); + } + } else { + elem = name; + } + if (attrs) { + self.updateNodeAttributes(elem, attrs); + } + if (arguments.length <= 2) { + return elem; + } else { + var args = m.extend([elem], arguments, 2); + return self.appendChildNodes.apply(this, args); + } + }, + + /** @id MochiKit.DOM.createDOMFunc */ + createDOMFunc: function (/* tag, attrs, *nodes */) { + var m = MochiKit.Base; + return m.partial.apply( + this, + m.extend([MochiKit.DOM.createDOM], arguments) + ); + }, + + /** @id MochiKit.DOM.removeElement */ + removeElement: function (elem) { + var e = MochiKit.DOM.getElement(elem); + e.parentNode.removeChild(e); + return e; + }, + + /** @id MochiKit.DOM.swapDOM */ + swapDOM: function (dest, src) { + var self = MochiKit.DOM; + dest = self.getElement(dest); + var parent = dest.parentNode; + if (src) { + src = self.getElement(src); + parent.replaceChild(src, dest); + } else { + parent.removeChild(dest); + } + return src; + }, + + /** @id MochiKit.DOM.getElement */ + getElement: function (id) { + var self = MochiKit.DOM; + if (arguments.length == 1) { + return ((typeof(id) == "string") ? + self._document.getElementById(id) : id); + } else { + return MochiKit.Base.map(self.getElement, arguments); + } + }, + + /** @id MochiKit.DOM.getElementsByTagAndClassName */ + getElementsByTagAndClassName: function (tagName, className, + /* optional */parent) { + var self = MochiKit.DOM; + if (typeof(tagName) == 'undefined' || tagName === null) { + tagName = '*'; + } + if (typeof(parent) == 'undefined' || parent === null) { + parent = self._document; + } + parent = self.getElement(parent); + var children = (parent.getElementsByTagName(tagName) + || self._document.all); + if (typeof(className) == 'undefined' || className === null) { + return MochiKit.Base.extend(null, children); + } + + var elements = []; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var cls = child.className; + if (!cls) { + continue; + } + var classNames = cls.split(' '); + for (var j = 0; j < classNames.length; j++) { + if (classNames[j] == className) { + elements.push(child); + break; + } + } + } + + return elements; + }, + + _newCallStack: function (path, once) { + var rval = function () { + var callStack = arguments.callee.callStack; + for (var i = 0; i < callStack.length; i++) { + if (callStack[i].apply(this, arguments) === false) { + break; + } + } + if (once) { + try { + this[path] = null; + } catch (e) { + // pass + } + } + }; + rval.callStack = []; + return rval; + }, + + /** @id MochiKit.DOM.addToCallStack */ + addToCallStack: function (target, path, func, once) { + var self = MochiKit.DOM; + var existing = target[path]; + var regfunc = existing; + if (!(typeof(existing) == 'function' + && typeof(existing.callStack) == "object" + && existing.callStack !== null)) { + regfunc = self._newCallStack(path, once); + if (typeof(existing) == 'function') { + regfunc.callStack.push(existing); + } + target[path] = regfunc; + } + regfunc.callStack.push(func); + }, + + /** @id MochiKit.DOM.addLoadEvent */ + addLoadEvent: function (func) { + var self = MochiKit.DOM; + self.addToCallStack(self._window, "onload", func, true); + + }, + + /** @id MochiKit.DOM.focusOnLoad */ + focusOnLoad: function (element) { + var self = MochiKit.DOM; + self.addLoadEvent(function () { + element = self.getElement(element); + if (element) { + element.focus(); + } + }); + }, + + /** @id MochiKit.DOM.setElementClass */ + setElementClass: function (element, className) { + var self = MochiKit.DOM; + var obj = self.getElement(element); + if (self.attributeArray.compliant) { + obj.setAttribute("class", className); + } else { + obj.setAttribute("className", className); + } + }, + + /** @id MochiKit.DOM.toggleElementClass */ + toggleElementClass: function (className/*, element... */) { + var self = MochiKit.DOM; + for (var i = 1; i < arguments.length; i++) { + var obj = self.getElement(arguments[i]); + if (!self.addElementClass(obj, className)) { + self.removeElementClass(obj, className); + } + } + }, + + /** @id MochiKit.DOM.addElementClass */ + addElementClass: function (element, className) { + var self = MochiKit.DOM; + var obj = self.getElement(element); + var cls = obj.className; + // trivial case, no className yet + if (cls == undefined || cls.length === 0) { + self.setElementClass(obj, className); + return true; + } + // the other trivial case, already set as the only class + if (cls == className) { + return false; + } + var classes = cls.split(" "); + for (var i = 0; i < classes.length; i++) { + // already present + if (classes[i] == className) { + return false; + } + } + // append class + self.setElementClass(obj, cls + " " + className); + return true; + }, + + /** @id MochiKit.DOM.removeElementClass */ + removeElementClass: function (element, className) { + var self = MochiKit.DOM; + var obj = self.getElement(element); + var cls = obj.className; + // trivial case, no className yet + if (cls == undefined || cls.length === 0) { + return false; + } + // other trivial case, set only to className + if (cls == className) { + self.setElementClass(obj, ""); + return true; + } + var classes = cls.split(" "); + for (var i = 0; i < classes.length; i++) { + // already present + if (classes[i] == className) { + // only check sane case where the class is used once + classes.splice(i, 1); + self.setElementClass(obj, classes.join(" ")); + return true; + } + } + // not found + return false; + }, + + /** @id MochiKit.DOM.swapElementClass */ + swapElementClass: function (element, fromClass, toClass) { + var obj = MochiKit.DOM.getElement(element); + var res = MochiKit.DOM.removeElementClass(obj, fromClass); + if (res) { + MochiKit.DOM.addElementClass(obj, toClass); + } + return res; + }, + + /** @id MochiKit.DOM.hasElementClass */ + hasElementClass: function (element, className/*...*/) { + var obj = MochiKit.DOM.getElement(element); + var cls = obj.className; + if (!cls) { + return false; + } + var classes = cls.split(" "); + for (var i = 1; i < arguments.length; i++) { + var good = false; + for (var j = 0; j < classes.length; j++) { + if (classes[j] == arguments[i]) { + good = true; + break; + } + } + if (!good) { + return false; + } + } + return true; + }, + + /** @id MochiKit.DOM.escapeHTML */ + escapeHTML: function (s) { + return s.replace(/&/g, "&" + ).replace(/"/g, """ + ).replace(//g, ">"); + }, + + /** @id MochiKit.DOM.toHTML */ + toHTML: function (dom) { + return MochiKit.DOM.emitHTML(dom).join(""); + }, + + /** @id MochiKit.DOM.emitHTML */ + emitHTML: function (dom, /* optional */lst) { + if (typeof(lst) == 'undefined' || lst === null) { + lst = []; + } + // queue is the call stack, we're doing this non-recursively + var queue = [dom]; + var self = MochiKit.DOM; + var escapeHTML = self.escapeHTML; + var attributeArray = self.attributeArray; + while (queue.length) { + dom = queue.pop(); + if (typeof(dom) == 'string') { + lst.push(dom); + } else if (dom.nodeType == 1) { + // we're not using higher order stuff here + // because safari has heisenbugs.. argh. + // + // I think it might have something to do with + // garbage collection and function calls. + lst.push('<' + dom.tagName.toLowerCase()); + var attributes = []; + var domAttr = attributeArray(dom); + for (var i = 0; i < domAttr.length; i++) { + var a = domAttr[i]; + attributes.push([ + " ", + a.name, + '="', + escapeHTML(a.value), + '"' + ]); + } + attributes.sort(); + for (i = 0; i < attributes.length; i++) { + var attrs = attributes[i]; + for (var j = 0; j < attrs.length; j++) { + lst.push(attrs[j]); + } + } + if (dom.hasChildNodes()) { + lst.push(">"); + // queue is the FILO call stack, so we put the close tag + // on first + queue.push(""); + var cnodes = dom.childNodes; + for (i = cnodes.length - 1; i >= 0; i--) { + queue.push(cnodes[i]); + } + } else { + lst.push('/>'); + } + } else if (dom.nodeType == 3) { + lst.push(escapeHTML(dom.nodeValue)); + } + } + return lst; + }, + + /** @id MochiKit.DOM.scrapeText */ + scrapeText: function (node, /* optional */asArray) { + var rval = []; + (function (node) { + var cn = node.childNodes; + if (cn) { + for (var i = 0; i < cn.length; i++) { + arguments.callee.call(this, cn[i]); + } + } + var nodeValue = node.nodeValue; + if (typeof(nodeValue) == 'string') { + rval.push(nodeValue); + } + })(MochiKit.DOM.getElement(node)); + if (asArray) { + return rval; + } else { + return rval.join(""); + } + }, + + /** @id MochiKit.DOM.removeEmptyTextNodes */ + removeEmptyTextNodes: function (element) { + element = MochiKit.DOM.getElement(element); + for (var i = 0; i < element.childNodes.length; i++) { + var node = element.childNodes[i]; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) { + node.parentNode.removeChild(node); + } + } + }, + + /** @id MochiKit.DOM.makeClipping */ + makeClipping: function (element) { + element = MochiKit.DOM.getElement(element); + var oldOverflow = element.style.overflow; + if ((MochiKit.Style.getStyle(element, 'overflow') || 'visible') != 'hidden') { + element.style.overflow = 'hidden'; + } + return oldOverflow; + }, + + /** @id MochiKit.DOM.undoClipping */ + undoClipping: function (element, overflow) { + element = MochiKit.DOM.getElement(element); + if (!overflow) { + return; + } + element.style.overflow = overflow; + }, + + /** @id MochiKit.DOM.makePositioned */ + makePositioned: function (element) { + element = MochiKit.DOM.getElement(element); + var pos = MochiKit.Style.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + 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 (/Opera/.test(navigator.userAgent)) { + element.style.top = 0; + element.style.left = 0; + } + } + }, + + /** @id MochiKit.DOM.undoPositioned */ + undoPositioned: function (element) { + element = MochiKit.DOM.getElement(element); + if (element.style.position == 'relative') { + element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; + } + }, + + /** @id MochiKit.DOM.getFirstElementByTagAndClassName */ + getFirstElementByTagAndClassName: function (tagName, className, + /* optional */parent) { + var self = MochiKit.DOM; + if (typeof(tagName) == 'undefined' || tagName === null) { + tagName = '*'; + } + if (typeof(parent) == 'undefined' || parent === null) { + parent = self._document; + } + parent = self.getElement(parent); + var children = (parent.getElementsByTagName(tagName) + || self._document.all); + if (typeof(className) == 'undefined' || className === null) { + return children[0]; + } + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var classNames = child.className.split(' '); + for (var j = 0; j < classNames.length; j++) { + if (classNames[j] == className) { + return child; + } + } + } + }, + + /** @id MochiKit.DOM.getFirstParentByTagAndClassName */ + getFirstParentByTagAndClassName: function (elem, tagName, className) { + var self = MochiKit.DOM; + elem = self.getElement(elem); + if (typeof(tagName) == 'undefined' || tagName === null) { + tagName = '*'; + } else { + tagName = tagName.toUpperCase(); + } + if (typeof(className) == 'undefined' || className === null) { + className = null; + } + + var classList = ''; + var curTagName = ''; + while (elem && elem.tagName) { + elem = elem.parentNode; + if (tagName == '*' && className === null) { + return elem; + } + classList = elem.className.split(' '); + curTagName = elem.tagName.toUpperCase(); + if (className === null && tagName == curTagName) { + return elem; + } else if (className !== null) { + for (var i = 0; i < classList.length; i++) { + if (tagName == '*' && classList[i] == className) { + return elem; + } else if (tagName == curTagName && classList[i] == className) { + return elem; + } + } + } + } + return elem; + }, + + /** @id MochiKit.DOM.isParent */ + isParent: function (child, element) { + if (!child.parentNode || child == element) { + return false; + } + + if (child.parentNode == element) { + return true; + } + + return MochiKit.DOM.isParent(child.parentNode, element); + }, + + __new__: function (win) { + + var m = MochiKit.Base; + if (typeof(document) != "undefined") { + this._document = document; + var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + this._xhtml = (document.documentElement && + document.createElementNS && + document.documentElement.namespaceURI === kXULNSURI); + } else if (MochiKit.MockDOM) { + this._document = MochiKit.MockDOM.document; + } + this._window = win; + + this.domConverters = new m.AdapterRegistry(); + + var __tmpElement = this._document.createElement("span"); + var attributeArray; + if (__tmpElement && __tmpElement.attributes && + __tmpElement.attributes.length > 0) { + // for braindead browsers (IE) that insert extra junk + var filter = m.filter; + attributeArray = function (node) { + return filter(attributeArray.ignoreAttrFilter, node.attributes); + }; + attributeArray.ignoreAttr = {}; + var attrs = __tmpElement.attributes; + var ignoreAttr = attributeArray.ignoreAttr; + for (var i = 0; i < attrs.length; i++) { + var a = attrs[i]; + ignoreAttr[a.name] = a.value; + } + attributeArray.ignoreAttrFilter = function (a) { + return (attributeArray.ignoreAttr[a.name] != a.value); + }; + attributeArray.compliant = false; + attributeArray.renames = { + "class": "className", + "checked": "defaultChecked", + "usemap": "useMap", + "for": "htmlFor", + "readonly": "readOnly", + "colspan": "colSpan", + "bgcolor": "bgColor", + "cellspacing": "cellSpacing", + "cellpadding": "cellPadding" + }; + } else { + attributeArray = function (node) { + /*** + + Return an array of attributes for a given node, + filtering out attributes that don't belong for + that are inserted by "Certain Browsers". + + ***/ + return node.attributes; + }; + attributeArray.compliant = true; + attributeArray.renames = {}; + } + this.attributeArray = attributeArray; + + // FIXME: this really belongs in Base, and could probably be cleaner + var _deprecated = function(fromModule, arr) { + var modules = arr[1].split('.'); + var str = ''; + var obj = {}; + + str += 'if (!MochiKit.' + modules[1] + ') { throw new Error("'; + str += 'This function has been deprecated and depends on MochiKit.'; + str += modules[1] + '.");}'; + str += 'return MochiKit.' + modules[1] + '.' + arr[0]; + str += '.apply(this, arguments);'; + + obj[modules[2]] = new Function(str); + MochiKit.Base.update(MochiKit[fromModule], obj); + } + for (var i; i < MochiKit.DOM.DEPRECATED.length; i++) { + _deprecated('DOM', MochiKit.DOM.DEPRECATED[i]); + } + + // shorthand for createDOM syntax + var createDOMFunc = this.createDOMFunc; + /** @id MochiKit.DOM.UL */ + this.UL = createDOMFunc("ul"); + /** @id MochiKit.DOM.OL */ + this.OL = createDOMFunc("ol"); + /** @id MochiKit.DOM.LI */ + this.LI = createDOMFunc("li"); + /** @id MochiKit.DOM.TD */ + this.TD = createDOMFunc("td"); + /** @id MochiKit.DOM.TR */ + this.TR = createDOMFunc("tr"); + /** @id MochiKit.DOM.TBODY */ + this.TBODY = createDOMFunc("tbody"); + /** @id MochiKit.DOM.THEAD */ + this.THEAD = createDOMFunc("thead"); + /** @id MochiKit.DOM.TFOOT */ + this.TFOOT = createDOMFunc("tfoot"); + /** @id MochiKit.DOM.TABLE */ + this.TABLE = createDOMFunc("table"); + /** @id MochiKit.DOM.TH */ + this.TH = createDOMFunc("th"); + /** @id MochiKit.DOM.INPUT */ + this.INPUT = createDOMFunc("input"); + /** @id MochiKit.DOM.SPAN */ + this.SPAN = createDOMFunc("span"); + /** @id MochiKit.DOM.A */ + this.A = createDOMFunc("a"); + /** @id MochiKit.DOM.DIV */ + this.DIV = createDOMFunc("div"); + /** @id MochiKit.DOM.IMG */ + this.IMG = createDOMFunc("img"); + /** @id MochiKit.DOM.BUTTON */ + this.BUTTON = createDOMFunc("button"); + /** @id MochiKit.DOM.TT */ + this.TT = createDOMFunc("tt"); + /** @id MochiKit.DOM.PRE */ + this.PRE = createDOMFunc("pre"); + /** @id MochiKit.DOM.H1 */ + this.H1 = createDOMFunc("h1"); + /** @id MochiKit.DOM.H2 */ + this.H2 = createDOMFunc("h2"); + /** @id MochiKit.DOM.H3 */ + this.H3 = createDOMFunc("h3"); + /** @id MochiKit.DOM.BR */ + this.BR = createDOMFunc("br"); + /** @id MochiKit.DOM.HR */ + this.HR = createDOMFunc("hr"); + /** @id MochiKit.DOM.LABEL */ + this.LABEL = createDOMFunc("label"); + /** @id MochiKit.DOM.TEXTAREA */ + this.TEXTAREA = createDOMFunc("textarea"); + /** @id MochiKit.DOM.FORM */ + this.FORM = createDOMFunc("form"); + /** @id MochiKit.DOM.P */ + this.P = createDOMFunc("p"); + /** @id MochiKit.DOM.SELECT */ + this.SELECT = createDOMFunc("select"); + /** @id MochiKit.DOM.OPTION */ + this.OPTION = createDOMFunc("option"); + /** @id MochiKit.DOM.OPTGROUP */ + this.OPTGROUP = createDOMFunc("optgroup"); + /** @id MochiKit.DOM.LEGEND */ + this.LEGEND = createDOMFunc("legend"); + /** @id MochiKit.DOM.FIELDSET */ + this.FIELDSET = createDOMFunc("fieldset"); + /** @id MochiKit.DOM.STRONG */ + this.STRONG = createDOMFunc("strong"); + /** @id MochiKit.DOM.CANVAS */ + this.CANVAS = createDOMFunc("canvas"); + + /** @id MochiKit.DOM.$ */ + this.$ = this.getElement; + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); + + } +}); + + +MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window)); + +// +// XXX: Internet Explorer blows +// +if (MochiKit.__export__) { + withWindow = MochiKit.DOM.withWindow; + withDocument = MochiKit.DOM.withDocument; +} + +MochiKit.Base._exportSymbols(this, MochiKit.DOM); diff --git a/mochikit_v14/MochiKit/DateTime.js b/mochikit_v14/MochiKit/DateTime.js new file mode 100644 index 0000000..c0b03ee --- /dev/null +++ b/mochikit_v14/MochiKit/DateTime.js @@ -0,0 +1,216 @@ +/*** + +MochiKit.DateTime 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.DateTime'); +} + +if (typeof(MochiKit) == 'undefined') { + MochiKit = {}; +} + +if (typeof(MochiKit.DateTime) == 'undefined') { + MochiKit.DateTime = {}; +} + +MochiKit.DateTime.NAME = "MochiKit.DateTime"; +MochiKit.DateTime.VERSION = "1.4"; +MochiKit.DateTime.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; +MochiKit.DateTime.toString = function () { + return this.__repr__(); +}; + +/** @id MochiKit.DateTime.isoDate */ +MochiKit.DateTime.isoDate = function (str) { + str = str + ""; + if (typeof(str) != "string" || str.length === 0) { + return null; + } + var iso = str.split('-'); + if (iso.length === 0) { + return null; + } + return new Date(iso[0], iso[1] - 1, iso[2]); +}; + +MochiKit.DateTime._isoRegexp = /(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/; + +/** @id MochiKit.DateTime.isoTimestamp */ +MochiKit.DateTime.isoTimestamp = function (str) { + str = str + ""; + if (typeof(str) != "string" || str.length === 0) { + return null; + } + var res = str.match(MochiKit.DateTime._isoRegexp); + if (typeof(res) == "undefined" || res === null) { + return null; + } + var year, month, day, hour, min, sec, msec; + year = parseInt(res[1], 10); + if (typeof(res[2]) == "undefined" || res[2] === '') { + return new Date(year); + } + month = parseInt(res[2], 10) - 1; + day = parseInt(res[3], 10); + if (typeof(res[4]) == "undefined" || res[4] === '') { + return new Date(year, month, day); + } + hour = parseInt(res[4], 10); + min = parseInt(res[5], 10); + sec = (typeof(res[6]) != "undefined" && res[6] !== '') ? parseInt(res[6], 10) : 0; + if (typeof(res[7]) != "undefined" && res[7] !== '') { + msec = Math.round(1000.0 * parseFloat("0." + res[7])); + } else { + msec = 0; + } + if ((typeof(res[8]) == "undefined" || res[8] === '') && (typeof(res[9]) == "undefined" || res[9] === '')) { + return new Date(year, month, day, hour, min, sec, msec); + } + var ofs; + if (typeof(res[9]) != "undefined" && res[9] !== '') { + ofs = parseInt(res[10], 10) * 3600000; + if (typeof(res[11]) != "undefined" && res[11] !== '') { + ofs += parseInt(res[11], 10) * 60000; + } + if (res[9] == "-") { + ofs = -ofs; + } + } else { + ofs = 0; + } + return new Date(Date.UTC(year, month, day, hour, min, sec, msec) - ofs); +}; + +/** @id MochiKit.DateTime.toISOTime */ +MochiKit.DateTime.toISOTime = function (date, realISO/* = false */) { + if (typeof(date) == "undefined" || date === null) { + return null; + } + var hh = date.getHours(); + var mm = date.getMinutes(); + var ss = date.getSeconds(); + var lst = [ + ((realISO && (hh < 10)) ? "0" + hh : hh), + ((mm < 10) ? "0" + mm : mm), + ((ss < 10) ? "0" + ss : ss) + ]; + return lst.join(":"); +}; + +/** @id MochiKit.DateTime.toISOTimeStamp */ +MochiKit.DateTime.toISOTimestamp = function (date, realISO/* = false*/) { + if (typeof(date) == "undefined" || date === null) { + return null; + } + var sep = realISO ? "T" : " "; + var foot = realISO ? "Z" : ""; + if (realISO) { + date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000)); + } + return MochiKit.DateTime.toISODate(date) + sep + MochiKit.DateTime.toISOTime(date, realISO) + foot; +}; + +/** @id MochiKit.DateTime.toISODate */ +MochiKit.DateTime.toISODate = function (date) { + if (typeof(date) == "undefined" || date === null) { + return null; + } + var _padTwo = MochiKit.DateTime._padTwo; + return [ + date.getFullYear(), + _padTwo(date.getMonth() + 1), + _padTwo(date.getDate()) + ].join("-"); +}; + +/** @id MochiKit.DateTime.americanDate */ +MochiKit.DateTime.americanDate = function (d) { + d = d + ""; + if (typeof(d) != "string" || d.length === 0) { + return null; + } + var a = d.split('/'); + return new Date(a[2], a[0] - 1, a[1]); +}; + +MochiKit.DateTime._padTwo = function (n) { + return (n > 9) ? n : "0" + n; +}; + +/** @id MochiKit.DateTime.toPaddedAmericanDate */ +MochiKit.DateTime.toPaddedAmericanDate = function (d) { + if (typeof(d) == "undefined" || d === null) { + return null; + } + var _padTwo = MochiKit.DateTime._padTwo; + return [ + _padTwo(d.getMonth() + 1), + _padTwo(d.getDate()), + d.getFullYear() + ].join('/'); +}; + +/** @id MochiKit.DateTime.toAmericanDate */ +MochiKit.DateTime.toAmericanDate = function (d) { + if (typeof(d) == "undefined" || d === null) { + return null; + } + return [d.getMonth() + 1, d.getDate(), d.getFullYear()].join('/'); +}; + +MochiKit.DateTime.EXPORT = [ + "isoDate", + "isoTimestamp", + "toISOTime", + "toISOTimestamp", + "toISODate", + "americanDate", + "toPaddedAmericanDate", + "toAmericanDate" +]; + +MochiKit.DateTime.EXPORT_OK = []; +MochiKit.DateTime.EXPORT_TAGS = { + ":common": MochiKit.DateTime.EXPORT, + ":all": MochiKit.DateTime.EXPORT +}; + +MochiKit.DateTime.__new__ = function () { + // MochiKit.Base.nameFunctions(this); + var base = this.NAME + "."; + for (var k in this) { + var o = this[k]; + if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { + try { + o.NAME = base + k; + } catch (e) { + // pass + } + } + } +}; + +MochiKit.DateTime.__new__(); + +if (typeof(MochiKit.Base) != "undefined") { + MochiKit.Base._exportSymbols(this, MochiKit.DateTime); +} else { + (function (globals, module) { + if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') + || (MochiKit.__export__ === false)) { + var all = module.EXPORT_TAGS[":all"]; + for (var i = 0; i < all.length; i++) { + globals[all[i]] = module[all[i]]; + } + } + })(this, MochiKit.DateTime); +} diff --git a/mochikit_v14/MochiKit/DragAndDrop.js b/mochikit_v14/MochiKit/DragAndDrop.js new file mode 100644 index 0000000..c471ffe --- /dev/null +++ b/mochikit_v14/MochiKit/DragAndDrop.js @@ -0,0 +1,824 @@ +/*** +MochiKit.DragAndDrop 1.4 + +See for documentation, downloads, license, etc. + +Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) + Mochi-ized By Thomas Herve (_firstname_@nimail.org) + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.DragAndDrop'); + dojo.require('MochiKit.Base'); + dojo.require('MochiKit.DOM'); + dojo.require('MochiKit.Iter'); + dojo.require('MochiKit.Visual'); + dojo.require('MochiKit.Signal'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); + JSAN.use("MochiKit.DOM", []); + JSAN.use("MochiKit.Visual", []); + JSAN.use("MochiKit.Iter", []); + JSAN.use("MochiKit.Signal", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined' || + typeof(MochiKit.DOM) == 'undefined' || + typeof(MochiKit.Visual) == 'undefined' || + typeof(MochiKit.Signal) == 'undefined' || + typeof(MochiKit.Iter) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.DragAndDrop depends on MochiKit.Base, MochiKit.DOM, MochiKit.Visual, MochiKit.Signal and MochiKit.Iter!"; +} + +if (typeof(MochiKit.DragAndDrop) == 'undefined') { + MochiKit.DragAndDrop = {}; +} + +MochiKit.DragAndDrop.NAME = 'MochiKit.DragAndDrop'; +MochiKit.DragAndDrop.VERSION = '1.4'; + +MochiKit.DragAndDrop.__repr__ = function () { + return '[' + this.NAME + ' ' + this.VERSION + ']'; +}; + +MochiKit.DragAndDrop.toString = function () { + return this.__repr__(); +}; + +MochiKit.DragAndDrop.EXPORT = [ + "Droppable", + "Draggable" +]; + +MochiKit.DragAndDrop.EXPORT_OK = [ + "Droppables", + "Draggables" +]; + +MochiKit.DragAndDrop.Droppables = { + /*** + + Manage all droppables. Shouldn't be used, use the Droppable object instead. + + ***/ + drops: [], + + remove: function (element) { + this.drops = MochiKit.Base.filter(function (d) { + return d.element != MochiKit.DOM.getElement(element); + }, this.drops); + }, + + register: function (drop) { + this.drops.push(drop); + }, + + unregister: function (drop) { + this.drops = MochiKit.Base.filter(function (d) { + return d != drop; + }, this.drops); + }, + + prepare: function (element) { + MochiKit.Base.map(function (drop) { + if (drop.isAccepted(element)) { + if (drop.options.activeclass) { + MochiKit.DOM.addElementClass(drop.element, + drop.options.activeclass); + } + drop.options.onactive(drop.element, element); + } + }, this.drops); + }, + + findDeepestChild: function (drops) { + deepest = drops[0]; + + for (i = 1; i < drops.length; ++i) { + if (MochiKit.DOM.isParent(drops[i].element, deepest.element)) { + deepest = drops[i]; + } + } + return deepest; + }, + + show: function (point, element) { + if (!this.drops.length) { + return; + } + var affected = []; + + if (this.last_active) { + this.last_active.deactivate(); + } + MochiKit.Iter.forEach(this.drops, function (drop) { + if (drop.isAffected(point, element)) { + affected.push(drop); + } + }); + if (affected.length > 0) { + drop = this.findDeepestChild(affected); + MochiKit.Position.within(drop.element, point.page.x, point.page.y); + drop.options.onhover(element, drop.element, + MochiKit.Position.overlap(drop.options.overlap, drop.element)); + drop.activate(); + } + }, + + fire: function (event, element) { + if (!this.last_active) { + return; + } + MochiKit.Position.prepare(); + + if (this.last_active.isAffected(event.mouse(), element)) { + this.last_active.options.ondrop(element, + this.last_active.element, event); + } + }, + + reset: function (element) { + MochiKit.Base.map(function (drop) { + if (drop.options.activeclass) { + MochiKit.DOM.removeElementClass(drop.element, + drop.options.activeclass); + } + drop.options.ondesactive(drop.element, element); + }, this.drops); + if (this.last_active) { + this.last_active.deactivate(); + } + } +}; + +/** @id MochiKit.DragAndDrop.Droppable */ +MochiKit.DragAndDrop.Droppable = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.DragAndDrop.Droppable.prototype = { + /*** + + A droppable object. Simple use is to create giving an element: + + new MochiKit.DragAndDrop.Droppable('myelement'); + + Generally you'll want to define the 'ondrop' function and maybe the + 'accept' option to filter draggables. + + ***/ + __class__: MochiKit.DragAndDrop.Droppable, + + __init__: function (element, /* optional */options) { + var d = MochiKit.DOM; + var b = MochiKit.Base; + this.element = d.getElement(element); + this.options = b.update({ + + /** @id MochiKit.DragAndDrop.greedy */ + greedy: true, + + /** @id MochiKit.DragAndDrop.hoverclass */ + hoverclass: null, + + /** @id MochiKit.DragAndDrop.activeclass */ + activeclass: null, + + /** @id MochiKit.DragAndDrop.hoverfunc */ + hoverfunc: b.noop, + + /** @id MochiKit.DragAndDrop.accept */ + accept: null, + + /** @id MochiKit.DragAndDrop.onactive */ + onactive: b.noop, + + /** @id MochiKit.DragAndDrop.ondesactive */ + ondesactive: b.noop, + + /** @id MochiKit.DragAndDrop.onhover */ + onhover: b.noop, + + /** @id MochiKit.DragAndDrop.ondrop */ + ondrop: b.noop, + + /** @id MochiKit.DragAndDrop.containment */ + containment: [], + tree: false + }, options || {}); + + // cache containers + this.options._containers = []; + b.map(MochiKit.Base.bind(function (c) { + this.options._containers.push(d.getElement(c)); + }, this), this.options.containment); + + d.makePositioned(this.element); // fix IE + + MochiKit.DragAndDrop.Droppables.register(this); + }, + + /** @id MochiKit.DragAndDrop.isContained */ + isContained: function (element) { + if (this.options._containers.length) { + var containmentNode; + if (this.options.tree) { + containmentNode = element.treeNode; + } else { + containmentNode = element.parentNode; + } + return MochiKit.Iter.some(this.options._containers, function (c) { + return containmentNode == c; + }); + } else { + return true; + } + }, + + /** @id MochiKit.DragAndDrop.isAccepted */ + isAccepted: function (element) { + return ((!this.options.accept) || MochiKit.Iter.some( + this.options.accept, function (c) { + return MochiKit.DOM.hasElementClass(element, c); + })); + }, + + /** @id MochiKit.DragAndDrop.isAffected */ + isAffected: function (point, element) { + return ((this.element != element) && + this.isContained(element) && + this.isAccepted(element) && + MochiKit.Position.within(this.element, point.page.x, + point.page.y)); + }, + + /** @id MochiKit.DragAndDrop.deactivate */ + deactivate: function () { + /*** + + A droppable is deactivate when a draggable has been over it and left. + + ***/ + if (this.options.hoverclass) { + MochiKit.DOM.removeElementClass(this.element, + this.options.hoverclass); + } + this.options.hoverfunc(this.element, false); + MochiKit.DragAndDrop.Droppables.last_active = null; + }, + + /** @id MochiKit.DragAndDrop.activate */ + activate: function () { + /*** + + A droppable is active when a draggable is over it. + + ***/ + if (this.options.hoverclass) { + MochiKit.DOM.addElementClass(this.element, this.options.hoverclass); + } + this.options.hoverfunc(this.element, true); + MochiKit.DragAndDrop.Droppables.last_active = this; + }, + + /** @id MochiKit.DragAndDrop.destroy */ + destroy: function () { + /*** + + Delete this droppable. + + ***/ + MochiKit.DragAndDrop.Droppables.unregister(this); + }, + + /** @id MochiKit.DragAndDrop.repr */ + repr: function () { + return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]"; + } +}; + +MochiKit.DragAndDrop.Draggables = { + /*** + + Manage draggables elements. Not intended to direct use. + + ***/ + drags: [], + + register: function (draggable) { + if (this.drags.length === 0) { + var conn = MochiKit.Signal.connect; + this.eventMouseUp = conn(document, 'onmouseup', this, this.endDrag); + this.eventMouseMove = conn(document, 'onmousemove', this, + this.updateDrag); + this.eventKeypress = conn(document, 'onkeypress', this, + this.keyPress); + } + this.drags.push(draggable); + }, + + unregister: function (draggable) { + this.drags = MochiKit.Base.filter(function (d) { + return d != draggable; + }, this.drags); + if (this.drags.length === 0) { + var disc = MochiKit.Signal.disconnect; + disc(this.eventMouseUp); + disc(this.eventMouseMove); + disc(this.eventKeypress); + } + }, + + activate: function (draggable) { + // allows keypress events if window is not currently focused + // fails for Safari + window.focus(); + this.activeDraggable = draggable; + }, + + deactivate: function () { + this.activeDraggable = null; + }, + + updateDrag: function (event) { + if (!this.activeDraggable) { + return; + } + var pointer = event.mouse(); + // Mozilla-based browsers fire successive mousemove events with + // the same coordinates, prevent needless redrawing (moz bug?) + if (this._lastPointer && (MochiKit.Base.repr(this._lastPointer.page) == + MochiKit.Base.repr(pointer.page))) { + return; + } + this._lastPointer = pointer; + this.activeDraggable.updateDrag(event, pointer); + }, + + endDrag: function (event) { + if (!this.activeDraggable) { + return; + } + this._lastPointer = null; + this.activeDraggable.endDrag(event); + this.activeDraggable = null; + }, + + keyPress: function (event) { + if (this.activeDraggable) { + this.activeDraggable.keyPress(event); + } + }, + + notify: function (eventName, draggable, event) { + MochiKit.Signal.signal(this, eventName, draggable, event); + } +}; + +/** @id MochiKit.DragAndDrop.Draggable */ +MochiKit.DragAndDrop.Draggable = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.DragAndDrop.Draggable.prototype = { + /*** + + A draggable object. Simple instantiate : + + new MochiKit.DragAndDrop.Draggable('myelement'); + + ***/ + __class__ : MochiKit.DragAndDrop.Draggable, + + __init__: function (element, /* optional */options) { + var v = MochiKit.Visual; + var b = MochiKit.Base; + options = b.update({ + + /** @id MochiKit.DragAndDrop.handle */ + handle: false, + + /** @id MochiKit.DragAndDrop.starteffect */ + starteffect: function (innerelement) { + this._savedOpacity = MochiKit.Style.getStyle(innerelement, 'opacity') || 1.0; + new v.Opacity(innerelement, {duration:0.2, from:this._savedOpacity, to:0.7}); + }, + /** @id MochiKit.DragAndDrop.reverteffect */ + reverteffect: function (innerelement, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2) + + Math.abs(left_offset^2))*0.02; + return new v.Move(innerelement, + {x: -left_offset, y: -top_offset, duration: dur}); + }, + + /** @id MochiKit.DragAndDrop.endeffect */ + endeffect: function (innerelement) { + new v.Opacity(innerelement, {duration:0.2, from:0.7, to:this._savedOpacity}); + }, + + /** @id MochiKit.DragAndDrop.onchange */ + onchange: b.noop, + + /** @id MochiKit.DragAndDrop.zindex */ + zindex: 1000, + + /** @id MochiKit.DragAndDrop.revert */ + revert: false, + + /** @id MochiKit.DragAndDrop.scroll */ + scroll: false, + + /** @id MochiKit.DragAndDrop.scrollSensitivity */ + scrollSensitivity: 20, + + /** @id MochiKit.DragAndDrop.scrollSpeed */ + scrollSpeed: 15, + // false, or xy or [x, y] or function (x, y){return [x, y];} + + /** @id MochiKit.DragAndDrop.snap */ + snap: false + }, options || {}); + + var d = MochiKit.DOM; + this.element = d.getElement(element); + + if (options.handle && (typeof(options.handle) == 'string')) { + this.handle = d.getFirstElementByTagAndClassName(null, + options.handle, this.element); + } + if (!this.handle) { + this.handle = d.getElement(options.handle); + } + if (!this.handle) { + this.handle = this.element; + } + + if (options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { + options.scroll = d.getElement(options.scroll); + this._isScrollChild = MochiKit.DOM.isChildNode(this.element, options.scroll); + } + + d.makePositioned(this.element); // fix IE + + this.delta = this.currentDelta(); + this.options = options; + this.dragging = false; + + this.eventMouseDown = MochiKit.Signal.connect(this.handle, + 'onmousedown', this, this.initDrag); + MochiKit.DragAndDrop.Draggables.register(this); + }, + + /** @id MochiKit.DragAndDrop.destroy */ + destroy: function () { + MochiKit.Signal.disconnect(this.eventMouseDown); + MochiKit.DragAndDrop.Draggables.unregister(this); + }, + + /** @id MochiKit.DragAndDrop.currentDelta */ + currentDelta: function () { + var s = MochiKit.Style.getStyle; + return [ + parseInt(s(this.element, 'left') || '0'), + parseInt(s(this.element, 'top') || '0')]; + }, + + /** @id MochiKit.DragAndDrop.initDrag */ + initDrag: function (event) { + if (!event.mouse().button.left) { + return; + } + // abort on form elements, fixes a Firefox issue + var src = event.target(); + var tagName = (src.tagName || '').toUpperCase(); + if (tagName === 'INPUT' || tagName === 'SELECT' || + tagName === 'OPTION' || tagName === 'BUTTON' || + tagName === 'TEXTAREA') { + return; + } + + if (this._revert) { + this._revert.cancel(); + this._revert = null; + } + + var pointer = event.mouse(); + var pos = MochiKit.Position.cumulativeOffset(this.element); + this.offset = [pointer.page.x - pos.x, pointer.page.y - pos.y]; + + MochiKit.DragAndDrop.Draggables.activate(this); + event.stop(); + }, + + /** @id MochiKit.DragAndDrop.startDrag */ + startDrag: function (event) { + this.dragging = true; + if (this.options.selectclass) { + MochiKit.DOM.addElementClass(this.element, + this.options.selectclass); + } + if (this.options.zindex) { + this.originalZ = parseInt(MochiKit.Style.getStyle(this.element, + 'z-index') || '0'); + this.element.style.zIndex = this.options.zindex; + } + + if (this.options.ghosting) { + this._clone = this.element.cloneNode(true); + this.ghostPosition = MochiKit.Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + if (this.options.scroll) { + if (this.options.scroll == window) { + var where = this._getWindowScroll(this.options.scroll); + this.originalScrollLeft = where.left; + this.originalScrollTop = where.top; + } else { + this.originalScrollLeft = this.options.scroll.scrollLeft; + this.originalScrollTop = this.options.scroll.scrollTop; + } + } + + MochiKit.DragAndDrop.Droppables.prepare(this.element); + MochiKit.DragAndDrop.Draggables.notify('start', this, event); + if (this.options.starteffect) { + this.options.starteffect(this.element); + } + }, + + /** @id MochiKit.DragAndDrop.updateDrag */ + updateDrag: function (event, pointer) { + if (!this.dragging) { + this.startDrag(event); + } + MochiKit.Position.prepare(); + MochiKit.DragAndDrop.Droppables.show(pointer, this.element); + MochiKit.DragAndDrop.Draggables.notify('drag', this, event); + this.draw(pointer); + this.options.onchange(this); + + if (this.options.scroll) { + this.stopScrolling(); + var p, q; + if (this.options.scroll == window) { + var s = this._getWindowScroll(this.options.scroll); + p = new MochiKit.Style.Coordinates(s.left, s.top); + q = new MochiKit.Style.Coordinates(s.left + s.width, + s.top + s.height); + } else { + p = MochiKit.Position.page(this.options.scroll); + p.x += this.options.scroll.scrollLeft; + p.y += this.options.scroll.scrollTop; + p.x += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0); + p.y += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0); + q = new MochiKit.Style.Coordinates(p.x + this.options.scroll.offsetWidth, + p.y + this.options.scroll.offsetHeight); + } + var speed = [0, 0]; + if (pointer.page.x > (q.x - this.options.scrollSensitivity)) { + speed[0] = pointer.page.x - (q.x - this.options.scrollSensitivity); + } else if (pointer.page.x < (p.x + this.options.scrollSensitivity)) { + speed[0] = pointer.page.x - (p.x + this.options.scrollSensitivity); + } + if (pointer.page.y > (q.y - this.options.scrollSensitivity)) { + speed[1] = pointer.page.y - (q.y - this.options.scrollSensitivity); + } else if (pointer.page.y < (p.y + this.options.scrollSensitivity)) { + speed[1] = pointer.page.y - (p.y + this.options.scrollSensitivity); + } + this.startScrolling(speed); + } + + // fix AppleWebKit rendering + if (/AppleWebKit'/.test(navigator.appVersion)) { + window.scrollBy(0, 0); + } + event.stop(); + }, + + /** @id MochiKit.DragAndDrop.finishDrag */ + finishDrag: function (event, success) { + var dr = MochiKit.DragAndDrop; + this.dragging = false; + if (this.options.selectclass) { + MochiKit.DOM.removeElementClass(this.element, + this.options.selectclass); + } + + if (this.options.ghosting) { + // XXX: from a user point of view, it would be better to remove + // the node only *after* the MochiKit.Visual.Move end when used + // with revert. + MochiKit.Position.relativize(this.element, this.ghostPosition); + MochiKit.DOM.removeElement(this._clone); + this._clone = null; + } + + if (success) { + dr.Droppables.fire(event, this.element); + } + dr.Draggables.notify('end', 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._revert = 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); + } + + dr.Draggables.deactivate(); + dr.Droppables.reset(this.element); + }, + + /** @id MochiKit.DragAndDrop.keyPress */ + keyPress: function (event) { + if (event.key().string != "KEY_ESCAPE") { + return; + } + this.finishDrag(event, false); + event.stop(); + }, + + /** @id MochiKit.DragAndDrop.endDrag */ + endDrag: function (event) { + if (!this.dragging) { + return; + } + this.stopScrolling(); + this.finishDrag(event, true); + event.stop(); + }, + + /** @id MochiKit.DragAndDrop.draw */ + draw: function (point) { + var pos = MochiKit.Position.cumulativeOffset(this.element); + var d = this.currentDelta(); + pos.x -= d[0]; + pos.y -= d[1]; + + if (this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { + pos.x -= this.options.scroll.scrollLeft - this.originalScrollLeft; + pos.y -= this.options.scroll.scrollTop - this.originalScrollTop; + } + + var p = [point.page.x - pos.x - this.offset[0], + point.page.y - pos.y - this.offset[1]]; + + 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) { + var i = -1; + p = MochiKit.Base.map(MochiKit.Base.bind(function (v) { + i += 1; + return Math.round(v/this.options.snap[i]) * + this.options.snap[i]; + }, this), p); + } else { + p = MochiKit.Base.map(MochiKit.Base.bind(function (v) { + return Math.round(v/this.options.snap) * + this.options.snap; + }, this), p); + } + } + } + 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 + } + }, + + /** @id MochiKit.DragAndDrop.stopScrolling */ + stopScrolling: function () { + if (this.scrollInterval) { + clearInterval(this.scrollInterval); + this.scrollInterval = null; + MochiKit.DragAndDrop.Draggables._lastScrollPointer = null; + } + }, + + /** @id MochiKit.DragAndDrop.startScrolling */ + startScrolling: function (speed) { + if (!speed[0] && !speed[1]) { + return; + } + this.scrollSpeed = [speed[0] * this.options.scrollSpeed, + speed[1] * this.options.scrollSpeed]; + this.lastScrolled = new Date(); + this.scrollInterval = setInterval(MochiKit.Base.bind(this.scroll, this), 10); + }, + + /** @id MochiKit.DragAndDrop.scroll */ + scroll: function () { + var current = new Date(); + var delta = current - this.lastScrolled; + this.lastScrolled = current; + + if (this.options.scroll == window) { + var s = this._getWindowScroll(this.options.scroll); + if (this.scrollSpeed[0] || this.scrollSpeed[1]) { + var dm = delta / 1000; + this.options.scroll.scrollTo(s.left + dm * this.scrollSpeed[0], + s.top + dm * this.scrollSpeed[1]); + } + } else { + this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; + this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; + } + + var d = MochiKit.DragAndDrop; + + MochiKit.Position.prepare(); + d.Droppables.show(d.Draggables._lastPointer, this.element); + d.Draggables.notify('drag', this); + if (this._isScrollChild) { + d.Draggables._lastScrollPointer = d.Draggables._lastScrollPointer || d.Draggables._lastPointer; + d.Draggables._lastScrollPointer.x += this.scrollSpeed[0] * delta / 1000; + d.Draggables._lastScrollPointer.y += this.scrollSpeed[1] * delta / 1000; + if (d.Draggables._lastScrollPointer.x < 0) { + d.Draggables._lastScrollPointer.x = 0; + } + if (d.Draggables._lastScrollPointer.y < 0) { + d.Draggables._lastScrollPointer.y = 0; + } + this.draw(d.Draggables._lastScrollPointer); + } + + this.options.onchange(this); + }, + + _getWindowScroll: function (win) { + var vp, w, h; + MochiKit.DOM.withWindow(win, function () { + vp = MochiKit.Style.getViewportPosition(win.document); + }); + if (win.innerWidth) { + w = win.innerWidth; + h = win.innerHeight; + } else if (win.document.documentElement && win.document.documentElement.clientWidth) { + w = win.document.documentElement.clientWidth; + h = win.document.documentElement.clientHeight; + } else { + w = win.document.body.offsetWidth; + h = win.document.body.offsetHeight; + } + return {top: vp.x, left: vp.y, width: w, height: h}; + }, + + /** @id MochiKit.DragAndDrop.repr */ + repr: function () { + return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]"; + } +}; + +MochiKit.DragAndDrop.__new__ = function () { + MochiKit.Base.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": MochiKit.Base.concat(this.EXPORT, this.EXPORT_OK) + }; +}; + +MochiKit.DragAndDrop.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.DragAndDrop); + diff --git a/mochikit_v14/MochiKit/Format.js b/mochikit_v14/MochiKit/Format.js new file mode 100644 index 0000000..937b681 --- /dev/null +++ b/mochikit_v14/MochiKit/Format.js @@ -0,0 +1,304 @@ +/*** + +MochiKit.Format 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Format'); +} + +if (typeof(MochiKit) == 'undefined') { + MochiKit = {}; +} + +if (typeof(MochiKit.Format) == 'undefined') { + MochiKit.Format = {}; +} + +MochiKit.Format.NAME = "MochiKit.Format"; +MochiKit.Format.VERSION = "1.4"; +MochiKit.Format.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; +MochiKit.Format.toString = function () { + return this.__repr__(); +}; + +MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) { + return function (num) { + num = parseFloat(num); + if (typeof(num) == "undefined" || num === null || isNaN(num)) { + return placeholder; + } + var curheader = header; + var curfooter = footer; + if (num < 0) { + num = -num; + } else { + curheader = curheader.replace(/-/, ""); + } + var me = arguments.callee; + var fmt = MochiKit.Format.formatLocale(locale); + if (isPercent) { + num = num * 100.0; + curfooter = fmt.percent + curfooter; + } + num = MochiKit.Format.roundToFixed(num, precision); + var parts = num.split(/\./); + var whole = parts[0]; + var frac = (parts.length == 1) ? "" : parts[1]; + var res = ""; + while (whole.length < leadingZeros) { + whole = "0" + whole; + } + if (separatorAt) { + while (whole.length > separatorAt) { + var i = whole.length - separatorAt; + //res = res + fmt.separator + whole.substring(i, whole.length); + res = fmt.separator + whole.substring(i, whole.length) + res; + whole = whole.substring(0, i); + } + } + res = whole + res; + if (precision > 0) { + while (frac.length < trailingZeros) { + frac = frac + "0"; + } + res = res + fmt.decimal + frac; + } + return curheader + res + curfooter; + }; +}; + +/** @id MochiKit.Format.numberFormatter */ +MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) { + // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html + // | 0 | leading or trailing zeros + // | # | just the number + // | , | separator + // | . | decimal separator + // | % | Multiply by 100 and format as percent + if (typeof(placeholder) == "undefined") { + placeholder = ""; + } + var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/); + if (!match) { + throw TypeError("Invalid pattern"); + } + var header = pattern.substr(0, match.index); + var footer = pattern.substr(match.index + match[0].length); + if (header.search(/-/) == -1) { + header = header + "-"; + } + var whole = match[1]; + var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : ""; + var isPercent = (typeof(match[3]) == "string" && match[3] != ""); + var tmp = whole.split(/,/); + var separatorAt; + if (typeof(locale) == "undefined") { + locale = "default"; + } + if (tmp.length == 1) { + separatorAt = null; + } else { + separatorAt = tmp[1].length; + } + var leadingZeros = whole.length - whole.replace(/0/g, "").length; + var trailingZeros = frac.length - frac.replace(/0/g, "").length; + var precision = frac.length; + var rval = MochiKit.Format._numberFormatter( + placeholder, header, footer, locale, isPercent, precision, + leadingZeros, separatorAt, trailingZeros + ); + var m = MochiKit.Base; + if (m) { + var fn = arguments.callee; + var args = m.concat(arguments); + rval.repr = function () { + return [ + self.NAME, + "(", + map(m.repr, args).join(", "), + ")" + ].join(""); + }; + } + return rval; +}; + +/** @id MochiKit.Format.formatLocale */ +MochiKit.Format.formatLocale = function (locale) { + if (typeof(locale) == "undefined" || locale === null) { + locale = "default"; + } + if (typeof(locale) == "string") { + var rval = MochiKit.Format.LOCALE[locale]; + if (typeof(rval) == "string") { + rval = arguments.callee(rval); + MochiKit.Format.LOCALE[locale] = rval; + } + return rval; + } else { + return locale; + } +}; + +/** @id MochiKit.Format.twoDigitAverage */ +MochiKit.Format.twoDigitAverage = function (numerator, denominator) { + if (denominator) { + var res = numerator / denominator; + if (!isNaN(res)) { + return MochiKit.Format.twoDigitFloat(numerator / denominator); + } + } + return "0"; +}; + +/** @id MochiKit.Format.twoDigitFloat */ +MochiKit.Format.twoDigitFloat = function (someFloat) { + var sign = (someFloat < 0 ? '-' : ''); + var s = Math.floor(Math.abs(someFloat) * 100).toString(); + if (s == '0') { + return s; + } + if (s.length < 3) { + while (s.charAt(s.length - 1) == '0') { + s = s.substring(0, s.length - 1); + } + return sign + '0.' + s; + } + var head = sign + s.substring(0, s.length - 2); + var tail = s.substring(s.length - 2, s.length); + if (tail == '00') { + return head; + } else if (tail.charAt(1) == '0') { + return head + '.' + tail.charAt(0); + } else { + return head + '.' + tail; + } +}; + +/** @id MochiKit.Format.lstrip */ +MochiKit.Format.lstrip = function (str, /* optional */chars) { + str = str + ""; + if (typeof(str) != "string") { + return null; + } + if (!chars) { + return str.replace(/^\s+/, ""); + } else { + return str.replace(new RegExp("^[" + chars + "]+"), ""); + } +}; + +/** @id MochiKit.Format.rstrip */ +MochiKit.Format.rstrip = function (str, /* optional */chars) { + str = str + ""; + if (typeof(str) != "string") { + return null; + } + if (!chars) { + return str.replace(/\s+$/, ""); + } else { + return str.replace(new RegExp("[" + chars + "]+$"), ""); + } +}; + +/** @id MochiKit.Format.strip */ +MochiKit.Format.strip = function (str, /* optional */chars) { + var self = MochiKit.Format; + return self.rstrip(self.lstrip(str, chars), chars); +}; + +/** @id MochiKit.Format.truncToFixed */ +MochiKit.Format.truncToFixed = function (aNumber, precision) { + aNumber = Math.floor(aNumber * Math.pow(10, precision)); + var res = (aNumber * Math.pow(10, -precision)).toFixed(precision); + if (res.charAt(0) == ".") { + res = "0" + res; + } + return res; +}; + +/** @id MochiKit.Format.roundToFixed */ +MochiKit.Format.roundToFixed = function (aNumber, precision) { + return MochiKit.Format.truncToFixed( + aNumber + 0.5 * Math.pow(10, -precision), + precision + ); +}; + +/** @id MochiKit.Format.percentFormat */ +MochiKit.Format.percentFormat = function (someFloat) { + return MochiKit.Format.twoDigitFloat(100 * someFloat) + '%'; +}; + +MochiKit.Format.EXPORT = [ + "truncToFixed", + "roundToFixed", + "numberFormatter", + "formatLocale", + "twoDigitAverage", + "twoDigitFloat", + "percentFormat", + "lstrip", + "rstrip", + "strip" +]; + +MochiKit.Format.LOCALE = { + en_US: {separator: ",", decimal: ".", percent: "%"}, + de_DE: {separator: ".", decimal: ",", percent: "%"}, + fr_FR: {separator: " ", decimal: ",", percent: "%"}, + "default": "en_US" +}; + +MochiKit.Format.EXPORT_OK = []; +MochiKit.Format.EXPORT_TAGS = { + ':all': MochiKit.Format.EXPORT, + ':common': MochiKit.Format.EXPORT +}; + +MochiKit.Format.__new__ = function () { + // MochiKit.Base.nameFunctions(this); + var base = this.NAME + "."; + var k, v, o; + for (k in this.LOCALE) { + o = this.LOCALE[k]; + if (typeof(o) == "object") { + o.repr = function () { return this.NAME; }; + o.NAME = base + "LOCALE." + k; + } + } + for (k in this) { + o = this[k]; + if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { + try { + o.NAME = base + k; + } catch (e) { + // pass + } + } + } +}; + +MochiKit.Format.__new__(); + +if (typeof(MochiKit.Base) != "undefined") { + MochiKit.Base._exportSymbols(this, MochiKit.Format); +} else { + (function (globals, module) { + if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') + || (MochiKit.__export__ === false)) { + var all = module.EXPORT_TAGS[":all"]; + for (var i = 0; i < all.length; i++) { + globals[all[i]] = module[all[i]]; + } + } + })(this, MochiKit.Format); +} diff --git a/mochikit_v14/MochiKit/Iter.js b/mochikit_v14/MochiKit/Iter.js new file mode 100644 index 0000000..c2fcbee --- /dev/null +++ b/mochikit_v14/MochiKit/Iter.js @@ -0,0 +1,851 @@ +/*** + +MochiKit.Iter 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Iter'); + dojo.require('MochiKit.Base'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Iter depends on MochiKit.Base!"; +} + +if (typeof(MochiKit.Iter) == 'undefined') { + MochiKit.Iter = {}; +} + +MochiKit.Iter.NAME = "MochiKit.Iter"; +MochiKit.Iter.VERSION = "1.4"; +MochiKit.Base.update(MochiKit.Iter, { + __repr__: function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + toString: function () { + return this.__repr__(); + }, + + /** @id MochiKit.Iter.registerIteratorFactory */ + registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) { + MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override); + }, + + /** @id MochiKit.Iter.iter */ + iter: function (iterable, /* optional */ sentinel) { + var self = MochiKit.Iter; + if (arguments.length == 2) { + return self.takewhile( + function (a) { return a != sentinel; }, + iterable + ); + } + if (typeof(iterable.next) == 'function') { + return iterable; + } else if (typeof(iterable.iter) == 'function') { + return iterable.iter(); + /* + } else if (typeof(iterable.__iterator__) == 'function') { + // + // XXX: We can't support JavaScript 1.7 __iterator__ directly + // because of Object.prototype.__iterator__ + // + return iterable.__iterator__(); + */ + } + + try { + return self.iteratorRegistry.match(iterable); + } catch (e) { + var m = MochiKit.Base; + if (e == m.NotFound) { + e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable"); + } + throw e; + } + }, + + /** @id MochiKit.Iter.count */ + count: function (n) { + if (!n) { + n = 0; + } + var m = MochiKit.Base; + return { + repr: function () { return "count(" + n + ")"; }, + toString: m.forwardCall("repr"), + next: m.counter(n) + }; + }, + + /** @id MochiKit.Iter.cycle */ + cycle: function (p) { + var self = MochiKit.Iter; + var m = MochiKit.Base; + var lst = []; + var iterator = self.iter(p); + return { + repr: function () { return "cycle(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + try { + var rval = iterator.next(); + lst.push(rval); + return rval; + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + if (lst.length === 0) { + this.next = function () { + throw self.StopIteration; + }; + } else { + var i = -1; + this.next = function () { + i = (i + 1) % lst.length; + return lst[i]; + }; + } + return this.next(); + } + } + }; + }, + + /** @id MochiKit.Iter.repeat */ + repeat: function (elem, /* optional */n) { + var m = MochiKit.Base; + if (typeof(n) == 'undefined') { + return { + repr: function () { + return "repeat(" + m.repr(elem) + ")"; + }, + toString: m.forwardCall("repr"), + next: function () { + return elem; + } + }; + } + return { + repr: function () { + return "repeat(" + m.repr(elem) + ", " + n + ")"; + }, + toString: m.forwardCall("repr"), + next: function () { + if (n <= 0) { + throw MochiKit.Iter.StopIteration; + } + n -= 1; + return elem; + } + }; + }, + + /** @id MochiKit.Iter.next */ + next: function (iterator) { + return iterator.next(); + }, + + /** @id MochiKit.Iter.izip */ + izip: function (p, q/*, ...*/) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + var next = self.next; + var iterables = m.map(self.iter, arguments); + return { + repr: function () { return "izip(...)"; }, + toString: m.forwardCall("repr"), + next: function () { return m.map(next, iterables); } + }; + }, + + /** @id MochiKit.Iter.ifilter */ + ifilter: function (pred, seq) { + var m = MochiKit.Base; + seq = MochiKit.Iter.iter(seq); + if (pred === null) { + pred = m.operator.truth; + } + return { + repr: function () { return "ifilter(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + while (true) { + var rval = seq.next(); + if (pred(rval)) { + return rval; + } + } + // mozilla warnings aren't too bright + return undefined; + } + }; + }, + + /** @id MochiKit.Iter.ifilterfalse */ + ifilterfalse: function (pred, seq) { + var m = MochiKit.Base; + seq = MochiKit.Iter.iter(seq); + if (pred === null) { + pred = m.operator.truth; + } + return { + repr: function () { return "ifilterfalse(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + while (true) { + var rval = seq.next(); + if (!pred(rval)) { + return rval; + } + } + // mozilla warnings aren't too bright + return undefined; + } + }; + }, + + /** @id MochiKit.Iter.islice */ + islice: function (seq/*, [start,] stop[, step] */) { + var self = MochiKit.Iter; + var m = MochiKit.Base; + seq = self.iter(seq); + var start = 0; + var stop = 0; + var step = 1; + var i = -1; + if (arguments.length == 2) { + stop = arguments[1]; + } else if (arguments.length == 3) { + start = arguments[1]; + stop = arguments[2]; + } else { + start = arguments[1]; + stop = arguments[2]; + step = arguments[3]; + } + return { + repr: function () { + return "islice(" + ["...", start, stop, step].join(", ") + ")"; + }, + toString: m.forwardCall("repr"), + next: function () { + var rval; + while (i < start) { + rval = seq.next(); + i++; + } + if (start >= stop) { + throw self.StopIteration; + } + start += step; + return rval; + } + }; + }, + + /** @id MochiKit.Iter.imap */ + imap: function (fun, p, q/*, ...*/) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + var iterables = m.map(self.iter, m.extend(null, arguments, 1)); + var map = m.map; + var next = self.next; + return { + repr: function () { return "imap(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + return fun.apply(this, map(next, iterables)); + } + }; + }, + + /** @id MochiKit.Iter.applymap */ + applymap: function (fun, seq, self) { + seq = MochiKit.Iter.iter(seq); + var m = MochiKit.Base; + return { + repr: function () { return "applymap(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + return fun.apply(self, seq.next()); + } + }; + }, + + /** @id MochiKit.Iter.chain */ + chain: function (p, q/*, ...*/) { + // dumb fast path + var self = MochiKit.Iter; + var m = MochiKit.Base; + if (arguments.length == 1) { + return self.iter(arguments[0]); + } + var argiter = m.map(self.iter, arguments); + return { + repr: function () { return "chain(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + while (argiter.length > 1) { + try { + return argiter[0].next(); + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + argiter.shift(); + } + } + if (argiter.length == 1) { + // optimize last element + var arg = argiter.shift(); + this.next = m.bind("next", arg); + return this.next(); + } + throw self.StopIteration; + } + }; + }, + + /** @id MochiKit.Iter.takewhile */ + takewhile: function (pred, seq) { + var self = MochiKit.Iter; + seq = self.iter(seq); + return { + repr: function () { return "takewhile(...)"; }, + toString: MochiKit.Base.forwardCall("repr"), + next: function () { + var rval = seq.next(); + if (!pred(rval)) { + this.next = function () { + throw self.StopIteration; + }; + this.next(); + } + return rval; + } + }; + }, + + /** @id MochiKit.Iter.dropwhile */ + dropwhile: function (pred, seq) { + seq = MochiKit.Iter.iter(seq); + var m = MochiKit.Base; + var bind = m.bind; + return { + "repr": function () { return "dropwhile(...)"; }, + "toString": m.forwardCall("repr"), + "next": function () { + while (true) { + var rval = seq.next(); + if (!pred(rval)) { + break; + } + } + this.next = bind("next", seq); + return rval; + } + }; + }, + + _tee: function (ident, sync, iterable) { + sync.pos[ident] = -1; + var m = MochiKit.Base; + var listMin = m.listMin; + return { + repr: function () { return "tee(" + ident + ", ...)"; }, + toString: m.forwardCall("repr"), + next: function () { + var rval; + var i = sync.pos[ident]; + + if (i == sync.max) { + rval = iterable.next(); + sync.deque.push(rval); + sync.max += 1; + sync.pos[ident] += 1; + } else { + rval = sync.deque[i - sync.min]; + sync.pos[ident] += 1; + if (i == sync.min && listMin(sync.pos) != sync.min) { + sync.min += 1; + sync.deque.shift(); + } + } + return rval; + } + }; + }, + + /** @id MochiKit.Iter.tee */ + tee: function (iterable, n/* = 2 */) { + var rval = []; + var sync = { + "pos": [], + "deque": [], + "max": -1, + "min": -1 + }; + if (arguments.length == 1 || typeof(n) == "undefined" || n === null) { + n = 2; + } + var self = MochiKit.Iter; + iterable = self.iter(iterable); + var _tee = self._tee; + for (var i = 0; i < n; i++) { + rval.push(_tee(i, sync, iterable)); + } + return rval; + }, + + /** @id MochiKit.Iter.list */ + list: function (iterable) { + // Fast-path for Array and Array-like + var rval; + if (iterable instanceof Array) { + return iterable.slice(); + } + // this is necessary to avoid a Safari crash + if (typeof(iterable) == "function" && + !(iterable instanceof Function) && + typeof(iterable.length) == 'number') { + rval = []; + for (var i = 0; i < iterable.length; i++) { + rval.push(iterable[i]); + } + return rval; + } + + var self = MochiKit.Iter; + iterable = self.iter(iterable); + var rval = []; + try { + while (true) { + rval.push(iterable.next()); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + return rval; + } + // mozilla warnings aren't too bright + return undefined; + }, + + + /** @id MochiKit.Iter.reduce */ + reduce: function (fn, iterable, /* optional */initial) { + var i = 0; + var x = initial; + var self = MochiKit.Iter; + iterable = self.iter(iterable); + if (arguments.length < 3) { + try { + x = iterable.next(); + } catch (e) { + if (e == self.StopIteration) { + e = new TypeError("reduce() of empty sequence with no initial value"); + } + throw e; + } + i++; + } + try { + while (true) { + x = fn(x, iterable.next()); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + return x; + }, + + /** @id MochiKit.Iter.range */ + range: function (/* [start,] stop[, step] */) { + var start = 0; + var stop = 0; + var step = 1; + if (arguments.length == 1) { + stop = arguments[0]; + } else if (arguments.length == 2) { + start = arguments[0]; + stop = arguments[1]; + } else if (arguments.length == 3) { + start = arguments[0]; + stop = arguments[1]; + step = arguments[2]; + } else { + throw new TypeError("range() takes 1, 2, or 3 arguments!"); + } + if (step === 0) { + throw new TypeError("range() step must not be 0"); + } + return { + next: function () { + if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) { + throw MochiKit.Iter.StopIteration; + } + var rval = start; + start += step; + return rval; + }, + repr: function () { + return "range(" + [start, stop, step].join(", ") + ")"; + }, + toString: MochiKit.Base.forwardCall("repr") + }; + }, + + /** @id MochiKit.Iter.sum */ + sum: function (iterable, start/* = 0 */) { + if (typeof(start) == "undefined" || start === null) { + start = 0; + } + var x = start; + var self = MochiKit.Iter; + iterable = self.iter(iterable); + try { + while (true) { + x += iterable.next(); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + return x; + }, + + /** @id MochiKit.Iter.exhaust */ + exhaust: function (iterable) { + var self = MochiKit.Iter; + iterable = self.iter(iterable); + try { + while (true) { + iterable.next(); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + }, + + /** @id MochiKit.Iter.forEach */ + forEach: function (iterable, func, /* optional */self) { + var m = MochiKit.Base; + if (arguments.length > 2) { + func = m.bind(func, self); + } + // fast path for array + if (m.isArrayLike(iterable)) { + try { + for (var i = 0; i < iterable.length; i++) { + func(iterable[i]); + } + } catch (e) { + if (e != MochiKit.Iter.StopIteration) { + throw e; + } + } + } else { + self = MochiKit.Iter; + self.exhaust(self.imap(func, iterable)); + } + }, + + /** @id MochiKit.Iter.every */ + every: function (iterable, func) { + var self = MochiKit.Iter; + try { + self.ifilterfalse(func, iterable).next(); + return false; + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + return true; + } + }, + + /** @id MochiKit.Iter.sorted */ + sorted: function (iterable, /* optional */cmp) { + var rval = MochiKit.Iter.list(iterable); + if (arguments.length == 1) { + cmp = MochiKit.Base.compare; + } + rval.sort(cmp); + return rval; + }, + + /** @id MochiKit.Iter.reversed */ + reversed: function (iterable) { + var rval = MochiKit.Iter.list(iterable); + rval.reverse(); + return rval; + }, + + /** @id MochiKit.Iter.some */ + some: function (iterable, func) { + var self = MochiKit.Iter; + try { + self.ifilter(func, iterable).next(); + return true; + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + return false; + } + }, + + /** @id MochiKit.Iter.iextend */ + iextend: function (lst, iterable) { + if (MochiKit.Base.isArrayLike(iterable)) { + // fast-path for array-like + for (var i = 0; i < iterable.length; i++) { + lst.push(iterable[i]); + } + } else { + var self = MochiKit.Iter; + iterable = self.iter(iterable); + try { + while (true) { + lst.push(iterable.next()); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + } + return lst; + }, + + /** @id MochiKit.Iter.groupby */ + groupby: function(iterable, /* optional */ keyfunc) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + if (arguments.length < 2) { + keyfunc = m.operator.identity; + } + iterable = self.iter(iterable); + + // shared + var pk = undefined; + var k = undefined; + var v; + + function fetch() { + v = iterable.next(); + k = keyfunc(v); + }; + + function eat() { + var ret = v; + v = undefined; + return ret; + }; + + var first = true; + var compare = m.compare; + return { + repr: function () { return "groupby(...)"; }, + next: function() { + // iterator-next + + // iterate until meet next group + while (compare(k, pk) === 0) { + fetch(); + if (first) { + first = false; + break; + } + } + pk = k; + return [k, { + next: function() { + // subiterator-next + if (v == undefined) { // Is there something to eat? + fetch(); + } + if (compare(k, pk) !== 0) { + throw self.StopIteration; + } + return eat(); + } + }]; + } + }; + }, + + /** @id MochiKit.Iter.groupby_as_array */ + groupby_as_array: function (iterable, /* optional */ keyfunc) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + if (arguments.length < 2) { + keyfunc = m.operator.identity; + } + + iterable = self.iter(iterable); + var result = []; + var first = true; + var prev_key; + var compare = m.compare; + while (true) { + try { + var value = iterable.next(); + var key = keyfunc(value); + } catch (e) { + if (e == self.StopIteration) { + break; + } + throw e; + } + if (first || compare(key, prev_key) !== 0) { + var values = []; + result.push([key, values]); + } + values.push(value); + first = false; + prev_key = key; + } + return result; + }, + + /** @id MochiKit.Iter.arrayLikeIter */ + arrayLikeIter: function (iterable) { + var i = 0; + return { + repr: function () { return "arrayLikeIter(...)"; }, + toString: MochiKit.Base.forwardCall("repr"), + next: function () { + if (i >= iterable.length) { + throw MochiKit.Iter.StopIteration; + } + return iterable[i++]; + } + }; + }, + + /** @id MochiKit.Iter.hasIterateNext */ + hasIterateNext: function (iterable) { + return (iterable && typeof(iterable.iterateNext) == "function"); + }, + + /** @id MochiKit.Iter.iterateNextIter */ + iterateNextIter: function (iterable) { + return { + repr: function () { return "iterateNextIter(...)"; }, + toString: MochiKit.Base.forwardCall("repr"), + next: function () { + var rval = iterable.iterateNext(); + if (rval === null || rval === undefined) { + throw MochiKit.Iter.StopIteration; + } + return rval; + } + }; + } +}); + + +MochiKit.Iter.EXPORT_OK = [ + "iteratorRegistry", + "arrayLikeIter", + "hasIterateNext", + "iterateNextIter", +]; + +MochiKit.Iter.EXPORT = [ + "StopIteration", + "registerIteratorFactory", + "iter", + "count", + "cycle", + "repeat", + "next", + "izip", + "ifilter", + "ifilterfalse", + "islice", + "imap", + "applymap", + "chain", + "takewhile", + "dropwhile", + "tee", + "list", + "reduce", + "range", + "sum", + "exhaust", + "forEach", + "every", + "sorted", + "reversed", + "some", + "iextend", + "groupby", + "groupby_as_array" +]; + +MochiKit.Iter.__new__ = function () { + var m = MochiKit.Base; + // Re-use StopIteration if exists (e.g. SpiderMonkey) + if (typeof(StopIteration) != "undefined") { + this.StopIteration = StopIteration; + } else { + /** @id MochiKit.Iter.StopIteration */ + this.StopIteration = new m.NamedError("StopIteration"); + } + this.iteratorRegistry = new m.AdapterRegistry(); + // Register the iterator factory for arrays + this.registerIteratorFactory( + "arrayLike", + m.isArrayLike, + this.arrayLikeIter + ); + + this.registerIteratorFactory( + "iterateNext", + this.hasIterateNext, + this.iterateNextIter + ); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); + +}; + +MochiKit.Iter.__new__(); + +// +// XXX: Internet Explorer blows +// +if (MochiKit.__export__) { + reduce = MochiKit.Iter.reduce; +} + +MochiKit.Base._exportSymbols(this, MochiKit.Iter); diff --git a/mochikit_v14/MochiKit/Logging.js b/mochikit_v14/MochiKit/Logging.js new file mode 100644 index 0000000..4d25c3e --- /dev/null +++ b/mochikit_v14/MochiKit/Logging.js @@ -0,0 +1,321 @@ +/*** + +MochiKit.Logging 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Logging'); + dojo.require('MochiKit.Base'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Logging depends on MochiKit.Base!"; +} + +if (typeof(MochiKit.Logging) == 'undefined') { + MochiKit.Logging = {}; +} + +MochiKit.Logging.NAME = "MochiKit.Logging"; +MochiKit.Logging.VERSION = "1.4"; +MochiKit.Logging.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +MochiKit.Logging.toString = function () { + return this.__repr__(); +}; + + +MochiKit.Logging.EXPORT = [ + "LogLevel", + "LogMessage", + "Logger", + "alertListener", + "logger", + "log", + "logError", + "logDebug", + "logFatal", + "logWarning" +]; + + +MochiKit.Logging.EXPORT_OK = [ + "logLevelAtLeast", + "isLogMessage", + "compareLogMessage" +]; + + +/** @id MochiKit.Logging.LogMessage */ +MochiKit.Logging.LogMessage = function (num, level, info) { + this.num = num; + this.level = level; + this.info = info; + this.timestamp = new Date(); +}; + +MochiKit.Logging.LogMessage.prototype = { + /** @id MochiKit.Logging.LogMessage.prototype.repr */ + repr: function () { + var m = MochiKit.Base; + return 'LogMessage(' + + m.map( + m.repr, + [this.num, this.level, this.info] + ).join(', ') + ')'; + }, + /** @id MochiKit.Logging.LogMessage.prototype.toString */ + toString: MochiKit.Base.forwardCall("repr") +}; + +MochiKit.Base.update(MochiKit.Logging, { + /** @id MochiKit.Logging.logLevelAtLeast */ + logLevelAtLeast: function (minLevel) { + var self = MochiKit.Logging; + if (typeof(minLevel) == 'string') { + minLevel = self.LogLevel[minLevel]; + } + return function (msg) { + var msgLevel = msg.level; + if (typeof(msgLevel) == 'string') { + msgLevel = self.LogLevel[msgLevel]; + } + return msgLevel >= minLevel; + }; + }, + + /** @id MochiKit.Logging.isLogMessage */ + isLogMessage: function (/* ... */) { + var LogMessage = MochiKit.Logging.LogMessage; + for (var i = 0; i < arguments.length; i++) { + if (!(arguments[i] instanceof LogMessage)) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Logging.compareLogMessage */ + compareLogMessage: function (a, b) { + return MochiKit.Base.compare([a.level, a.info], [b.level, b.info]); + }, + + /** @id MochiKit.Logging.alertListener */ + alertListener: function (msg) { + alert( + "num: " + msg.num + + "\nlevel: " + msg.level + + "\ninfo: " + msg.info.join(" ") + ); + } + +}); + +/** @id MochiKit.Logging.Logger */ +MochiKit.Logging.Logger = function (/* optional */maxSize) { + this.counter = 0; + if (typeof(maxSize) == 'undefined' || maxSize === null) { + maxSize = -1; + } + this.maxSize = maxSize; + this._messages = []; + this.listeners = {}; + this.useNativeConsole = false; +}; + +MochiKit.Logging.Logger.prototype = { + /** @id MochiKit.Logging.Logger.prototype.clear */ + clear: function () { + this._messages.splice(0, this._messages.length); + }, + + /** @id MochiKit.Logging.Logger.prototype.logToConsole */ + logToConsole: function (msg) { + if (typeof(window) != "undefined" && window.console + && window.console.log) { + // Safari and FireBug 0.4 + // Percent replacement is a workaround for cute Safari crashing bug + window.console.log(msg.replace(/%/g, '\uFF05')); + } else if (typeof(opera) != "undefined" && opera.postError) { + // Opera + opera.postError(msg); + } else if (typeof(printfire) == "function") { + // FireBug 0.3 and earlier + printfire(msg); + } else if (typeof(Debug) != "undefined" && Debug.writeln) { + // IE Web Development Helper (?) + // http://www.nikhilk.net/Entry.aspx?id=93 + Debug.writeln(msg); + } else if (typeof(debug) != "undefined" && debug.trace) { + // Atlas framework (?) + // http://www.nikhilk.net/Entry.aspx?id=93 + debug.trace(msg); + } + }, + + /** @id MochiKit.Logging.Logger.prototype.dispatchListeners */ + dispatchListeners: function (msg) { + for (var k in this.listeners) { + var pair = this.listeners[k]; + if (pair.ident != k || (pair[0] && !pair[0](msg))) { + continue; + } + pair[1](msg); + } + }, + + /** @id MochiKit.Logging.Logger.prototype.addListener */ + addListener: function (ident, filter, listener) { + if (typeof(filter) == 'string') { + filter = MochiKit.Logging.logLevelAtLeast(filter); + } + var entry = [filter, listener]; + entry.ident = ident; + this.listeners[ident] = entry; + }, + + /** @id MochiKit.Logging.Logger.prototype.removeListener */ + removeListener: function (ident) { + delete this.listeners[ident]; + }, + + /** @id MochiKit.Logging.Logger.prototype.baseLog */ + baseLog: function (level, message/*, ...*/) { + var msg = new MochiKit.Logging.LogMessage( + this.counter, + level, + MochiKit.Base.extend(null, arguments, 1) + ); + this._messages.push(msg); + this.dispatchListeners(msg); + if (this.useNativeConsole) { + this.logToConsole(msg.level + ": " + msg.info.join(" ")); + } + this.counter += 1; + while (this.maxSize >= 0 && this._messages.length > this.maxSize) { + this._messages.shift(); + } + }, + + /** @id MochiKit.Logging.Logger.prototype.getMessages */ + getMessages: function (howMany) { + var firstMsg = 0; + if (!(typeof(howMany) == 'undefined' || howMany === null)) { + firstMsg = Math.max(0, this._messages.length - howMany); + } + return this._messages.slice(firstMsg); + }, + + /** @id MochiKit.Logging.Logger.prototype.getMessageText */ + getMessageText: function (howMany) { + if (typeof(howMany) == 'undefined' || howMany === null) { + howMany = 30; + } + var messages = this.getMessages(howMany); + if (messages.length) { + var lst = map(function (m) { + return '\n [' + m.num + '] ' + m.level + ': ' + m.info.join(' '); + }, messages); + lst.unshift('LAST ' + messages.length + ' MESSAGES:'); + return lst.join(''); + } + return ''; + }, + + /** @id MochiKit.Logging.Logger.prototype.debuggingBookmarklet */ + debuggingBookmarklet: function (inline) { + if (typeof(MochiKit.LoggingPane) == "undefined") { + alert(this.getMessageText()); + } else { + MochiKit.LoggingPane.createLoggingPane(inline || false); + } + } +}; + +MochiKit.Logging.__new__ = function () { + this.LogLevel = { + ERROR: 40, + FATAL: 50, + WARNING: 30, + INFO: 20, + DEBUG: 10 + }; + + var m = MochiKit.Base; + m.registerComparator("LogMessage", + this.isLogMessage, + this.compareLogMessage + ); + + var partial = m.partial; + + var Logger = this.Logger; + var baseLog = Logger.prototype.baseLog; + m.update(this.Logger.prototype, { + debug: partial(baseLog, 'DEBUG'), + log: partial(baseLog, 'INFO'), + error: partial(baseLog, 'ERROR'), + fatal: partial(baseLog, 'FATAL'), + warning: partial(baseLog, 'WARNING') + }); + + // indirectly find logger so it can be replaced + var self = this; + var connectLog = function (name) { + return function () { + self.logger[name].apply(self.logger, arguments); + }; + }; + + /** @id MochiKit.Logging.log */ + this.log = connectLog('log'); + /** @id MochiKit.Logging.logError */ + this.logError = connectLog('error'); + /** @id MochiKit.Logging.logDebug */ + this.logDebug = connectLog('debug'); + /** @id MochiKit.Logging.logFatal */ + this.logFatal = connectLog('fatal'); + /** @id MochiKit.Logging.logWarning */ + this.logWarning = connectLog('warning'); + this.logger = new Logger(); + this.logger.useNativeConsole = true; + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); + +}; + +if (typeof(printfire) == "undefined" && + typeof(document) != "undefined" && document.createEvent && + typeof(dispatchEvent) != "undefined") { + // FireBug really should be less lame about this global function + printfire = function () { + printfire.args = arguments; + var ev = document.createEvent("Events"); + ev.initEvent("printfire", false, true); + dispatchEvent(ev); + }; +} + +MochiKit.Logging.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Logging); diff --git a/mochikit_v14/MochiKit/LoggingPane.js b/mochikit_v14/MochiKit/LoggingPane.js new file mode 100644 index 0000000..3798ae4 --- /dev/null +++ b/mochikit_v14/MochiKit/LoggingPane.js @@ -0,0 +1,374 @@ +/*** + +MochiKit.LoggingPane 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.LoggingPane'); + dojo.require('MochiKit.Logging'); + dojo.require('MochiKit.Base'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Logging", []); + JSAN.use("MochiKit.Base", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined' || typeof(MochiKit.Logging) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.LoggingPane depends on MochiKit.Base and MochiKit.Logging!"; +} + +if (typeof(MochiKit.LoggingPane) == 'undefined') { + MochiKit.LoggingPane = {}; +} + +MochiKit.LoggingPane.NAME = "MochiKit.LoggingPane"; +MochiKit.LoggingPane.VERSION = "1.4"; +MochiKit.LoggingPane.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +MochiKit.LoggingPane.toString = function () { + return this.__repr__(); +}; + +/** @id MochiKit.LoggingPane.createLoggingPane */ +MochiKit.LoggingPane.createLoggingPane = function (inline/* = false */) { + var m = MochiKit.LoggingPane; + inline = !(!inline); + if (m._loggingPane && m._loggingPane.inline != inline) { + m._loggingPane.closePane(); + m._loggingPane = null; + } + if (!m._loggingPane || m._loggingPane.closed) { + m._loggingPane = new m.LoggingPane(inline, MochiKit.Logging.logger); + } + return m._loggingPane; +}; + +/** @id MochiKit.LoggingPane.LoggingPane */ +MochiKit.LoggingPane.LoggingPane = function (inline/* = false */, logger/* = MochiKit.Logging.logger */) { + + /* Use a div if inline, pop up a window if not */ + /* Create the elements */ + if (typeof(logger) == "undefined" || logger === null) { + logger = MochiKit.Logging.logger; + } + this.logger = logger; + var update = MochiKit.Base.update; + var updatetree = MochiKit.Base.updatetree; + var bind = MochiKit.Base.bind; + var clone = MochiKit.Base.clone; + var win = window; + var uid = "_MochiKit_LoggingPane"; + if (typeof(MochiKit.DOM) != "undefined") { + win = MochiKit.DOM.currentWindow(); + } + if (!inline) { + // name the popup with the base URL for uniqueness + var url = win.location.href.split("?")[0].replace(/[#:\/.><&-]/g, "_"); + var name = uid + "_" + url; + var nwin = win.open("", name, "dependent,resizable,height=200"); + if (!nwin) { + alert("Not able to open debugging window due to pop-up blocking."); + return undefined; + } + nwin.document.write( + '' + + '[MochiKit.LoggingPane]' + + '' + ); + nwin.document.close(); + nwin.document.title += ' ' + win.document.title; + win = nwin; + } + var doc = win.document; + this.doc = doc; + + // Connect to the debug pane if it already exists (i.e. in a window orphaned by the page being refreshed) + var debugPane = doc.getElementById(uid); + var existing_pane = !!debugPane; + if (debugPane && typeof(debugPane.loggingPane) != "undefined") { + debugPane.loggingPane.logger = this.logger; + debugPane.loggingPane.buildAndApplyFilter(); + return debugPane.loggingPane; + } + + if (existing_pane) { + // clear any existing contents + var child; + while ((child = debugPane.firstChild)) { + debugPane.removeChild(child); + } + } else { + debugPane = doc.createElement("div"); + debugPane.id = uid; + } + debugPane.loggingPane = this; + var levelFilterField = doc.createElement("input"); + var infoFilterField = doc.createElement("input"); + var filterButton = doc.createElement("button"); + var loadButton = doc.createElement("button"); + var clearButton = doc.createElement("button"); + var closeButton = doc.createElement("button"); + var logPaneArea = doc.createElement("div"); + var logPane = doc.createElement("div"); + + /* Set up the functions */ + var listenerId = uid + "_Listener"; + this.colorTable = clone(this.colorTable); + var messages = []; + var messageFilter = null; + + /** @id MochiKit.LoggingPane.messageLevel */ + var messageLevel = function (msg) { + var level = msg.level; + if (typeof(level) == "number") { + level = MochiKit.Logging.LogLevel[level]; + } + return level; + }; + + /** @id MochiKit.LoggingPane.messageText */ + var messageText = function (msg) { + return msg.info.join(" "); + }; + + /** @id MochiKit.LoggingPane.addMessageText */ + var addMessageText = bind(function (msg) { + var level = messageLevel(msg); + var text = messageText(msg); + var c = this.colorTable[level]; + var p = doc.createElement("span"); + p.className = "MochiKit-LogMessage MochiKit-LogLevel-" + level; + p.style.cssText = "margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: " + c; + p.appendChild(doc.createTextNode(level + ": " + text)); + logPane.appendChild(p); + logPane.appendChild(doc.createElement("br")); + if (logPaneArea.offsetHeight > logPaneArea.scrollHeight) { + logPaneArea.scrollTop = 0; + } else { + logPaneArea.scrollTop = logPaneArea.scrollHeight; + } + }, this); + + /** @id MochiKit.LoggingPane.addMessage */ + var addMessage = function (msg) { + messages[messages.length] = msg; + addMessageText(msg); + }; + + /** @id MochiKit.LoggingPane.buildMessageFilter */ + var buildMessageFilter = function () { + var levelre, infore; + try { + /* Catch any exceptions that might arise due to invalid regexes */ + levelre = new RegExp(levelFilterField.value); + infore = new RegExp(infoFilterField.value); + } catch(e) { + /* If there was an error with the regexes, do no filtering */ + logDebug("Error in filter regex: " + e.message); + return null; + } + + return function (msg) { + return ( + levelre.test(messageLevel(msg)) && + infore.test(messageText(msg)) + ); + }; + }; + + /** @id MochiKit.LoggingPane.clearMessagePane */ + var clearMessagePane = function () { + while (logPane.firstChild) { + logPane.removeChild(logPane.firstChild); + } + }; + + /** @id MochiKit.LoggingPane.clearMessages */ + var clearMessages = function () { + messages = []; + clearMessagePane(); + }; + + /** @id MochiKit.LoggingPane.closePane */ + var closePane = bind(function () { + if (this.closed) { + return; + } + this.closed = true; + if (MochiKit.LoggingPane._loggingPane == this) { + MochiKit.LoggingPane._loggingPane = null; + } + this.logger.removeListener(listenerId); + try { + try { + debugPane.loggingPane = null; + } catch(e) { logFatal("Bookmarklet was closed incorrectly."); } + if (inline) { + debugPane.parentNode.removeChild(debugPane); + } else { + this.win.close(); + } + } catch(e) {} + }, this); + + /** @id MochiKit.LoggingPane.filterMessages */ + var filterMessages = function () { + clearMessagePane(); + + for (var i = 0; i < messages.length; i++) { + var msg = messages[i]; + if (messageFilter === null || messageFilter(msg)) { + addMessageText(msg); + } + } + }; + + this.buildAndApplyFilter = function () { + messageFilter = buildMessageFilter(); + + filterMessages(); + + this.logger.removeListener(listenerId); + this.logger.addListener(listenerId, messageFilter, addMessage); + }; + + + /** @id MochiKit.LoggingPane.loadMessages */ + var loadMessages = bind(function () { + messages = this.logger.getMessages(); + filterMessages(); + }, this); + + /** @id MochiKit.LoggingPane.filterOnEnter */ + var filterOnEnter = bind(function (event) { + event = event || window.event; + key = event.which || event.keyCode; + if (key == 13) { + this.buildAndApplyFilter(); + } + }, this); + + /* Create the debug pane */ + var style = "display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: " + this.logFont; + if (inline) { + style += "; height: 10em; border-top: 2px solid black"; + } else { + style += "; height: 100%;"; + } + debugPane.style.cssText = style; + + if (!existing_pane) { + doc.body.appendChild(debugPane); + } + + /* Create the filter fields */ + style = {"cssText": "width: 33%; display: inline; font: " + this.logFont}; + + updatetree(levelFilterField, { + "value": "FATAL|ERROR|WARNING|INFO|DEBUG", + "onkeypress": filterOnEnter, + "style": style + }); + debugPane.appendChild(levelFilterField); + + updatetree(infoFilterField, { + "value": ".*", + "onkeypress": filterOnEnter, + "style": style + }); + debugPane.appendChild(infoFilterField); + + /* Create the buttons */ + style = "width: 8%; display:inline; font: " + this.logFont; + + filterButton.appendChild(doc.createTextNode("Filter")); + filterButton.onclick = bind("buildAndApplyFilter", this); + filterButton.style.cssText = style; + debugPane.appendChild(filterButton); + + loadButton.appendChild(doc.createTextNode("Load")); + loadButton.onclick = loadMessages; + loadButton.style.cssText = style; + debugPane.appendChild(loadButton); + + clearButton.appendChild(doc.createTextNode("Clear")); + clearButton.onclick = clearMessages; + clearButton.style.cssText = style; + debugPane.appendChild(clearButton); + + closeButton.appendChild(doc.createTextNode("Close")); + closeButton.onclick = closePane; + closeButton.style.cssText = style; + debugPane.appendChild(closeButton); + + /* Create the logging pane */ + logPaneArea.style.cssText = "overflow: auto; width: 100%"; + logPane.style.cssText = "width: 100%; height: " + (inline ? "8em" : "100%"); + + logPaneArea.appendChild(logPane); + debugPane.appendChild(logPaneArea); + + this.buildAndApplyFilter(); + loadMessages(); + + if (inline) { + this.win = undefined; + } else { + this.win = win; + } + this.inline = inline; + this.closePane = closePane; + this.closed = false; + + + return this; +}; + +MochiKit.LoggingPane.LoggingPane.prototype = { + "logFont": "8pt Verdana,sans-serif", + "colorTable": { + "ERROR": "red", + "FATAL": "darkred", + "WARNING": "blue", + "INFO": "black", + "DEBUG": "green" + } +}; + + +MochiKit.LoggingPane.EXPORT_OK = [ + "LoggingPane" +]; + +MochiKit.LoggingPane.EXPORT = [ + "createLoggingPane" +]; + +MochiKit.LoggingPane.__new__ = function () { + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": MochiKit.Base.concat(this.EXPORT, this.EXPORT_OK) + }; + + MochiKit.Base.nameFunctions(this); + + MochiKit.LoggingPane._loggingPane = null; + +}; + +MochiKit.LoggingPane.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.LoggingPane); diff --git a/mochikit_v14/MochiKit/MochiKit.js b/mochikit_v14/MochiKit/MochiKit.js new file mode 100644 index 0000000..3a13b24 --- /dev/null +++ b/mochikit_v14/MochiKit/MochiKit.js @@ -0,0 +1,154 @@ +/*** + +MochiKit.MochiKit 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(MochiKit) == 'undefined') { + MochiKit = {}; +} + +if (typeof(MochiKit.MochiKit) == 'undefined') { + /** @id MochiKit.MochiKit */ + MochiKit.MochiKit = {}; +} + +MochiKit.MochiKit.NAME = "MochiKit.MochiKit"; +MochiKit.MochiKit.VERSION = "1.4"; +MochiKit.MochiKit.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +/** @id MochiKit.MochiKit.toString */ +MochiKit.MochiKit.toString = function () { + return this.__repr__(); +}; + +/** @id MochiKit.MochiKit.SUBMODULES */ +MochiKit.MochiKit.SUBMODULES = [ + "Base", + "Iter", + "Logging", + "DateTime", + "Format", + "Async", + "DOM", + "Selector", + "Style", + "LoggingPane", + "Color", + "Signal", + "Position", + "Visual" +]; + +if (typeof(JSAN) != 'undefined' || typeof(dojo) != 'undefined') { + if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.MochiKit'); + dojo.require("MochiKit.*"); + } + if (typeof(JSAN) != 'undefined') { + (function (lst) { + for (var i = 0; i < lst.length; i++) { + JSAN.use("MochiKit." + lst[i], []); + } + })(MochiKit.MochiKit.SUBMODULES); + } + (function () { + var extend = MochiKit.Base.extend; + var self = MochiKit.MochiKit; + var modules = self.SUBMODULES; + var EXPORT = []; + var EXPORT_OK = []; + var EXPORT_TAGS = {}; + var i, k, m, all; + for (i = 0; i < modules.length; i++) { + m = MochiKit[modules[i]]; + extend(EXPORT, m.EXPORT); + extend(EXPORT_OK, m.EXPORT_OK); + for (k in m.EXPORT_TAGS) { + EXPORT_TAGS[k] = extend(EXPORT_TAGS[k], m.EXPORT_TAGS[k]); + } + all = m.EXPORT_TAGS[":all"]; + if (!all) { + all = extend(null, m.EXPORT, m.EXPORT_OK); + } + var j; + for (j = 0; j < all.length; j++) { + k = all[j]; + self[k] = m[k]; + } + } + self.EXPORT = EXPORT; + self.EXPORT_OK = EXPORT_OK; + self.EXPORT_TAGS = EXPORT_TAGS; + }()); + +} else { + if (typeof(MochiKit.__compat__) == 'undefined') { + MochiKit.__compat__ = true; + } + (function () { + if (typeof(document) == "undefined") { + return; + } + var scripts = document.getElementsByTagName("script"); + var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + var base = null; + var baseElem = null; + var allScripts = {}; + var i; + for (i = 0; i < scripts.length; i++) { + var src = scripts[i].getAttribute("src"); + if (!src) { + continue; + } + allScripts[src] = true; + if (src.match(/MochiKit.js$/)) { + base = src.substring(0, src.lastIndexOf('MochiKit.js')); + baseElem = scripts[i]; + } + } + if (base === null) { + return; + } + var modules = MochiKit.MochiKit.SUBMODULES; + for (var i = 0; i < modules.length; i++) { + if (MochiKit[modules[i]]) { + continue; + } + var uri = base + modules[i] + '.js'; + if (uri in allScripts) { + continue; + } + if (document.documentElement && + document.documentElement.namespaceURI == kXULNSURI) { + // XUL + var s = document.createElementNS(kXULNSURI, 'script'); + s.setAttribute("id", "MochiKit_" + base + modules[i]); + s.setAttribute("src", uri); + s.setAttribute("type", "application/x-javascript"); + baseElem.parentNode.appendChild(s); + } else { + // HTML + /* + DOM can not be used here because Safari does + deferred loading of scripts unless they are + in the document or inserted with document.write + + This is not XHTML compliant. If you want XHTML + compliance then you must use the packed version of MochiKit + or include each script individually (basically unroll + these document.write calls into your XHTML source) + + */ + document.write(''); + } + }; + })(); +} diff --git a/mochikit_v14/MochiKit/MockDOM.js b/mochikit_v14/MochiKit/MockDOM.js new file mode 100644 index 0000000..92558cb --- /dev/null +++ b/mochikit_v14/MochiKit/MockDOM.js @@ -0,0 +1,115 @@ +/*** + +MochiKit.MockDOM 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(MochiKit) == "undefined") { + MochiKit = {}; +} + +if (typeof(MochiKit.MockDOM) == "undefined") { + MochiKit.MockDOM = {}; +} + +MochiKit.MockDOM.NAME = "MochiKit.MockDOM"; +MochiKit.MockDOM.VERSION = "1.4"; + +MochiKit.MockDOM.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +/** @id MochiKit.MockDOM.toString */ +MochiKit.MockDOM.toString = function () { + return this.__repr__(); +}; + +/** @id MochiKit.MockDOM.createDocument */ +MochiKit.MockDOM.createDocument = function () { + var doc = new MochiKit.MockDOM.MockElement("DOCUMENT"); + doc.body = doc.createElement("BODY"); + doc.appendChild(doc.body); + return doc; +}; + +/** @id MochiKit.MockDOM.MockElement */ +MochiKit.MockDOM.MockElement = function (name, data, ownerDocument) { + this.tagName = this.nodeName = name.toUpperCase(); + this.ownerDocument = ownerDocument || null; + if (name == "DOCUMENT") { + this.nodeType = 9; + this.childNodes = []; + } else if (typeof(data) == "string") { + this.nodeValue = data; + this.nodeType = 3; + } else { + this.nodeType = 1; + this.childNodes = []; + } + if (name.substring(0, 1) == "<") { + var nameattr = name.substring( + name.indexOf('"') + 1, name.lastIndexOf('"')); + name = name.substring(1, name.indexOf(" ")); + this.tagName = this.nodeName = name.toUpperCase(); + this.setAttribute("name", nameattr); + } +}; + +MochiKit.MockDOM.MockElement.prototype = { + /** @id MochiKit.MockDOM.MockElement.prototype.createElement */ + createElement: function (tagName) { + return new MochiKit.MockDOM.MockElement(tagName, null, this.nodeType == 9 ? this : this.ownerDocument); + }, + /** @id MochiKit.MockDOM.MockElement.prototype.createTextNode */ + createTextNode: function (text) { + return new MochiKit.MockDOM.MockElement("text", text, this.nodeType == 9 ? this : this.ownerDocument); + }, + /** @id MochiKit.MockDOM.MockElement.prototype.setAttribute */ + setAttribute: function (name, value) { + this[name] = value; + }, + /** @id MochiKit.MockDOM.MockElement.prototype.getAttribute */ + getAttribute: function (name) { + return this[name]; + }, + /** @id MochiKit.MockDOM.MockElement.prototype.appendChild */ + appendChild: function (child) { + this.childNodes.push(child); + }, + /** @id MochiKit.MockDOM.MockElement.prototype.toString */ + toString: function () { + return "MockElement(" + this.tagName + ")"; + }, + /** @id MochiKit.MockDOM.MockElement.prototype.getElementsByTagName */ + getElementsByTagName: function (tagName) { + var foundElements = []; + MochiKit.Base.nodeWalk(this, function(node){ + if (tagName == '*' || tagName == node.tagName) { + foundElements.push(node); + return node.childNodes; + } + }); + return foundElements; + } +}; + + /** @id MochiKit.MockDOM.EXPORT_OK */ +MochiKit.MockDOM.EXPORT_OK = [ + "mockElement", + "createDocument" +]; + + /** @id MochiKit.MockDOM.EXPORT */ +MochiKit.MockDOM.EXPORT = [ + "document" +]; + +MochiKit.MockDOM.__new__ = function () { + this.document = this.createDocument(); +}; + +MochiKit.MockDOM.__new__(); diff --git a/mochikit_v14/MochiKit/Position.js b/mochikit_v14/MochiKit/Position.js new file mode 100644 index 0000000..23b0f18 --- /dev/null +++ b/mochikit_v14/MochiKit/Position.js @@ -0,0 +1,258 @@ +/*** + +MochiKit.Position 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005-2006 Bob Ippolito and others. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Position'); + dojo.require('MochiKit.Base'); + dojo.require('MochiKit.DOM'); + dojo.require('MochiKit.Style'); +} +if (typeof(JSAN) != 'undefined') { + JSAN.use('MochiKit.Base', []); + JSAN.use('MochiKit.DOM', []); + JSAN.use('MochiKit.Style', []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined' || + typeof(MochiKit.Style) == 'undefined' || + typeof(MochiKit.DOM) == 'undefined') { + throw ''; + } +} catch (e) { + throw 'MochiKit.Style depends on MochiKit.Base, MochiKit.DOM, and MochiKit.Style!'; +} + +if (typeof(MochiKit.Position) == 'undefined') { + MochiKit.Position = {}; +} + +MochiKit.Position.NAME = 'MochiKit.Position'; +MochiKit.Position.VERSION = '1.4'; +MochiKit.Position.__repr__ = function () { + return '[' + this.NAME + ' ' + this.VERSION + ']'; +}; +MochiKit.Position.toString = function () { + return this.__repr__(); +}; + +MochiKit.Position.EXPORT_OK = []; + +MochiKit.Position.EXPORT = [ +]; + + +MochiKit.Base.update(MochiKit.Position, { + // set to true if needed, warning: firefox performance problems + // NOT neeeded for page scrolling, only if draggable contained in + // scrollable elements + includeScrollOffsets: false, + + /** @id MochiKit.Position.prepare */ + prepare: function () { + var deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + var deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY); + }, + + /** @id MochiKit.Position.cumulativeOffset */ + cumulativeOffset: function (element) { + var valueT = 0; + var valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return new MochiKit.Style.Coordinates(valueL, valueT); + }, + + /** @id MochiKit.Position.realOffset */ + realOffset: function (element) { + var valueT = 0; + var valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return new MochiKit.Style.Coordinates(valueL, valueT); + }, + + /** @id MochiKit.Position.within */ + 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); + if (element.style.position == "fixed") { + this.offset.x += this.windowOffset.x; + this.offset.y += this.windowOffset.y; + } + + return (y >= this.offset.y && + y < this.offset.y + element.offsetHeight && + x >= this.offset.x && + x < this.offset.x + element.offsetWidth); + }, + + /** @id MochiKit.Position.withinIncludingScrolloffsets */ + withinIncludingScrolloffsets: function (element, x, y) { + var offsetcache = this.realOffset(element); + + this.xcomp = x + offsetcache.x - this.windowOffset.x; + this.ycomp = y + offsetcache.y - this.windowOffset.y; + this.offset = this.cumulativeOffset(element); + + return (this.ycomp >= this.offset.y && + this.ycomp < this.offset.y + element.offsetHeight && + this.xcomp >= this.offset.x && + this.xcomp < this.offset.x + element.offsetWidth); + }, + + // within must be called directly before + /** @id MochiKit.Position.overlap */ + overlap: function (mode, element) { + if (!mode) { + return 0; + } + if (mode == 'vertical') { + return ((this.offset.y + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + } + if (mode == 'horizontal') { + return ((this.offset.x + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + } + }, + + /** @id MochiKit.Position.absolutize */ + absolutize: function (element) { + element = MochiKit.DOM.getElement(element); + if (element.style.position == 'absolute') { + return; + } + MochiKit.Position.prepare(); + + var offsets = MochiKit.Position.positionedOffset(element); + var width = element.clientWidth; + var height = element.clientHeight; + + var oldStyle = { + 'position': element.style.position, + 'left': offsets.x - parseFloat(element.style.left || 0), + 'top': offsets.y - parseFloat(element.style.top || 0), + 'width': element.style.width, + 'height': element.style.height + }; + + element.style.position = 'absolute'; + element.style.top = offsets.y + 'px'; + element.style.left = offsets.x + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + + return oldStyle; + }, + + /** @id MochiKit.Position.positionedOffset */ + positionedOffset: function (element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + p = MochiKit.Style.getStyle(element, 'position'); + if (p == 'relative' || p == 'absolute') { + break; + } + } + } while (element); + return new MochiKit.Style.Coordinates(valueL, valueT); + }, + + /** @id MochiKit.Position.relativize */ + relativize: function (element, oldPos) { + element = MochiKit.DOM.getElement(element); + if (element.style.position == 'relative') { + return; + } + MochiKit.Position.prepare(); + + var top = parseFloat(element.style.top || 0) - + (oldPos['top'] || 0); + var left = parseFloat(element.style.left || 0) - + (oldPos['left'] || 0); + + element.style.position = oldPos['position']; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = oldPos['width']; + element.style.height = oldPos['height']; + }, + + /** @id MochiKit.Position.clone */ + clone: function (source, target) { + source = MochiKit.DOM.getElement(source); + target = MochiKit.DOM.getElement(target); + target.style.position = 'absolute'; + var offsets = this.cumulativeOffset(source); + target.style.top = offsets.y + 'px'; + target.style.left = offsets.x + 'px'; + target.style.width = source.offsetWidth + 'px'; + target.style.height = source.offsetHeight + 'px'; + }, + + /** @id MochiKit.Position.page */ + page: function (forElement) { + var valueT = 0; + var valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent == document.body && MochiKit.Style.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 new MochiKit.Style.Coordinates(valueL, valueT); + } +}); + +MochiKit.Position.__new__ = function (win) { + var m = MochiKit.Base; + this.EXPORT_TAGS = { + ':common': this.EXPORT, + ':all': m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); +}; + +MochiKit.Position.__new__(this); \ No newline at end of file diff --git a/mochikit_v14/MochiKit/Selector.js b/mochikit_v14/MochiKit/Selector.js new file mode 100644 index 0000000..f5d1afa --- /dev/null +++ b/mochikit_v14/MochiKit/Selector.js @@ -0,0 +1,431 @@ +/*** + +MochiKit.Selector 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Selector'); + dojo.require('MochiKit.Base'); + dojo.require('MochiKit.DOM'); + dojo.require('MochiKit.Iter'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); + JSAN.use("MochiKit.DOM", []); + JSAN.use("MochiKit.Iter", []); +} + +try { + if (typeof(MochiKit.Base) === 'undefined' || + typeof(MochiKit.DOM) === 'undefined' || + typeof(MochiKit.Iter) === 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Selector depends on MochiKit.Base, MochiKit.DOM and MochiKit.Iter!"; +} + +if (typeof(MochiKit.Selector) == 'undefined') { + MochiKit.Selector = {}; +} + +MochiKit.Selector.NAME = "MochiKit.Selector"; + +MochiKit.Selector.VERSION = "1.4"; + +MochiKit.Selector.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +MochiKit.Selector.toString = function () { + return this.__repr__(); +}; + +MochiKit.Selector.EXPORT = [ + "Selector", + "findChildElements", + "findDocElements", + "$$" +]; + +MochiKit.Selector.EXPORT_OK = [ +]; + +MochiKit.Selector.Selector = function (expression) { + this.params = {classNames: [], pseudoClassNames: []}; + this.expression = expression.toString().replace(/(^\s+|\s+$)/g, ''); + this.parseExpression(); + this.compileMatcher(); +}; + +MochiKit.Selector.Selector.prototype = { + /*** + + Selector class: convenient object to make CSS selections. + + ***/ + __class__: MochiKit.Selector.Selector, + + /** @id MochiKit.Selector.Selector.prototype.parseExpression */ + parseExpression: function () { + function abort(message) { + throw 'Parse error in selector: ' + message; + } + + if (this.expression == '') { + abort('empty expression'); + } + + var repr = MochiKit.Base.repr; + var params = this.params; + var expr = this.expression; + var match, modifier, clause, rest; + while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!^$*]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { + params.attributes = params.attributes || []; + params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); + expr = match[1]; + } + + if (expr == '*') { + return this.params.wildcard = true; + } + + while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+(?:\([^)]*\))?)(.*)/i)) { + modifier = match[1]; + clause = match[2]; + rest = match[3]; + switch (modifier) { + case '#': + params.id = clause; + break; + case '.': + params.classNames.push(clause); + break; + case ':': + params.pseudoClassNames.push(clause); + break; + case '': + case undefined: + params.tagName = clause.toUpperCase(); + break; + default: + abort(repr(expr)); + } + expr = rest; + } + + if (expr.length > 0) { + abort(repr(expr)); + } + }, + + /** @id MochiKit.Selector.Selector.prototype.buildMatchExpression */ + buildMatchExpression: function () { + var repr = MochiKit.Base.repr; + var params = this.params; + var conditions = []; + var clause, i; + + function childElements(element) { + return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, " + element + ".childNodes)"; + } + + if (params.wildcard) { + conditions.push('true'); + } + if (clause = params.id) { + conditions.push('element.id == ' + repr(clause)); + } + if (clause = params.tagName) { + conditions.push('element.tagName.toUpperCase() == ' + repr(clause)); + } + if ((clause = params.classNames).length > 0) { + for (i = 0; i < clause.length; i++) { + conditions.push('MochiKit.DOM.hasElementClass(element, ' + repr(clause[i]) + ')'); + } + } + if ((clause = params.pseudoClassNames).length > 0) { + for (i = 0; i < clause.length; i++) { + var match = clause[i].match(/^([^(]+)(?:\((.*)\))?$/); + var pseudoClass = match[1]; + var pseudoClassArgument = match[2]; + switch (pseudoClass) { + case 'root': + conditions.push('element.nodeType == 9 || element === element.ownerDocument.documentElement'); break; + case 'nth-child': + case 'nth-last-child': + case 'nth-of-type': + case 'nth-last-of-type': + match = pseudoClassArgument.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/); + if (!match) { + throw "Invalid argument to pseudo element nth-child: " + pseudoClassArgument; + } + var a, b; + if (match[0] == 'odd') { + a = 2; + b = 1; + } else if (match[0] == 'even') { + a = 2; + b = 0; + } else { + a = match[2] && parseInt(match) || null; + b = parseInt(match[3]); + } + conditions.push('this.nthChild(element,' + a + ',' + b + + ',' + !!pseudoClass.match('^nth-last') // Reverse + + ',' + !!pseudoClass.match('of-type$') // Restrict to same tagName + + ')'); + break; + case 'first-child': + conditions.push('this.nthChild(element, null, 1)'); + break; + case 'last-child': + conditions.push('this.nthChild(element, null, 1, true)'); + break; + case 'first-of-type': + conditions.push('this.nthChild(element, null, 1, false, true)'); + break; + case 'last-of-type': + conditions.push('this.nthChild(element, null, 1, true, true)'); + break; + case 'only-child': + conditions.push(childElements('element.parentNode') + '.length == 1'); + break; + case 'only-of-type': + conditions.push('MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, ' + childElements('element.parentNode') + ').length == 1'); + break; + case 'empty': + conditions.push('element.childNodes.length == 0'); + break; + case 'enabled': + conditions.push('(this.isUIElement(element) && element.disabled === false)'); + break; + case 'disabled': + conditions.push('(this.isUIElement(element) && element.disabled === true)'); + break; + case 'checked': + conditions.push('(this.isUIElement(element) && element.checked === true)'); + break; + case 'not': + var subselector = new MochiKit.Selector.Selector(pseudoClassArgument); + conditions.push('!( ' + subselector.buildMatchExpression() + ')') + break; + } + } + } + if (clause = params.attributes) { + MochiKit.Base.map(function (attribute) { + var value = 'MochiKit.DOM.getNodeAttribute(element, ' + repr(attribute.name) + ')'; + var splitValueBy = function (delimiter) { + return value + '.split(' + repr(delimiter) + ')'; + } + + switch (attribute.operator) { + case '=': + conditions.push(value + ' == ' + repr(attribute.value)); + break; + case '~=': + conditions.push(value + ' && MochiKit.Base.findValue(' + splitValueBy(' ') + ', ' + repr(attribute.value) + ') > -1'); + break; + case '^=': + conditions.push(value + '.substring(0, ' + attribute.value.length + ') == ' + repr(attribute.value)); + break; + case '$=': + conditions.push(value + '.substring(' + value + '.length - ' + attribute.value.length + ') == ' + repr(attribute.value)); + break; + case '*=': + conditions.push(value + '.match(' + repr(attribute.value) + ')'); + break; + case '|=': + conditions.push( + value + ' && ' + splitValueBy('-') + '[0].toUpperCase() == ' + repr(attribute.value.toUpperCase()) + ); + break; + case '!=': + conditions.push(value + ' != ' + repr(attribute.value)); + break; + case '': + case undefined: + conditions.push(value + ' != null'); + break; + default: + throw 'Unknown operator ' + attribute.operator + ' in selector'; + } + }, clause); + } + + return conditions.join(' && '); + }, + + /** @id MochiKit.Selector.Selector.prototype.compileMatcher */ + compileMatcher: function () { + this.match = new Function('element', 'if (!element.tagName) return false; \ + return ' + this.buildMatchExpression()); + }, + + /** @id MochiKit.Selector.Selector.prototype.nthChild */ + nthChild: function (element, a, b, reverse, sametag){ + var siblings = MochiKit.Base.filter(function (node) { + return node.nodeType == 1; + }, element.parentNode.childNodes); + if (sametag) { + siblings = MochiKit.Base.filter(function (node) { + return node.tagName == element.tagName; + }, siblings); + } + if (reverse) { + siblings = MochiKit.Iter.reversed(siblings); + } + if (a) { + var actualIndex = MochiKit.Base.findIdentical(siblings, element); + return ((actualIndex + 1 - b) / a) % 1 == 0; + } else { + return b == MochiKit.Base.findIdentical(siblings, element) + 1; + } + }, + + /** @id MochiKit.Selector.Selector.prototype.isUIElement */ + isUIElement: function (element) { + return MochiKit.Base.findValue(['input', 'button', 'select', 'option', 'textarea', 'object'], + element.tagName.toLowerCase()) > -1; + }, + + /** @id MochiKit.Selector.Selector.prototype.findElements */ + findElements: function (scope, axis) { + var element; + + if (axis == undefined) { + axis = ""; + } + + function inScope(element, scope) { + if (axis == "") { + return MochiKit.DOM.isChildNode(element, scope); + } else if (axis == ">") { + return element.parentNode == scope; + } else if (axis == "+") { + return element == nextSiblingElement(scope); + } else if (axis == "~") { + var sibling = scope; + while (sibling = nextSiblingElement(sibling)) { + if (element == sibling) { + return true; + } + } + return false; + } else { + throw "Invalid axis: " + axis; + } + } + + if (element = MochiKit.DOM.getElement(this.params.id)) { + if (this.match(element)) { + if (!scope || inScope(element, scope)) { + return [element]; + } + } + } + + function nextSiblingElement(node) { + node = node.nextSibling; + while (node && node.nodeType != 1) { + node = node.nextSibling; + } + return node; + } + + if (axis == "") { + scope = (scope || MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName || '*'); + } else if (axis == ">") { + if (!scope) { + throw "> combinator not allowed without preceeding expression"; + } + scope = MochiKit.Base.filter(function (node) { + return node.nodeType == 1; + }, scope.childNodes); + } else if (axis == "+") { + if (!scope) { + throw "+ combinator not allowed without preceeding expression"; + } + scope = nextSiblingElement(scope) && [nextSiblingElement(scope)]; + } else if (axis == "~") { + if (!scope) { + throw "~ combinator not allowed without preceeding expression"; + } + var newscope = []; + while (nextSiblingElement(scope)) { + scope = nextSiblingElement(scope); + newscope.push(scope); + } + scope = newscope; + } + + if (!scope) { + return []; + } + + var results = MochiKit.Base.filter(MochiKit.Base.bind(function (scopeElt) { + return this.match(scopeElt); + }, this), scope); + + return results; + }, + + /** @id MochiKit.Selector.Selector.prototype.repr */ + repr: function () { + return 'Selector(' + this.expression + ')'; + }, + + toString: MochiKit.Base.forwardCall("repr") +}; + +MochiKit.Base.update(MochiKit.Selector, { + + /** @id MochiKit.Selector.findChildElements */ + findChildElements: function (element, expressions) { + return MochiKit.Base.flattenArray(MochiKit.Base.map(function (expression) { + var nextScope = ""; + return MochiKit.Iter.reduce(function (results, expr) { + if (match = expr.match(/^[>+~]$/)) { + nextScope = match[0]; + return results; + } else { + var selector = new MochiKit.Selector.Selector(expr); + var elements = MochiKit.Iter.reduce(function (elements, result) { + return MochiKit.Base.extend(elements, selector.findElements(result || element, nextScope)); + }, results, []); + nextScope = ""; + return elements; + } + }, expression.replace(/(^\s+|\s+$)/g, '').split(/\s+/), [null]); + }, expressions)); + }, + + findDocElements: function () { + return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(), arguments); + }, + + __new__: function () { + var m = MochiKit.Base; + + this.$$ = this.findDocElements; + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); + } +}); + +MochiKit.Selector.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Selector); + diff --git a/mochikit_v14/MochiKit/Signal.js b/mochikit_v14/MochiKit/Signal.js new file mode 100644 index 0000000..7293841 --- /dev/null +++ b/mochikit_v14/MochiKit/Signal.js @@ -0,0 +1,898 @@ +/*** + +MochiKit.Signal 1.4 + +See for documentation, downloads, license, etc. + +(c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Signal'); + dojo.require('MochiKit.Base'); + dojo.require('MochiKit.DOM'); + dojo.require('MochiKit.Style'); +} +if (typeof(JSAN) != 'undefined') { + JSAN.use('MochiKit.Base', []); + JSAN.use('MochiKit.DOM', []); + JSAN.use('MochiKit.Style', []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined') { + throw ''; + } +} catch (e) { + throw 'MochiKit.Signal depends on MochiKit.Base!'; +} + +try { + if (typeof(MochiKit.DOM) == 'undefined') { + throw ''; + } +} catch (e) { + throw 'MochiKit.Signal depends on MochiKit.DOM!'; +} + +try { + if (typeof(MochiKit.Style) == 'undefined') { + throw ''; + } +} catch (e) { + throw 'MochiKit.Signal depends on MochiKit.Style!'; +} + +if (typeof(MochiKit.Signal) == 'undefined') { + MochiKit.Signal = {}; +} + +MochiKit.Signal.NAME = 'MochiKit.Signal'; +MochiKit.Signal.VERSION = '1.4'; + +MochiKit.Signal._observers = []; + +/** @id MochiKit.Signal.Event */ +MochiKit.Signal.Event = function (src, e) { + this._event = e || window.event; + this._src = src; +}; + +MochiKit.Base.update(MochiKit.Signal.Event.prototype, { + + __repr__: function () { + var repr = MochiKit.Base.repr; + var str = '{event(): ' + repr(this.event()) + + ', src(): ' + repr(this.src()) + + ', type(): ' + repr(this.type()) + + ', target(): ' + repr(this.target()); + + if (this.type() && + this.type().indexOf('key') === 0 || + this.type().indexOf('mouse') === 0 || + this.type().indexOf('click') != -1 || + this.type() == 'contextmenu') { + str += ', modifier(): ' + '{alt: ' + repr(this.modifier().alt) + + ', ctrl: ' + repr(this.modifier().ctrl) + + ', meta: ' + repr(this.modifier().meta) + + ', shift: ' + repr(this.modifier().shift) + + ', any: ' + repr(this.modifier().any) + '}'; + } + + if (this.type() && this.type().indexOf('key') === 0) { + str += ', key(): {code: ' + repr(this.key().code) + + ', string: ' + repr(this.key().string) + '}'; + } + + if (this.type() && ( + this.type().indexOf('mouse') === 0 || + this.type().indexOf('click') != -1 || + this.type() == 'contextmenu')) { + + str += ', mouse(): {page: ' + repr(this.mouse().page) + + ', client: ' + repr(this.mouse().client); + + if (this.type() != 'mousemove') { + str += ', button: {left: ' + repr(this.mouse().button.left) + + ', middle: ' + repr(this.mouse().button.middle) + + ', right: ' + repr(this.mouse().button.right) + '}}'; + } else { + str += '}'; + } + } + if (this.type() == 'mouseover' || this.type() == 'mouseout') { + str += ', relatedTarget(): ' + repr(this.relatedTarget()); + } + str += '}'; + return str; + }, + + /** @id MochiKit.Signal.Event.prototype.toString */ + toString: function () { + return this.__repr__(); + }, + + /** @id MochiKit.Signal.Event.prototype.src */ + src: function () { + return this._src; + }, + + /** @id MochiKit.Signal.Event.prototype.event */ + event: function () { + return this._event; + }, + + /** @id MochiKit.Signal.Event.prototype.type */ + type: function () { + return this._event.type || undefined; + }, + + /** @id MochiKit.Signal.Event.prototype.target */ + target: function () { + return this._event.target || this._event.srcElement; + }, + + _relatedTarget: null, + /** @id MochiKit.Signal.Event.prototype.relatedTarget */ + relatedTarget: function () { + if (this._relatedTarget !== null) { + return this._relatedTarget; + } + + var elem = null; + if (this.type() == 'mouseover') { + elem = (this._event.relatedTarget || + this._event.fromElement); + } else if (this.type() == 'mouseout') { + elem = (this._event.relatedTarget || + this._event.toElement); + } + if (elem !== null) { + this._relatedTarget = elem; + return elem; + } + + return undefined; + }, + + _modifier: null, + /** @id MochiKit.Signal.Event.prototype.modifier */ + modifier: function () { + if (this._modifier !== null) { + return this._modifier; + } + var m = {}; + m.alt = this._event.altKey; + m.ctrl = this._event.ctrlKey; + m.meta = this._event.metaKey || false; // IE and Opera punt here + m.shift = this._event.shiftKey; + m.any = m.alt || m.ctrl || m.shift || m.meta; + this._modifier = m; + return m; + }, + + _key: null, + /** @id MochiKit.Signal.Event.prototype.key */ + key: function () { + if (this._key !== null) { + return this._key; + } + var k = {}; + if (this.type() && this.type().indexOf('key') === 0) { + + /* + + If you're looking for a special key, look for it in keydown or + keyup, but never keypress. If you're looking for a Unicode + chracter, look for it with keypress, but never keyup or + keydown. + + Notes: + + FF key event behavior: + key event charCode keyCode + DOWN ku,kd 0 40 + DOWN kp 0 40 + ESC ku,kd 0 27 + ESC kp 0 27 + a ku,kd 0 65 + a kp 97 0 + shift+a ku,kd 0 65 + shift+a kp 65 0 + 1 ku,kd 0 49 + 1 kp 49 0 + shift+1 ku,kd 0 0 + shift+1 kp 33 0 + + IE key event behavior: + (IE doesn't fire keypress events for special keys.) + key event keyCode + DOWN ku,kd 40 + DOWN kp undefined + ESC ku,kd 27 + ESC kp 27 + a ku,kd 65 + a kp 97 + shift+a ku,kd 65 + shift+a kp 65 + 1 ku,kd 49 + 1 kp 49 + shift+1 ku,kd 49 + shift+1 kp 33 + + Safari key event behavior: + (Safari sets charCode and keyCode to something crazy for + special keys.) + key event charCode keyCode + DOWN ku,kd 63233 40 + DOWN kp 63233 63233 + ESC ku,kd 27 27 + ESC kp 27 27 + a ku,kd 97 65 + a kp 97 97 + shift+a ku,kd 65 65 + shift+a kp 65 65 + 1 ku,kd 49 49 + 1 kp 49 49 + shift+1 ku,kd 33 49 + shift+1 kp 33 33 + + */ + + /* look for special keys here */ + if (this.type() == 'keydown' || this.type() == 'keyup') { + k.code = this._event.keyCode; + k.string = (MochiKit.Signal._specialKeys[k.code] || + 'KEY_UNKNOWN'); + this._key = k; + return k; + + /* look for characters here */ + } else if (this.type() == 'keypress') { + + /* + + Special key behavior: + + IE: does not fire keypress events for special keys + FF: sets charCode to 0, and sets the correct keyCode + Safari: sets keyCode and charCode to something stupid + + */ + + k.code = 0; + k.string = ''; + + if (typeof(this._event.charCode) != 'undefined' && + this._event.charCode !== 0 && + !MochiKit.Signal._specialMacKeys[this._event.charCode]) { + k.code = this._event.charCode; + k.string = String.fromCharCode(k.code); + } else if (this._event.keyCode && + typeof(this._event.charCode) == 'undefined') { // IE + k.code = this._event.keyCode; + k.string = String.fromCharCode(k.code); + } + + this._key = k; + return k; + } + } + return undefined; + }, + + _mouse: null, + /** @id MochiKit.Signal.Event.prototype.mouse */ + mouse: function () { + if (this._mouse !== null) { + return this._mouse; + } + + var m = {}; + var e = this._event; + + if (this.type() && ( + this.type().indexOf('mouse') === 0 || + this.type().indexOf('click') != -1 || + this.type() == 'contextmenu')) { + + m.client = new MochiKit.Style.Coordinates(0, 0); + if (e.clientX || e.clientY) { + m.client.x = (!e.clientX || e.clientX < 0) ? 0 : e.clientX; + m.client.y = (!e.clientY || e.clientY < 0) ? 0 : e.clientY; + } + + m.page = new MochiKit.Style.Coordinates(0, 0); + if (e.pageX || e.pageY) { + m.page.x = (!e.pageX || e.pageX < 0) ? 0 : e.pageX; + m.page.y = (!e.pageY || e.pageY < 0) ? 0 : e.pageY; + } else { + /* + + The IE shortcut can be off by two. We fix it. See: + http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp + + This is similar to the method used in + MochiKit.Style.getElementPosition(). + + */ + var de = MochiKit.DOM._document.documentElement; + var b = MochiKit.DOM._document.body; + + m.page.x = e.clientX + + (de.scrollLeft || b.scrollLeft) - + (de.clientLeft || 0); + + m.page.y = e.clientY + + (de.scrollTop || b.scrollTop) - + (de.clientTop || 0); + + } + if (this.type() != 'mousemove') { + m.button = {}; + m.button.left = false; + m.button.right = false; + m.button.middle = false; + + /* we could check e.button, but which is more consistent */ + if (e.which) { + m.button.left = (e.which == 1); + m.button.middle = (e.which == 2); + m.button.right = (e.which == 3); + + /* + + Mac browsers and right click: + + - Safari doesn't fire any click events on a right + click: + http://bugs.webkit.org/show_bug.cgi?id=6595 + + - Firefox fires the event, and sets ctrlKey = true + + - Opera fires the event, and sets metaKey = true + + oncontextmenu is fired on right clicks between + browsers and across platforms. + + */ + + } else { + m.button.left = !!(e.button & 1); + m.button.right = !!(e.button & 2); + m.button.middle = !!(e.button & 4); + } + } + this._mouse = m; + return m; + } + return undefined; + }, + + /** @id MochiKit.Signal.Event.prototype.stop */ + stop: function () { + this.stopPropagation(); + this.preventDefault(); + }, + + /** @id MochiKit.Signal.Event.prototype.stopPropagation */ + stopPropagation: function () { + if (this._event.stopPropagation) { + this._event.stopPropagation(); + } else { + this._event.cancelBubble = true; + } + }, + + /** @id MochiKit.Signal.Event.prototype.preventDefault */ + preventDefault: function () { + if (this._event.preventDefault) { + this._event.preventDefault(); + } else if (this._confirmUnload === null) { + this._event.returnValue = false; + } + }, + + _confirmUnload: null, + + /** @id MochiKit.Signal.Event.prototype.confirmUnload */ + confirmUnload: function (msg) { + if (this.type() == 'beforeunload') { + this._confirmUnload = msg; + this._event.returnValue = msg; + } + } +}); + +/* Safari sets keyCode to these special values onkeypress. */ +MochiKit.Signal._specialMacKeys = { + 3: 'KEY_ENTER', + 63289: 'KEY_NUM_PAD_CLEAR', + 63276: 'KEY_PAGE_UP', + 63277: 'KEY_PAGE_DOWN', + 63275: 'KEY_END', + 63273: 'KEY_HOME', + 63234: 'KEY_ARROW_LEFT', + 63232: 'KEY_ARROW_UP', + 63235: 'KEY_ARROW_RIGHT', + 63233: 'KEY_ARROW_DOWN', + 63302: 'KEY_INSERT', + 63272: 'KEY_DELETE' +}; + +/* for KEY_F1 - KEY_F12 */ +(function () { + var _specialMacKeys = MochiKit.Signal._specialMacKeys; + for (i = 63236; i <= 63242; i++) { + // no F0 + _specialMacKeys[i] = 'KEY_F' + (i - 63236 + 1); + } +})(); + +/* Standard keyboard key codes. */ +MochiKit.Signal._specialKeys = { + 8: 'KEY_BACKSPACE', + 9: 'KEY_TAB', + 12: 'KEY_NUM_PAD_CLEAR', // weird, for Safari and Mac FF only + 13: 'KEY_ENTER', + 16: 'KEY_SHIFT', + 17: 'KEY_CTRL', + 18: 'KEY_ALT', + 19: 'KEY_PAUSE', + 20: 'KEY_CAPS_LOCK', + 27: 'KEY_ESCAPE', + 32: 'KEY_SPACEBAR', + 33: 'KEY_PAGE_UP', + 34: 'KEY_PAGE_DOWN', + 35: 'KEY_END', + 36: 'KEY_HOME', + 37: 'KEY_ARROW_LEFT', + 38: 'KEY_ARROW_UP', + 39: 'KEY_ARROW_RIGHT', + 40: 'KEY_ARROW_DOWN', + 44: 'KEY_PRINT_SCREEN', + 45: 'KEY_INSERT', + 46: 'KEY_DELETE', + 59: 'KEY_SEMICOLON', // weird, for Safari and IE only + 91: 'KEY_WINDOWS_LEFT', + 92: 'KEY_WINDOWS_RIGHT', + 93: 'KEY_SELECT', + 106: 'KEY_NUM_PAD_ASTERISK', + 107: 'KEY_NUM_PAD_PLUS_SIGN', + 109: 'KEY_NUM_PAD_HYPHEN-MINUS', + 110: 'KEY_NUM_PAD_FULL_STOP', + 111: 'KEY_NUM_PAD_SOLIDUS', + 144: 'KEY_NUM_LOCK', + 145: 'KEY_SCROLL_LOCK', + 186: 'KEY_SEMICOLON', + 187: 'KEY_EQUALS_SIGN', + 188: 'KEY_COMMA', + 189: 'KEY_HYPHEN-MINUS', + 190: 'KEY_FULL_STOP', + 191: 'KEY_SOLIDUS', + 192: 'KEY_GRAVE_ACCENT', + 219: 'KEY_LEFT_SQUARE_BRACKET', + 220: 'KEY_REVERSE_SOLIDUS', + 221: 'KEY_RIGHT_SQUARE_BRACKET', + 222: 'KEY_APOSTROPHE' + // undefined: 'KEY_UNKNOWN' +}; + +(function () { + /* for KEY_0 - KEY_9 */ + var _specialKeys = MochiKit.Signal._specialKeys; + for (var i = 48; i <= 57; i++) { + _specialKeys[i] = 'KEY_' + (i - 48); + } + + /* for KEY_A - KEY_Z */ + for (i = 65; i <= 90; i++) { + _specialKeys[i] = 'KEY_' + String.fromCharCode(i); + } + + /* for KEY_NUM_PAD_0 - KEY_NUM_PAD_9 */ + for (i = 96; i <= 105; i++) { + _specialKeys[i] = 'KEY_NUM_PAD_' + (i - 96); + } + + /* for KEY_F1 - KEY_F12 */ + for (i = 112; i <= 123; i++) { + // no F0 + _specialKeys[i] = 'KEY_F' + (i - 112 + 1); + } +})(); + +/* Internal object to keep track of created signals. */ +MochiKit.Signal.Ident = function (ident) { + this.source = ident.source; + this.signal = ident.signal; + this.listener = ident.listener; + this.isDOM = ident.isDOM; + this.objOrFunc = ident.objOrFunc; + this.funcOrStr = ident.funcOrStr; + this.connected = ident.connected; +}; + +MochiKit.Signal.Ident.prototype = {}; + +MochiKit.Base.update(MochiKit.Signal, { + + __repr__: function () { + return '[' + this.NAME + ' ' + this.VERSION + ']'; + }, + + toString: function () { + return this.__repr__(); + }, + + _unloadCache: function () { + var self = MochiKit.Signal; + var observers = self._observers; + + for (var i = 0; i < observers.length; i++) { + if (observers[i].signal !== 'onload' && observers[i].signal !== 'onunload') { + self._disconnect(observers[i]); + } + } + }, + + _listener: function (src, sig, func, obj, isDOM) { + var self = MochiKit.Signal; + var E = self.Event; + if (!isDOM) { + return MochiKit.Base.bind(func, obj); + } + obj = obj || src; + if (typeof(func) == "string") { + if (sig === 'onload' || sig === 'onunload') { + return function (nativeEvent) { + obj[func].apply(obj, [new E(src, nativeEvent)]); + + var ident = new MochiKit.Signal.Ident({ + source: src, signal: sig, objOrFunc: obj, funcOrStr: func}); + + MochiKit.Signal._disconnect(ident); + }; + } else { + return function (nativeEvent) { + obj[func].apply(obj, [new E(src, nativeEvent)]); + }; + } + } else { + if (sig === 'onload' || sig === 'onunload') { + return function (nativeEvent) { + func.apply(obj, [new E(src, nativeEvent)]); + MochiKit.Signal.disconnect(src, sig, func); + + var ident = new MochiKit.Signal.Ident({ + source: src, signal: sig, objOrFunc: func}); + + MochiKit.Signal._disconnect(ident); + }; + } else { + return function (nativeEvent) { + func.apply(obj, [new E(src, nativeEvent)]); + }; + } + } + }, + + _browserAlreadyHasMouseEnterAndLeave: function () { + return /MSIE/.test(navigator.userAgent); + }, + + _mouseEnterListener: function (src, sig, func, obj) { + var E = MochiKit.Signal.Event; + return function (nativeEvent) { + var e = new E(src, nativeEvent); + try { + e.relatedTarget().nodeName; + } catch (err) { + /* probably hit a permission denied error; possibly one of + * firefox's screwy anonymous DIVs inside an input element. + * Allow this event to propogate up. + */ + return; + } + e.stop(); + if (MochiKit.DOM.isChildNode(e.relatedTarget(), src)) { + /* We've moved between our node and a child. Ignore. */ + return; + } + e.type = function () { return sig; }; + if (typeof(func) == "string") { + return obj[func].apply(obj, [e]); + } else { + return func.apply(obj, [e]); + } + }; + }, + + _getDestPair: function (objOrFunc, funcOrStr) { + var obj = null; + var func = null; + if (typeof(funcOrStr) != 'undefined') { + obj = objOrFunc; + func = funcOrStr; + if (typeof(funcOrStr) == 'string') { + if (typeof(objOrFunc[funcOrStr]) != "function") { + throw new Error("'funcOrStr' must be a function on 'objOrFunc'"); + } + } else if (typeof(funcOrStr) != 'function') { + throw new Error("'funcOrStr' must be a function or string"); + } + } else if (typeof(objOrFunc) != "function") { + throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given"); + } else { + func = objOrFunc; + } + return [obj, func]; + }, + + /** @id MochiKit.Signal.connect */ + connect: function (src, sig, objOrFunc/* optional */, funcOrStr) { + src = MochiKit.DOM.getElement(src); + var self = MochiKit.Signal; + + if (typeof(sig) != 'string') { + throw new Error("'sig' must be a string"); + } + + var destPair = self._getDestPair(objOrFunc, funcOrStr); + var obj = destPair[0]; + var func = destPair[1]; + if (typeof(obj) == 'undefined' || obj === null) { + obj = src; + } + + var isDOM = !!(src.addEventListener || src.attachEvent); + if (isDOM && (sig === "onmouseenter" || sig === "onmouseleave") + && !self._browserAlreadyHasMouseEnterAndLeave()) { + var listener = self._mouseEnterListener(src, sig.substr(2), func, obj); + if (sig === "onmouseenter") { + sig = "onmouseover"; + } else { + sig = "onmouseout"; + } + } else { + var listener = self._listener(src, sig, func, obj, isDOM); + } + + if (src.addEventListener) { + src.addEventListener(sig.substr(2), listener, false); + } else if (src.attachEvent) { + src.attachEvent(sig, listener); // useCapture unsupported + } + + var ident = new MochiKit.Signal.Ident({ + source: src, + signal: sig, + listener: listener, + isDOM: isDOM, + objOrFunc: objOrFunc, + funcOrStr: funcOrStr, + connected: true + }); + self._observers.push(ident); + + if (!isDOM && typeof(src.__connect__) == 'function') { + var args = MochiKit.Base.extend([ident], arguments, 1); + src.__connect__.apply(src, args); + } + + return ident; + }, + + _disconnect: function (ident) { + // already disconnected + if (!ident.connected) { + return; + } + ident.connected = false; + // check isDOM + if (!ident.isDOM) { + return; + } + var src = ident.source; + var sig = ident.signal; + var listener = ident.listener; + + if (src.removeEventListener) { + src.removeEventListener(sig.substr(2), listener, false); + } else if (src.detachEvent) { + src.detachEvent(sig, listener); // useCapture unsupported + } else { + throw new Error("'src' must be a DOM element"); + } + }, + + /** @id MochiKit.Signal.disconnect */ + disconnect: function (ident) { + var self = MochiKit.Signal; + var observers = self._observers; + var m = MochiKit.Base; + if (arguments.length > 1) { + // compatibility API + var src = MochiKit.DOM.getElement(arguments[0]); + var sig = arguments[1]; + var obj = arguments[2]; + var func = arguments[3]; + for (var i = observers.length - 1; i >= 0; i--) { + var o = observers[i]; + if (o.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) { + self._disconnect(o); + if (!self._lock) { + observers.splice(i, 1); + } else { + self._dirty = true; + } + return true; + } + } + } else { + var idx = m.findIdentical(observers, ident); + if (idx >= 0) { + self._disconnect(ident); + if (!self._lock) { + observers.splice(idx, 1); + } else { + self._dirty = true; + } + return true; + } + } + return false; + }, + + /** @id MochiKit.Signal.disconnectAllTo */ + disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) { + var self = MochiKit.Signal; + var observers = self._observers; + var disconnect = self._disconnect; + var locked = self._lock; + var dirty = self._dirty; + if (typeof(funcOrStr) === 'undefined') { + funcOrStr = null; + } + for (var i = observers.length - 1; i >= 0; i--) { + var ident = observers[i]; + if (ident.objOrFunc === objOrFunc && + (funcOrStr === null || ident.funcOrStr === funcOrStr)) { + disconnect(ident); + if (locked) { + dirty = true; + } else { + observers.splice(i, 1); + } + } + } + self._dirty = dirty; + }, + + /** @id MochiKit.Signal.disconnectAll */ + disconnectAll: function (src/* optional */, sig) { + src = MochiKit.DOM.getElement(src); + var m = MochiKit.Base; + var signals = m.flattenArguments(m.extend(null, arguments, 1)); + var self = MochiKit.Signal; + var disconnect = self._disconnect; + var observers = self._observers; + var i, ident; + var locked = self._lock; + var dirty = self._dirty; + if (signals.length === 0) { + // disconnect all + for (i = observers.length - 1; i >= 0; i--) { + ident = observers[i]; + if (ident.source === src) { + disconnect(ident); + if (!locked) { + observers.splice(i, 1); + } else { + dirty = true; + } + } + } + } else { + var sigs = {}; + for (i = 0; i < signals.length; i++) { + sigs[signals[i]] = true; + } + for (i = observers.length - 1; i >= 0; i--) { + ident = observers[i]; + if (ident.source === src && ident.signal in sigs) { + disconnect(ident); + if (!locked) { + observers.splice(i, 1); + } else { + dirty = true; + } + } + } + } + self._dirty = dirty; + }, + + /** @id MochiKit.Signal.signal */ + signal: function (src, sig) { + var self = MochiKit.Signal; + var observers = self._observers; + src = MochiKit.DOM.getElement(src); + var args = MochiKit.Base.extend(null, arguments, 2); + var errors = []; + self._lock = true; + for (var i = 0; i < observers.length; i++) { + var ident = observers[i]; + if (ident.source === src && ident.signal === sig) { + try { + ident.listener.apply(src, args); + } catch (e) { + errors.push(e); + } + } + } + self._lock = false; + if (self._dirty) { + self._dirty = false; + for (var i = observers.length - 1; i >= 0; i--) { + if (!observers[i].connected) { + observers.splice(i, 1); + } + } + } + if (errors.length == 1) { + throw errors[0]; + } else if (errors.length > 1) { + var e = new Error("Multiple errors thrown in handling 'sig', see errors property"); + e.errors = errors; + throw e; + } + } + +}); + +MochiKit.Signal.EXPORT_OK = []; + +MochiKit.Signal.EXPORT = [ + 'connect', + 'disconnect', + 'signal', + 'disconnectAll', + 'disconnectAllTo' +]; + +MochiKit.Signal.__new__ = function (win) { + var m = MochiKit.Base; + this._document = document; + this._window = win; + this._lock = false; + this._dirty = false; + + try { + this.connect(window, 'onunload', this._unloadCache); + } catch (e) { + // pass: might not be a browser + } + + this.EXPORT_TAGS = { + ':common': this.EXPORT, + ':all': m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); +}; + +MochiKit.Signal.__new__(this); + +// +// XXX: Internet Explorer blows +// +if (MochiKit.__export__) { + connect = MochiKit.Signal.connect; + disconnect = MochiKit.Signal.disconnect; + disconnectAll = MochiKit.Signal.disconnectAll; + signal = MochiKit.Signal.signal; +} + +MochiKit.Base._exportSymbols(this, MochiKit.Signal); diff --git a/mochikit_v14/MochiKit/Sortable.js b/mochikit_v14/MochiKit/Sortable.js new file mode 100644 index 0000000..8976ec0 --- /dev/null +++ b/mochikit_v14/MochiKit/Sortable.js @@ -0,0 +1,589 @@ +/*** +Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) + Mochi-ized By Thomas Herve (_firstname_@nimail.org) + +See scriptaculous.js for full license. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Sortable'); + dojo.require('MochiKit.Base'); + dojo.require('MochiKit.DOM'); + dojo.require('MochiKit.Iter'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); + JSAN.use("MochiKit.DOM", []); + JSAN.use("MochiKit.Iter", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined' || + typeof(MochiKit.DOM) == 'undefined' || + typeof(MochiKit.Iter) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.DragAndDrop depends on MochiKit.Base, MochiKit.DOM and MochiKit.Iter!"; +} + +if (typeof(MochiKit.Sortable) == 'undefined') { + MochiKit.Sortable = {}; +} + +MochiKit.Sortable.NAME = 'MochiKit.Sortable'; +MochiKit.Sortable.VERSION = '1.4'; + +MochiKit.Sortable.__repr__ = function () { + return '[' + this.NAME + ' ' + this.VERSION + ']'; +}; + +MochiKit.Sortable.toString = function () { + return this.__repr__(); +}; + +MochiKit.Sortable.EXPORT = [ +]; + +MochiKit.Sortable.EXPORT_OK = [ +]; + +MochiKit.Base.update(MochiKit.Sortable, { + /*** + + Manage sortables. Mainly use the create function to add a sortable. + + ***/ + sortables: {}, + + _findRootElement: function (element) { + while (element.tagName.toUpperCase() != "BODY") { + if (element.id && MochiKit.Sortable.sortables[element.id]) { + return element; + } + element = element.parentNode; + } + }, + + /** @id MochiKit.Sortable.options */ + options: function (element) { + element = MochiKit.Sortable._findRootElement(MochiKit.DOM.getElement(element)); + if (!element) { + return; + } + return MochiKit.Sortable.sortables[element.id]; + }, + + /** @id MochiKit.Sortable.destroy */ + destroy: function (element){ + var s = MochiKit.Sortable.options(element); + var b = MochiKit.Base; + var d = MochiKit.DragAndDrop; + + if (s) { + MochiKit.Signal.disconnect(s.startHandle); + MochiKit.Signal.disconnect(s.endHandle); + b.map(function (dr) { + d.Droppables.remove(dr); + }, s.droppables); + b.map(function (dr) { + dr.destroy(); + }, s.draggables); + + delete MochiKit.Sortable.sortables[s.element.id]; + } + }, + + /** @id MochiKit.Sortable.create */ + create: function (element, options) { + element = MochiKit.DOM.getElement(element); + var self = MochiKit.Sortable; + + /** @id MochiKit.Sortable.options */ + options = MochiKit.Base.update({ + + /** @id MochiKit.Sortable.element */ + element: element, + + /** @id MochiKit.Sortable.tag */ + tag: 'li', // assumes li children, override with tag: 'tagname' + + /** @id MochiKit.Sortable.dropOnEmpty */ + dropOnEmpty: false, + + /** @id MochiKit.Sortable.tree */ + tree: false, + + /** @id MochiKit.Sortable.treeTag */ + treeTag: 'ul', + + /** @id MochiKit.Sortable.overlap */ + overlap: 'vertical', // one of 'vertical', 'horizontal' + + /** @id MochiKit.Sortable.constraint */ + constraint: 'vertical', // one of 'vertical', 'horizontal', false + // also takes array of elements (or ids); or false + + /** @id MochiKit.Sortable.containment */ + containment: [element], + + /** @id MochiKit.Sortable.handle */ + handle: false, // or a CSS class + + /** @id MochiKit.Sortable.only */ + only: false, + + /** @id MochiKit.Sortable.hoverclass */ + hoverclass: null, + + /** @id MochiKit.Sortable.ghosting */ + ghosting: false, + + /** @id MochiKit.Sortable.scroll */ + scroll: false, + + /** @id MochiKit.Sortable.scrollSensitivity */ + scrollSensitivity: 20, + + /** @id MochiKit.Sortable.scrollSpeed */ + scrollSpeed: 15, + + /** @id MochiKit.Sortable.format */ + format: /^[^_]*_(.*)$/, + + /** @id MochiKit.Sortable.onChange */ + onChange: MochiKit.Base.noop, + + /** @id MochiKit.Sortable.onUpdate */ + onUpdate: MochiKit.Base.noop, + + /** @id MochiKit.Sortable.accept */ + accept: null + }, options); + + // clear any old sortable with same element + self.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + ghosting: options.ghosting, + scroll: options.scroll, + scrollSensitivity: options.scrollSensitivity, + scrollSpeed: options.scrollSpeed, + 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 (innerelement) { + innerelement.style.top = 0; + innerelement.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: self.onHover, + tree: options.tree, + accept: options.accept + } + + var options_for_tree = { + onhover: self.onEmptyHover, + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass, + accept: options.accept + } + + // fix for gecko engine + MochiKit.DOM.removeEmptyTextNodes(element); + + options.draggables = []; + options.droppables = []; + + // drop on empty handling + if (options.dropOnEmpty || options.tree) { + new MochiKit.DragAndDrop.Droppable(element, options_for_tree); + options.droppables.push(element); + } + MochiKit.Base.map(function (e) { + // handles are per-draggable + var handle = options.handle ? + MochiKit.DOM.getFirstElementByTagAndClassName(null, + options.handle, e) : e; + options.draggables.push( + new MochiKit.DragAndDrop.Draggable(e, + MochiKit.Base.update(options_for_draggable, + {handle: handle}))); + new MochiKit.DragAndDrop.Droppable(e, options_for_droppable); + if (options.tree) { + e.treeNode = element; + } + options.droppables.push(e); + }, (self.findElements(element, options) || [])); + + if (options.tree) { + MochiKit.Base.map(function (e) { + new MochiKit.DragAndDrop.Droppable(e, options_for_tree); + e.treeNode = element; + options.droppables.push(e); + }, (self.findTreeElements(element, options) || [])); + } + + // keep reference + self.sortables[element.id] = options; + + options.lastValue = self.serialize(element); + options.startHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'start', + MochiKit.Base.partial(self.onStart, element)); + options.endHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'end', + MochiKit.Base.partial(self.onEnd, element)); + }, + + /** @id MochiKit.Sortable.onStart */ + onStart: function (element, draggable) { + var self = MochiKit.Sortable; + var options = self.options(element); + options.lastValue = self.serialize(options.element); + }, + + /** @id MochiKit.Sortable.onEnd */ + onEnd: function (element, draggable) { + var self = MochiKit.Sortable; + self.unmark(); + var options = self.options(element); + if (options.lastValue != self.serialize(options.element)) { + options.onUpdate(options.element); + } + }, + + // return all suitable-for-sortable elements in a guaranteed order + + /** @id MochiKit.Sortable.findElements */ + findElements: function (element, options) { + return MochiKit.Sortable.findChildren( + element, options.only, options.tree ? true : false, options.tag); + }, + + /** @id MochiKit.Sortable.findTreeElements */ + findTreeElements: function (element, options) { + return MochiKit.Sortable.findChildren( + element, options.only, options.tree ? true : false, options.treeTag); + }, + + /** @id MochiKit.Sortable.findChildren */ + findChildren: function (element, only, recursive, tagName) { + if (!element.hasChildNodes()) { + return null; + } + tagName = tagName.toUpperCase(); + if (only) { + only = MochiKit.Base.flattenArray([only]); + } + var elements = []; + MochiKit.Base.map(function (e) { + if (e.tagName && + e.tagName.toUpperCase() == tagName && + (!only || + MochiKit.Iter.some(only, function (c) { + return MochiKit.DOM.hasElementClass(e, c); + }))) { + elements.push(e); + } + if (recursive) { + var grandchildren = MochiKit.Sortable.findChildren(e, only, recursive, tagName); + if (grandchildren && grandchildren.length > 0) { + elements = elements.concat(grandchildren); + } + } + }, element.childNodes); + return elements; + }, + + /** @id MochiKit.Sortable.onHover */ + onHover: function (element, dropon, overlap) { + if (MochiKit.DOM.isParent(dropon, element)) { + return; + } + var self = MochiKit.Sortable; + + if (overlap > .33 && overlap < .66 && self.options(dropon).tree) { + return; + } else if (overlap > 0.5) { + self.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) { + self.options(oldParentNode).onChange(element); + } + self.options(dropon.parentNode).onChange(element); + } + } else { + self.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) { + self.options(oldParentNode).onChange(element); + } + self.options(dropon.parentNode).onChange(element); + } + } + }, + + _offsetSize: function (element, type) { + if (type == 'vertical' || type == 'height') { + return element.offsetHeight; + } else { + return element.offsetWidth; + } + }, + + /** @id MochiKit.Sortable.onEmptyHover */ + onEmptyHover: function (element, dropon, overlap) { + var oldParentNode = element.parentNode; + var self = MochiKit.Sortable; + var droponOptions = self.options(dropon); + + if (!MochiKit.DOM.isParent(dropon, element)) { + var index; + + var children = self.findElements(dropon, {tag: droponOptions.tag, + only: droponOptions.only}); + var child = null; + + if (children) { + var offset = self._offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); + + for (index = 0; index < children.length; index += 1) { + if (offset - self._offsetSize(children[index], droponOptions.overlap) >= 0) { + offset -= self._offsetSize(children[index], droponOptions.overlap); + } else if (offset - (self._offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { + child = index + 1 < children.length ? children[index + 1] : null; + break; + } else { + child = children[index]; + break; + } + } + } + + dropon.insertBefore(element, child); + + self.options(oldParentNode).onChange(element); + droponOptions.onChange(element); + } + }, + + /** @id MochiKit.Sortable.unmark */ + unmark: function () { + var m = MochiKit.Sortable._marker; + if (m) { + MochiKit.Style.hideElement(m); + } + }, + + /** @id MochiKit.Sortable.mark */ + mark: function (dropon, position) { + // mark on ghosting only + var d = MochiKit.DOM; + var self = MochiKit.Sortable; + var sortable = self.options(dropon.parentNode); + if (sortable && !sortable.ghosting) { + return; + } + + if (!self._marker) { + self._marker = d.getElement('dropmarker') || + document.createElement('DIV'); + MochiKit.Style.hideElement(self._marker); + d.addElementClass(self._marker, 'dropmarker'); + self._marker.style.position = 'absolute'; + document.getElementsByTagName('body').item(0).appendChild(self._marker); + } + var offsets = MochiKit.Position.cumulativeOffset(dropon); + self._marker.style.left = offsets.x + 'px'; + self._marker.style.top = offsets.y + 'px'; + + if (position == 'after') { + if (sortable.overlap == 'horizontal') { + self._marker.style.left = (offsets.x + dropon.clientWidth) + 'px'; + } else { + self._marker.style.top = (offsets.y + dropon.clientHeight) + 'px'; + } + } + MochiKit.Style.showElement(self._marker); + }, + + _tree: function (element, options, parent) { + var self = MochiKit.Sortable; + var children = self.findElements(element, options) || []; + + for (var i = 0; i < children.length; ++i) { + var match = children[i].id.match(options.format); + + if (!match) { + continue; + } + + var child = { + id: encodeURIComponent(match ? match[1] : null), + element: element, + parent: parent, + children: [], + position: parent.children.length, + container: self._findChildrenElement(children[i], options.treeTag.toUpperCase()) + } + + /* Get the element containing the children and recurse over it */ + if (child.container) { + self._tree(child.container, options, child) + } + + parent.children.push (child); + } + + return parent; + }, + + /* Finds the first element of the given tag type within a parent element. + Used for finding the first LI[ST] within a L[IST]I[TEM].*/ + _findChildrenElement: function (element, containerTag) { + if (element && element.hasChildNodes) { + containerTag = containerTag.toUpperCase(); + for (var i = 0; i < element.childNodes.length; ++i) { + if (element.childNodes[i].tagName.toUpperCase() == containerTag) { + return element.childNodes[i]; + } + } + } + return null; + }, + + /** @id MochiKit.Sortable.tree */ + tree: function (element, options) { + element = MochiKit.DOM.getElement(element); + var sortableOptions = MochiKit.Sortable.options(element); + options = MochiKit.Base.update({ + tag: sortableOptions.tag, + treeTag: sortableOptions.treeTag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format + }, options || {}); + + var root = { + id: null, + parent: null, + children: new Array, + container: element, + position: 0 + } + + return MochiKit.Sortable._tree(element, options, root); + }, + + /** + * Specifies the sequence for the Sortable. + * @param {Node} element Element to use as the Sortable. + * @param {Object} newSequence New sequence to use. + * @param {Object} options Options to use fro the Sortable. + */ + setSequence: function (element, newSequence, options) { + var self = MochiKit.Sortable; + var b = MochiKit.Base; + element = MochiKit.DOM.getElement(element); + options = b.update(self.options(element), options || {}); + + var nodeMap = {}; + b.map(function (n) { + var m = n.id.match(options.format); + if (m) { + nodeMap[m[1]] = [n, n.parentNode]; + } + n.parentNode.removeChild(n); + }, self.findElements(element, options)); + + b.map(function (ident) { + var n = nodeMap[ident]; + if (n) { + n[1].appendChild(n[0]); + delete nodeMap[ident]; + } + }, newSequence); + }, + + /* Construct a [i] index for a particular node */ + _constructIndex: function (node) { + var index = ''; + do { + if (node.id) { + index = '[' + node.position + ']' + index; + } + } while ((node = node.parent) != null); + return index; + }, + + /** @id MochiKit.Sortable.sequence */ + sequence: function (element, options) { + element = MochiKit.DOM.getElement(element); + var self = MochiKit.Sortable; + var options = MochiKit.Base.update(self.options(element), options || {}); + + return MochiKit.Base.map(function (item) { + return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; + }, MochiKit.DOM.getElement(self.findElements(element, options) || [])); + }, + + /** + * Serializes the content of a Sortable. Useful to send this content through a XMLHTTPRequest. + * These options override the Sortable options for the serialization only. + * @param {Node} element Element to serialize. + * @param {Object} options Serialization options. + */ + serialize: function (element, options) { + element = MochiKit.DOM.getElement(element); + var self = MochiKit.Sortable; + options = MochiKit.Base.update(self.options(element), options || {}); + var name = encodeURIComponent(options.name || element.id); + + if (options.tree) { + return MochiKit.Base.flattenArray(MochiKit.Base.map(function (item) { + return [name + self._constructIndex(item) + "[id]=" + + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); + }, self.tree(element, options).children)).join('&'); + } else { + return MochiKit.Base.map(function (item) { + return name + "[]=" + encodeURIComponent(item); + }, self.sequence(element, options)).join('&'); + } + } +}); + +// trunk compatibility +MochiKit.Sortable.Sortable = MochiKit.Sortable; diff --git a/mochikit_v14/MochiKit/Style.js b/mochikit_v14/MochiKit/Style.js new file mode 100644 index 0000000..93e7786 --- /dev/null +++ b/mochikit_v14/MochiKit/Style.js @@ -0,0 +1,445 @@ +/*** + +MochiKit.Style 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Style'); + dojo.require('MochiKit.Base'); + dojo.require('MochiKit.DOM'); +} +if (typeof(JSAN) != 'undefined') { + JSAN.use('MochiKit.Base', []); + JSAN.use('MochiKit.DOM', []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined') { + throw ''; + } +} catch (e) { + throw 'MochiKit.Style depends on MochiKit.Base!'; +} + +try { + if (typeof(MochiKit.DOM) == 'undefined') { + throw ''; + } +} catch (e) { + throw 'MochiKit.Style depends on MochiKit.DOM!'; +} + + +if (typeof(MochiKit.Style) == 'undefined') { + MochiKit.Style = {}; +} + +MochiKit.Style.NAME = 'MochiKit.Style'; +MochiKit.Style.VERSION = '1.4'; +MochiKit.Style.__repr__ = function () { + return '[' + this.NAME + ' ' + this.VERSION + ']'; +}; +MochiKit.Style.toString = function () { + return this.__repr__(); +}; + +MochiKit.Style.EXPORT_OK = []; + +MochiKit.Style.EXPORT = [ + 'setStyle', + 'setOpacity', + 'getStyle', + 'getElementDimensions', + 'elementDimensions', // deprecated + 'setElementDimensions', + 'getElementPosition', + 'elementPosition', // deprecated + 'setElementPosition', + 'setDisplayForElement', + 'hideElement', + 'showElement', + 'getViewportDimensions', + 'getViewportPosition', + 'Dimensions', + 'Coordinates' +]; + + +/* + + Dimensions + +*/ +/** @id MochiKit.Style.Dimensions */ +MochiKit.Style.Dimensions = function (w, h) { + this.w = w; + this.h = h; +}; + +MochiKit.Style.Dimensions.prototype.__repr__ = function () { + var repr = MochiKit.Base.repr; + return '{w: ' + repr(this.w) + ', h: ' + repr(this.h) + '}'; +}; + +MochiKit.Style.Dimensions.prototype.toString = function () { + return this.__repr__(); +}; + + +/* + + Coordinates + +*/ +/** @id MochiKit.Style.Coordinates */ +MochiKit.Style.Coordinates = function (x, y) { + this.x = x; + this.y = y; +}; + +MochiKit.Style.Coordinates.prototype.__repr__ = function () { + var repr = MochiKit.Base.repr; + return '{x: ' + repr(this.x) + ', y: ' + repr(this.y) + '}'; +}; + +MochiKit.Style.Coordinates.prototype.toString = function () { + return this.__repr__(); +}; + + +MochiKit.Base.update(MochiKit.Style, { + + /** @id MochiKit.Style.getStyle */ + getStyle: function (elem, cssProperty) { + var dom = MochiKit.DOM; + var d = dom._document; + + elem = dom.getElement(elem); + cssProperty = MochiKit.Base.camelize(cssProperty); + + if (!elem || elem == d) { + return undefined; + } + if (cssProperty == 'opacity' && elem.filters) { + var opacity = (MochiKit.Style.getStyle(elem, 'filter') || '').match(/alpha\(opacity=(.*)\)/); + if (opacity && opacity[1]) { + return parseFloat(opacity[1]) / 100; + } + return 1.0; + } + var value = elem.style ? elem.style[cssProperty] : null; + if (!value) { + if (d.defaultView && d.defaultView.getComputedStyle) { + var css = d.defaultView.getComputedStyle(elem, null); + cssProperty = cssProperty.replace(/([A-Z])/g, '-$1' + ).toLowerCase(); // from dojo.style.toSelectorCase + value = css ? css.getPropertyValue(cssProperty) : null; + } else if (elem.currentStyle) { + value = elem.currentStyle[cssProperty]; + } + } + if (cssProperty == 'opacity') { + value = parseFloat(value); + } + + if (/Opera/.test(navigator.userAgent) && (MochiKit.Base.find(['left', 'top', 'right', 'bottom'], cssProperty) != -1)) { + if (MochiKit.Style.getStyle(elem, 'position') == 'static') { + value = 'auto'; + } + } + + return value == 'auto' ? null : value; + }, + + /** @id MochiKit.Style.setStyle */ + setStyle: function (elem, style) { + elem = MochiKit.DOM.getElement(elem); + for (var name in style) { + if (name == 'opacity') { + MochiKit.Style.setOpacity(elem, style[name]); + } else { + elem.style[MochiKit.Base.camelize(name)] = style[name]; + } + } + }, + + /** @id MochiKit.Style.setOpacity */ + setOpacity: function (elem, o) { + elem = MochiKit.DOM.getElement(elem); + var self = MochiKit.Style; + if (o == 1) { + var toSet = /Gecko/.test(navigator.userAgent) && !(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)); + elem.style["opacity"] = toSet ? 0.999999 : 1.0; + if (/MSIE/.test(navigator.userAgent)) { + elem.style['filter'] = + self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, ''); + } + } else { + if (o < 0.00001) { + o = 0; + } + elem.style["opacity"] = o; + if (/MSIE/.test(navigator.userAgent)) { + elem.style['filter'] = + self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + o * 100 + ')'; + } + } + }, + + /* + + getElementPosition is adapted from YAHOO.util.Dom.getXY v0.9.0. + Copyright: Copyright (c) 2006, Yahoo! Inc. All rights reserved. + License: BSD, http://developer.yahoo.net/yui/license.txt + + */ + + /** @id MochiKit.Style.getElementPosition */ + getElementPosition: function (elem, /* optional */relativeTo) { + var self = MochiKit.Style; + var dom = MochiKit.DOM; + elem = dom.getElement(elem); + + if (!elem || + (!(elem.x && elem.y) && + (!elem.parentNode === null || + self.getStyle(elem, 'display') == 'none'))) { + return undefined; + } + + var c = new self.Coordinates(0, 0); + var box = null; + var parent = null; + + var d = MochiKit.DOM._document; + var de = d.documentElement; + var b = d.body; + + if (!elem.parentNode && elem.x && elem.y) { + /* it's just a MochiKit.Style.Coordinates object */ + c.x += elem.x || 0; + c.y += elem.y || 0; + } else if (elem.getBoundingClientRect) { // IE shortcut + /* + + The IE shortcut can be off by two. We fix it. See: + http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp + + This is similar to the method used in + MochiKit.Signal.Event.mouse(). + + */ + box = elem.getBoundingClientRect(); + + c.x += box.left + + (de.scrollLeft || b.scrollLeft) - + (de.clientLeft || 0); + + c.y += box.top + + (de.scrollTop || b.scrollTop) - + (de.clientTop || 0); + + } else if (elem.offsetParent) { + c.x += elem.offsetLeft; + c.y += elem.offsetTop; + parent = elem.offsetParent; + + if (parent != elem) { + while (parent) { + c.x += parent.offsetLeft; + c.y += parent.offsetTop; + parent = parent.offsetParent; + } + } + + /* + + Opera < 9 and old Safari (absolute) incorrectly account for + body offsetTop and offsetLeft. + + */ + var ua = navigator.userAgent.toLowerCase(); + if ((typeof(opera) != 'undefined' && + parseFloat(opera.version()) < 9) || + (ua.indexOf('AppleWebKit') != -1 && + self.getStyle(elem, 'position') == 'absolute')) { + + c.x -= b.offsetLeft; + c.y -= b.offsetTop; + + } + } + + if (typeof(relativeTo) != 'undefined') { + relativeTo = arguments.callee(relativeTo); + if (relativeTo) { + c.x -= (relativeTo.x || 0); + c.y -= (relativeTo.y || 0); + } + } + + if (elem.parentNode) { + parent = elem.parentNode; + } else { + parent = null; + } + + while (parent) { + var tagName = parent.tagName.toUpperCase(); + if (tagName === 'BODY' || tagName === 'HTML') { + break; + } + var disp = self.getStyle(parent, 'display'); + // Handle strange Opera bug for some display + if (disp != 'inline' && disp != 'table-row') { + c.x -= parent.scrollLeft; + c.y -= parent.scrollTop; + } + if (parent.parentNode) { + parent = parent.parentNode; + } else { + parent = null; + } + } + + return c; + }, + + /** @id MochiKit.Style.setElementPosition */ + setElementPosition: function (elem, newPos/* optional */, units) { + elem = MochiKit.DOM.getElement(elem); + if (typeof(units) == 'undefined') { + units = 'px'; + } + var newStyle = {}; + var isUndefNull = MochiKit.Base.isUndefinedOrNull; + if (!isUndefNull(newPos.x)) { + newStyle['left'] = newPos.x + units; + } + if (!isUndefNull(newPos.y)) { + newStyle['top'] = newPos.y + units; + } + MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle}); + }, + + /** @id MochiKit.Style.getElementDimensions */ + getElementDimensions: function (elem) { + var self = MochiKit.Style; + var dom = MochiKit.DOM; + if (typeof(elem.w) == 'number' || typeof(elem.h) == 'number') { + return new self.Dimensions(elem.w || 0, elem.h || 0); + } + elem = dom.getElement(elem); + if (!elem) { + return undefined; + } + var disp = self.getStyle(elem, 'display'); + // display can be empty/undefined on WebKit/KHTML + if (disp != 'none' && disp !== '' && typeof(disp) != 'undefined') { + return new self.Dimensions(elem.offsetWidth || 0, + elem.offsetHeight || 0); + } + var s = elem.style; + var originalVisibility = s.visibility; + var originalPosition = s.position; + s.visibility = 'hidden'; + s.position = 'absolute'; + s.display = ''; + var originalWidth = elem.offsetWidth; + var originalHeight = elem.offsetHeight; + s.display = 'none'; + s.position = originalPosition; + s.visibility = originalVisibility; + return new self.Dimensions(originalWidth, originalHeight); + }, + + /** @id MochiKit.Style.setElementDimensions */ + setElementDimensions: function (elem, newSize/* optional */, units) { + elem = MochiKit.DOM.getElement(elem); + if (typeof(units) == 'undefined') { + units = 'px'; + } + var newStyle = {}; + var isUndefNull = MochiKit.Base.isUndefinedOrNull; + if (!isUndefNull(newSize.w)) { + newStyle['width'] = newSize.w + units; + } + if (!isUndefNull(newSize.h)) { + newStyle['height'] = newSize.h + units; + } + MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle}); + }, + + /** @id MochiKit.Style.setDisplayForElement */ + setDisplayForElement: function (display, element/*, ...*/) { + var elements = MochiKit.Base.extend(null, arguments, 1); + var getElement = MochiKit.DOM.getElement; + for (var i = 0; i < elements.length; i++) { + element = getElement(elements[i]); + if (element) { + element.style.display = display; + } + } + }, + + /** @id MochiKit.Style.getViewportDimensions */ + getViewportDimensions: function () { + var d = new MochiKit.Style.Dimensions(); + + var w = MochiKit.DOM._window; + var b = MochiKit.DOM._document.body; + + if (w.innerWidth) { + d.w = w.innerWidth; + d.h = w.innerHeight; + } else if (b.parentElement.clientWidth) { + d.w = b.parentElement.clientWidth; + d.h = b.parentElement.clientHeight; + } else if (b && b.clientWidth) { + d.w = b.clientWidth; + d.h = b.clientHeight; + } + return d; + }, + + /** @id MochiKit.Style.getViewportPosition */ + getViewportPosition: function () { + var c = new MochiKit.Style.Coordinates(0, 0); + var d = MochiKit.DOM._document; + var de = d.documentElement; + var db = d.body; + if (de && (de.scrollTop || de.scrollLeft)) { + c.x = de.scrollLeft; + c.y = de.scrollTop; + } else if (db) { + c.x = db.scrollLeft; + c.y = db.scrollTop; + } + return c; + }, + + __new__: function () { + var m = MochiKit.Base; + + this.elementPosition = this.getElementPosition; + this.elementDimensions = this.getElementDimensions; + + this.hideElement = m.partial(this.setDisplayForElement, 'none'); + this.showElement = m.partial(this.setDisplayForElement, 'block'); + + this.EXPORT_TAGS = { + ':common': this.EXPORT, + ':all': m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); + } +}); + +MochiKit.Style.__new__(); +MochiKit.Base._exportSymbols(this, MochiKit.Style); diff --git a/mochikit_v14/MochiKit/Test.js b/mochikit_v14/MochiKit/Test.js new file mode 100644 index 0000000..494a5b4 --- /dev/null +++ b/mochikit_v14/MochiKit/Test.js @@ -0,0 +1,181 @@ +/*** + +MochiKit.Test 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Test'); + dojo.require('MochiKit.Base'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); +} + +try { + if (typeof(MochiKit.Base) == 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Test depends on MochiKit.Base!"; +} + +if (typeof(MochiKit.Test) == 'undefined') { + MochiKit.Test = {}; +} + +MochiKit.Test.NAME = "MochiKit.Test"; +MochiKit.Test.VERSION = "1.4"; +MochiKit.Test.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +MochiKit.Test.toString = function () { + return this.__repr__(); +}; + + +MochiKit.Test.EXPORT = ["runTests"]; +MochiKit.Test.EXPORT_OK = []; + +MochiKit.Test.runTests = function (obj) { + if (typeof(obj) == "string") { + obj = JSAN.use(obj); + } + var suite = new MochiKit.Test.Suite(); + suite.run(obj); +}; + +MochiKit.Test.Suite = function () { + this.testIndex = 0; + MochiKit.Base.bindMethods(this); +}; + +MochiKit.Test.Suite.prototype = { + run: function (obj) { + try { + obj(this); + } catch (e) { + this.traceback(e); + } + }, + traceback: function (e) { + var items = MochiKit.Iter.sorted(MochiKit.Base.items(e)); + print("not ok " + this.testIndex + " - Error thrown"); + for (var i = 0; i < items.length; i++) { + var kv = items[i]; + if (kv[0] == "stack") { + kv[1] = kv[1].split(/\n/)[0]; + } + this.print("# " + kv.join(": ")); + } + }, + print: function (s) { + print(s); + }, + is: function (got, expected, /* optional */message) { + var res = 1; + var msg = null; + try { + res = MochiKit.Base.compare(got, expected); + } catch (e) { + msg = "Can not compare " + typeof(got) + ":" + typeof(expected); + } + if (res) { + msg = "Expected value did not compare equal"; + } + if (!res) { + return this.testResult(true, message); + } + return this.testResult(false, message, + [[msg], ["got:", got], ["expected:", expected]]); + }, + + testResult: function (pass, msg, failures) { + this.testIndex += 1; + if (pass) { + this.print("ok " + this.testIndex + " - " + msg); + return; + } + this.print("not ok " + this.testIndex + " - " + msg); + if (failures) { + for (var i = 0; i < failures.length; i++) { + this.print("# " + failures[i].join(" ")); + } + } + }, + + isDeeply: function (got, expected, /* optional */message) { + var m = MochiKit.Base; + var res = 1; + try { + res = m.compare(got, expected); + } catch (e) { + // pass + } + if (res === 0) { + return this.ok(true, message); + } + var gk = m.keys(got); + var ek = m.keys(expected); + gk.sort(); + ek.sort(); + if (m.compare(gk, ek)) { + // differing keys + var cmp = {}; + var i; + for (i = 0; i < gk.length; i++) { + cmp[gk[i]] = "got"; + } + for (i = 0; i < ek.length; i++) { + if (ek[i] in cmp) { + delete cmp[ek[i]]; + } else { + cmp[ek[i]] = "expected"; + } + } + var diffkeys = m.keys(cmp); + diffkeys.sort(); + var gotkeys = []; + var expkeys = []; + while (diffkeys.length) { + var k = diffkeys.shift(); + if (k in Object.prototype) { + continue; + } + (cmp[k] == "got" ? gotkeys : expkeys).push(k); + } + + + } + + return this.testResult((!res), msg, + (msg ? [["got:", got], ["expected:", expected]] : undefined) + ); + }, + + ok: function (res, message) { + return this.testResult(res, message); + } +}; + +MochiKit.Test.__new__ = function () { + var m = MochiKit.Base; + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; + + m.nameFunctions(this); + +}; + +MochiKit.Test.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Test); diff --git a/mochikit_v14/MochiKit/Visual.js b/mochikit_v14/MochiKit/Visual.js new file mode 100644 index 0000000..b7b9ff5 --- /dev/null +++ b/mochikit_v14/MochiKit/Visual.js @@ -0,0 +1,1981 @@ +/*** + +MochiKit.Visual 1.4 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +if (typeof(dojo) != 'undefined') { + dojo.provide('MochiKit.Visual'); + dojo.require('MochiKit.Base'); + dojo.require('MochiKit.DOM'); + dojo.require('MochiKit.Style'); + dojo.require('MochiKit.Color'); + dojo.require('MochiKit.Position'); +} + +if (typeof(JSAN) != 'undefined') { + JSAN.use("MochiKit.Base", []); + JSAN.use("MochiKit.DOM", []); + JSAN.use("MochiKit.Style", []); + JSAN.use("MochiKit.Color", []); + JSAN.use("MochiKit.Position", []); +} + +try { + if (typeof(MochiKit.Base) === 'undefined' || + typeof(MochiKit.DOM) === 'undefined' || + typeof(MochiKit.Style) === 'undefined' || + typeof(MochiKit.Position) === 'undefined' || + typeof(MochiKit.Color) === 'undefined') { + throw ""; + } +} catch (e) { + throw "MochiKit.Visual depends on MochiKit.Base, MochiKit.DOM, MochiKit.Style, MochiKit.Position and MochiKit.Color!"; +} + +if (typeof(MochiKit.Visual) == "undefined") { + MochiKit.Visual = {}; +} + +MochiKit.Visual.NAME = "MochiKit.Visual"; +MochiKit.Visual.VERSION = "1.4"; + +MochiKit.Visual.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +MochiKit.Visual.toString = function () { + return this.__repr__(); +}; + +MochiKit.Visual._RoundCorners = function (e, options) { + e = MochiKit.DOM.getElement(e); + this._setOptions(options); + if (this.options.__unstable__wrapElement) { + e = this._doWrap(e); + } + + var color = this.options.color; + var C = MochiKit.Color.Color; + if (this.options.color === "fromElement") { + color = C.fromBackground(e); + } else if (!(color instanceof C)) { + color = C.fromString(color); + } + this.isTransparent = (color.asRGB().a <= 0); + + var bgColor = this.options.bgColor; + if (this.options.bgColor === "fromParent") { + bgColor = C.fromBackground(e.offsetParent); + } else if (!(bgColor instanceof C)) { + bgColor = C.fromString(bgColor); + } + + this._roundCornersImpl(e, color, bgColor); +}; + +MochiKit.Visual._RoundCorners.prototype = { + _doWrap: function (e) { + var parent = e.parentNode; + var doc = MochiKit.DOM.currentDocument(); + if (typeof(doc.defaultView) === "undefined" + || doc.defaultView === null) { + return e; + } + var style = doc.defaultView.getComputedStyle(e, null); + if (typeof(style) === "undefined" || style === null) { + return e; + } + var wrapper = MochiKit.DOM.DIV({"style": { + display: "block", + // convert padding to margin + marginTop: style.getPropertyValue("padding-top"), + marginRight: style.getPropertyValue("padding-right"), + marginBottom: style.getPropertyValue("padding-bottom"), + marginLeft: style.getPropertyValue("padding-left"), + // remove padding so the rounding looks right + padding: "0px" + /* + paddingRight: "0px", + paddingLeft: "0px" + */ + }}); + wrapper.innerHTML = e.innerHTML; + e.innerHTML = ""; + e.appendChild(wrapper); + return e; + }, + + _roundCornersImpl: function (e, color, bgColor) { + if (this.options.border) { + this._renderBorder(e, bgColor); + } + if (this._isTopRounded()) { + this._roundTopCorners(e, color, bgColor); + } + if (this._isBottomRounded()) { + this._roundBottomCorners(e, color, bgColor); + } + }, + + _renderBorder: function (el, bgColor) { + var borderValue = "1px solid " + this._borderColor(bgColor); + var borderL = "border-left: " + borderValue; + var borderR = "border-right: " + borderValue; + var style = "style='" + borderL + ";" + borderR + "'"; + el.innerHTML = "

    " + el.innerHTML + "
    "; + }, + + _roundTopCorners: function (el, color, bgColor) { + var corner = this._createCorner(bgColor); + for (var i = 0; i < this.options.numSlices; i++) { + corner.appendChild( + this._createCornerSlice(color, bgColor, i, "top") + ); + } + el.style.paddingTop = 0; + el.insertBefore(corner, el.firstChild); + }, + + _roundBottomCorners: function (el, color, bgColor) { + var corner = this._createCorner(bgColor); + for (var i = (this.options.numSlices - 1); i >= 0; i--) { + corner.appendChild( + this._createCornerSlice(color, bgColor, i, "bottom") + ); + } + el.style.paddingBottom = 0; + el.appendChild(corner); + }, + + _createCorner: function (bgColor) { + var dom = MochiKit.DOM; + return dom.DIV({style: {backgroundColor: bgColor.toString()}}); + }, + + _createCornerSlice: function (color, bgColor, n, position) { + var slice = MochiKit.DOM.SPAN(); + + var inStyle = slice.style; + inStyle.backgroundColor = color.toString(); + inStyle.display = "block"; + inStyle.height = "1px"; + inStyle.overflow = "hidden"; + inStyle.fontSize = "1px"; + + var borderColor = this._borderColor(color, bgColor); + if (this.options.border && n === 0) { + inStyle.borderTopStyle = "solid"; + inStyle.borderTopWidth = "1px"; + inStyle.borderLeftWidth = "0px"; + inStyle.borderRightWidth = "0px"; + inStyle.borderBottomWidth = "0px"; + // assumes css compliant box model + inStyle.height = "0px"; + inStyle.borderColor = borderColor.toString(); + } else if (borderColor) { + inStyle.borderColor = borderColor.toString(); + inStyle.borderStyle = "solid"; + inStyle.borderWidth = "0px 1px"; + } + + if (!this.options.compact && (n == (this.options.numSlices - 1))) { + inStyle.height = "2px"; + } + + this._setMargin(slice, n, position); + this._setBorder(slice, n, position); + + return slice; + }, + + _setOptions: function (options) { + this.options = { + corners: "all", + color: "fromElement", + bgColor: "fromParent", + blend: true, + border: false, + compact: false, + __unstable__wrapElement: false + }; + MochiKit.Base.update(this.options, options); + + this.options.numSlices = (this.options.compact ? 2 : 4); + }, + + _whichSideTop: function () { + var corners = this.options.corners; + if (this._hasString(corners, "all", "top")) { + return ""; + } + + var has_tl = (corners.indexOf("tl") != -1); + var has_tr = (corners.indexOf("tr") != -1); + if (has_tl && has_tr) { + return ""; + } + if (has_tl) { + return "left"; + } + if (has_tr) { + return "right"; + } + return ""; + }, + + _whichSideBottom: function () { + var corners = this.options.corners; + if (this._hasString(corners, "all", "bottom")) { + return ""; + } + + var has_bl = (corners.indexOf('bl') != -1); + var has_br = (corners.indexOf('br') != -1); + if (has_bl && has_br) { + return ""; + } + if (has_bl) { + return "left"; + } + if (has_br) { + return "right"; + } + return ""; + }, + + _borderColor: function (color, bgColor) { + if (color == "transparent") { + return bgColor; + } else if (this.options.border) { + return this.options.border; + } else if (this.options.blend) { + return bgColor.blendedColor(color); + } + return ""; + }, + + + _setMargin: function (el, n, corners) { + var marginSize = this._marginSize(n) + "px"; + var whichSide = ( + corners == "top" ? this._whichSideTop() : this._whichSideBottom() + ); + var style = el.style; + + if (whichSide == "left") { + style.marginLeft = marginSize; + style.marginRight = "0px"; + } else if (whichSide == "right") { + style.marginRight = marginSize; + style.marginLeft = "0px"; + } else { + style.marginLeft = marginSize; + style.marginRight = marginSize; + } + }, + + _setBorder: function (el, n, corners) { + var borderSize = this._borderSize(n) + "px"; + var whichSide = ( + corners == "top" ? this._whichSideTop() : this._whichSideBottom() + ); + + var style = el.style; + if (whichSide == "left") { + style.borderLeftWidth = borderSize; + style.borderRightWidth = "0px"; + } else if (whichSide == "right") { + style.borderRightWidth = borderSize; + style.borderLeftWidth = "0px"; + } else { + style.borderLeftWidth = borderSize; + style.borderRightWidth = borderSize; + } + }, + + _marginSize: function (n) { + if (this.isTransparent) { + return 0; + } + + var o = this.options; + if (o.compact && o.blend) { + var smBlendedMarginSizes = [1, 0]; + return smBlendedMarginSizes[n]; + } else if (o.compact) { + var compactMarginSizes = [2, 1]; + return compactMarginSizes[n]; + } else if (o.blend) { + var blendedMarginSizes = [3, 2, 1, 0]; + return blendedMarginSizes[n]; + } else { + var marginSizes = [5, 3, 2, 1]; + return marginSizes[n]; + } + }, + + _borderSize: function (n) { + var o = this.options; + var borderSizes; + if (o.compact && (o.blend || this.isTransparent)) { + return 1; + } else if (o.compact) { + borderSizes = [1, 0]; + } else if (o.blend) { + borderSizes = [2, 1, 1, 1]; + } else if (o.border) { + borderSizes = [0, 2, 0, 0]; + } else if (this.isTransparent) { + borderSizes = [5, 3, 2, 1]; + } else { + return 0; + } + return borderSizes[n]; + }, + + _hasString: function (str) { + for (var i = 1; i< arguments.length; i++) { + if (str.indexOf(arguments[i]) != -1) { + return true; + } + } + return false; + }, + + _isTopRounded: function () { + return this._hasString(this.options.corners, + "all", "top", "tl", "tr" + ); + }, + + _isBottomRounded: function () { + return this._hasString(this.options.corners, + "all", "bottom", "bl", "br" + ); + }, + + _hasSingleTextChild: function (el) { + return (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3); + } +}; + +/** @id MochiKit.Visual.roundElement */ +MochiKit.Visual.roundElement = function (e, options) { + new MochiKit.Visual._RoundCorners(e, options); +}; + +/** @id MochiKit.Visual.roundClass */ +MochiKit.Visual.roundClass = function (tagName, className, options) { + var elements = MochiKit.DOM.getElementsByTagAndClassName( + tagName, className + ); + for (var i = 0; i < elements.length; i++) { + MochiKit.Visual.roundElement(elements[i], options); + } +}; + +/** @id MochiKit.Visual.tagifyText */ +MochiKit.Visual.tagifyText = function (element, /* optional */tagifyStyle) { + /*** + + Change a node text to character in tags. + + @param tagifyStyle: the style to apply to character nodes, default to + 'position: relative'. + + ***/ + tagifyStyle = tagifyStyle || 'position:relative'; + if (/MSIE/.test(navigator.userAgent)) { + tagifyStyle += ';zoom:1'; + } + element = MochiKit.DOM.getElement(element); + var ma = MochiKit.Base.map; + ma(function (child) { + if (child.nodeType == 3) { + ma(function (character) { + element.insertBefore( + MochiKit.DOM.SPAN({style: tagifyStyle}, + character == ' ' ? String.fromCharCode(160) : character), child); + }, child.nodeValue.split('')); + MochiKit.DOM.removeElement(child); + } + }, element.childNodes); +}; + +/** @id MochiKit.Visual.forceRerendering */ +MochiKit.Visual.forceRerendering = function (element) { + try { + element = MochiKit.DOM.getElement(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { + } +}; + +/** @id MochiKit.Visual.multiple */ +MochiKit.Visual.multiple = function (elements, effect, /* optional */options) { + /*** + + Launch the same effect subsequently on given elements. + + ***/ + options = MochiKit.Base.update({ + speed: 0.1, delay: 0.0 + }, options || {}); + var masterDelay = options.delay; + var index = 0; + MochiKit.Base.map(function (innerelement) { + options.delay = index * options.speed + masterDelay; + new effect(innerelement, options); + index += 1; + }, elements); +}; + +MochiKit.Visual.PAIRS = { + 'slide': ['slideDown', 'slideUp'], + 'blind': ['blindDown', 'blindUp'], + 'appear': ['appear', 'fade'], + 'size': ['grow', 'shrink'] +}; + +/** @id MochiKit.Visual.toggle */ +MochiKit.Visual.toggle = function (element, /* optional */effect, /* optional */options) { + /*** + + Toggle an item between two state depending of its visibility, making + a effect between these states. Default effect is 'appear', can be + 'slide' or 'blind'. + + ***/ + element = MochiKit.DOM.getElement(element); + effect = (effect || 'appear').toLowerCase(); + options = MochiKit.Base.update({ + queue: {position: 'end', scope: (element.id || 'global'), limit: 1} + }, options || {}); + var v = MochiKit.Visual; + v[element.style.display != 'none' ? + v.PAIRS[effect][1] : v.PAIRS[effect][0]](element, options); +}; + +/*** + +Transitions: define functions calculating variations depending of a position. + +***/ + +MochiKit.Visual.Transitions = {}; + +/** @id MochiKit.Visual.Transitions.linear */ +MochiKit.Visual.Transitions.linear = function (pos) { + return pos; +}; + +/** @id MochiKit.Visual.Transitions.sinoidal */ +MochiKit.Visual.Transitions.sinoidal = function (pos) { + return (-Math.cos(pos*Math.PI)/2) + 0.5; +}; + +/** @id MochiKit.Visual.Transitions.reverse */ +MochiKit.Visual.Transitions.reverse = function (pos) { + return 1 - pos; +}; + +/** @id MochiKit.Visual.Transitions.flicker */ +MochiKit.Visual.Transitions.flicker = function (pos) { + return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; +}; + +/** @id MochiKit.Visual.Transitions.wobble */ +MochiKit.Visual.Transitions.wobble = function (pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; +}; + +/** @id MochiKit.Visual.Transitions.pulse */ +MochiKit.Visual.Transitions.pulse = function (pos, pulses) { + if (!pulses) { + return (Math.floor(pos*10) % 2 === 0 ? + (pos*10 - Math.floor(pos*10)) : 1 - (pos*10 - Math.floor(pos*10))); + } + return (Math.round((pos % (1/pulses)) * pulses) == 0 ? + ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : + 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))); +}; + +/** @id MochiKit.Visual.Transitions.none */ +MochiKit.Visual.Transitions.none = function (pos) { + return 0; +}; + +/** @id MochiKit.Visual.Transitions.full */ +MochiKit.Visual.Transitions.full = function (pos) { + return 1; +}; + +/*** + +Core effects + +***/ + +MochiKit.Visual.ScopedQueue = function () { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(); + } + this.__init__(); +}; + +MochiKit.Base.update(MochiKit.Visual.ScopedQueue.prototype, { + __init__: function () { + this.effects = []; + this.interval = null; + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.add */ + add: function (effect) { + var timestamp = new Date().getTime(); + + var position = (typeof(effect.options.queue) == 'string') ? + effect.options.queue : effect.options.queue.position; + + var ma = MochiKit.Base.map; + switch (position) { + case 'front': + // move unstarted effects after this effect + ma(function (e) { + if (e.state == 'idle') { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + } + }, this.effects); + break; + case 'end': + var finish; + // start effect after last queued effect has finished + ma(function (e) { + var i = e.finishOn; + if (i >= (finish || i)) { + finish = i; + } + }, this.effects); + timestamp = finish || timestamp; + break; + case 'break': + ma(function (e) { + e.finalize(); + }, this.effects); + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + if (!effect.options.queue.limit || + this.effects.length < effect.options.queue.limit) { + this.effects.push(effect); + } + + if (!this.interval) { + this.interval = this.startLoop(MochiKit.Base.bind(this.loop, this), + 40); + } + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.startLoop */ + startLoop: function (func, interval) { + return setInterval(func, interval); + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.remove */ + remove: function (effect) { + this.effects = MochiKit.Base.filter(function (e) { + return e != effect; + }, this.effects); + if (!this.effects.length) { + this.stopLoop(this.interval); + this.interval = null; + } + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.stopLoop */ + stopLoop: function (interval) { + clearInterval(interval); + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.loop */ + loop: function () { + var timePos = new Date().getTime(); + MochiKit.Base.map(function (effect) { + effect.loop(timePos); + }, this.effects); + } +}); + +MochiKit.Visual.Queues = { + instances: {}, + + get: function (queueName) { + if (typeof(queueName) != 'string') { + return queueName; + } + + if (!this.instances[queueName]) { + this.instances[queueName] = new MochiKit.Visual.ScopedQueue(); + } + return this.instances[queueName]; + } +}; + +MochiKit.Visual.Queue = MochiKit.Visual.Queues.get('global'); + +MochiKit.Visual.DefaultOptions = { + transition: MochiKit.Visual.Transitions.sinoidal, + duration: 1.0, // seconds + fps: 25.0, // max. 25fps due to MochiKit.Visual.Queue implementation + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' +}; + +MochiKit.Visual.Base = function () {}; + +MochiKit.Visual.Base.prototype = { + /*** + + Basic class for all Effects. Define a looping mechanism called for each step + of an effect. Don't instantiate it, only subclass it. + + ***/ + + __class__ : MochiKit.Visual.Base, + + /** @id MochiKit.Visual.Base.prototype.start */ + start: function (options) { + var v = MochiKit.Visual; + this.options = MochiKit.Base.setdefault(options || {}, + v.DefaultOptions); + 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) { + v.Queues.get(typeof(this.options.queue) == 'string' ? + 'global' : this.options.queue.scope).add(this); + } + }, + + /** @id MochiKit.Visual.Base.prototype.loop */ + loop: function (timePos) { + if (timePos >= this.startOn) { + if (timePos >= this.finishOn) { + return this.finalize(); + } + 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; + } + } + }, + + /** @id MochiKit.Visual.Base.prototype.render */ + render: function (pos) { + if (this.state == 'idle') { + this.state = 'running'; + this.event('beforeSetup'); + 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.event('beforeUpdate'); + this.update(pos); + this.event('afterUpdate'); + } + }, + + /** @id MochiKit.Visual.Base.prototype.cancel */ + cancel: function () { + if (!this.options.sync) { + MochiKit.Visual.Queues.get(typeof(this.options.queue) == 'string' ? + 'global' : this.options.queue.scope).remove(this); + } + this.state = 'finished'; + }, + + /** @id MochiKit.Visual.Base.prototype.finalize */ + finalize: function () { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + this.finish(); + this.event('afterFinish'); + }, + + setup: function () { + }, + + finish: function () { + }, + + update: function (position) { + }, + + /** @id MochiKit.Visual.Base.prototype.event */ + event: function (eventName) { + if (this.options[eventName + 'Internal']) { + this.options[eventName + 'Internal'](this); + } + if (this.options[eventName]) { + this.options[eventName](this); + } + }, + + /** @id MochiKit.Visual.Base.prototype.repr */ + repr: function () { + return '[' + this.__class__.NAME + ', options:' + + MochiKit.Base.repr(this.options) + ']'; + } +}; + + /** @id MochiKit.Visual.Parallel */ +MochiKit.Visual.Parallel = function (effects, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(effects, options); + } + + this.__init__(effects, options); +}; + +MochiKit.Visual.Parallel.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Parallel.prototype, { + /*** + + Run multiple effects at the same time. + + ***/ + + __class__ : MochiKit.Visual.Parallel, + + __init__: function (effects, options) { + this.effects = effects || []; + this.start(options); + }, + + /** @id MochiKit.Visual.Parallel.prototype.update */ + update: function (position) { + MochiKit.Base.map(function (effect) { + effect.render(position); + }, this.effects); + }, + + /** @id MochiKit.Visual.Parallel.prototype.finish */ + finish: function () { + MochiKit.Base.map(function (effect) { + effect.finalize(); + }, this.effects); + } +}); + +/** @id MochiKit.Visual.Opacity */ +MochiKit.Visual.Opacity = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.Opacity.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Opacity.prototype, { + /*** + + Change the opacity of an element. + + @param options: 'from' and 'to' change the starting and ending opacities. + Must be between 0.0 and 1.0. Default to current opacity and 1.0. + + ***/ + + __class__ : MochiKit.Visual.Opacity, + + __init__: function (element, /* optional */options) { + var b = MochiKit.Base; + var s = MochiKit.Style; + this.element = MochiKit.DOM.getElement(element); + // make this work on IE on elements without 'layout' + if (this.element.currentStyle && + (!this.element.currentStyle.hasLayout)) { + s.setStyle(this.element, {zoom: 1}); + } + options = b.update({ + from: s.getStyle(this.element, 'opacity') || 0.0, + to: 1.0 + }, options || {}); + this.start(options); + }, + + /** @id MochiKit.Visual.Opacity.prototype.update */ + update: function (position) { + MochiKit.Style.setStyle(this.element, {'opacity': position}); + } +}); + +/** @id MochiKit.Visual.Move.prototype */ +MochiKit.Visual.Move = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.Move.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Move.prototype, { + /*** + + Move an element between its current position to a defined position + + @param options: 'x' and 'y' for final positions, default to 0, 0. + + ***/ + + __class__ : MochiKit.Visual.Move, + + __init__: function (element, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + options = MochiKit.Base.update({ + x: 0, + y: 0, + mode: 'relative' + }, options || {}); + this.start(options); + }, + + /** @id MochiKit.Visual.Move.prototype.setup */ + 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) + MochiKit.DOM.makePositioned(this.element); + + var s = this.element.style; + var originalVisibility = s.visibility; + var originalDisplay = s.display; + if (originalDisplay == 'none') { + s.visibility = 'hidden'; + s.display = ''; + } + + this.originalLeft = parseFloat(MochiKit.Style.getStyle(this.element, 'left') || '0'); + this.originalTop = parseFloat(MochiKit.Style.getStyle(this.element, 'top') || '0'); + + if (this.options.mode == 'absolute') { + // absolute movement, so we need to calc deltaX and deltaY + this.options.x -= this.originalLeft; + this.options.y -= this.originalTop; + } + if (originalDisplay == 'none') { + s.visibility = originalVisibility; + s.display = originalDisplay; + } + }, + + /** @id MochiKit.Visual.Move.prototype.update */ + update: function (position) { + MochiKit.Style.setStyle(this.element, { + left: Math.round(this.options.x * position + this.originalLeft) + 'px', + top: Math.round(this.options.y * position + this.originalTop) + 'px' + }); + } +}); + +/** @id MochiKit.Visual.Scale */ +MochiKit.Visual.Scale = function (element, percent, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, percent, options); + } + this.__init__(element, percent, options); +}; + +MochiKit.Visual.Scale.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Scale.prototype, { + /*** + + Change the size of an element. + + @param percent: final_size = percent*original_size + + @param options: several options changing scale behaviour + + ***/ + + __class__ : MochiKit.Visual.Scale, + + __init__: function (element, percent, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + options = MochiKit.Base.update({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or {} with provided values + scaleFrom: 100.0, + scaleTo: percent + }, options || {}); + this.start(options); + }, + + /** @id MochiKit.Visual.Scale.prototype.setup */ + setup: function () { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = MochiKit.Style.getStyle(this.element, + 'position'); + + var ma = MochiKit.Base.map; + var b = MochiKit.Base.bind; + this.originalStyle = {}; + ma(b(function (k) { + this.originalStyle[k] = this.element.style[k]; + }, this), ['top', 'left', 'width', 'height', 'fontSize']); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = MochiKit.Style.getStyle(this.element, + 'font-size') || '100%'; + ma(b(function (fontSizeType) { + if (fontSize.indexOf(fontSizeType) > 0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }, this), ['em', 'px', '%']); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + if (/^content/.test(this.options.scaleMode)) { + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + } else if (this.options.scaleMode == 'box') { + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + } else { + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + } + }, + + /** @id MochiKit.Visual.Scale.prototype.update */ + update: function (position) { + var currentScale = (this.options.scaleFrom/100.0) + + (this.factor * position); + if (this.options.scaleContent && this.fontSize) { + MochiKit.Style.setStyle(this.element, { + fontSize: this.fontSize * currentScale + this.fontSizeType + }); + } + this.setDimensions(this.dims[0] * currentScale, + this.dims[1] * currentScale); + }, + + /** @id MochiKit.Visual.Scale.prototype.finish */ + finish: function () { + if (this.restoreAfterFinish) { + MochiKit.Style.setStyle(this.element, this.originalStyle); + } + }, + + /** @id MochiKit.Visual.Scale.prototype.setDimensions */ + setDimensions: function (height, width) { + var d = {}; + var r = Math.round; + if (/MSIE/.test(navigator.userAgent)) { + r = Math.ceil; + } + if (this.options.scaleX) { + d.width = r(width) + 'px'; + } + if (this.options.scaleY) { + d.height = r(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'; + } + } + } + MochiKit.Style.setStyle(this.element, d); + } +}); + +/** @id MochiKit.Visual.Highlight */ +MochiKit.Visual.Highlight = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.Highlight.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Highlight.prototype, { + /*** + + Highlight an item of the page. + + @param options: 'startcolor' for choosing highlighting color, default + to '#ffff99'. + + ***/ + + __class__ : MochiKit.Visual.Highlight, + + __init__: function (element, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + options = MochiKit.Base.update({ + startcolor: '#ffff99' + }, options || {}); + this.start(options); + }, + + /** @id MochiKit.Visual.Highlight.prototype.setup */ + setup: function () { + var b = MochiKit.Base; + var s = MochiKit.Style; + // Prevent executing on elements not in the layout flow + if (s.getStyle(this.element, 'display') == 'none') { + this.cancel(); + return; + } + // Disable background image during the effect + this.oldStyle = { + backgroundImage: s.getStyle(this.element, 'background-image') + }; + s.setStyle(this.element, { + backgroundImage: 'none' + }); + + if (!this.options.endcolor) { + this.options.endcolor = + MochiKit.Color.Color.fromBackground(this.element).toHexString(); + } + if (b.isUndefinedOrNull(this.options.restorecolor)) { + this.options.restorecolor = s.getStyle(this.element, + 'background-color'); + } + // init color calculations + this._base = b.map(b.bind(function (i) { + return parseInt( + this.options.startcolor.slice(i*2 + 1, i*2 + 3), 16); + }, this), [0, 1, 2]); + this._delta = b.map(b.bind(function (i) { + return parseInt(this.options.endcolor.slice(i*2 + 1, i*2 + 3), 16) + - this._base[i]; + }, this), [0, 1, 2]); + }, + + /** @id MochiKit.Visual.Highlight.prototype.update */ + update: function (position) { + var m = '#'; + MochiKit.Base.map(MochiKit.Base.bind(function (i) { + m += MochiKit.Color.toColorPart(Math.round(this._base[i] + + this._delta[i]*position)); + }, this), [0, 1, 2]); + MochiKit.Style.setStyle(this.element, { + backgroundColor: m + }); + }, + + /** @id MochiKit.Visual.Highlight.prototype.finish */ + finish: function () { + MochiKit.Style.setStyle(this.element, + MochiKit.Base.update(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +/** @id MochiKit.Visual.ScrollTo */ +MochiKit.Visual.ScrollTo = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.ScrollTo.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.ScrollTo.prototype, { + /*** + + Scroll to an element in the page. + + ***/ + + __class__ : MochiKit.Visual.ScrollTo, + + __init__: function (element, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + this.start(options || {}); + }, + + /** @id MochiKit.Visual.ScrollTo.prototype.setup */ + setup: function () { + var p = MochiKit.Position; + p.prepare(); + var offsets = p.cumulativeOffset(this.element); + if (this.options.offset) { + offsets.y += this.options.offset; + } + var max; + if (window.innerHeight) { + max = window.innerHeight - window.height; + } else if (document.documentElement && + document.documentElement.clientHeight) { + max = document.documentElement.clientHeight - + document.body.scrollHeight; + } else if (document.body) { + max = document.body.clientHeight - document.body.scrollHeight; + } + this.scrollStart = p.windowOffset.y; + this.delta = (offsets.y > max ? max : offsets.y) - this.scrollStart; + }, + + /** @id MochiKit.Visual.ScrollTo.prototype.update */ + update: function (position) { + var p = MochiKit.Position; + p.prepare(); + window.scrollTo(p.windowOffset.x, this.scrollStart + (position * this.delta)); + } +}); + +MochiKit.Visual.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +MochiKit.Visual.Morph = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.Morph.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Morph.prototype, { + /*** + + Morph effect: make a transformation from current style to the given style, + automatically making a transition between the two. + + ***/ + + __class__ : MochiKit.Visual.Morph, + + __init__: function (element, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + this.start(options || {}); + }, + + /** @id MochiKit.Visual.Morph.prototype.setup */ + setup: function () { + var b = MochiKit.Base; + var style = this.options.style; + this.styleStart = {}; + this.styleEnd = {}; + this.units = {}; + var value, unit; + for (var s in style) { + value = style[s]; + s = b.camelize(s); + if (MochiKit.Visual.CSS_LENGTH.test(value)) { + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + unit = (components.length == 3) ? components[2] : null; + this.styleEnd[s] = value; + this.units[s] = unit; + value = MochiKit.Style.getStyle(this.element, s); + components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + this.styleStart[s] = value; + } else { + var c = MochiKit.Color.Color; + value = c.fromString(value); + if (value) { + this.units[s] = "color"; + this.styleEnd[s] = value.toHexString(); + value = MochiKit.Style.getStyle(this.element, s); + this.styleStart[s] = c.fromString(value).toHexString(); + + this.styleStart[s] = b.map(b.bind(function (i) { + return parseInt( + this.styleStart[s].slice(i*2 + 1, i*2 + 3), 16); + }, this), [0, 1, 2]); + this.styleEnd[s] = b.map(b.bind(function (i) { + return parseInt( + this.styleEnd[s].slice(i*2 + 1, i*2 + 3), 16); + }, this), [0, 1, 2]); + } + } + } + }, + + /** @id MochiKit.Visual.Morph.prototype.update */ + update: function (position) { + var value; + for (var s in this.styleStart) { + if (this.units[s] == "color") { + var m = '#'; + var start = this.styleStart[s]; + var end = this.styleEnd[s]; + MochiKit.Base.map(MochiKit.Base.bind(function (i) { + m += MochiKit.Color.toColorPart(Math.round(start[i] + + (end[i] - start[i])*position)); + }, this), [0, 1, 2]); + this.element.style[s] = m; + } else { + value = this.styleStart[s] + Math.round((this.styleEnd[s] - this.styleStart[s]) * position * 1000) / 1000 + this.units[s]; + this.element.style[s] = value; + } + } + } +}); + +/*** + +Combination effects. + +***/ + +/** @id MochiKit.Visual.fade */ +MochiKit.Visual.fade = function (element, /* optional */ options) { + /*** + + Fade a given element: change its opacity and hide it in the end. + + @param options: 'to' and 'from' to change opacity. + + ***/ + var s = MochiKit.Style; + var oldOpacity = s.getStyle(element, 'opacity'); + options = MochiKit.Base.update({ + from: s.getStyle(element, 'opacity') || 1.0, + to: 0.0, + afterFinishInternal: function (effect) { + if (effect.options.to !== 0) { + return; + } + s.hideElement(effect.element); + s.setStyle(effect.element, {'opacity': oldOpacity}); + } + }, options || {}); + return new MochiKit.Visual.Opacity(element, options); +}; + +/** @id MochiKit.Visual.appear */ +MochiKit.Visual.appear = function (element, /* optional */ options) { + /*** + + Make an element appear. + + @param options: 'to' and 'from' to change opacity. + + ***/ + var s = MochiKit.Style; + var v = MochiKit.Visual; + options = MochiKit.Base.update({ + from: (s.getStyle(element, 'display') == 'none' ? 0.0 : + s.getStyle(element, 'opacity') || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function (effect) { + v.forceRerendering(effect.element); + }, + beforeSetupInternal: function (effect) { + s.setStyle(effect.element, {'opacity': effect.options.from}); + s.showElement(effect.element); + } + }, options || {}); + return new v.Opacity(element, options); +}; + +/** @id MochiKit.Visual.puff */ +MochiKit.Visual.puff = function (element, /* optional */ options) { + /*** + + 'Puff' an element: grow it to double size, fading it and make it hidden. + + ***/ + var s = MochiKit.Style; + var v = MochiKit.Visual; + element = MochiKit.DOM.getElement(element); + var oldStyle = { + position: s.getStyle(element, 'position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height, + opacity: s.getStyle(element, 'opacity') + }; + options = MochiKit.Base.update({ + beforeSetupInternal: function (effect) { + MochiKit.Position.absolutize(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + }, + scaleContent: true, + scaleFromCenter: true + }, options || {}); + return new v.Parallel( + [new v.Scale(element, 200, + {sync: true, scaleFromCenter: options.scaleFromCenter, + scaleContent: options.scaleContent, restoreAfterFinish: true}), + new v.Opacity(element, {sync: true, to: 0.0 })], + options); +}; + +/** @id MochiKit.Visual.blindUp */ +MochiKit.Visual.blindUp = function (element, /* optional */ options) { + /*** + + Blind an element up: change its vertical size to 0. + + ***/ + var d = MochiKit.DOM; + element = d.getElement(element); + var elemClip = d.makeClipping(element); + options = MochiKit.Base.update({ + scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function (effect) { + MochiKit.Style.hideElement(effect.element); + d.undoClipping(effect.element, elemClip); + } + }, options || {}); + + return new MochiKit.Visual.Scale(element, 0, options); +}; + +/** @id MochiKit.Visual.blindDown */ +MochiKit.Visual.blindDown = function (element, /* optional */ options) { + /*** + + Blind an element down: restore its vertical size. + + ***/ + var d = MochiKit.DOM; + var s = MochiKit.Style; + element = d.getElement(element); + var elementDimensions = s.getElementDimensions(element); + var elemClip; + options = MochiKit.Base.update({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + restoreAfterFinish: true, + afterSetupInternal: function (effect) { + elemClip = d.makeClipping(effect.element); + s.setStyle(effect.element, {height: '0px'}); + s.showElement(effect.element); + }, + afterFinishInternal: function (effect) { + d.undoClipping(effect.element, elemClip); + } + }, options || {}); + return new MochiKit.Visual.Scale(element, 100, options); +}; + +/** @id MochiKit.Visual.switchOff */ +MochiKit.Visual.switchOff = function (element, /* optional */ options) { + /*** + + Apply a switch-off-like effect. + + ***/ + var d = MochiKit.DOM; + element = d.getElement(element); + var oldOpacity = MochiKit.Style.getStyle(element, 'opacity'); + var elemClip; + options = MochiKit.Base.update({ + duration: 0.3, + scaleFromCenter: true, + scaleX: false, + scaleContent: false, + restoreAfterFinish: true, + beforeSetupInternal: function (effect) { + d.makePositioned(effect.element); + elemClip = d.makeClipping(effect.element); + }, + afterFinishInternal: function (effect) { + MochiKit.Style.hideElement(effect.element); + d.undoClipping(effect.element, elemClip); + d.undoPositioned(effect.element); + MochiKit.Style.setStyle(effect.element, {'opacity': oldOpacity}); + } + }, options || {}); + var v = MochiKit.Visual; + return new v.appear(element, { + duration: 0.4, + from: 0, + transition: v.Transitions.flicker, + afterFinishInternal: function (effect) { + new v.Scale(effect.element, 1, options); + } + }); +}; + +/** @id MochiKit.Visual.dropOut */ +MochiKit.Visual.dropOut = function (element, /* optional */ options) { + /*** + + Make an element fall and disappear. + + ***/ + var d = MochiKit.DOM; + var s = MochiKit.Style; + element = d.getElement(element); + var oldStyle = { + top: s.getStyle(element, 'top'), + left: s.getStyle(element, 'left'), + opacity: s.getStyle(element, 'opacity') + }; + + options = MochiKit.Base.update({ + duration: 0.5, + distance: 100, + beforeSetupInternal: function (effect) { + d.makePositioned(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + d.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options || {}); + var v = MochiKit.Visual; + return new v.Parallel( + [new v.Move(element, {x: 0, y: options.distance, sync: true}), + new v.Opacity(element, {sync: true, to: 0.0})], + options); +}; + +/** @id MochiKit.Visual.shake */ +MochiKit.Visual.shake = function (element, /* optional */ options) { + /*** + + Move an element from left to right several times. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + element = d.getElement(element); + options = MochiKit.Base.update({ + x: -20, + y: 0, + duration: 0.05, + afterFinishInternal: function (effect) { + d.undoPositioned(effect.element); + s.setStyle(effect.element, oldStyle); + } + }, options || {}); + var oldStyle = { + top: s.getStyle(element, 'top'), + left: s.getStyle(element, 'left') }; + return new v.Move(element, + {x: 20, y: 0, duration: 0.05, afterFinishInternal: function (effect) { + new v.Move(effect.element, + {x: -40, y: 0, duration: 0.1, afterFinishInternal: function (effect) { + new v.Move(effect.element, + {x: 40, y: 0, duration: 0.1, afterFinishInternal: function (effect) { + new v.Move(effect.element, + {x: -40, y: 0, duration: 0.1, afterFinishInternal: function (effect) { + new v.Move(effect.element, + {x: 40, y: 0, duration: 0.1, afterFinishInternal: function (effect) { + new v.Move(effect.element, options + ) }}) }}) }}) }}) }}); +}; + +/** @id MochiKit.Visual.slideDown */ +MochiKit.Visual.slideDown = function (element, /* optional */ options) { + /*** + + Slide an element down. + It needs to have the content of the element wrapped in a container + element with fixed height. + + ***/ + var d = MochiKit.DOM; + var b = MochiKit.Base; + var s = MochiKit.Style; + element = d.getElement(element); + if (!element.firstChild) { + throw "MochiKit.Visual.slideDown must be used on a element with a child"; + } + d.removeEmptyTextNodes(element); + var oldInnerBottom = s.getStyle(element.firstChild, 'bottom') || 0; + var elementDimensions = s.getElementDimensions(element); + var elemClip; + options = b.update({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + restoreAfterFinish: true, + afterSetupInternal: function (effect) { + d.makePositioned(effect.element); + d.makePositioned(effect.element.firstChild); + if (/Opera/.test(navigator.userAgent)) { + s.setStyle(effect.element, {top: ''}); + } + elemClip = d.makeClipping(effect.element); + s.setStyle(effect.element, {height: '0px'}); + s.showElement(effect.element); + }, + afterUpdateInternal: function (effect) { + s.setStyle(effect.element.firstChild, + {bottom: (effect.dims[0] - effect.element.clientHeight) + 'px'}); + }, + afterFinishInternal: function (effect) { + d.undoClipping(effect.element, elemClip); + // IE will crash if child is undoPositioned first + if (/MSIE/.test(navigator.userAgent)) { + d.undoPositioned(effect.element); + d.undoPositioned(effect.element.firstChild); + } else { + d.undoPositioned(effect.element.firstChild); + d.undoPositioned(effect.element); + } + s.setStyle(effect.element.firstChild, + {bottom: oldInnerBottom}); + } + }, options || {}); + + return new MochiKit.Visual.Scale(element, 100, options); +}; + +/** @id MochiKit.Visual.slideUp */ +MochiKit.Visual.slideUp = function (element, /* optional */ options) { + /*** + + Slide an element up. + It needs to have the content of the element wrapped in a container + element with fixed height. + + ***/ + var d = MochiKit.DOM; + var b = MochiKit.Base; + var s = MochiKit.Style; + element = d.getElement(element); + if (!element.firstChild) { + throw "MochiKit.Visual.slideUp must be used on a element with a child"; + } + d.removeEmptyTextNodes(element); + var oldInnerBottom = s.getStyle(element.firstChild, 'bottom'); + var elemClip; + options = b.update({ + scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + restoreAfterFinish: true, + beforeStartInternal: function (effect) { + d.makePositioned(effect.element); + d.makePositioned(effect.element.firstChild); + if (/Opera/.test(navigator.userAgent)) { + s.setStyle(effect.element, {top: ''}); + } + elemClip = d.makeClipping(effect.element); + s.showElement(effect.element); + }, + afterUpdateInternal: function (effect) { + s.setStyle(effect.element.firstChild, + {bottom: (effect.dims[0] - effect.element.clientHeight) + 'px'}); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.element); + d.undoClipping(effect.element, elemClip); + d.undoPositioned(effect.element.firstChild); + d.undoPositioned(effect.element); + s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); + } + }, options || {}); + return new MochiKit.Visual.Scale(element, 0, options); +}; + +// Bug in opera makes the TD containing this element expand for a instance +// after finish +/** @id MochiKit.Visual.squish */ +MochiKit.Visual.squish = function (element, /* optional */ options) { + /*** + + Reduce an element and make it disappear. + + ***/ + var d = MochiKit.DOM; + var b = MochiKit.Base; + var elemClip; + options = b.update({ + restoreAfterFinish: true, + beforeSetupInternal: function (effect) { + elemClip = d.makeClipping(effect.element); + }, + afterFinishInternal: function (effect) { + MochiKit.Style.hideElement(effect.element); + d.undoClipping(effect.element, elemClip); + } + }, options || {}); + + return new MochiKit.Visual.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, options); +}; + +/** @id MochiKit.Visual.grow */ +MochiKit.Visual.grow = function (element, /* optional */ options) { + /*** + + Grow an element to its original size. Make it zero-sized before + if necessary. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + element = d.getElement(element); + options = MochiKit.Base.update({ + direction: 'center', + moveTransition: v.Transitions.sinoidal, + scaleTransition: v.Transitions.sinoidal, + opacityTransition: v.Transitions.full, + scaleContent: true, + scaleFromCenter: false + }, options || {}); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: s.getStyle(element, 'opacity') + }; + + var dims = s.getElementDimensions(element); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.w; + initialMoveY = moveY = 0; + moveX = -dims.w; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.h; + moveY = -dims.h; + break; + case 'bottom-right': + initialMoveX = dims.w; + initialMoveY = dims.h; + moveX = -dims.w; + moveY = -dims.h; + break; + case 'center': + initialMoveX = dims.w / 2; + initialMoveY = dims.h / 2; + moveX = -dims.w / 2; + moveY = -dims.h / 2; + break; + } + + var optionsParallel = MochiKit.Base.update({ + beforeSetupInternal: function (effect) { + s.setStyle(effect.effects[0].element, {height: '0px'}); + s.showElement(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + d.undoClipping(effect.effects[0].element); + d.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options || {}); + + return new v.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetupInternal: function (effect) { + s.hideElement(effect.element); + d.makeClipping(effect.element); + d.makePositioned(effect.element); + }, + afterFinishInternal: function (effect) { + new v.Parallel( + [new v.Opacity(effect.element, { + sync: true, to: 1.0, from: 0.0, + transition: options.opacityTransition + }), + new v.Move(effect.element, { + x: moveX, y: moveY, sync: true, + transition: options.moveTransition + }), + new v.Scale(effect.element, 100, { + scaleMode: {originalHeight: dims.h, + originalWidth: dims.w}, + sync: true, + scaleFrom: /Opera/.test(navigator.userAgent) ? 1 : 0, + transition: options.scaleTransition, + scaleContent: options.scaleContent, + scaleFromCenter: options.scaleFromCenter, + restoreAfterFinish: true + }) + ], optionsParallel + ); + } + }); +}; + +/** @id MochiKit.Visual.shrink */ +MochiKit.Visual.shrink = function (element, /* optional */ options) { + /*** + + Shrink an element and make it disappear. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + element = d.getElement(element); + options = MochiKit.Base.update({ + direction: 'center', + moveTransition: v.Transitions.sinoidal, + scaleTransition: v.Transitions.sinoidal, + opacityTransition: v.Transitions.none, + scaleContent: true, + scaleFromCenter: false + }, options || {}); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: s.getStyle(element, 'opacity') + }; + + var dims = s.getElementDimensions(element); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.w; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.h; + break; + case 'bottom-right': + moveX = dims.w; + moveY = dims.h; + break; + case 'center': + moveX = dims.w / 2; + moveY = dims.h / 2; + break; + } + var elemClip; + + var optionsParallel = MochiKit.Base.update({ + beforeStartInternal: function (effect) { + elemClip = d.makePositioned(effect.effects[0].element); + d.makeClipping(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + d.undoClipping(effect.effects[0].element, elemClip); + d.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options || {}); + + return new v.Parallel( + [new v.Opacity(element, { + sync: true, to: 0.0, from: 1.0, + transition: options.opacityTransition + }), + new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { + sync: true, transition: options.scaleTransition, + scaleContent: options.scaleContent, + scaleFromCenter: options.scaleFromCenter, + restoreAfterFinish: true + }), + new v.Move(element, { + x: moveX, y: moveY, sync: true, transition: options.moveTransition + }) + ], optionsParallel + ); +}; + +/** @id MochiKit.Visual.pulsate */ +MochiKit.Visual.pulsate = function (element, /* optional */ options) { + /*** + + Pulse an element between appear/fade. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var b = MochiKit.Base; + var oldOpacity = MochiKit.Style.getStyle(element, 'opacity'); + options = b.update({ + duration: 3.0, + from: 0, + afterFinishInternal: function (effect) { + MochiKit.Style.setStyle(effect.element, {'opacity': oldOpacity}); + } + }, options || {}); + var transition = options.transition || v.Transitions.sinoidal; + var reverser = b.bind(function (pos) { + return transition(1 - v.Transitions.pulse(pos, options.pulses)); + }, transition); + b.bind(reverser, transition); + return new v.Opacity(element, b.update({ + transition: reverser}, options)); +}; + +/** @id MochiKit.Visual.fold */ +MochiKit.Visual.fold = function (element, /* optional */ options) { + /*** + + Fold an element, first vertically, then horizontally. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + element = d.getElement(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + var elemClip = d.makeClipping(element); + options = MochiKit.Base.update({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function (effect) { + new v.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function (effect) { + s.hideElement(effect.element); + d.undoClipping(effect.element, elemClip); + s.setStyle(effect.element, oldStyle); + } + }); + } + }, options || {}); + return new v.Scale(element, 5, options); +}; + + +// Compatibility with MochiKit 1.0 +MochiKit.Visual.Color = MochiKit.Color.Color; +MochiKit.Visual.getElementsComputedStyle = MochiKit.DOM.computedStyle; + +/* end of Rico adaptation */ + +MochiKit.Visual.__new__ = function () { + var m = MochiKit.Base; + + m.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; + +}; + +MochiKit.Visual.EXPORT = [ + "roundElement", + "roundClass", + "tagifyText", + "multiple", + "toggle", + "Parallel", + "Opacity", + "Move", + "Scale", + "Highlight", + "ScrollTo", + "Morph", + "fade", + "appear", + "puff", + "blindUp", + "blindDown", + "switchOff", + "dropOut", + "shake", + "slideDown", + "slideUp", + "squish", + "grow", + "shrink", + "pulsate", + "fold" +]; + +MochiKit.Visual.EXPORT_OK = [ + "Base", + "PAIRS" +]; + +MochiKit.Visual.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Visual); diff --git a/mochikit_v14/MochiKit/__package__.js b/mochikit_v14/MochiKit/__package__.js new file mode 100644 index 0000000..8d644b1 --- /dev/null +++ b/mochikit_v14/MochiKit/__package__.js @@ -0,0 +1,18 @@ +dojo.kwCompoundRequire({ + "common": [ + "MochiKit.Base", + "MochiKit.Iter", + "MochiKit.Logging", + "MochiKit.DateTime", + "MochiKit.Format", + "MochiKit.Async", + "MochiKit.DOM", + "MochiKit.Style", + "MochiKit.LoggingPane", + "MochiKit.Color", + "MochiKit.Signal", + "MochiKit.Position", + "MochiKit.Visual" + ] +}); +dojo.provide("MochiKit.*"); diff --git a/mochikit_v14/doc/html/MochiKit/Async.html b/mochikit_v14/doc/html/MochiKit/Async.html new file mode 100644 index 0000000..d9c26cf --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Async.html @@ -0,0 +1,781 @@ + + + + + + + +MochiKit.Async - manage asynchronous tasks + + + + + + +
    +
    +

    Name

    +

    MochiKit.Async - manage asynchronous tasks

    +
    +
    +

    Synopsis

    +
    +var url = "/src/b/bo/bob/MochiKit.Async/META.json";
    +/*
    +
    +    META.json looks something like this:
    +
    +    {"name": "MochiKit", "version": "0.5"}
    +
    +*/
    +var d = loadJSONDoc(url);
    +var gotMetadata = function (meta) {
    +    if (MochiKit.Async.VERSION == meta.version) {
    +        alert("You have the newest MochiKit.Async!");
    +    } else {
    +        alert("MochiKit.Async "
    +            + meta.version
    +            + " is available, upgrade!");
    +    }
    +};
    +var metadataFetchFailed = function (err) {
    +  alert("The metadata for MochiKit.Async could not be fetched :(");
    +};
    +d.addCallbacks(gotMetadata, metadataFetchFailed);
    +
    +
    +
    +

    Description

    +

    MochiKit.Async provides facilities to manage asynchronous (as in AJAX +[1]) tasks. The model for asynchronous computation used in this +module is heavily inspired by Twisted [2].

    +
    + +
    +

    Overview

    +
    +

    Deferred

    +

    The Deferred constructor encapsulates a single value that is not +available yet. The most important example of this in the context of a +web browser would be an XMLHttpRequest to a server. The importance +of the Deferred is that it allows a consistent API to be exposed for +all asynchronous computations that occur exactly once.

    +

    The producer of the Deferred is responsible for doing all of the +complicated work behind the scenes. This often means waiting for a +timer to fire, or waiting for an event (e.g. onreadystatechange of +XMLHttpRequest). It could also be coordinating several events +(e.g. XMLHttpRequest with a timeout, or several Deferreds +(e.g. fetching a set of XML documents that should be processed at the +same time).

    +

    Since these sorts of tasks do not respond immediately, the producer of +the Deferred does the following steps before returning to the +consumer:

    +
      +
    1. Create a new Deferred(); object and keep a +reference to it, because it will be needed later when the value is +ready.
    2. +
    3. Setup the conditions to create the value requested (e.g. create a +new XMLHttpRequest, set its onreadystatechange).
    4. +
    5. Return the Deferred object.
    6. +
    +

    Since the value is not yet ready, the consumer attaches a function to +the Deferred that will be called when the value is ready. This is not +unlike setTimeout, or other similar facilities you may already be +familiar with. The consumer can also attach an "errback" to the +Deferred, which is a callback for error handling.

    +

    When the value is ready, the producer simply calls +myDeferred.callback(theValue). If an error occurred, it should +call myDeferred.errback(theValue) instead. As soon as this +happens, the callback that the consumer attached to the +Deferred is called with theValue as the only argument.

    +

    There are quite a few additional "advanced" features baked into +Deferred, such as cancellation and callback chains, so +take a look at the API reference if you would like to know more!

    +
    +
    +
    +

    API Reference

    +
    +

    Errors

    +

    + +AlreadyCalledError:

    +
    +

    Thrown by a Deferred if .callback or .errback +are called more than once.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +BrowserComplianceError:

    +
    +

    Thrown when the JavaScript runtime is not capable of performing +the given function. Currently, this happens if the browser does +not support XMLHttpRequest.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +CancelledError:

    +
    +

    Thrown by a Deferred when it is cancelled, unless a +canceller is present and throws something else.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +GenericError:

    +
    +

    Results passed to .fail or .errback of a +Deferred are wrapped by this Error if !(result +instanceof Error).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +XMLHttpRequestError:

    +
    +

    Thrown when an XMLHttpRequest does not complete successfully +for any reason. The req property of the error is the failed +XMLHttpRequest object, and for convenience the number +property corresponds to req.status.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Constructors

    +

    + +Deferred():

    +
    +Encapsulates a sequence of callbacks in response to a value that +may not yet be available. This is modeled after the Deferred class +from Twisted [3].
    +
    +

    Why do we want this? JavaScript has no threads, and even if it +did, threads are hard. Deferreds are a way of abstracting +non-blocking events, such as the final response to an +XMLHttpRequest.

    +

    The sequence of callbacks is internally represented as a list of +2-tuples containing the callback/errback pair. For example, the +following call sequence:

    +
    +var d = new Deferred();
    +d.addCallback(myCallback);
    +d.addErrback(myErrback);
    +d.addBoth(myBoth);
    +d.addCallbacks(myCallback, myErrback);
    +
    +

    is translated into a Deferred with the following +internal representation:

    +
    +[
    +    [myCallback, null],
    +    [null, myErrback],
    +    [myBoth, myBoth],
    +    [myCallback, myErrback]
    +]
    +
    +

    The Deferred also keeps track of its current status +(fired). Its status may be one of the following three values:

    +
    + ++++ + + + + + + + + + + + + + + + + +
    ValueCondition
    -1no value yet (initial condition)
    0success
    1error
    +
    +

    A Deferred will be in the error state if one of the +following conditions are met:

    +
      +
    1. The result given to callback or errback is "instanceof +Error"
    2. +
    3. The callback or errback threw while executing. If the thrown +object is not instanceof Error, it will be wrapped with +GenericError.
    4. +
    +

    Otherwise, the Deferred will be in the success +state. The state of the Deferred determines the next +element in the callback sequence to run.

    +

    When a callback or errback occurs with the example deferred chain, +something equivalent to the following will happen (imagine that +exceptions are caught and returned as-is):

    +
    +// d.callback(result) or d.errback(result)
    +if (!(result instanceof Error)) {
    +    result = myCallback(result);
    +}
    +if (result instanceof Error) {
    +    result = myErrback(result);
    +}
    +result = myBoth(result);
    +if (result instanceof Error) {
    +    result = myErrback(result);
    +} else {
    +    result = myCallback(result);
    +}
    +
    +

    The result is then stored away in case another step is added to +the callback sequence. Since the Deferred already has +a value available, any new callbacks added will be called +immediately.

    +

    There are two other "advanced" details about this implementation +that are useful:

    +

    Callbacks are allowed to return Deferred instances, so +you can build complicated sequences of events with (relative) +ease.

    +

    The creator of the Deferred may specify a +canceller. The canceller is a function that will be called if +Deferred.prototype.cancel is called before the +Deferred fires. You can use this to allow an +XMLHttpRequest to be cleanly cancelled, for example. Note that +cancel will fire the Deferred with a +CancelledError (unless your canceller throws or +returns a different Error), so errbacks should be prepared to +handle that Error gracefully for cancellable +Deferred instances.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Deferred.prototype.addBoth(func):

    +
    +

    Add the same function as both a callback and an errback as the +next element on the callback sequence. This is useful for code +that you want to guarantee to run, e.g. a finalizer.

    +

    If additional arguments are given, then func will be replaced +with MochiKit.Base.partial.apply(null, +arguments). This differs from Twisted, because the result of +the callback or errback will be the last argument passed to +func.

    +

    If func returns a Deferred, then it will be +chained (its value or error will be passed to the next +callback). Note that once the returned Deferred is chained, it +can no longer accept new callbacks.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Deferred.prototype.addCallback(func[, ...]):

    +
    +

    Add a single callback to the end of the callback sequence.

    +

    If additional arguments are given, then func will be replaced +with MochiKit.Base.partial.apply(null, +arguments). This differs from Twisted, because the result of +the callback will be the last argument passed to func.

    +

    If func returns a Deferred, then it will be +chained (its value or error will be passed to the next +callback). Note that once the returned Deferred is chained, it +can no longer accept new callbacks.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Deferred.prototype.addCallbacks(callback, errback):

    +
    +

    Add separate callback and errback to the end of the callback +sequence. Either callback or errback may be null, but not +both.

    +

    If callback or errback returns a Deferred, +then it will be chained (its value or error will be passed to the +next callback). Note that once the returned Deferred is +chained, it can no longer accept new callbacks.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Deferred.prototype.addErrback(func):

    +
    +

    Add a single errback to the end of the callback sequence.

    +

    If additional arguments are given, then func will be replaced +with MochiKit.Base.partial.apply(null, +arguments). This differs from Twisted, because the result of +the errback will be the last argument passed to func.

    +

    If func returns a Deferred, then it will be +chained (its value or error will be passed to the next +callback). Note that once the returned Deferred is chained, it +can no longer accept new callbacks.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Deferred.prototype.callback([result]):

    +
    +

    Begin the callback sequence with a non-Error result. Result +may be any value except for a Deferred.

    +

    Either .callback or .errback should be called exactly once +on a Deferred.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Deferred.prototype.cancel():

    +
    +

    Cancels a Deferred that has not yet received a value, +or is waiting on another Deferred as its value.

    +

    If a canceller is defined, the canceller is called. If the +canceller did not return an Error, or there was no canceller, +then the errback chain is started with CancelledError.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Deferred.prototype.errback([result]):

    +
    +

    Begin the callback sequence with an error result. Result may be +any value except for a Deferred, but if !(result +instanceof Error), it will be wrapped with +GenericError.

    +

    Either .callback or .errback should be called exactly once +on a + +Deferred.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +DeferredLock():

    +
    +

    A lock for asynchronous systems.

    +

    The locked property of a DeferredLock will be +true if it locked, false otherwise. Do not change this +property.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +DeferredLock.prototype.acquire():

    +
    +

    Attempt to acquire the lock. Returns a Deferred that +fires on lock acquisition with the DeferredLock as the +value. If the lock is locked, then the Deferred goes +into a waiting list.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +DeferredLock.prototype.release():

    +
    +

    Release the lock. If there is a waiting list, then the first +Deferred in that waiting list will be called back.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +DeferredList(list, [fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller]):

    +
    +

    Combine a list of Deferred into one. Track the +callbacks and return a list of (success, result) tuples, 'success' +being a boolean indicating whether result is a normal result or an +error.

    +

    Once created, you have access to all Deferred methods, +like addCallback, addErrback, addBoth. The behaviour can be +changed by the following options:

    +
    +
    fireOnOneCallback:
    +
    Flag for launching the callback once the first Deferred of the +list has returned.
    +
    fireOnOneErrback:
    +
    Flag for calling the errback at the first error of a Deferred.
    +
    consumeErrors:
    +
    Flag indicating that any errors raised in the Deferreds should +be consumed by the DeferredList.
    +
    +

    Example:

    +
    +// We need to fetch data from 2 different urls
    +var d1 = loadJSONDoc(url1);
    +var d2 = loadJSONDoc(url2);
    +var l1 = new DeferredList([d1, d2], false, false, true);
    +l1.addCallback(function (resultList) {
    +    MochiKit.Base.map(function (result) {
    +        if (result[0]) {
    +            alert("Data is here: " + result[1]);
    +        } else {
    +            alert("Got an error: " + result[1]);
    +        }
    +    }, resultList);
    +});
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Functions

    +

    + +callLater(seconds, func[, args...]):

    +
    +

    Call func(args...) after at least seconds seconds have +elapsed. This is a convenience method for:

    +
    +func = partial.apply(extend(null, arguments, 1));
    +return wait(seconds).addCallback(function (res) { return func() });
    +
    +

    Returns a cancellable Deferred.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +doXHR(url[, {option: value, ...}]):

    +
    +

    Perform a customized XMLHttpRequest and wrap it with a +Deferred that may be cancelled.

    +

    Note that only 200 (OK), 201 (CREATED), +204 (NO CONTENT) and 304 (NOT MODIFIED) are considered +success codes. All other status codes will +result in an errback with an XMLHttpRequestError.

    +
    +
    url:
    +
    The URL for this request.
    +
    +

    The following options are currently accepted:

    +
    +
    method:
    +
    The HTTP method. Default is 'GET'.
    +
    sendContent:
    +
    The content to send (e.g. with POST). Default is no content.
    +
    queryString:
    +
    If present it will be used to build a query string to append to +the url using MochiKit.Base.queryString. Default is +no query string.
    +
    username:
    +
    The username for the request. Default is no username.
    +
    password:
    +
    The password for the request. Default is no password.
    +
    headers:
    +
    Additional headers to set in the request, either as an object +such as {'Accept': 'text/xml'} or as an Array of 2-Arrays +[['Accept', 'text/xml']]. Default is no additional headers.
    +
    mimeType:
    +
    An override mime type. The typical use of this is to pass +'text/xml' to force XMLHttpRequest to attempt to parse responseXML. +Default is no override.
    +
    returns:
    +
    Deferred that will callback with the +XMLHttpRequest instance on success
    +
    Availability:
    +
    Available in MochiKit 1.4+.
    +
    +
    +

    + +doSimpleXMLHttpRequest(url[, queryArguments...]):

    +
    +

    Perform a simple XMLHttpRequest and wrap it with a +Deferred that may be cancelled.

    +

    Note that only 200 (OK), 201 (CREATED), +204 (NO CONTENT) and 304 (NOT MODIFIED) are considered +success codes. All other status codes will +result in an errback with an XMLHttpRequestError.

    +
    +
    url:
    +
    The URL to GET
    +
    queryArguments:
    +

    If this function is called with more than one argument, a +"?" and the result of +MochiKit.Base.queryString with the rest of the +arguments are appended to the URL.

    +

    For example, this will do a GET request to the URL +http://example.com?bar=baz:

    +
    +doSimpleXMLHttpRequest("http://example.com", {bar: "baz"});
    +
    +
    +
    returns:
    +
    Deferred that will callback with the +XMLHttpRequest instance on success
    +
    Availability:
    +
    Available in MochiKit 1.3.1+. Support for 201 and 204 were added in +MochiKit 1.4.
    +
    +
    +

    + +evalJSONRequest(req):

    +
    +

    Evaluate a JSON [4] XMLHttpRequest

    +
    +
    req:
    +
    The request whose .responseText property is to be +evaluated
    +
    returns:
    +
    A JavaScript object
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +fail([result]):

    +
    +

    Return a Deferred that has already had +.errback(result) called.

    +

    See succeed documentation for rationale.

    +
    +
    result:
    +
    The result to give to +Deferred.prototype.errback(result).
    +
    returns:
    +
    A new Deferred()
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +gatherResults(deferreds):

    +
    +

    A convenience function that returns a DeferredList +from the given Array of Deferred instances that +will callback with an Array of just results when they're +available, or errback on the first array.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +getXMLHttpRequest():

    +
    +

    Return an XMLHttpRequest compliant object for the current +platform.

    +

    In order of preference:

    +
      +
    • new XMLHttpRequest()
    • +
    • new ActiveXObject('Msxml2.XMLHTTP')
    • +
    • new ActiveXObject('Microsoft.XMLHTTP')
    • +
    • new ActiveXObject('Msxml2.XMLHTTP.4.0')
    • +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +maybeDeferred(func[, argument...]):

    +
    +

    Call a func with the given arguments and ensure the result is +a Deferred.

    +
    +
    func:
    +
    The function to call.
    +
    returns:
    +
    A new Deferred based on the call to func. If +func does not naturally return a Deferred, its +result or error value will be wrapped by one.
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +loadJSONDoc(url[, queryArguments...]):

    +
    +

    Do a simple XMLHttpRequest to a URL and get the response as a +JSON [4] document.

    +
    +
    url:
    +
    The URL to GET
    +
    queryArguments:
    +

    If this function is called with more than one argument, a +"?" and the result of +MochiKit.Base.queryString with the rest of the +arguments are appended to the URL.

    +

    For example, this will do a GET request to the URL +http://example.com?bar=baz:

    +
    +loadJSONDoc("http://example.com", {bar: "baz"});
    +
    +
    +
    returns:
    +
    Deferred that will callback with the evaluated +JSON [4] response upon successful XMLHttpRequest
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +sendXMLHttpRequest(req[, sendContent]):

    +
    +

    Set an onreadystatechange handler on an XMLHttpRequest +object and send it off. Will return a cancellable +Deferred that will callback on success.

    +

    Note that only 200 (OK), 201 (CREATED), +204 (NO CONTENT) and 304 (NOT MODIFIED) are considered +success codes. All other status codes will +result in an errback with an XMLHttpRequestError.

    +
    +
    req:
    +
    An preconfigured XMLHttpRequest object (open has been +called).
    +
    sendContent:
    +
    Optional string or DOM content to send over the +XMLHttpRequest.
    +
    returns:
    +
    Deferred that will callback with the +XMLHttpRequest instance on success.
    +
    Availability:
    +
    Available in MochiKit 1.3.1+. Support for 201 and 204 were added in +MochiKit 1.4.
    +
    +
    +

    + +succeed([result]):

    +
    +

    Return a Deferred that has already had +.callback(result) called.

    +

    This is useful when you're writing synchronous code to an +asynchronous interface: i.e., some code is calling you expecting a +Deferred result, but you don't actually need to do +anything asynchronous. Just return succeed(theResult).

    +

    See fail for a version of this function that uses a failing +Deferred rather than a successful one.

    +
    +
    result:
    +
    The result to give to +Deferred.prototype.callback(result)
    +
    returns:
    +
    a new Deferred
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +wait(seconds[, res]):

    +
    +

    Return a new cancellable Deferred that will +.callback(res) after at least seconds seconds have +elapsed.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +
    +

    See Also

    + + + + + +
    [1]AJAX, Asynchronous JavaScript and XML: http://en.wikipedia.org/wiki/AJAX
    + + + + + +
    [2]Twisted, an event-driven networking framework written in Python: http://twistedmatrix.com/
    + + + + + +
    [3]Twisted Deferred Reference: http://twistedmatrix.com/projects/core/documentation/howto/defer.html
    + + + + + +
    [4](1, 2, 3) JSON, JavaScript Object Notation: http://json.org/
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Base.html b/mochikit_v14/doc/html/MochiKit/Base.html new file mode 100644 index 0000000..1fc71f6 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Base.html @@ -0,0 +1,1665 @@ + + + + + + + +MochiKit.Base - functional programming and useful comparisons + + + + + + +
    +
    +

    Name

    +

    MochiKit.Base - functional programming and useful comparisons

    +
    +
    +

    Synopsis

    +
    +myObjectRepr = function () {
    +    // gives a nice, stable string representation for objects,
    +    // ignoring any methods
    +    var keyValuePairs = [];
    +    for (var k in this) {
    +        var v = this[k];
    +        if (typeof(v) != 'function') {
    +            keyValuePairs.push([k, v]);
    +        }
    +    };
    +    keyValuePairs.sort(compare);
    +    return "{" + map(
    +        function (pair) {
    +            return map(repr, pair).join(":");
    +        },
    +        keyValuePairs
    +    ).join(", ") + "}";
    +};
    +
    +// repr() will look for objects that have a repr method
    +myObjectArray = [
    +    {"a": 3, "b": 2, "repr": myObjectRepr},
    +    {"a": 1, "b": 2, "repr": myObjectRepr}
    +];
    +
    +// sort it by the "a" property, check to see if it matches
    +myObjectArray.sort(keyComparator("a"));
    +expectedRepr = '[{"a": 1, "b": 2}, {"a": 3, "b": 2}]';
    +assert( repr(myObjectArray) == expectedRepr );
    +
    +// get just the "a" values out into an array
    +sortedAValues = map(itemgetter("a"), myObjectArray);
    +assert( compare(sortedAValues, [1, 3]) == 0 );
    +
    +// serialize an array as JSON, unserialize it, expect something equivalent
    +myArray = [1, 2, "3", null, undefined];
    +assert( objEqual(evalJSON(serializeJSON(myArray)), myArray) );
    +
    +
    +
    +

    Description

    +

    MochiKit.Base is the foundation for the MochiKit suite. +It provides:

    + +

    Python users will feel at home with MochiKit.Base, as the +facilities are quite similar to those available as part of Python and +the Python standard library.

    +
    +
    +

    Dependencies

    +

    None.

    +
    +
    +

    Overview

    +
    +

    Comparison

    +

    The comparators (operators for comparison) in JavaScript are deeply +broken, and it is not possible to teach them new tricks.

    +

    MochiKit exposes an extensible comparison facility as a simple +compare(a, b) function, which should be used in lieu of +JavaScript's operators whenever comparing objects other than numbers +or strings (though you can certainly use compare for +those, too!).

    +

    The compare function has the same signature and return +value as a sort function for Array.prototype.sort, and is often +used in that context.

    +

    Defining new comparators for the compare function to use +is done by adding an entry to its AdapterRegistry with the +registerComparator function.

    +
    +
    +

    Programmer Representation

    +

    JavaScript's default representation mechanism, toString, is +notorious for having terrible default behavior. It's also very unwise +to change that default, as other JavaScript code you may be using may +depend on it.

    +

    It's also useful to separate the concept of a "string representation" +and a "string representation for programmers", much like Python does +with its str and repr protocols.

    +

    repr provides this programmer representation for +JavaScript, in a way that doesn't require object prototype hacking: +using an AdapterRegistry.

    +

    Objects that implement the repr protocol can either implement a +.repr() or .__repr__() method, or they can simply have an +adapter setup to generate programmer representations. By default, the +registry provides nice representations for null, undefined, +Array, and objects or functions with a NAME attribute that use +the default toString. For objects that repr doesn't already +understand, it simply defaults to toString, so it will integrate +seamlessly with code that implements the idiomatic JavaScript +toString method!

    +

    To define a programmer representation for your own objects, simply add +a .repr() or .__repr__() method that returns a string. For +objects that you didn't create (e.g., from a script you didn't write, +or a built-in object), it is instead recommended that you create an +adapter with registerRepr.

    +
    +
    +

    JSON Serialization

    +

    JSON [1], JavaScript Object Notation, is a widely used serialization +format in the context of web development. It's extremely simple, +lightweight, and fast. In its essence, JSON is a restricted subset of +JavaScript syntax suitable for sending over the wire that can be +unserialized with a simple eval. It's often used as an alternative to +XML in "AJAX" contexts because it is compact, fast, and much simpler +to use for most purposes.

    +

    To create a JSON serialization of any object, simply call +serializeJSON() with that object. To unserialize a JSON +string, simply call evalJSON() with the serialization.

    +

    In order of precedence, serializeJSON coerces the given +argument into a JSON serialization:

    +
      +
    1. Primitive types are returned as their JSON representation: +string, number, boolean, null.
    2. +
    3. If the object has a __json__ or json method, then it is +called with no arguments. If the result of this method is not the +object itself, then the new object goes through rule processing +again (e.g. it may return a string, which is then serialized in +JSON format).
    4. +
    5. If the object is Array-like (has a length property that is +a number, and is not a function), then it is serialized as a JSON +array. Each element will be processed according to these rules in +order. Elements that can not be serialized (e.g. functions) will +be replaced with undefined.
    6. +
    7. The jsonRegistry AdapterRegistry is consulted for +an adapter for this object. JSON adapters take one argument (the +object), and are expected to behave like a __json__ or +json method (return another object to be serialized, or +itself).
    8. +
    9. If the object is undefined, a TypeError is thrown. If you +wish to serialize undefined as null or some other value, you +should create an adapter to do so.
    10. +
    11. If no adapter is available, the object is enumerated and +serialized as a JSON object (name:value pairs). All names are +expected to be strings. Each value is serialized according to +these rules, and if it can not be serialized (e.g. methods), then +that name:value pair will be skipped.
    12. +
    +
    +
    +

    Adapter Registries

    +

    MochiKit makes extensive use of adapter registries, which enable you +to implement object-specific behaviors for objects that you do not +necessarily want to modify, such as built-in objects. This is +especially useful because JavaScript does not provide a method for +hiding user-defined properties from for propName in obj +enumeration.

    +

    AdapterRegistry is simply an encapsulation for an ordered +list of "check" and "wrap" function pairs. Each +AdapterRegistry instance should perform one function, but +may have multiple ways to achieve that function based upon the +arguments. One way to think of it is as a poor man's generic function, +or multiple dispatch (on arbitrary functions, not just type!).

    +

    Check functions take one or more arguments, and return true if the +argument list is suitable for the wrap function. Check functions +should perform "cheap" checks of an object's type or contents, before +the "expensive" wrap function is called.

    +

    Wrap functions take the same arguments as check functions and do some +operation, such as creating a programmer representation or comparing +both arguments.

    +
    +
    +

    Convenience Functions

    +

    Much of MochiKit.Base is there to simply remove the grunt +work of doing generic JavaScript programming.

    +

    Need to take every property from one object and set them on another? +No problem, just call update(dest, src)! What if you just +wanted to update keys that weren't already set? Look no further than +setdefault(dest, src[, ...]).

    +

    Want to return a mutable object, but don't want to suffer the +consequences if the user mutates it? Just clone(it) and +you'll get a copy-on-write clone. Cheaper than a copy!

    +

    Need to extend an Array with another array? Or even an +Array-like object such as a NodeList or the special +arguments object? Even if you need to skip the first few elements +of the source Array-like object, it's no problem with +extend(dstArray, srcArrayLike[, skip])!

    +

    Wouldn't it be convenient to have all of the JavaScript operators were +available as functions somewhere? That's what the +operators table is for, and it even comes with additional +operators based on the compare function.

    +

    Need to walk some tree of objects and manipulate or find something in +it? A DOM element tree perhaps? Use nodeWalk(node, +visitor)!

    +

    There's plenty more, so check out the API Reference below.

    +
    +
    +

    Functional Programming

    +

    Functional programming constructs such as map and +filter can save you a lot of time, because JavaScript +iteration is error-prone and arduous. Writing less code is the best +way to prevent bugs, and functional programming can help you do that.

    +

    MochiKit.Base ships with a few simple Array-based +functional programming constructs, namely map and +filter, and their "extended" brethren, xmap +and xfilter.

    +

    map(func, arrayLike[, ...]) takes a function and an +Array-like object, and creates a new Array. The new Array +is the result of func(element) for every element of arrayLike, +much like the Array.prototype.map extension in Mozilla. However, +MochiKit.Base takes that a step further and gives you the +full blown Python version of map, which will take several +Array-like objects, and calls the function with one argument per +given Array-like, e.g.:

    +
    +var arrayOne = [1, 2, 3, 4, 5];
    +var arrayTwo = [1, 5, 2, 4, 3];
    +var arrayThree = [5, 2, 1, 3, 4];
    +var biggestElements = map(objMax, arrayOne, arrayTwo, arrayThree);
    +assert( objEqual(biggestElements, [5, 5, 3, 4, 5]) );
    +
    +

    filter(func, arrayLike[, self]) takes a function and an +Array-like object, and returns a new Array. This is basically +identical to the Array.prototype.filter extension in +Mozilla. self, if given, will be used as this in the context of +func when called.

    +

    xmap and xfilter are just special forms of +map and filter that accept a function as the +first argument, and use the extra arguments as the Array-like. Not +terribly interesting, but a definite time-saver in some cases.

    +

    If you appreciate the functional programming facilities here, you +should definitely check out MochiKit.Iter, which provides +full blown iterators, MochiKit.Iter.range, +MochiKit.Iter.reduce, and a near-complete port of Python's +itertools [2] module, with some extra stuff thrown in for good +measure!

    +
    +
    +

    Bound and Partial Functions

    +

    JavaScript's method-calling special form and lack of bound functions +(functions that know what this should be) are one of the first +stumbling blocks that programmers new to JavaScript face. The +bind(func, self) method fixes that right up by returning a +new function that calls func with the right this.

    +

    In order to take real advantage of all this fancy functional +programming stuff, you're probably going to want partial +application. This allows you to create a new function from an existing +function that remembers some of the arguments. For example, if you +wanted to compare a given object to a slew of other objects, you could +do something like this:

    +
    +compareWithOne = partial(compare, 1);
    +results = map(compareWithOne, [0, 1, 2, 3]);
    +assert( objEqual(results, [-1, 0, 1, 1]) );
    +
    +

    One of the better uses of partial functions is in +MochiKit.DOM, which is certainly a must-see for those of +you creating lots of DOM elements with JavaScript!

    +
    +
    +
    +

    API Reference

    +
    +

    Errors

    +

    + +NotFound:

    +
    +

    A singleton error raised when no suitable adapter is found

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Constructors

    +

    + +AdapterRegistry:

    +
    +

    A registry to facilitate adaptation.

    +

    All check/wrap function pairs in a given registry should +take the same number of arguments.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +AdapterRegistry.prototype.register(name, check, wrap[, override]):

    +
    +
    +
    name:
    +
    a unique identifier used to identify this adapter so that it +may be unregistered.
    +
    check:
    +
    function that should return true if the given arguments +are appropriate for the wrap function.
    +
    wrap:
    +
    function that takes the same parameters as check and does +the adaptation. Every wrap/check function pair in the +registry should have the same number of arguments.
    +
    override:
    +
    if true, the check function will be +given highest priority. Otherwise, the lowest.
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +AdapterRegistry.prototype.match(obj[, ...]):

    +
    +

    Find an adapter for the given arguments by calling every check +function until one returns true.

    +

    If no suitable adapter is found, throws NotFound.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +AdapterRegistry.prototype.unregister(name):

    +
    +

    Remove a named adapter from the registry

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +NamedError:

    +
    +

    Convenience constructor for creating new errors +(e.g. NotFound)

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Functions

    +

    + +arrayEqual(self, arr):

    +
    +

    Compare the arrays self and arr for equality using +compare on each element. Uses a fast-path for length +differences.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +average(lst[, ...]):

    +
    +

    This function is an alias of mean().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +bind(func, self[, arg, ...]):

    +
    +

    Return a copy of func bound to self. This means whenever +and however the returned function is called, this will always +reference the given self. func may be either a function +object, or a string. If it is a string, then self[func] will +be used, making these two statements equivalent:

    +
    +bind("method", self);
    +bind(self.method, self);
    +
    +

    Calling bind(func, self) on an already bound function +will return a new function that is bound to the new self! If +self is undefined, then the previous self is used. If +self is null, then the this object is used (which may +or may not be the global object). To force binding to the global +object, you should pass it explicitly.

    +

    Additional arguments, if given, will be partially applied to the +function. These three expressions are equivalent and return +equally efficient functions (bind and +partial share the same code path):

    + +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +bindMethods(self):

    +
    +

    Replace all functions meth on self with +bind(meth, self). This emulates Python's bound +instance methods, where there is no need to worry about preserving +this when the method is used as a callback.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +camelize(str):

    +
    +

    Converts hyphenated strings to camelCase:

    +
    +assert( camelize("border-left") == "borderLeft" );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +clone(obj):

    +
    +

    Return a new object using obj as its prototype. Use this if +you want to return a mutable object (e.g. instance state), but +don't want the user to mutate it. If they do, it won't have any +effect on the original obj.

    +

    Note that this is a shallow clone, so mutable properties will have +to be cloned separately if you want to "protect" them.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +compare(a, b):

    +
    +

    Compare two objects in a sensible manner. Currently this is:

    +
      +
    1. undefined and null compare equal to each other
    2. +
    3. undefined and null are less than anything else
    4. +
    5. If JavaScript says a == b, then we trust it
    6. +
    7. comparators registered with registerComparator are used to +find a good comparator. Built-in comparators are currently +available for Array-like and Date-like objects.
    8. +
    9. Otherwise hope that the built-in comparison operators do +something useful, which should work for numbers and strings.
    10. +
    11. If neither a < b or a > b, then throw a TypeError
    12. +
    +

    Returns what one would expect from a comparison function:

    + ++++ + + + + + + + + + + + + + + +
    ValueCondition
    0a == b
    1a > b
    -1a < b
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +compose(f1, f2, ..., fN):

    +
    +

    Return a new function as the combination of the given function +arguments, equivalent to f1(f2(arguments)).

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +concat(lst[, ...]):

    +
    +

    Concatenates all given Array-like arguments and returns +a new Array:

    +
    +var lst = concat(["1","3","5"], ["2","4","6"]);
    +assert( lst.toString() == "1,3,5,2,4,6" );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +counter(n=1):

    +
    +

    Returns a function that will return a number one greater than +the previous returned value, starting at n. For example:

    +
    +nextId = counter()
    +assert( nextId() == 1 )
    +assert( nextId() == 2 )
    +
    +

    For an iterator with this behavior, see +MochiKit.Iter.count.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +extend(self, obj, skip=0):

    +
    +

    Mutate the array self by extending it with an Array-like +obj, starting from index skip. If null is given as the +initial array, a new one will be created.

    +

    This mutates and returns self, be warned.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +evalJSON(aJSONString):

    +
    +

    Unserialize a JSON [1] represenation of an object.

    +

    Note that this uses the eval function of the interpreter, and +therefore trusts the contents of aJSONString to be safe. This +is acceptable when the JSON and JavaScript application originate +from the same server, but in other scenarios it may not be the +appropriate security model. Currently, a validating JSON parser is +beyond the scope of MochiKit, but there is one available from +json.org [1].

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +filter(fn, lst):

    +
    +

    Returns a new Array composed of all elements from lst +where fn(lst[i]) returns a true value.

    +

    If fn is null, operator.truth will be used.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +findValue(lst, value, start=0, end=lst.length):

    +
    +

    Finds the index of value in the Array-like object lst +using compare. The search starts at the index +start, and ends at the index end - 1. If value is not +found in lst, it will return -1.

    +

    For example:

    +
    +assert( findValue([1, 2, 3, 2, 1], 2) == 1 )
    +assert( findValue([1, 2, 3, 2, 1], 2, 2) == 3 )
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +findIdentical(lst, value, start=0, end=lst.length):

    +
    +

    Finds the index of value in the Array-like object lst +using the === operator. The search starts at the index +start, and ends at the index end - 1. If value is not +found in lst, it will return -1.

    +

    You should use this function instead of findValue if +lst may be comprised of objects for which no comparator is +defined and all you care about is finding an identical object +(e.g. the same instance), or if lst is comprised of just +numbers or strings and performance is important.

    +

    For example:

    +
    +assert( findIdentical([1, 2, 3, 2, 1], 2) == 1 )
    +assert( findIdentical([1, 2, 3, 2, 1], 2, 2) == 3 )
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +flattenArguments(arg[, ...]):

    +
    +

    Given a bunch of arguments, return a single Array containing +all of those arguments. Any Array-like argument will be extended +in-place, e.g.:

    +
    +compare(flattenArguments(1, [2, 3, [4, 5]]), [1, 2, 3, 4, 5]) == 0
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +flattenArray(lst):

    +
    +

    Return a new Array consisting of every item in lst with Array +items expanded in-place recursively. This differs from +flattenArguments in that it only takes one argument and +it only flattens items that are instanceof Array.

    +
    +compare(flattenArray([1, [2, 3, [4, 5]]]), [1, 2, 3, 4, 5]) == 0
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +forwardCall(name):

    +
    +

    Returns a function that forwards a method call to +this.name(...)

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +isArrayLike(obj[, ...]):

    +
    +

    Returns true if all given arguments are Array-like (have a +.length property and typeof(obj) == 'object')

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +isDateLike(obj[, ...]):

    +
    +

    Returns true if all given arguments are Date-like (have a +.getTime() method)

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +isEmpty(obj[, ...]):

    +
    +

    Returns true if all the given Array-like or string +arguments are empty (obj.length == 0)

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +isNotEmpty(obj[, ...]):

    +
    +

    Returns true if all the given Array-like or string +arguments are not empty (obj.length > 0)

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +isNull(obj[, ...]):

    +
    +

    Returns true if all arguments are null.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +isUndefinedOrNull(obj[, ...]):

    +
    +

    Returns true if all arguments are undefined or null

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +itemgetter(name):

    +
    +

    Returns a function(obj) that returns obj[name]

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +items(obj):

    +
    +

    Return an Array of [propertyName, propertyValue] pairs for +the given obj (in the order determined by for propName in +obj).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +keyComparator(key[, ...]):

    +
    +

    A comparator factory that compares a[key] with b[key]. +e.g.:

    +
    +var lst = ["a", "bbb", "cc"];
    +lst.sort(keyComparator("length"));
    +assert( lst.toString() == "a,cc,bbb" );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +keys(obj):

    +
    +

    Return an Array of the property names of an object (in the +order determined by for propName in obj).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +listMax(lst):

    +
    +

    Return the largest element of an Array-like object, as +determined by compare. This is a special form of +listMinMax, specifically +partial(listMinMax, 1).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +listMin(lst):

    +
    +

    Return the smallest element of an Array-like object, as +determined by compare. This is a special form of +listMinMax, specifically +partial(listMinMax, -1).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +listMinMax(which, lst):

    +
    +

    If which == -1 then it will return the smallest element of the +Array-like lst. This is also available as +listMin(lst).

    +

    If which == 1 then it will return the largest element of the +Array-like lst. This is also available as +listMax(list).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +map(fn, lst[, ...]):

    +
    +

    Return a new array composed of the results of fn(x) for every +x in lst.

    +

    If fn is null, and only one sequence argument is given the +identity function is used.

    +
    +map(null, lst) -> lst.slice();
    +

    If fn is not null and more than one sequence argument is +given, then one element from each sequence is used to build the +argument list for fn.

    +
    +
    +
    map(fn, p, q, ...)
    +
    -> [fn(p[0], q[0], ..), fn(p[1], q[1], ...), ...]
    +
    +
    +

    If fn is null, and more than one sequence is given as +arguments, then the Array function is used, making it +equivalent to MochiKit.Iter.zip.

    +
    +
    +
    map(null, p, q, ...)
    +
    -> MochiKit.Iter.zip(p, q, ...) +-> [[p0, q0, ...], [p1, q1, ...], ...];
    +
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +mean(lst[, ...]):

    +
    +

    Returns the arithmetic mean (average) of the argument list, or an array. +This function applies flattenArguments() to the argument list.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +median(lst[, ...]):

    +
    +

    Returns the median of the argument list, or an array. This function +applies flattenArguments() to the argument list.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +merge(obj[, ...]):

    +
    +

    Create a new instance of Object that contains every property +from all given objects. If a property is defined on more than one +of the objects, the last property is used.

    +

    This is a special form of update(self, obj[, ...]), +specifically, it is defined as partial(update, null).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +method(self, func, ...):

    +
    +

    Alternate form of bind that takes the object before +the function. These two calls are equivalent:

    +
    +bind("method", myobject)
    +method(myobject, "method")
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +methodcaller(name[, args...]):

    +
    +

    Return a new function that calls a method on its argument, +for example:

    +
    +lst = map(methodcaller("toLowerCase"), ["THIS", "is", "LoWeRCaSe"]);
    +assert( lst.join(" ") == "this is lowercase" );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +nameFunctions(namespace):

    +
    +

    Given a namespace (object or function) with a NAME +property, find all methods in it and give them nice NAME +properties too (for use with repr). e.g.:

    +
    +namespace = {
    +    NAME: "Awesome",
    +    Dude: function () {}
    +}
    +nameFunctions(namespace);
    +assert( namespace.Dude.NAME == 'Awesome.Dude' );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +noop():

    +
    +

    A function that performs no operation. Use this where you would +otherwise use (function () {}) in order to avoid Internet +Explorer cyclic garbage leakage.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4
    +
    +
    +

    + +objEqual(a, b):

    +
    +

    Return true if compare(a, b) == 0

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +nodeWalk(node, visitor):

    +
    +

    Non-recursive generic node walking function (e.g. for a DOM).

    +

    The walk order for nodeWalk is breadth first, meaning that all +siblings will be visited before any children.

    +
    +
    node:
    +
    The initial node to be searched.
    +
    visitor:
    +
    The visitor function, will be called as visitor(node), and +should return an Array-like of nodes to be searched next +(e.g. node.childNodes). Leaf nodes may return null or +undefined.
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +objMax(obj[, ...]):

    +
    +

    Return the maximum object according to compare out of +the given arguments. This is similar to listMax, +except is uses the arguments instead of a given Array-like.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +objMin(obj[, ...]):

    +
    +

    Return the minimum object according to compare out of +the given arguments. This is similar to listMin, +except it uses the arguments instead of a given Array-like.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +operator:

    +
    +

    A table of JavaScript's operators for usage with map, +filter, etc.

    +

    Unary Logic Operators:

    +
    + +++++ + + + + + + + + + + + + + + + + + + + + +
    OperatorImplementationDescription
    truth(a)!!aLogical truth
    lognot(a)!aLogical not
    identity(a)aLogical identity
    +
    +

    Unary Math Operators:

    +
    + +++++ + + + + + + + + + + + + + + + + +
    OperatorImplementationDescription
    not(a)~aBitwise not
    neg(a)-aNegation
    +
    +

    Binary Operators:

    +
    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OperatorImplementationDescription
    add(a, b)a + bAddition
    sub(a, b)a - bSubtraction
    div(a, b)a / bDivision
    mod(a, b)a % bModulus
    mul(a, b)a * bMultiplication
    and(a, b)a & bBitwise and
    or(a, b)a | bBitwise or
    xor(a, b)a ^ bBitwise exclusive or
    lshift(a, b)a << bBitwise left shift
    rshift(a, b)a >> bBitwise signed right shift
    zrshift(a, b)a >>> bBitwise unsigned right shift
    +
    +

    Built-in Comparators:

    +
    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OperatorImplementationDescription
    eq(a, b)a == bEquals
    ne(a, b)a != bNot equals
    gt(a, b)a > bGreater than
    ge(a, b)a >= bGreater than or equal to
    lt(a, b)a < bLess than
    le(a, b)a <= bLess than or equal to
    +
    +

    Strict Built-in Comparators:

    +
    + +++++ + + + + + + + + + + + + + + + + +
    OperatorImplementationDescription
    seq(a, b)a === bStrict equals
    sne(a, b)a !== bStrict not equals
    +
    +

    Extended Comparators (uses compare):

    +
    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OperatorImplementationDescription
    ceq(a, b)compare(a, b) == 0Equals
    cne(a, b)compare(a, b) != 0Not equals
    cgt(a, b)compare(a, b) == 1Greater than
    cge(a, b)compare(a, b) != -1Greater than or equal to
    clt(a, b)compare(a, b) == -1Less than
    cle(a, b)compare(a, b) != 1Less than or equal to
    +
    +

    Binary Logical Operators:

    +
    + +++++ + + + + + + + + + + + + + + + + + + + + +
    OperatorImplementationDescription
    logand(a, b)a && bLogical and
    logor(a, b)a || bLogical or
    contains(a, b)b in aHas property (note order)
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +parseQueryString(encodedString[, useArrays=false]):

    +
    +

    Parse a name=value pair URL query string into an object with a +property for each pair. e.g.:

    +
    +var args = parseQueryString("foo=value%20one&bar=two");
    +assert( args.foo == "value one" && args.bar == "two" );
    +
    +

    If you expect that the query string will reuse the same name, then +give true as a second argument, which will use arrays to store +the values. e.g.:

    +
    +var args = parseQueryString("foo=one&foo=two", true);
    +assert( args.foo[0] == "one" && args.foo[1] == "two" );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +partial(func, arg[, ...]):

    +
    +

    Return a partially applied function, e.g.:

    +
    +addNumbers = function (a, b) {
    +    return a + b;
    +}
    +
    +addOne = partial(addNumbers, 1);
    +
    +assert(addOne(2) == 3);
    +
    +

    partial is a special form of bind that +does not alter the bound self (if any). It is equivalent to +calling:

    +
    +bind(func, undefined, arg[, ...]);
    +
    +

    See the documentation for bind for more details about +this facility.

    +

    This could be used to implement, but is NOT currying.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +queryString(names, values):

    +
    +

    Creates a URL query string from a pair of Array-like objects +representing names and values. Each name=value pair will +be URL encoded by urlEncode. name=value pairs with a +value of undefined or null will be skipped. e.g.:

    +
    +var keys = ["foo", "bar"];
    +var values = ["value one", "two"];
    +assert( queryString(keys, values) == "foo=value%20one&bar=two" );
    +
    +
    +
    Alternate form 1:
    +
    queryString(domElement)
    +
    +

    If MochiKit.DOM is loaded, one argument is given, and +that argument is either a string or has a nodeType property +greater than zero, then names and values will be the +result of MochiKit.DOM.formContents(domElement).

    +
    +
    Alternate form 2:
    +
    queryString({name: value, ...})
    +
    +

    Note that when using the alternate form, the order of the +name=value pairs in the resultant query string is dependent on how +the particular JavaScript implementation handles for (..in..) +property enumeration.

    +

    When using the second alternate form, name=value pairs with +typeof(value) == "function" are ignored. This is a workaround +for the case where a poorly designed library has modified +Object.prototype and inserted "convenience functions".

    +

    Values that are Array-like will be expanded as if they were multiply +defined HTML elements. For example:

    +
    +assert( queryString({a: [1,2]}) === "a=1&a=2" );
    +
    +
    +
    Alternate form 2 (MochiKit 1.4+):
    +
    queryString([names, values])
    +
    +

    This form behaves identically to queryString(names, values), +except it takes both arguments as a single Array. This mirrors the +return value of MochiKit.DOM.formContents.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +registerComparator(name, check, comparator[, override]):

    +
    +

    Register a comparator for use with compare.

    +
    +
    name:
    +
    unique identifier describing the comparator.
    +
    check:
    +
    function(a, b) that returns true if a and b +can be compared with comparator.
    +
    comparator:
    +

    function(a, b) that returns:

    + ++++ + + + + + + + + + + + + + + +
    ValueCondition
    0a == b
    1a > b
    -1a < b
    +

    comparator is guaranteed to only be called if check(a, +b) returns a true value.

    +
    +
    override:
    +
    if true, then this will be made the highest precedence +comparator. Otherwise, the lowest.
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +registerJSON(name, check, simplifier[, override]):

    +
    +

    Register a simplifier function for use with +serializeJSON.

    +
    +
    name:
    +
    unique identifier describing the serialization.
    +
    check:
    +
    function(obj) that returns true if obj can +can be simplified for serialization by simplifier.
    +
    simplifier:
    +

    function(obj) that returns a simpler object that can be +further serialized by serializeJSON. For example, +you could simplify Date-like objects to ISO 8601 timestamp +strings with the following simplifier:

    +
    +var simplifyDateAsISO = function (obj) {
    +    return toISOTimestamp(obj, true);
    +};
    +registerJSON("DateLike", isDateLike, simplifyDateAsISO);
    +
    +

    simplifier is guaranteed to only be called if +check(obj) returns a true value.

    +
    +
    override:
    +
    if true, then this will be made the highest precedence +serialization. Otherwise, the lowest.
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +registerRepr(name, check, wrap[, override]):

    +
    +

    Register a programmer representation function. repr +functions should take one argument and return a string +representation of it suitable for developers, primarily used when +debugging.

    +

    If override is given, it is used as the highest priority repr, +otherwise it will be used as the lowest.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +repr(obj):

    +
    +

    Return a programmer representation for obj. See the +Programmer Representation overview for more information about +this function.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +reverseKeyComparator(key):

    +
    +

    A comparator factory that compares a[key] with b[key] in +reverse. e.g.:

    +
    +var lst = ["a", "bbb", "cc"];
    +lst.sort(reverseKeyComparator("length"));
    +assert(lst.toString() == "bbb,cc,a");
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +serializeJSON(anObject):

    +
    +

    Serialize anObject in the JSON [1] format, see JSON +Serialization for the coercion rules. For unserializable objects +(functions that do not have an adapter, __json__ method, or +json method), this will return undefined.

    +

    For those familiar with Python, JSON is similar in scope to +pickle, but it can not handle recursive object graphs.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +setdefault(self, obj[, ...]):

    +
    +

    Mutate self by adding all properties from other object(s) that +it does not already have set.

    +

    If self is null, a new Object instance will be created +and returned.

    +

    This mutates and returns self, be warned.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +typeMatcher(typ[, ...]):

    +
    +

    Given a set of types (as string arguments), returns a +function(obj[, ...]) that will return true if the types of +the given arguments are all members of that set.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +update(self, obj[, ...]):

    +
    +

    Mutate self by replacing its key:value pairs with those from +other object(s). Key:value pairs from later objects will overwrite +those from earlier objects.

    +

    If self is null, a new Object instance will be created +and returned.

    +

    This mutates and returns self, be warned.

    +

    A version of this function that creates a new object is available +as merge(a, b[, ...])

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +updatetree(self, obj[, ...]):

    +
    +

    Mutate self by replacing its key:value pairs with those from +other object(s). If a given key has an object value in both +self and obj, then this function will be called +recursively, updating instead of replacing that object.

    +

    If self is null, a new Object instance will be created +and returned.

    +

    This mutates and returns self, be warned.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +urlEncode(unencoded):

    +
    +

    Converts unencoded into a URL-encoded string. In this +implementation, spaces are converted to %20 instead of "+". e.g.:

    +
    +assert( URLencode("1+2=2") == "1%2B2%3D2");
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +values(obj):

    +
    +

    Return an Array of the property values of an object (in the +order determined by for propName in obj).

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +xfilter(fn, obj[, ...]):

    +
    +

    Returns a new Array composed of the arguments where +fn(obj) returns a true value.

    +

    If fn is null, operator.truth will be used.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +xmap(fn, obj[, ...):

    +
    +

    Return a new Array composed of fn(obj) for every obj +given as an argument.

    +

    If fn is null, operator.identity is used.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +
    +

    See Also

    + + + + + +
    [1](1, 2, 3, 4, 5) JSON, JavaScript Object Notation: http://json.org/
    + + + + + +
    [2]Python's itertools +module: http://docs.python.org/lib/module-itertools.html
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Color.html b/mochikit_v14/doc/html/MochiKit/Color.html new file mode 100644 index 0000000..de50c0b --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Color.html @@ -0,0 +1,753 @@ + + + + + + + +MochiKit.Color - color abstraction with CSS3 support + + + + + + +
    +
    +

    Name

    +

    MochiKit.Color - color abstraction with CSS3 support

    +
    +
    +

    Synopsis

    +
    +// RGB color expressions are supported
    +assert(
    +    objEqual(Color.whiteColor(), Color.fromString("rgb(255,100%, 255)"))
    +);
    +
    +// So is instantiating directly from HSL or RGB values.
    +// Note that fromRGB and fromHSL take numbers between 0.0 and 1.0!
    +assert( objEqual(Color.fromRGB(1.0, 1.0, 1.0), Color.fromHSL(0.0, 0.0, 1.0) );
    +
    +// Or even SVG color keyword names, as per CSS3!
    +assert( Color.fromString("aquamarine"), "#7fffd4" );
    +
    +// NSColor-like colors built in
    +assert( Color.whiteColor().toHexString() == "#ffffff" );
    +
    +
    +
    +

    Description

    +

    MochiKit.Color is an abstraction for handling colors and strings that +represent colors.

    +
    + +
    +

    Overview

    +

    MochiKit.Color provides an abstraction of RGB, HSL and HSV colors with +alpha. It supports parsing and generating of CSS3 colors, and has a +full CSS3 (SVG) color table.

    +

    All of the functionality in this module is exposed through a Color +constructor and its prototype, but a few of its internals are +available for direct use at module level.

    +
    +
    +

    API Reference

    +
    +

    Constructors

    +

    + +Color():

    +
    +

    Represents a color. Component values should be integers between +0.0 and 1.0. You should use one of the Color +factory functions such as Color.fromRGB, +Color.fromHSL, etc. instead of constructing +Color objects directly.

    +

    Color instances can be compared with +MochiKit.Base.compare (though ordering is on RGB, so +is not particularly meaningful except for equality), and the +default toString implementation returns +Color.prototype.toHexString().

    +

    Color instances are immutable, and much of the +architecture is inspired by AppKit's NSColor [1]

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromBackground(elem):

    +
    +

    Returns a Color object based on the background of the +provided element. Equivalent to:

    +
    +c = Color.fromComputedStyle(
    +    elem, "backgroundColor", "background-color") || Color.whiteColor();
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromComputedStyle(elem, style):

    +
    +

    Returns a Color object based on the result of +MochiKit.Style.getStyle(elem, style) or null if not +found.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromHexString(hexString):

    +
    +

    Returns a Color object from the given hexadecimal +color string. For example, "#FFFFFF" would return a +Color with RGB values [255/255, 255/255, 255/255] +(white).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromHSL(hue, saturation, lightness, alpha=1.0):

    +
    +

    Return a Color object from the given hue, +saturation, lightness values. Values should be numbers +between 0.0 and 1.0.

    +

    If alpha is not given, then 1.0 (completely opaque) will +be used.

    +
    +
    Alternate form:
    +
    Color.fromHSL({h: hue, s: saturation, l: lightness, +a: alpha})
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromHSLString(hslString):

    +
    +

    Returns a Color object from the given decimal hsl +color string. For example, "hsl(0,0%,100%)" would return a +Color with HSL values [0/360, 0/360, 360/360] +(white).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromHSV(hue, saturation, value, alpha=1.0):

    +
    +

    Return a Color object from the given hue, +saturation, value values. Values should be numbers between +0.0 and 1.0.

    +

    If alpha is not given, then 1.0 (completely opaque) will +be used.

    +
    +
    Alternate form:
    +
    Color.fromHSV({h: hue, s: saturation, v: value, a: +alpha})
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromName(colorName):

    +
    +

    Returns a Color object corresponding to the given SVG +1.0 color keyword name [2] as per the W3C CSS3 Color Module +[3]. "transparent" is also accepted as a color name, and will +return Color.transparentColor().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromRGB(red, green, blue, alpha=1.0):

    +
    +

    Return a Color object from the given red, +green, blue, and alpha values. Values should be +numbers between 0 and 1.0.

    +

    If alpha is not given, then 1.0 (completely opaque) will +be used.

    +
    +
    Alternate form:
    +
    Color.fromRGB({r: red, g: green, b: blue, a: +alpha})
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromRGBString(rgbString):

    +
    +

    Returns a Color object from the given decimal rgb +color string. For example, "rgb(255,255,255)" would return a +Color with RGB values [255/255, 255/255, 255/255] +(white).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromText(elem):

    +
    +

    Returns a Color object based on the text color of the +provided element. Equivalent to:

    +
    +c = Color.fromComputedStyle(elem, "color") || Color.whiteColor();
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.fromString(rgbOrHexString):

    +
    +

    Returns a Color object from the given RGB, HSL, hex, +or name. Will return null if the string can not be parsed by +any of these methods.

    +

    See Color.fromHexString, +Color.fromRGBString, Color.fromHSLString +and Color.fromName more information.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.namedColors():

    +
    +

    Returns an object with properties for each SVG 1.0 color keyword +name [2] supported by CSS3 [3]. Property names are the color +keyword name in lowercase, and the value is a string suitable for +Color.fromString().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.colorWithAlpha(alpha):

    +
    +

    Return a new Color based on this color, but with the +provided alpha value.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.colorWithHue(hue):

    +
    +

    Return a new Color based on this color, but with the +provided hue value.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.colorWithSaturation(saturation):

    +
    +

    Return a new Color based on this color, but with the +provided saturation value (using the HSL color model).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.colorWithLightness(lightness):

    +
    +

    Return a new Color based on this color, but with the +provided lightness value.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.darkerColorWithLevel(level):

    +
    +

    Return a new Color based on this color, but darker by +the given level (between 0 and 1.0).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.lighterColorWithLevel(level):

    +
    +

    Return a new Color based on this color, but lighter by +the given level (between 0 and 1.0).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.blendedColor(other, fraction=0.5):

    +
    +

    Return a new Color whose RGBA component values are a +weighted sum of this color and other. Each component of the +returned color is the fraction of other's value plus 1 - +fraction of this color's.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.isLight():

    +
    +

    Return true if the lightness value of this color is greater +than 0.5.

    +

    Note that alpha is ignored for this calculation (color +components are not premultiplied).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.isDark():

    +
    +

    Return true if the lightness value of this color is less than +or equal to 0.5.

    +

    Note that alpha is ignored for this calculation (color +components are not premultiplied).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.toRGBString():

    +
    +

    Return the decimal "rgb(red, green, blue)" string +representation of this color.

    +

    If the alpha component is not 1.0 (fully opaque), the +"rgba(red, green, blue, alpha)" string representation will be +used.

    +

    For example:

    +
    +assert( Color.whiteColor().toRGBString() == "rgb(255,255,255)" );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.toHSLString():

    +
    +

    Return the decimal "hsl(hue, saturation, lightness)" string +representation of this color.

    +

    If the alpha component is not 1.0 (fully opaque), the +"hsla(hue, saturation, lightness, alpha)" string +representation will be used.

    +

    For example:

    +
    +assert( Color.whiteColor().toHSLString() == "hsl(0,0,360)" );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.toHexString():

    +
    +

    Return the hexadecimal "#RRGGBB" string representation of this +color.

    +

    Note that the alpha component is completely ignored for +hexadecimal string representations!

    +

    For example:

    +
    +assert( Color.whiteColor().toHexString() == "#FFFFFF" );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.asRGB():

    +
    +

    Return the RGB (red, green, blue, alpha) components of this color +as an object with r, g, b, and a properties that +have values between 0.0 and 1.0.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.asHSL():

    +
    +

    Return the HSL (hue, saturation, lightness, alpha) components of +this color as an object with h, s, l and a +properties that have values between 0.0 and 1.0.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.prototype.asHSV():

    +
    +

    Return the HSV (hue, saturation, value, alpha) components of this +color as an object with h, s, v and a properties +that have values between 0.0 and 1.0.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.blackColor():

    +
    +

    Return a Color object whose RGB values are 0, 0, 0 +(#000000).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.blueColor():

    +
    +

    Return a Color object whose RGB values are 0, 0, 1 +(#0000ff).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.brownColor():

    +
    +

    Return a Color object whose RGB values are 0.6, 0.4, +0.2 (#996633).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.cyanColor():

    +
    +

    Return a Color object whose RGB values are 0, 1, 1 +(#00ffff).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.darkGrayColor():

    +
    +

    Return a Color object whose RGB values are 1/3, 1/3, +1/3 (#555555).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.grayColor():

    +
    +

    Return a Color object whose RGB values are 0.5, 0.5, +0.5 (#808080).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.greenColor():

    +
    +

    Return a Color object whose RGB values are 0, 1, 0. +(#00ff00).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.lightGrayColor():

    +
    +

    Return a Color object whose RGB values are 2/3, 2/3, +2/3 (#aaaaaa).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.magentaColor():

    +
    +

    Return a Color object whose RGB values are 1, 0, 1 +(#ff00ff).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.orangeColor():

    +
    +

    Return a Color object whose RGB values are 1, 0.5, 0 +(#ff8000).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.purpleColor():

    +
    +

    Return a Color object whose RGB values are 0.5, 0, 0.5 +(#800080).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.redColor():

    +
    +

    Return a Color object whose RGB values are 1, 0, 0 +(#ff0000).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.whiteColor():

    +
    +

    Return a Color object whose RGB values are 1, 1, 1 +(#ffffff).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.yellowColor():

    +
    +

    Return a Color object whose RGB values are 1, 1, 0 +(#ffff00).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Color.transparentColor():

    +
    +

    Return a Color object that is completely transparent +(has alpha component of 0).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Functions

    +

    + +clampColorComponent(num, scale):

    +
    +

    Returns num * scale clamped between 0 and scale.

    +

    clampColorComponent is not exported by default when +using JSAN.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +hslToRGB(hue, saturation, lightness, alpha):

    +
    +

    Computes RGB values from the provided HSL values. The return value +is a mapping with "r", "g", "b" and "a" keys.

    +
    +
    Alternate form:
    +
    hslToRGB({h: hue, s: saturation, l: lightness, a: +alpha}).
    +
    +

    hslToRGB is not exported by default when using JSAN.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +hsvToRGB(hue, saturation, value, alpha):

    +
    +

    Computes RGB values from the provided HSV values. The return value +is a mapping with "r", "g", "b" and "a" keys.

    +
    +
    Alternate form:
    +
    hsvToRGB({h: hue, s: saturation, v: value, a: +alpha}).
    +
    +

    hsvToRGB is not exported by default when using JSAN.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toColorPart(num):

    +
    +

    Convert num to a zero padded hexadecimal digit for use in a +hexadecimal color string. Num should be an integer between 0 +and 255.

    +

    toColorPart is not exported by default when using +JSAN.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +rgbToHSL(red, green, blue, alpha):

    +
    +

    Computes HSL values based on the provided RGB values. The return +value is a mapping with "h", "s", "l" and "a" +keys.

    +
    +
    Alternate form:
    +
    rgbToHSL({r: red, g: green, b: blue, a: alpha}).
    +
    +

    rgbToHSL is not exported by default when using JSAN.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +rgbToHSV(red, green, blue, alpha):

    +
    +

    Computes HSV values based on the provided RGB values. The return +value is a mapping with "h", "s", "v" and "a" +keys.

    +
    +
    Alternate form:
    +
    rgbToHSV({r: red, g: green, b: blue, a: alpha}).
    +
    +

    rgbToHSV is not exported by default when using JSAN.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    + +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/DOM.html b/mochikit_v14/doc/html/MochiKit/DOM.html new file mode 100644 index 0000000..a61ec34 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/DOM.html @@ -0,0 +1,1186 @@ + + + + + + + +MochiKit.DOM - painless DOM manipulation API + + + + + + +
    +
    +

    Name

    +

    MochiKit.DOM - painless DOM manipulation API

    +
    +
    +

    Synopsis

    +
    +var rows = [
    +    ["dataA1", "dataA2", "dataA3"],
    +    ["dataB1", "dataB2", "dataB3"]
    +];
    +row_display = function (row) {
    +    return TR(null, map(partial(TD, null), row));
    +}
    +var newTable = TABLE({'class': 'prettytable'},
    +    THEAD(null,
    +        row_display(["head1", "head2", "head3"])),
    +    TFOOT(null,
    +        row_display(["foot1", "foot2", "foot3"])),
    +    TBODY(null,
    +        map(row_display, rows)));
    +// put that in your document.createElement and smoke it!
    +swapDOM(oldTable, newTable);
    +
    +
    +
    +

    Description

    +

    As you probably know, the DOM APIs are some of the most painful +Java-inspired APIs you'll run across from a highly dynamic +language. Don't worry about that though, because they provide a +reasonable basis to build something that sucks a lot less.

    +

    MochiKit.DOM takes much of its inspiration from Nevow's [1] stan +[2]. This means you choose a tag, give it some attributes, then +stuff it full of whatever objects you want. MochiKit.DOM isn't +stupid, it knows that a string should be a text node, and that you +want functions to be called, and that Array-like objects should be +expanded, and stupid null values should be skipped.

    +

    Hell, it will let you return strings from functions, and use iterators +from MochiKit.Iter. If that's not enough, just teach it +new tricks with registerDOMConverter. If you have never +used an API like this for creating DOM elements, you've been wasting +your damn time. Get with it!

    +
    +
    +

    Dependencies

    + +
    +
    +

    Overview

    +
    +

    DOM Coercion Rules

    +

    In order of precedence, createDOM coerces given arguments +to DOM nodes using the following rules:

    +
      +
    1. Functions are called with a this and first argument of the +parent node and their return value is subject to the following +rules (even this one).
    2. +
    3. undefined and null are ignored.
    4. +
    5. If MochiKit.Iter is loaded, iterables are flattened +(as if they were passed in-line as nodes) and each return value is +subject to these rules.
    6. +
    7. Values that look like DOM nodes (objects with a .nodeType > 0) +are .appendChild'ed to the created DOM fragment.
    8. +
    9. Strings are wrapped up with document.createTextNode
    10. +
    11. Objects that have a .dom(node) or .__dom__(node) method +are called with the parent node and their result is coerced using +these rules. (MochiKit 1.4+).
    12. +
    13. Objects that are not strings are run through the domConverters +MochiKit.Base.AdapterRegistry (see +registerDOMConverter). The adapted value is subject +to these same rules (e.g. if the adapter returns a string, it +will be coerced to a text node).
    14. +
    15. If no adapter is available, .toString() is used to create a +text node.
    16. +
    +
    +
    +

    Creating DOM Element Trees

    +

    createDOM provides you with an excellent facility for +creating DOM trees that is easy on the wrists. One of the best ways to +understand how to use it is to take a look at an example:

    +
    +var rows = [
    +    ["dataA1", "dataA2", "dataA3"],
    +    ["dataB1", "dataB2", "dataB3"]
    +];
    +row_display = function (row) {
    +    return TR(null, map(partial(TD, null), row));
    +}
    +var newTable = TABLE({'class': 'prettytable'},
    +    THEAD(null,
    +        row_display(["head1", "head2", "head3"])),
    +    TFOOT(null,
    +        row_display(["foot1", "foot2", "foot3"])),
    +    TBODY(null,
    +        map(row_display, rows)));
    +
    +

    This will create a table with the following visual layout (if it were +inserted into the document DOM):

    +
    + +++++ + + + + + + + + + + + + + + + + + + + + +
    head1head2head3
    dataA1dataA2dataA3
    dataB1dataB2dataB3
    foot1foot2foot3
    +
    +

    Corresponding to the following HTML:

    +
    +<table class="prettytable">
    +    <thead>
    +        <tr>
    +            <td>head1</td>
    +            <td>head2</td>
    +            <td>head3</td>
    +        </tr>
    +    </thead>
    +    <tfoot>
    +        <tr>
    +            <td>foot1</td>
    +            <td>foot2</td>
    +            <td>foot3</td>
    +        </tr>
    +    </tfoot>
    +    <tbody>
    +        <tr>
    +            <td>dataA1</td>
    +            <td>dataA2</td>
    +            <td>dataA3</td>
    +        </tr>
    +        <tr>
    +            <td>dataB1</td>
    +            <td>dataB2</td>
    +            <td>dataB3</td>
    +        </tr>
    +    </tbody>
    +</table>
    +
    +
    +
    +

    DOM Context

    +

    In order to prevent having to pass a window and/or document +variable to every MochiKit.DOM function (e.g. when working with a +child window), MochiKit.DOM maintains a context variable for each of +them. They are managed with the withWindow and +withDocument functions, and can be acquired with +currentWindow() and currentDocument()

    +

    For example, if you are creating DOM nodes in a child window, you +could do something like this:

    +
    +withWindow(child, function () {
    +    var doc = currentDocument();
    +    appendChildNodes(doc.body, H1(null, "This is in the child!"));
    +});
    +
    +

    Note that withWindow(win, ...) also implies +withDocument(win.document, ...).

    +
    +
    +

    DOM Gotchas

    +
    +
    Performance Tradeoff:
    +
    DOM is much easier to get correct and more flexible than working +directly with markup as strings. Modifying innerHTML is still +the fastest way to make document changes.
    +
    Internet Explorer:
    +
    Internet Explorer's DOM implementation is quite poor in comparison +to the other popular implementations. In order to avoid memory +leaks due to circular references, you should use +MochiKit.Signal.connect for all of your event handling +needs. Additionally, when creating tables with DOM, it is required +to use a TBODY tag (see Creating DOM Element Trees for an +example of this).
    +
    +
    +
    +
    +

    API Reference

    +
    +

    Functions

    +

    + +$(id[, ...]):

    +
    +

    An alias for getElement(id[, ...])

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +addElementClass(element, className):

    +
    +

    Ensure that the given element has className set as part of +its class attribute. This will not disturb other class names. +element is looked up with getElement, so string +identifiers are also acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +addLoadEvent(func):

    +
    +

    Note that addLoadEvent can not be used in combination +with MochiKit.Signal if the onload event is +connected. Once an event is connected with +MochiKit.Signal, no other APIs may be used for that +same event.

    +

    This will stack window.onload functions on top of each other. +Each function added will be called after onload in the order +that they were added.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +addToCallStack(target, path, func[, once]):

    +
    +

    Note that addToCallStack is not compatible with +MochiKit.Signal. Once an event is connected with +MochiKit.Signal, no other APIs may be used for that +same event.

    +

    Set the property path of target to a function that calls +the existing function at that property (if any), then calls +func.

    +

    If target[path]() returns exactly false, then func +will not be called.

    +

    If once is true, then target[path] is set to null +after the function call stack has completed.

    +

    If called several times for the same target[path], it will +create a stack of functions (instead of just a pair).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +appendChildNodes(node[, childNode[, ...]]):

    +
    +

    Append children to a DOM element using the DOM Coercion Rules.

    +
    +
    node:
    +
    A reference to the DOM element to add children to (if a string +is given, getElement(node) will be used to locate +the node)
    +
    childNode...:
    +
    All additional arguments, if any, will be coerced into DOM +nodes that are appended as children using the DOM Coercion +Rules.
    +
    returns:
    +
    The given DOM element
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +insertSiblingNodesBefore(node[, siblingNode[, ...]]):

    +
    +

    Insert children into the DOM structure using the DOM Coercion +Rules.

    +
    +
    node:
    +
    A reference to the DOM element you want to insert children +before (if a string is given, getElement(node) +will be used to locate the node)
    +
    siblingNode...:
    +
    All additional arguments, if any, will be coerced into DOM +nodes that are inserted as siblings using the DOM Coercion +Rules.
    +
    returns:
    +
    The parent of the given DOM element
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +insertSiblingNodesAfter(node[, siblingNode[, ...]]):

    +
    +

    Insert children into the DOM structure using the DOM Coercion +Rules.

    +
    +
    node:
    +
    A reference to the DOM element you want to insert children +after (if a string is given, getElement(node) +will be used to locate the node)
    +
    siblingNode...:
    +
    All additional arguments, if any, will be coerced into DOM +nodes that are inserted as siblings using the DOM Coercion +Rules.
    +
    returns:
    +
    The parent of the given DOM element
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +createDOM(name[, attrs[, node[, ...]]]):

    +
    +

    Create a DOM fragment in a really convenient manner, much like +Nevow`s [1] stan [2].

    +

    Partially applied versions of this function for common tags are +available as aliases:

    +
      +
    • A
    • +
    • BUTTON
    • +
    • BR
    • +
    • CANVAS
    • +
    • DIV
    • +
    • FIELDSET
    • +
    • FORM
    • +
    • H1
    • +
    • H2
    • +
    • H3
    • +
    • HR
    • +
    • IMG
    • +
    • INPUT
    • +
    • LABEL
    • +
    • LEGEND
    • +
    • LI
    • +
    • OL
    • +
    • OPTGROUP
    • +
    • OPTION
    • +
    • P
    • +
    • PRE
    • +
    • SELECT
    • +
    • SPAN
    • +
    • STRONG
    • +
    • TABLE
    • +
    • TBODY
    • +
    • TD
    • +
    • TEXTAREA
    • +
    • TFOOT
    • +
    • TH
    • +
    • THEAD
    • +
    • TR
    • +
    • TT
    • +
    • UL
    • +
    +

    See Creating DOM Element Trees for a comprehensive example.

    +
    +
    name:
    +
    The kind of fragment to create (e.g. 'span'), such as you +would pass to document.createElement.
    +
    attrs:
    +

    An object whose properties will be used as the attributes +(e.g. {'style': 'display:block'}), or null if no +attributes need to be set.

    +

    See updateNodeAttributes for more information.

    +

    For convenience, if attrs is a string, null is used +and the string will be considered the first node.

    +
    +
    node...:
    +
    All additional arguments, if any, will be coerced into DOM +nodes that are appended as children using the DOM Coercion +Rules.
    +
    returns:
    +
    A DOM element
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +createDOMFunc(tag[, attrs[, node[, ...]]]):

    +
    +

    Convenience function to create a partially applied createDOM +function. You'd want to use this if you add additional convenience +functions for creating tags, or if you find yourself creating a +lot of tags with a bunch of the same attributes or contents.

    +

    See createDOM for more detailed descriptions of the +arguments.

    +
    +
    tag:
    +
    The name of the tag
    +
    attrs:
    +
    Optionally specify the attributes to apply
    +
    node...:
    +
    Optionally specify any children nodes it should have
    +
    returns:
    +
    function that takes additional arguments and calls +createDOM
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +currentDocument():

    +
    +

    Return the current document DOM Context. This will always +be the same as the global document unless +withDocument or withWindow is currently +executing.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +currentWindow():

    +
    +

    Return the current window DOM Context. This will always be +the same as the global window unless withWindow is +currently executing.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +emitHTML(dom[, lst]):

    +
    +

    Convert a DOM tree to an Array of HTML string fragments. This should +be used for debugging/testing purposes only.

    +

    The DOM property innerHTML or cloneNode(true) method should +be used for most purposes.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +escapeHTML(s):

    +
    +

    Make a string safe for HTML, converting the usual suspects (lt, +gt, quot, amp)

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +focusOnLoad(element):

    +
    +

    Note that focusOnLoad can not be used in combination +with MochiKit.Signal if the onload event is +connected. Once an event is connected with +MochiKit.Signal, no other APIs may be used for that +same event.

    +

    This adds an onload event to focus the given element.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +formContents(elem=document.body):

    +
    +

    Search the DOM tree, starting at elem, for any elements with a +name and value attribute. Return a 2-element Array of +names and values suitable for use with +MochiKit.Base.queryString.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +getElement(id[, ...]):

    +
    +

    A small quick little function to encapsulate the +getElementById method. It includes a check to ensure we can +use that method.

    +

    If the id isn't a string, it will be returned as-is.

    +

    Also available as $(...) for convenience and +compatibility with other JavaScript frameworks.

    +

    If multiple arguments are given, an Array will be returned.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +getElementsByTagAndClassName(tagName, className, parent=document):

    +
    +

    Returns an array of elements in parent that match the tag name +and class name provided. If parent is a string, it will be +looked up with getElement.

    +

    If tagName is null or "*", all elements will be +searched for the matching class.

    +

    If className is null, all elements matching the provided +tag are returned.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +getFirstElementByTagAndClassName(tagName, className, parent=document):

    +
    +

    Return the first element in parent that matches the tag name +and class name provided. If parent is a string, it will be +looked up with getElement.

    +

    If tagName is null or "*", all elements will be searched +for the matching class.

    +

    If className is null, the first element matching the provided +tag will be returned.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +getFirstParentByTagAndClassName(elem, tagName='*', className=null):

    +
    +

    Returns the first parent of elem matches the tag name and class name +provided. If parent is a string, it will be looked up using +getElement.

    +

    If tagName is null or "*", all elements will be searched +for the matching class.

    +

    If className is null, the first element matching the provided +tag will be returned.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +getNodeAttribute(node, attr):

    +
    +

    Get the value of the given attribute for a DOM element without +ever raising an exception (will return null on exception).

    +
    +
    node:
    +
    A reference to the DOM element to update (if a string is +given, getElement(node) will be used to locate the +node)
    +
    attr:
    +

    The name of the attribute

    +

    Note that it will do the right thing for IE, so don't do +the class -> className hack yourself.

    +
    +
    returns:
    +
    The attribute's value, or null
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +hasElementClass(element, className[, ...]):

    +
    +

    Return true if className is found on the element. +element is looked up with getElement, so string +identifiers are also acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +isChildNode(node, maybeParent):

    +
    +

    Determine whether node is a child node of maybeParent. +Returns true if so, and false if not. A node is considered +a child node of itself for the purposes of this function.

    +

    If either node or maybeParent are strings, the related +nodes will be looked up with getElement.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +isParent(child, element):

    +
    +

    Returns true if element contains child. Returns false +if element == child or child is not contained in element. +If child or element are strings, they will be looked up with +getElement.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +makeClipping(element):

    +
    +

    Ensure that element.style.overflow = 'hidden'. If element is a +string, then it will be looked up with getElement.

    +

    Returns the original value of element.style.overflow, so that it +may be restored with undoClipping(element, overflow).

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +makePositioned(element):

    +
    +

    Ensure that element.style.position is set to "relative" if it +is not set or is "static". If element is a +string, then it will be looked up with getElement.

    +

    Returns the original value of element.style.position, so that it +may be restored with undoPositioned(element, position).

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +registerDOMConverter(name, check, wrap[, override]):

    +
    +

    Register an adapter to convert objects that match check(obj, +ctx) to a DOM element, or something that can be converted to a +DOM element (i.e. number, bool, string, function, iterable).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +removeElement(node):

    +
    +

    Remove and return node from a DOM tree.

    +
    +
    node:
    +
    the DOM element (or string id of one) to be removed
    +
    returns
    +
    The removed element
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +removeElementClass(element, className):

    +
    +

    Ensure that the given element does not have className set +as part of its class attribute. This will not disturb other class +names. element is looked up with getElement, so +string identifiers are also acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +removeEmptyTextNodes(node):

    +
    +

    Remove all text node children that contain only whitespace from +node. Useful in situations where such empty text nodes can +interfere with DOM traversal.

    +
    +
    node:
    +
    the DOM element (or string id of one) to remove whitespace child +nodes from.
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +replaceChildNodes(node[, childNode[, ...]]):

    +
    +

    Remove all children from the given DOM element, then append any +given childNodes to it (by calling appendChildNodes).

    +
    +
    node:
    +
    A reference to the DOM element to add children to (if a string +is given, getElement(node) will be used to locate +the node)
    +
    childNode...:
    +
    All additional arguments, if any, will be coerced into DOM +nodes that are appended as children using the DOM Coercion +Rules.
    +
    returns:
    +
    The given DOM element
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +scrapeText(node[, asArray=false]):

    +
    +

    Walk a DOM tree in-order and scrape all of the text out of it as a +string.

    +

    If asArray is true, then an Array will be returned +with each individual text node. These two are equivalent:

    +
    +assert( scrapeText(node) == scrapeText(node, true).join("") );
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +setElementClass(element, className):

    +
    +

    Set the entire class attribute of element to className. +element is looked up with getElement, so string +identifiers are also acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +setNodeAttribute(node, attr, value):

    +
    +

    Set the value of the given attribute for a DOM element without +ever raising an exception (will return null on exception). If +setting more than one attribute, you should use +updateNodeAttributes.

    +
    +
    node:
    +
    A reference to the DOM element to update (if a string is +given, getElement(node) will be used to locate the +node)
    +
    attr:
    +

    The name of the attribute

    +

    Note that it will do the right thing for IE, so don't do the +class -> className hack yourself.

    +
    +
    value:
    +
    The value of the attribute, may be an object to be merged +(e.g. for setting style).
    +
    returns:
    +
    The given DOM element or null on failure
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +swapDOM(dest, src):

    +
    +

    Replace dest in a DOM tree with src, returning src.

    +
    +
    dest:
    +
    a DOM element (or string id of one) to be replaced
    +
    src:
    +
    the DOM element (or string id of one) to replace it with, or +null if dest is to be removed (replaced with nothing).
    +
    returns:
    +
    a DOM element (src)
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +swapElementClass(element, fromClass, toClass):

    +
    +

    If fromClass is set on element, replace it with +toClass. This will not disturb other classes on that element. +element is looked up with getElement, so string +identifiers are also acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toggleElementClass(className[, element[, ...]]):

    +
    +

    Toggle the presence of a given className in the class +attribute of all given elements. All elements will be looked up +with getElement, so string identifiers are acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toHTML(dom):

    +
    +

    Convert a DOM tree to a HTML string using emitHTML. +This should be used for debugging/testing purposes only.

    +

    The DOM property innerHTML or cloneNode(true) method should +be used for most purposes.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +undoClipping(element, overflow):

    +
    +

    Restore the setting of element.style.overflow set by +makeClipping(element). If element is a string, then +it will be looked up with getElement.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +undoPositioned(element, overflow):

    +
    +

    Restore the setting of element.style.position set by +makePositioned(element). If element is a string, then +it will be looked up with getElement.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +updateNodeAttributes(node, attrs):

    +
    +

    Update the attributes of a DOM element from a given object.

    +
    +
    node:
    +
    A reference to the DOM element to update (if a string is +given, getElement(node) will be used to locate the +node)
    +
    attrs:
    +

    An object whose properties will be used to set the attributes +(e.g. {'class': 'invisible'}), or null if no +attributes need to be set. If an object is given for the +attribute value (e.g. {'style': {'display': 'block'}}) +then MochiKit.Base.updatetree will be used to set +that attribute.

    +

    Note that it will do the right thing for IE, so don't do the +class -> className hack yourself, and it deals with +setting "on..." event handlers correctly.

    +
    +
    returns:
    +
    The given DOM element
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +withWindow(win, func):

    +
    +

    Call func with the window DOM Context set to win +and the document DOM Context set to win.document. When +func() returns or throws an error, the DOM Context will be +restored to its previous state.

    +

    The return value of func() is returned by this function.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +withDocument(doc, func):

    +
    +

    Call func with the doc DOM Context set to doc. +When func() returns or throws an error, the DOM Context +will be restored to its previous state.

    +

    The return value of func() is returned by this function.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Style Functions

    +

    These functions are available in MochiKit 1.3.1, but have been moved to +MochiKit.Style in 1.4+.

    +

    + +computedStyle(htmlElement, cssProperty, mozillaEquivalentCSS):

    +
    +

    Looks up a CSS property for the given element. The element can be +specified as either a string with the element's ID or the element +object itself.

    +
    +
    cssProperty:
    +
    MochiKit 1.3.1 expects camel case, e.g. backgroundColor. +MochiKit 1.4+ expects CSS selector case, e.g. background-color, +but will accept camel case for backwards-compatibility.
    +
    mozillaEquivalentCSS:
    +
    MochiKit 1.3.1 expects selector case. +MochiKit 1.4+ ignores this argument.
    +
    Availability:
    +
    Available in MochiKit 1.3.1, deprecated in favor of +MochiKit.Style.getStyle in 1.4+
    +
    +
    +

    + +elementDimensions(element):

    +
    +

    Return the absolute pixel width and height (including padding and border, +but not margins) of element as an object with w and h +properties, or undefined if element is not in the document. +element may be specified as a string to be looked up with +getElement, a DOM element, or trivially as an object with +w and/or h properties.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1, deprecated in favor of +MochiKit.Style.getElementDimensions in 1.4+
    +
    +
    +

    + +elementPosition(element[, relativeTo={x: 0, y: 0}]):

    +
    +

    Return the absolute pixel position of element in the document +as an object with x and y properties, or undefined if +element is not in the document. element may be specified +as a string to be looked up with getElement, a DOM +element, or trivially as an object with x and/or y +properties.

    +

    If relativeTo is given, then its coordinates are subtracted from +the absolute position of element, e.g.:

    +
    +var elemPos = elementPosition(elem);
    +var anotherElemPos = elementPosition(anotherElem);
    +var relPos = elementPosition(elem, anotherElem);
    +assert( relPos.x == (elemPos.x - anotherElemPos.x) );
    +assert( relPos.y == (elemPos.y - anotherElemPos.y) );
    +
    +

    relativeTo may be specified as a string to be looked up with +getElement, a DOM element, or trivially as an object +with x and/or y properties.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1, deprecated in favor of +MochiKit.Style.getElementPosition in 1.4+
    +
    +
    +

    + +getViewportDimensions():

    +
    +

    Return the pixel width and height of the viewport as an object +with w and h properties. element is looked up with +getElement, so string identifiers are also acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1, moved to +MochiKit.Style.getViewportDimensions in 1.4+
    +
    +
    +

    + +hideElement(element, ...):

    +
    +

    Partial form of setDisplayForElement, specifically:

    +
    +partial(setDisplayForElement, "none")
    +
    +

    For information about the caveats of using a style.display +based show/hide mechanism, and a CSS based alternative, see +Element Visibility.

    +
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1, moved to +MochiKit.Style.hideElement in 1.4+
    +
    +
    +

    + +setElementDimensions(element, dimensions[, units='px']):

    +
    +

    Sets the dimensions of element in the document from an object +with w and h properties.

    +
    +
    node:
    +
    A reference to the DOM element to update (if a string is +given, getElement(node) will be used to locate the +node)
    +
    dimensions:
    +
    An object with w and h properties
    +
    units:
    +
    Optionally set the units to use, default is px
    +
    Availability:
    +
    Available in MochiKit 1.3.1, moved to +MochiKit.Style.setElementDimensions in 1.4+
    +
    +
    +

    + +setElementPosition(element, position[, units='px']):

    +
    +

    Sets the absolute position of element in the document from an +object with x and y properties.

    +
    +
    node:
    +
    A reference to the DOM element to update (if a string is +given, getElement(node) will be used to locate the +node)
    +
    position:
    +
    An object with x and y properties
    +
    units:
    +
    Optionally set the units to use, default is px
    +
    Availability:
    +
    Available in MochiKit 1.3.1, moved to +MochiKit.Style.setElementPosition in 1.4+
    +
    +
    +

    + +setDisplayForElement(display, element[, ...]):

    +
    +

    Change the style.display for the given element(s). Usually +used as the partial forms:

    + +

    Elements are looked up with getElement, so string +identifiers are acceptable.

    +

    For information about the caveats of using a style.display +based show/hide mechanism, and a CSS based alternative, see +Element Visibility.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1, moved to +MochiKit.Style.setDisplayForElement in 1.4+
    +
    +
    +

    + +setOpacity(element, opacity):

    +
    +

    Sets opacity for element. Valid opacity values range +from 0 (invisible) to 1 (opaque). element is looked up with +getElement, so string identifiers are also acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1, moved to +MochiKit.Style.setOpacity in 1.4+
    +
    +
    +

    + +showElement(element, ...):

    +
    +

    Partial form of setDisplayForElement, specifically:

    +
    +partial(setDisplayForElement, "block")
    +
    +

    For information about the caveats of using a style.display +based show/hide mechanism, and a CSS based alternative, see +Element Visibility.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1, moved to +MochiKit.Style.showElement in 1.4+
    +
    +
    +
    +
    +

    Style Objects

    +

    These objects are available in MochiKit 1.3.1, but have been moved to +MochiKit.Style in 1.4+.

    +

    + +Coordinates(x, y):

    +
    +

    Constructs an object with x and y properties. obj.toString() +returns something like {x: 0, y: 42} for debugging.

    +

    Availability: +Available in MochiKit 1.3.1, moved to +MochiKit.Style.Coordinates in 1.4+

    +
    +

    + +Dimensions(w, h):

    +
    +

    Constructs an object with w and h properties. obj.toString() +returns something like {w: 0, h: 42} for debugging.

    +

    Availability: +Available in MochiKit 1.3.1, moved to +MochiKit.Style.Dimensions in 1.4+

    +
    +
    +
    +
    +

    See Also

    + + + + + +
    [1](1, 2) Nevow, a web application construction kit for Python: +http://divmod.org/trac/wiki/DivmodNevow
    + + + + + +
    [2](1, 2) nevow.stan is a domain specific language for Python (read as +"crazy getitem/call overloading abuse") that Donovan and I +schemed up at PyCon 2003 at this super ninja Python/C++ +programmer's (David Abrahams) hotel room. Donovan later +inflicted this upon the masses in Nevow. Check out the Nevow +Guide for some examples: +http://divmod.org/trac/wiki/DivmodNevow
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/DateTime.html b/mochikit_v14/doc/html/MochiKit/DateTime.html new file mode 100644 index 0000000..eab793f --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/DateTime.html @@ -0,0 +1,166 @@ + + + + + + + +MochiKit.DateTime - "what time is it anyway?" + + + + + + +
    +
    +

    Name

    +

    MochiKit.DateTime - "what time is it anyway?"

    +
    +
    +

    Synopsis

    +
    +stringDate = toISOTimestamp(new Date());
    +dateObject = isoTimestamp(stringDate);
    +
    +
    +
    +

    Description

    +

    Remote servers don't give you JavaScript Date objects, and they +certainly don't want them from you, so you need to deal with string +representations of dates and timestamps. MochiKit.Date does that.

    +
    +
    +

    Dependencies

    +

    None.

    +
    +
    +

    API Reference

    +
    +

    Functions

    +

    + +isoDate(str):

    +
    +

    Convert an ISO 8601 date (YYYY-MM-DD) to a Date object.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +isoTimestamp(str):

    +
    +

    Convert any ISO 8601 [1] timestamp (or something reasonably close +to it) to a Date object. Will accept the "de facto" form:

    +
    +YYYY-MM-DD hh:mm:ss
    +

    or (the proper form):

    +
    +YYYY-MM-DDThh:mm:ssZ
    +

    If a time zone designator ("Z" or "[+-]HH:MM") is not present, +then the local timezone is used.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toISOTime(date):

    +
    +

    Convert a Date object to a string in the form of hh:mm:ss

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toISOTimestamp(date, realISO=false):

    +
    +

    Convert a Date object to something that's ALMOST but not quite +an ISO 8601 [1]_timestamp. If it was a proper ISO timestamp it +would be:

    +
    +YYYY-MM-DDThh:mm:ssZ
    +

    However, we see junk in SQL and other places that looks like this:

    +
    +YYYY-MM-DD hh:mm:ss
    +

    So, this function returns the latter form, despite its name, +unless you pass true for realISO.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toISODate(date):

    +
    +

    Convert a Date object to an ISO 8601 [1] date string +(YYYY-MM-DD)

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +americanDate(str):

    +
    +

    Converts a MM/DD/YYYY date to a Date object

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toPaddedAmericanDate(date):

    +
    +

    Converts a Date object to an MM/DD/YYYY date, e.g. 01/01/2001

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toAmericanDate(date):

    +
    +

    Converts a Date object to an M/D/YYYY date, e.g. 1/1/2001

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +
    +

    See Also

    + + + + + +
    [1](1, 2) W3C profile of ISO 8601: http://www.w3.org/TR/NOTE-datetime
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/DragAndDrop.html b/mochikit_v14/doc/html/MochiKit/DragAndDrop.html new file mode 100644 index 0000000..7ccc41c --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/DragAndDrop.html @@ -0,0 +1,185 @@ + + + + + + + +MochiKit.DragAndDrop - drag and drop elements with MochiKit + + + + + + +
    +
    +

    Name

    +

    MochiKit.DragAndDrop - drag and drop elements with MochiKit

    +
    +
    +

    Synopsis

    +
    +// Create a draggable
    +new Draggable('mydrag');
    +
    +// Create a corresponding droppable
    +new Droppable('mydrop', {
    +    accept: ['drag-class'],
    +    ondrop: function (element) {
    +        alert('"' + element.id + '" was dropped on me');
    +    }
    +});
    +
    +
    +
    +

    Description

    +

    MochiKit.DragAndDrop enables you the power of dragging elements +through your pages, for richer interfaces.

    +
    + +
    +

    Overview

    +

    The implementation was adapted from Scriptaculous.

    +
    +
    +

    API Reference

    +
    +

    Constructors

    +

    + +Draggable(element[, options]):

    +
    +

    A object that can be drag with the mouse.

    +

    You have the following options, with corresponding default values:

    +
    +
    handle (false):
    +
    Option for giving the element where starting the drag. By +default it's the element itself, but you can either put a +class of a subelement or the id of another element as handle.
    +
    starteffect (MochiKit.Visual.Opacity):
    +
    Function called once the drag has begun, taking the dragged +element as argument. It's an effect by default but you can +define any callback.
    +
    reverteffect (MochiKit.Visual.Move):
    +
    Effect applied when drag is cancelled. You have to define the +revert option to enable the call. By default it brings the +element back to its initial position, so you should know what +you want when you modify this. The function should return an +effect that can be cancelled.
    +
    endeffect (MochiKit.Visual.Opacity):
    +
    Pending part of starteffect. If you have modified your element +during start, you'd usually want to revert it in the function.
    +
    zindex (1000):
    +
    Zindex of the drag element. By default it brings it to front.
    +
    revert (false):
    +
    Indicate if the reverteffect function should be called. If you +define a function here, this function will be called before +reverteffect, with the element as first argument.
    +
    snap (false):
    +
    Define the behaviour of the drag element when moving. It can +either be a function, a value or an array of two values. If +it's a function, it should take the (x, y) position of the +element as arguments, and return the position draw in the +browser. If its a value, it's used as a modulo for each +coordinates. If it's an array, each value is applied for the +corresponding coordinate.
    +
    selectclass (null):
    +
    If defined, name of CSS class applied during the drag.
    +
    ghosting (null):
    +
    Make a ghost from the draggable: clone it at start, then +remove the clone at end.
    +
    onchange  (MochiKit.Base.noop):
    +
    Function called when updates are made on the draggable object.
    +
    scroll (false):
    +
    Element to scroll around, if precised. For example, 'window' +will allow the draggable to scroll in the page.
    +
    scrollSensitivity (20):
    +
    Scroll sensitivity, used when scroll is used.
    +
    scrollSpeed (15):
    +
    Scroll speed, used when scroll is used.
    +
    +

    A draggable generates some signals during its lifetime: start, drag and +end. They are available through the Draggables handler, and are called +with a draggable as argument. You can register a callback for these events +like this:

    +
    +onStart = function (draggable) {
    +    // Do some stuff
    +};
    +
    +connect(Draggables, 'start', onStart);
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Droppable(element[, options]):

    +
    +

    A object where you can drop a draggable.

    +

    You have the following options, with corresponding default values:

    +
    +
    greedy (true):
    +
    Stop on this droppable when a draggable drops over it.
    +
    hoverclass (null):
    +
    If defined, name of CSS class applied when a draggable is +hover the droppable element (hover state).
    +
    hoverfunc (MochiKit.Base.noop):
    +
    Function called on hover state.
    +
    accept (null):
    +
    Array of CSS classes allowed to drop on this.
    +
    activeclass (null):
    +
    If defined, name of CSS class applied if a possible draggable +begins its start (active state).
    +
    onactive (MochiKit.Base.noop):
    +
    Function called on active state.
    +
    containment ([]):
    +
    Specify a list of elements to check for active state: only the +children of the specified elements can be dropped. Mainly +useful for Sortable.
    +
    onhover (MochiKit.Base.noop):
    +
    Specific hover function, mainly used for Sortable.
    +
    ondrop (MochiKit.Base.noop):
    +
    Function called when a draggable is dropped. The function +takes three arguments: the draggable element, the droppable +element, and the event that raised the drop.
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +

    Portions adapted from Scriptaculous are available under the terms +of the MIT License.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Format.html b/mochikit_v14/doc/html/MochiKit/Format.html new file mode 100644 index 0000000..e192bef --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Format.html @@ -0,0 +1,290 @@ + + + + + + + +MochiKit.Format - string formatting goes here + + + + + + +
    +
    +

    Name

    +

    MochiKit.Format - string formatting goes here

    +
    +
    +

    Synopsis

    +
    +assert( truncToFixed(0.12345, 4) == "0.1234" );
    +assert( roundToFixed(0.12345, 4) == "0.1235" );
    +assert( twoDigitAverage(1, 0) == "0" );
    +assert( twoDigitFloat(1.2345) == "1.23" );
    +assert( twoDigitFloat(1) == "1" );
    +assert( percentFormat(1.234567) == "123.46%" );
    +assert( numberFormatter("###,###%")(125) == "12,500%" );
    +assert( numberFormatter("##.000")(1.25) == "1.250" );
    +
    +
    +
    +

    Description

    +

    Formatting strings and stringifying numbers is boring, so a couple +useful functions in that domain live here.

    +
    +
    +

    Dependencies

    +

    None.

    +
    +
    +

    Overview

    +
    +

    Formatting Numbers

    +

    MochiKit provides an extensible number formatting facility, modeled +loosely after the Number Format Pattern Syntax [1] from Java. +numberFormatter(pattern[, placeholder=""[, +locale="default"]) returns a function that converts Number to string +using the given information. pattern is a string consisting of +the following symbols:

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
    SymbolMeaning
    -If given, used as the position of the minus sign +for negative numbers. If not given, the position +to the left of the first number placeholder is used.
    #The placeholder for a number that does not imply zero +padding.
    0The placeholder for a number that implies zero padding. +If it is used to the right of a decimal separator, it +implies trailing zeros, otherwise leading zeros.
    ,The placeholder for a "thousands separator". May be used +at most once, and it must be to the left of a decimal +separator. Will be replaced by locale.separator in the +result (the default is also ,).
    .The decimal separator. The quantity of # or 0 +after the decimal separator will determine the precision of +the result. If no decimal separator is present, the +fractional precision is 0 -- meaning that it will be +rounded to the nearest integer.
    %If present, the number will be multiplied by 100 and +the % will be replaced by locale.percent.
    +
    +
    +
    +

    API Reference

    +
    +

    Functions

    +

    + +formatLocale(locale="default"):

    +
    +

    Return a locale object for the given locale. locale may be +either a string, which is looked up in the +MochiKit.Format.LOCALE object, or a locale object. If no +locale is given, LOCALE.default is used (equivalent to +LOCALE.en_US).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +lstrip(str, chars="\s"):

    +
    +

    Returns a string based on str with leading whitespace +stripped.

    +

    If chars is given, then that expression will be used instead +of whitespace. chars should be a string suitable for use in a +RegExp [character set].

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +numberFormatter(pattern, placeholder="", locale="default"):

    +
    +

    Return a function formatNumber(aNumber) that formats numbers +as a string according to the given pattern, placeholder and +locale.

    +

    pattern is a string that describes how the numbers should be +formatted, for more information see Formatting Numbers.

    +

    locale is a string of a known locale (en_US, de_DE, fr_FR, +default) or an object with the following fields:

    + ++++ + + + + + + + + + + + +
    separatorThe "thousands" separator for this locale (en_US is ",")
    decimalThe decimal separator for this locale (en_US is ".")
    percentThe percent symbol for this locale (en_US is "%")
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +percentFormat(someFloat):

    +
    +

    Roughly equivalent to: sprintf("%.2f%%", someFloat * 100)

    +

    In new code, you probably want to use: +numberFormatter("#.##%")(someFloat) instead.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +roundToFixed(aNumber, precision):

    +
    +

    Return a string representation of aNumber, rounded to +precision digits with trailing zeros. This is similar to +Number.toFixed(aNumber, precision), but this has +implementation consistent rounding behavior (some versions of +Safari round 0.5 down!) and also includes preceding 0 for +numbers less than 1 (Safari, again).

    +

    For example, roundToFixed(0.1357, 2) returns 0.14 +on every supported platform, where some return .13 for +(0.1357).toFixed(2).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +rstrip(str, chars="\s"):

    +
    +

    Returns a string based on str with trailing whitespace stripped.

    +

    If chars is given, then that expression will be used instead +of whitespace. chars should be a string suitable for use in a +RegExp [character set].

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +strip(str, chars="\s"):

    +
    +

    Returns a string based on str with leading and trailing +whitespace stripped (equivalent to lstrip(rstrip(str, +chars), chars)).

    +

    If chars is given, then that expression will be used instead +of whitespace. chars should be a string suitable for use in a +RegExp [character set].

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +truncToFixed(aNumber, precision):

    +
    +

    Return a string representation of aNumber, truncated to +precision digits with trailing zeros. This is similar to +aNumber.toFixed(precision), but this truncates rather than +rounds and has implementation consistent behavior for numbers less +than 1. Specifically, truncToFixed(aNumber, +precision) will always have a preceding 0 for numbers less +than 1.

    +

    For example, truncToFixed(0.1357, 2) returns 0.13.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +twoDigitAverage(numerator, denominator):

    +
    +

    Calculate an average from a numerator and a denominator and return +it as a string with two digits of precision (e.g. "1.23").

    +

    If the denominator is 0, "0" will be returned instead of NaN.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +twoDigitFloat(someFloat):

    +
    +

    Roughly equivalent to: sprintf("%.2f", someFloat)

    +

    In new code, you probably want to use +numberFormatter("#.##")(someFloat) instead.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    + +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Iter.html b/mochikit_v14/doc/html/MochiKit/Iter.html new file mode 100644 index 0000000..a96aa7c --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Iter.html @@ -0,0 +1,522 @@ + + + + + + + +MochiKit.Iter - itertools for JavaScript; iteration made HARD, and then easy + + + + + + +
    +
    +

    Name

    +

    MochiKit.Iter - itertools for JavaScript; iteration made HARD, and +then easy

    +
    +
    +

    Synopsis

    +
    +theSum = sum(takewhile(
    +        partial(operator.gt, 10),
    +        imap(
    +            partial(operator.mul, 2),
    +            count()
    +        )
    +    )
    +));
    +
    +assert( theSum == (0 + 0 + 2 + 4 + 6 + 8) );
    +
    +
    +
    +

    Description

    +

    All of the functional programming missing from +MochiKit.Base lives here. The functionality in this module +is largely inspired by Python's iteration protocol [1], and the +itertools module [2].

    +

    MochiKit.Iter defines a standard way to iterate over anything, that +you can extend with registerIterator, or by implementing +the .iter() or .__iterator__() (in MochiKit 1.4+) protocol. +Iterators are lazy, so it can potentially be +cheaper to build a filter chain of iterators than to build lots of +intermediate arrays. Especially when the data set is very large, but +the result is not.

    +
    + +
    +

    Overview

    +
    +

    Iteration for JavaScript

    +

    The best overview right now is in my Iteration for JavaScript [3] +blog entry. This information will migrate here eventually.

    +
    +
    +
    +

    API Reference

    +
    +

    Errors

    +

    + +StopIteration:

    +
    +

    The singleton MochiKit.Base.NamedError that signifies +the end of an iterator

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Functions

    +

    + +applymap(fun, seq[, self]):

    +
    +

    applymap(fun, seq) --> +fun.apply(self, seq0), fun.apply(self, seq1), ...

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +chain(p, q[, ...]):

    +
    +

    chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ...

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +count(n=0):

    +
    +

    count(n=0) --> n, n + 1, n + 2, ...

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +cycle(p):

    +
    +

    cycle(p) --> p0, p1, ... plast, p0, p1, ...

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +dropwhile(pred, seq):

    +
    +

    dropwhile(pred, seq) --> seq[n], seq[n + 1], starting when +pred(seq[n]) fails

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +every(iterable, func):

    +
    +

    Return true if func(item) is true for every item in +iterable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +exhaust(iterable):

    +
    +

    Exhausts an iterable without saving the results anywhere, like +list(iterable) when you don't care what the output is.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +forEach(iterable, func[, self]):

    +
    +

    Call func for each item in iterable, and don't save the +results.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +groupby(iterable[, keyfunc]):

    +
    +

    Make an iterator that returns consecutive keys and groups from the +iterable. The key is a function computing a key value for each +element. If not specified or is None, key defaults to an identity +function and returns the element unchanged. Generally, the +iterable needs to already be sorted on the same key function.

    +

    The returned group is itself an iterator that shares the +underlying iterable with groupby(). Because the source +is shared, when the groupby object is advanced, the previous group +is no longer visible. So, if that data is needed later, it should +be stored as an array:

    +
    +var groups = [];
    +var uniquekeys = [];
    +forEach(groupby(data, keyfunc), function (key_group) {
    +    groups.push(list(key_group[1]));
    +    uniquekeys.push(key_group[0]);
    +});
    +
    +

    As a convenience, groupby_as_array() is provided to +suit the above use case.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +groupby_as_array(iterable[, keyfunc]):

    +
    +

    Perform the same task as groupby(), except return an +array of arrays instead of an iterator of iterators.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +iextend(lst, iterable):

    +
    +

    Just like list(iterable), except it pushes results on +lst rather than creating a new one.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +ifilter(pred, seq):

    +
    +

    ifilter(pred, seq) --> elements of seq where pred(elem) is +true

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +ifilterfalse(pred, seq):

    +
    +

    ifilterfalse(pred, seq) --> elements of seq where +pred(elem) is false

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +imap(fun, p, q[, ...]):

    +
    +

    imap(fun, p, q, ...) --> fun(p0, q0, ...), fun(p1, q1, ...), +...

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +islice(seq, [start,] stop[, step]):

    +
    +

    islice(seq, [start,] stop[, step]) --> elements from +seq[start:stop:step] (in Python slice syntax)

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +iter(iterable[, sentinel]):

    +
    +

    Convert the given argument to an iterator (object implementing +.next()).

    +
      +
    1. If iterable is an iterator (implements .next()), then +it will be returned as-is.
    2. +
    3. If iterable is an iterator factory (implements +.iter()), then the result of iterable.iter() will be +returned.
    4. +
    5. If iterable is a JavaScript 1.7 iterator factory (implements +.__iterable__()), then the result of iterable.__iterable__() +will be returned (MochiKit 1.4+).
    6. +
    7. Otherwise, the iterator factory +MochiKit.Base.AdapterRegistry is used to find a +match.
    8. +
    9. If no factory is found, it will throw TypeError
    10. +
    +

    Built-in iterator factories are present for Array-like objects, +and objects that implement the iterateNext protocol (e.g. the +result of Mozilla's document.evaluate).

    +

    When used directly, using an iterator should look like this:

    +
    +var it = iter(iterable);
    +try {
    +    while (var o = it.next()) {
    +        // use o
    +    }
    +} catch (e) {
    +    if (e != StopIteration) {
    +        throw e;
    +    }
    +    // pass
    +}
    +
    +

    This is ugly, so you should use the higher order functions to work +with iterators whenever possible.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +izip(p, q[, ...]):

    +
    +

    izip(p, q, ...) --> [p0, q0, ...], [p1, q1, ...], ...

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +list(iterable):

    +
    +

    Convert iterable to a new Array

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +next(iterator):

    +
    +

    Return iterator.next()

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +range([start,] stop[, step]):

    +
    +

    Return an iterator containing an arithmetic progression of integers.

    +

    range(i, j) returns iter([i, i + 1, i + 2, ..., j - +1])

    +

    start (!) defaults to 0. When step is given, it +specifies the increment (or decrement). The end point is omitted!

    +

    For example, range(4) returns iter([0, 1, 2, 3]). +This iterates over exactly the valid indexes for an array of 4 +elements.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +reduce(fn, iterable[, initial]):

    +
    +

    Apply fn(a, b) cumulatively to the items of an iterable from +left to right, so as to reduce the iterable to a single value.

    +

    For example:

    +
    +reduce(function (a, b) { return x + y; }, [1, 2, 3, 4, 5])
    +
    +

    calculates:

    +
    +((((1 + 2) + 3) + 4) + 5).
    +
    +

    If initial is given, it is placed before the items of the sequence +in the calculation, and serves as a default when the sequence is +empty.

    +

    Note that the above example could be written more clearly as:

    +
    +reduce(operator.add, [1, 2, 3, 4, 5])
    +
    +

    Or even simpler:

    +
    +sum([1, 2, 3, 4, 5])
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +registerIteratorFactory(name, check, iterfactory[, override]):

    +
    +

    Register an iterator factory for use with the iter function.

    +

    check is a function(a) that returns true if a can +be converted into an iterator with iterfactory.

    +

    iterfactory is a function(a) that returns an object with a +.next() method that returns the next value in the sequence.

    +

    iterfactory is guaranteed to only be called if check(a) +returns a true value.

    +

    If override is true, then it will be made the +highest precedence iterator factory. Otherwise, the lowest.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +repeat(elem[, n]):

    +
    +

    repeat(elem, [,n]) --> elem, elem, elem, ... endlessly or up +to n times

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +reversed(iterable):

    +
    +

    Return a reversed array from iterable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +some(iterable, func):

    +
    +

    Return true if func(item) is true for at least one +item in iterable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +sorted(iterable[, cmp]):

    +
    +

    Return a sorted array from iterable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +sum(iterable, start=0):

    +
    +

    Returns the sum of a sequence of numbers plus the value of +parameter start (with a default of 0). When the sequence is +empty, returns start.

    +

    Equivalent to:

    +
    +reduce(operator.add, iterable, start);
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +takewhile(pred, seq):

    +
    +

    takewhile(pred, seq) --> seq[0], seq[1], ... until +pred(seq[n]) fails

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +tee(iterable, n=2):

    +
    +

    tee(it, n=2) --> [it1, it2, it3, ... itn] splits one iterator +into n

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +
    +

    See Also

    + + + + + +
    [1]The iteration protocol is described in +PEP 234 - Iterators: http://www.python.org/peps/pep-0234.html
    + + + + + +
    [2]Python's itertools +module: http://docs.python.org/lib/module-itertools.html
    + + + + + +
    [3]Iteration in JavaScript: http://bob.pythonmac.org/archives/2005/07/06/iteration-in-javascript/
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Logging.html b/mochikit_v14/doc/html/MochiKit/Logging.html new file mode 100644 index 0000000..d547e77 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Logging.html @@ -0,0 +1,398 @@ + + + + + + + +MochiKit.Logging - we're all tired of alert() + + + + + + +
    +
    +

    Name

    +

    MochiKit.Logging - we're all tired of alert()

    +
    +
    +

    Synopsis

    +
    +log("INFO messages are so boring");
    +logDebug("DEBUG messages are even worse");
    +log("good thing I can pass", objects, "conveniently");
    +
    +
    +
    +

    Description

    +

    MochiKit.Logging steals some ideas from Python's logging module [1], +but completely forgot about the Java [2] inspiration. This is a KISS +module for logging that provides enough flexibility to do just about +anything via listeners, but without all the cruft.

    +
    + +
    +

    Overview

    +
    +

    Native Console Logging

    +

    As of MochiKit 1.3, the default logger will log all messages to your +browser's native console. This is currently supported in Safari, Opera +9, and Firefox when the FireBug extension is installed. MochiKit +1.4 adds support for the relevant APIs for Internet Explorer (the +Debugger and the Atlas framework, see here).

    +

    To disable this behavior:

    +
    +MochiKit.Logging.logger.useNativeConsole = false;
    +
    +
    +
    +

    Bookmarklet Based Debugging

    +

    JavaScript is at a serious disadvantage without a standard console for +"print" statements. Everything else has one. The closest thing that +you get in a browser environment is the alert function, which is +absolutely evil.

    +

    This leaves you with one reasonable solution: do your logging in the +page somehow. The problem here is that you don't want to clutter the +page with debugging tools. The solution to that problem is what we +call BBD, or Bookmarklet Based Debugging [3].

    +

    Simply create a bookmarklet for +javascript:MochiKit.Logging.logger.debuggingBookmarklet(), and +whack it whenever you want to see what's in the logger. Of course, +this means you must drink the MochiKit.Logging kool-aid. It's tangy +and sweet, don't worry.

    +

    Currently this is an ugly alert, but we'll have something spiffy +Real Soon Now, and when we do, you only have to upgrade +MochiKit.Logging, not your bookmarklet!

    +
    +
    +
    +

    API Reference

    +
    +

    Constructors

    +

    + +LogMessage(num, level, info):

    +
    +

    Properties:

    +
    +
    +
    num:
    +
    Identifier for the log message
    +
    level:
    +
    Level of the log message ("INFO", "WARN", +"DEBUG", etc.)
    +
    info:
    +
    All other arguments passed to log function as an Array
    +
    timestamp:
    +
    Date object timestamping the log message
    +
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger([maxSize]):

    +
    +

    A basic logger object that has a buffer of recent messages plus a +listener dispatch mechanism for "real-time" logging of important +messages.

    +

    maxSize is the maximum number of entries in the log. If +maxSize >= 0, then the log will not buffer more than that many +messages. So if you don't like logging at all, be sure to pass +0.

    +

    There is a default logger available named "logger", and several of +its methods are also global functions:

    +
    +logger.log -> log +logger.debug -> logDebug +logger.warning -> logWarning +logger.error -> logError +logger.fatal -> logFatal
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger.prototype.addListener(ident, filter, listener):

    +
    +

    Add a listener for log messages.

    +

    ident is a unique identifier that may be used to remove the +listener later on.

    +

    filter can be one of the following:

    +
    +
    +
    null:
    +
    listener(msg) will be called for every log message +received.
    +
    string:
    +
    logLevelAtLeast(filter) will be used as the +function (see below).
    +
    function:
    +
    filter(msg) will be called for every msg, if it +returns true then listener(msg) will be called.
    +
    +
    +

    listener is a function that takes one argument, a log +message. A log message is an object (LogMessage +instance) that has at least these properties:

    +
    +
    +
    num:
    +
    A counter that uniquely identifies a log message +(per-logger)
    +
    level:
    +
    A string or number representing the log level. If string, +you may want to use LogLevel[level] for comparison.
    +
    info:
    +
    An Array of objects passed as additional arguments to the +log function.
    +
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger.prototype.baseLog(level, message[, ...]):

    +
    +

    The base functionality behind all of the log functions. The first +argument is the log level as a string or number, and all other +arguments are used as the info list.

    +

    This function is available partially applied as:

    +
    + ++++ + + + + + + + + + + + + + + + + + +
    Logger.debug'DEBUG'
    Logger.log'INFO'
    Logger.error'ERROR'
    Logger.fatal'FATAL'
    Logger.warning'WARNING'
    +
    +

    For the default logger, these are also available as global +functions, see the Logger constructor documentation +for more info.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger.prototype.clear():

    +
    +

    Clear all messages from the message buffer.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger.prototype.debuggingBookmarklet():

    +
    +

    Display the contents of the logger in a useful way for browsers.

    +

    Currently, if MochiKit.LoggingPane is loaded, then a +pop-up MochiKit.LoggingPane.LoggingPane will be +used. Otherwise, it will be an alert with +Logger.prototype.getMessageText().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger.prototype.dispatchListeners(msg):

    +
    +

    Dispatch a log message to all listeners.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger.prototype.getMessages(howMany):

    +
    +

    Return a list of up to howMany messages from the message +buffer.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger.prototype.getMessageText(howMany):

    +
    +

    Get a string representing up to the last howMany messages in +the message buffer. The default is 30.

    +

    The message looks like this:

    +
    +LAST {messages.length} MESSAGES:
    +  [{msg.num}] {msg.level}: {m.info.join(' ')}
    +  [{msg.num}] {msg.level}: {m.info.join(' ')}
    +  ...
    +
    +

    If you want some other format, use +Logger.prototype.getMessages and do it yourself.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +Logger.prototype.removeListener(ident):

    +
    +

    Remove a listener using the ident given to +Logger.prototype.addListener

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Functions

    +

    + +alertListener(msg):

    +
    +

    Ultra-obnoxious alert(...) listener

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +log(message[, info[, ...]]):

    +
    +

    Log an INFO message to the default logger

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +logDebug(message[, info[, ...]]):

    +
    +

    Log a DEBUG message to the default logger

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +logError(message[, info[, ...]]):

    +
    +

    Log an ERROR message to the default logger

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +logFatal(message[, info[, ...]]):

    +
    +

    Log a FATAL message to the default logger

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +logLevelAtLeast(minLevel):

    +
    +

    Return a function that will match log messages whose level is at +least minLevel

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +logWarning(message[, info[, ...]]):

    +
    +

    Log a WARNING message to the default logger

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +
    +

    See Also

    + + + + + +
    [1]Python's logging module: http://docs.python.org/lib/module-logging.html
    + + + + + +
    [2]PEP 282, where they admit all of the Java influence: http://www.python.org/peps/pep-0282.html
    + + + + + +
    [3]Original Bookmarklet Based Debugging blather: http://bob.pythonmac.org/archives/2005/07/03/bookmarklet-based-debugging/
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/LoggingPane.html b/mochikit_v14/doc/html/MochiKit/LoggingPane.html new file mode 100644 index 0000000..ed19860 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/LoggingPane.html @@ -0,0 +1,140 @@ + + + + + + + +MochiKit.LoggingPane - Interactive MochiKit.Logging pane + + + + + + +
    +
    +

    Name

    +

    MochiKit.LoggingPane - Interactive MochiKit.Logging pane

    +
    +
    +

    Synopsis

    +
    +// open a pop-up window
    +createLoggingPane()
    +// use a div at the bottom of the document
    +createLoggingPane(true);
    +
    +
    +
    +

    Description

    +

    MochiKit.Logging does not have any browser dependencies and is +completely unobtrusive. MochiKit.LoggingPane is a browser-based +colored viewing pane for your MochiKit.Logging output that +can be used as a pop-up or inline.

    +

    It also allows for regex and level filtering! MochiKit.LoggingPane is +used as the default +MochiKit.Logging.debuggingBookmarklet() if it is loaded.

    +
    + +
    +

    API Reference

    +
    +

    Constructors

    +

    + +LoggingPane(inline=false, logger=MochiKit.Logging.logger):

    +
    +

    A listener for a MochiKit.Logging logger with an +interactive DOM representation.

    +

    If inline is true, then the LoggingPane will be a +DIV at the bottom of the document. Otherwise, it will be in a +pop-up window with a name based on the calling page's URL. If +there is an element in the document with an id of +_MochiKit_LoggingPane, it will be used instead of appending a +new DIV to the body.

    +

    logger is the reference to the +MochiKit.Logging.Logger to listen to. If not +specified, the global default logger is used.

    +

    Properties:

    +
    +
    +
    win:
    +
    Reference to the pop-up window (undefined if +inline)
    +
    inline:
    +
    true if the LoggingPane is inline
    +
    colorTable:
    +

    An object with property->value mappings for each log level +and its color. May also be mutated on +LoggingPane.prototype to affect all instances. For +example:

    +
    +MochiKit.LoggingPane.LoggingPane.prototype.colorTable = {
    +    DEBUG: "green",
    +    INFO: "black",
    +    WARNING: "blue",
    +    ERROR: "red",
    +    FATAL: "darkred"
    +};
    +
    +
    +
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +LoggingPane.prototype.closePane():

    +
    +

    Close the LoggingPane (close the child window, or +remove the _MochiKit_LoggingPane DIV from the document).

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    Functions

    +

    + +createLoggingPane(inline=false):

    +
    +

    Create or return an existing LoggingPane for this +document with the given inline setting. This is preferred over +using LoggingPane directly, as only one +LoggingPane should be present in a given document.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Position.html b/mochikit_v14/doc/html/MochiKit/Position.html new file mode 100644 index 0000000..319285e --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Position.html @@ -0,0 +1,36 @@ + + + + + + + +MochiKit.Position - DOM Position manipulation API + + + + + + +
    +
    +

    Name

    +

    MochiKit.Position - DOM Position manipulation API

    +
    +
    +

    Synopsis

    +

    This module is experimental and is present in MochiKit 1.4+ only. No +functions are currently exported from this module. Documentation is +forthcoming.

    +
    +
    +

    Copyright

    +

    Copyright 2005-2006 Bob Ippolito <bob@redivi.com>, and others. +This program is dual-licensed free +software; you can redistribute it and/or modify it under the terms of +the MIT License or the Academic Free License v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Selector.html b/mochikit_v14/doc/html/MochiKit/Selector.html new file mode 100644 index 0000000..e3e5f14 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Selector.html @@ -0,0 +1,210 @@ + + + + + + + +MochiKit.Selector - Selecting elements by CSS selector syntax + + + + + + +
    +
    +

    Name

    +

    MochiKit.Selector - Selecting elements by CSS selector syntax

    +
    +
    +

    Synopsis

    +
    +MochiKit.Base.map(MochiKit.Visual.fade, $$('p.fademe'));
    +
    +
    +
    +

    Description

    +

    MochiKit.Selector provides utilities to select elements by CSS +selector syntax. In particular it provides the $$ +function.

    +
    + +
    +

    Overview

    +

    This module provides facilities to select childs of a DOM node by +using CSS selector syntax. In particular, it provides the +$$ function, which performs such a selection on the +current document.

    +

    Many of CSS3 [1] selectors are supported:

    +
      +
    • Select by tag name (A)

      +
    • +
    • Select by class (.theclass)

      +
    • +
    • Select by id (#someid)

      +
    • +
    • +
      Combinators
      +
        +
      • Descendant: E F
      • +
      • Child: E > F
      • +
      • Immediate following sibling: E + F
      • +
      • Following sibling: E ~ F
      • +
      +
      +
      +
    • +
    • +
      Attribute selectors
      +
        +
      • simple "has attribute" (without operator)
      • +
      • = equal
      • +
      • != not equal (not in CSS std.)
      • +
      • ~= word containment
      • +
      • ^= starts-with
      • +
      • $= ends-with
      • +
      • *= substring containment
      • +
      • |= first part of hyphen deleimited (eg. lang|="en" matches lang="en-US")
      • +
      +
      +
      +
    • +
    • +
      Pseudo-classes
      +
        +
      • :root, :nth-child, :nth-last-child, :nth-of-type, :nth-last-of-type, :first-child, :last-child, :first-of-type, :last-of-type, :only-child, :only-of-type, :empty, :enabled, :disabled, :checked, :not(<any other selector>)
      • +
      +
      +
      +
    • +
    +

    Multiple selectors can be concatenated, like this: P.quote[author~='Torvalds'], +in which case elements matching all the selectors are returned. Furthermore, such +concatenations can be combined by joining them with spaces and combinators. +This invokes the regular CSS behaviour of matching parts of the combination in +sequence, starting off each part from the elements returned by the preceeding part.

    +

    For the :nth-* pseudoclasses, the an+b syntax is partially +supported, specifically a and b must be non-negative and only a is +optional (this differs from the CSS std.) Also, odd and even +are supported, e.g. table tr:nth-child(odd) gives you every +other row of table starting with the first one.

    +

    For further documentation of CSS selectors, refer to the W3C CSS standard. [1]

    +

    The original version of this module was ported from Prototype.

    +

    Note: Due to how Internet Explorer handles node attributes, some attribute +selectors may not work as expected. In particular a[title] will not work +as all A elements in the Internet Explorer DOM model have a title attribute +regardless of whether it's specified in the markup or not.

    +
    +
    +

    API Reference

    +
    +

    Functions

    +

    + +$$(expression[, ...]):

    +
    +

    Performs a selection on the active document. Equivalent +to findChildElements(MochiKit.DOM.currentDocument(), [expression, ...])

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +findChildElements(element, expressions):

    +
    +

    Traverses the child nodes of element and returns the subset +of those that match any of the selector expressions in expressions.

    +

    Each expression can be a combination of simple expressions, by concatenating +them with spaces or combinators. In that case, normal CSS rules apply, each +simple expression is evaluated in turn and the results of that one is used +as the scope for the succeeding expression (see Selector.findElements). +Finally, the results of the last simple expression is returned as the search result.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +

    Constructors

    +

    + +Selector(simpleExpression):

    +
    +

    An object storing the parsed version of a simple CSS selector expression +and providing functions for executing searches.

    +

    Simple means that the expression is not a combination of expressions, +i.e. it does not contain any spaces.

    +

    Usually the user would not instantiate or use this object directly, but +heres how:

    +
    +var selector = MochiKit.Selector.Selector('#someelementid');
    +var searchResults = selector.findElements(rootElement);
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Selector.findElements(scope[, axis=""]):

    +
    +

    Performs a search on scope. The value of axis controls what relatives +of scope are considered.

    +
    +
    scope:
    +
    A DOM node that acts as a starting point for the search.
    +
    axis:
    +
    One of ">", "+", "~" or the empty string (default). +If the empty string, all descendant nodes of scope are tested against +the expression. If > only direct child nodes of scope are tested, +if + only the next sibling (if any) of scope is tested and if +~ all succeeding siblings of scope are tested.
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +
    +

    See Also

    + + + + + +
    [1](1, 2) CSS Selectors Level 3 (Last Call, oct. 2006): +http://www.w3.org/TR/2005/WD-css3-selectors-20051215/
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +

    Based on Prototype, (c) 2005 Sam Stephenson, available under the Prototype +license

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Signal.html b/mochikit_v14/doc/html/MochiKit/Signal.html new file mode 100644 index 0000000..8b4d47e --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Signal.html @@ -0,0 +1,476 @@ + + + + + + + +MochiKit.Signal - Simple universal event handling + + + + + + +
    +
    +

    Name

    +

    MochiKit.Signal - Simple universal event handling

    +
    +
    +

    Synopsis

    +

    Signal for DOM events:

    +
    +// DOM events are also signals. Connect freely! The functions will be
    +// called with the custom event as a parameter.
    +
    +// calls myClicked.apply(getElement('myID'), [event])
    +connect('myID', 'onclick', myClicked);
    +
    +// calls wasClicked.apply(myObject, [event])
    +connect('myID', 'onclick', myObject, wasClicked);
    +
    +// calls myObject.wasClicked(event)
    +connect('myID', 'onclick', myObject, 'wasClicked');
    +
    +// the event is normalized, no more e = e || window.event!
    +myObject.wasClicked = function(e) {
    +    var crossBrowserCoordinates = e.mouse().page;
    +    // e.mouse().page is a MochiKit.Style.Coordinates object
    +}
    +
    +

    Signal for non-DOM events:

    +
    +// otherObject.gotFlash() will be called when 'flash' signalled.
    +connect(myObject, 'flash', otherObject, 'gotFlash');
    +
    +// gotBang.apply(otherObject, [...]) will be called when 'bang' signalled.
    +// You can access otherObject from within gotBang as 'this'.
    +connect(myObject, 'bang', otherObject, gotBang);
    +
    +// myFunc.apply(myObject, [...]) will be called when 'flash' signalled.
    +// You can access myObject from within myFunc as 'this'.
    +var ident = connect(myObject, 'flash', myFunc);
    +
    +// You may disconnect with the return value from connect
    +disconnect(ident);
    +
    +// Signal can take parameters. These will be passed along to the
    +// connected functions.
    +signal(myObject, 'flash');
    +signal(myObject, 'bang', 'BANG!');
    +
    +
    +
    +

    Description

    +

    Event handling was never so easy!

    +

    This module takes care of all the hard work—figuring out which +event model to use, trying to retrieve the event object, and handling +your own internal events, as well as cleanup when the page is unloaded +to clean up IE's nasty memory leakage.

    +

    This event system is largely based on Qt's signal/slot system. Read +more on how that is handled and also how it is used in model/view +programming at: http://doc.trolltech.com/

    +
    + +
    +

    Overview

    +
    +

    Using Signal for DOM Events

    +

    When using MochiKit.Signal, do not use the browser's native event +API. That means, no onclick="blah", no +elem.addEventListener(...), and certainly no +elem.attachEvent(...). This also means that +MochiKit.DOM.addToCallStack and +MochiKit.DOM.addLoadEvent should not be used in +combination with this module.

    +

    Signals for DOM objects are named with the 'on' prefix, e.g.: +'onclick', 'onkeyup', etc.

    +

    When the signal fires, your slot will be called with one parameter, +the custom event object.

    +
    +
    +

    Custom Event Objects for DOM events

    +

    Signals triggered by DOM events are called with a custom event object +as a parameter. The custom event object presents a consistent view of +the event across all supported platforms and browsers, and provides +many conveniences not available even in a correct W3C implementation.

    +

    See the DOM Custom Event Object Reference for a detailed API +description of this object.

    +

    If you find that you're accessing the native event for any reason, +create a new ticket and we'll look into normalizing the behavior +you're looking for.

    +
    +
    +

    Memory Usage

    +

    Any object that has connected slots (via connect()) is +referenced by the Signal mechanism until it is disconnected via +disconnect() or disconnectAll().

    +

    Signal does not leak. It registers an 'onunload' event that +disconnects all objects on the page when the browser leaves the +page. However, memory usage will grow during the page view for every +connection made until it is disconnected. Even if the DOM object is +removed from the document, it will still be referenced by Signal until +it is explicitly disconnected.

    +

    In order to conserve memory during the page view, +disconnectAll() any DOM elements that are about to be +removed from the document.

    +
    +
    +

    Synthesized Events

    +

    Certain events supported by MochiKit are not generated natively by all +browsers. MochiKit can synthesize these events even for non-supporting +browsers, however, by watching for related events and triggering the +appropriate signals at the right times.

    +

    These events include:

    +

    onmouseenter

    +
    +

    Similar to 'onmouseover', but does not "bubble" up to parent +nodes. Such bubbling is often a cause of confusion. On an +'onmouseenter' event, you can be certain that the mouse has +left the node attached to the event.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    onmouseleave

    +
    +

    Similar to 'onmouseout', but does not "bubble" up to parent +nodes. This is the analog to 'onmouseenter'.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +

    Using Signal for non-DOM objects

    +

    Signals are triggered with the signal(src, 'signal', ...) +function. Additional parameters passed to this are passed onto the +connected slots. Explicit signals are not required for DOM events.

    +

    Slots that are connected to a signal are called in the following +manner when that signal is signalled:

    +
      +
    • If the slot was a single function, then it is called with this +set to the object originating the signal with whatever parameters +it was signalled with.
    • +
    • If the slot was an object and a function, then it is called with +this set to the object, and with whatever parameters it was +signalled with.
    • +
    • If the slot was an object and a string, then object[string] is +called with the parameters to the signal.
    • +
    +
    +
    +
    +

    API Reference

    +
    +

    Signal API Reference

    +

    + +connect(src, signal, dest[, func]):

    +
    +

    Connects a signal to a slot, and return a unique identifier that +can be used to disconnect that signal.

    +

    src is the object that has the signal. You may pass in a +string, in which case, it is interpreted as an id for an HTML +element.

    +

    signal is a string that represents a signal name. If 'src' is +an HTML Element, window, or the document, then it can be +one of the 'on-XYZ' events. You must include the 'on' prefix, and +it must be all lower-case.

    +

    dest and func describe the slot, or the action to take +when the signal is triggered.

    +
    +
      +
    • If dest is an object and func is a string, then +dest[func].apply(dest, [...]) will be called when the +signal is signalled.
    • +
    • If dest is an object and func is a function, then +func.apply(dest, [...]) will be called when the signal +is signalled.
    • +
    • If func is undefined and dest is a function, then +dest.apply(src, [...]) will be called when the signal is +signalled.
    • +
    +
    +

    No other combinations are allowed and will raise an exception.

    +

    The return value can be passed to disconnect to +disconnect the signal.

    +

    In MochiKit 1.4+, if src is an object that has a __connect__ +method, then src.__connect__(ident, signal, objOrFunc, funcOrStr) +will be called. This method may be used to disconnect the signal. +DOM objects can not implement this feature.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +disconnect(ident):

    +
    +

    To disconnect a signal, pass its ident returned by +connect(). This is similar to how the browser's +setTimeout and clearTimeout works.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +disconnectAll(src[, signal, ...]):

    +
    +

    disconnectAll(src) removes all signals from src.

    +

    disconnectAll(src, 'onmousedown', 'mySignal') will remove all +'onmousedown' and 'mySignal' signals from src.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +disconnectAllTo(dest[, func]):

    +
    +

    disconnectAllTo(dest) removes all signals connected to dest.

    +

    disconnectAllTo(dest, func) will remove all +signals connected to dest using func.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +signal(src, signal, ...):

    +
    +

    This will signal a signal, passing whatever additional parameters +on to the connected slots. src and signal are the same as +for connect().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +
    +
    +

    DOM Custom Event Object Reference

    +

    + +event():

    +
    +

    The native event produced by the browser. You should not need to +use this.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +src():

    +
    +

    The element that this signal is connected to.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +type():

    +
    +

    The event type ('click', 'mouseover', 'keypress', +etc.) as a string. Does not include the 'on' prefix.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +target():

    +
    +

    The element that triggered the event. This may be a child of +src().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +modifier():

    +
    +

    Returns {shift, ctrl, meta, alt, any}, where each property is +true if its respective modifier key was pressed, false +otherwise. any is true if any modifier is pressed, +false otherwise.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +stopPropagation():

    +
    +

    Works like W3C's stopPropagation().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +preventDefault():

    +
    +

    Works like W3C's preventDefault().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +stop():

    +
    +

    Shortcut that calls stopPropagation() and +preventDefault().

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +key():

    +
    +

    Returns {code, string}.

    +

    Use 'onkeydown' and 'onkeyup' handlers to detect control +characters such as 'KEY_F1'. Use the 'onkeypress' +handler to detect "printable" characters, such as 'é'.

    +

    When a user presses F1, in 'onkeydown' and 'onkeyup' this +method returns {code: 122, string: 'KEY_F1'}. In +'onkeypress', it returns {code: 0, string: ''}.

    +

    If a user presses Shift+2 on a US keyboard, this method returns +{code: 50, string: 'KEY_2'} in 'onkeydown' and +'onkeyup'. In 'onkeypress', it returns {code: 64, +string: '@'}.

    +

    See _specialKeys in the source code for a comprehensive list +of control characters.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +mouse():

    +
    +

    Properties for 'onmouse*', 'onclick', 'ondblclick', +and 'oncontextmenu':

    +
    +
      +
    • page is a MochiKit.Style.Coordinates object +that represents the cursor position relative to the HTML +document. Equivalent to pageX and pageY in +Safari, Mozilla, and Opera.
    • +
    • client is a MochiKit.Style.Coordinates +object that represents the cursor position relative to the +visible portion of the HTML document. Equivalent to +clientX and clientY on all browsers. Current versions of +Safari incorrectly return clientX as relative to the canvas +instead of relative to the viewport (Safari Bug 8707).
    • +
    +
    +

    Properties for 'onmouseup', 'onmousedown', 'onclick', +and 'ondblclick':

    +
    +
      +
    • mouse().button returns {left, right, middle} where +each property is true if the mouse button was pressed, +false otherwise.
    • +
    +
    +

    Known browser bugs:

    +
    +
      +
    • Current versions of Safari won't signal 'ondblclick' +when attached via connect() (Safari Bug 7790).

      +
    • +
    • In Safari < 2.0.4, calling preventDefault() or stop() +in 'onclick' events signalled from <a> tags does not +prevent the browser from following those links.

      +
    • +
    • Mac browsers don't report right-click consistently. Firefox +signals the slot and sets modifier().ctrl to true, +Opera signals the slot and sets modifier().meta to +true, and Safari doesn't signal the slot at all +(Safari Bug 6595).

      +

      To find a right-click in Safari, Firefox, and IE, you can +connect an element to 'oncontextmenu'. This doesn't +work in Opera.

      +
    • +
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +relatedTarget():

    +
    +

    Returns the document element that the mouse has moved to. This is +generated for 'onmouseover' and 'onmouseout' events.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +confirmUnload(msg):

    +
    +

    In browsers that support the 'onbeforeunload' event (IE and +Firefox), calling this in the event handler will show a dialog box +that allows the user to confirm or cancel the navigation away from +the page.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2006 Jonathan Gardner <jgardner@jonathangardner.net>, Beau +Hartshorne <beau@hartshornesoftware.com>, and Bob Ippolito +<bob@redivi.com>. This program is dual-licensed free software; you +can redistribute it and/or modify it under the terms of the MIT +License or the Academic Free License v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Sortable.html b/mochikit_v14/doc/html/MochiKit/Sortable.html new file mode 100644 index 0000000..d3ddaa4 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Sortable.html @@ -0,0 +1,238 @@ + + + + + + + +MochiKit.Sortable - sortable with drag and drop lists + + + + + + +
    +
    +

    Name

    +

    MochiKit.Sortable - sortable with drag and drop lists

    +
    +
    +

    Synopsis

    +
    +<ul id="dnd_sortable">
    +    <li>mochibot.com</li>
    +    <li>pythonmac.org</li>
    +    <li>undefined.org</li>
    +    <li>python.org</li>
    +</ul>
    +<script type="text/javascript">
    +  MochiKit.Sortable.Sortable.create('dnd_sortable');
    +</script>
    +
    +
    +
    +

    Description

    +

    MochiKit.Sortable add a new Sortable object to manipulate easily +drag&drop in lists.

    +
    + +
    +

    Overview

    +

    MochiKit.Sortable mainly contains the Sortable object offering +facilities to manipulate a list and drag its items to reorder it. It +can also be serialized for being send to server. It is ported from +Scriptaculous.

    +
    +
    +

    API Reference

    +
    +

    Objects defined

    +

    + +SortableObserver:

    +
    +

    Observer for DragAndDrop object. You normally don't have to access +this, only for customization purpose.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Sortable.create(element [, options]):

    +
    +

    Create a new Sortable. Usually you'll call it with a UL element, +but it can be customized with options to use something else.

    +

    You have the following options:

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    elementelement
    tag'li'
    dropOnEmptyfalse
    overlap'vertical'
    constraint'vertical'
    containmentelement
    handlefalse
    onlyfalse
    hoverclassnull
    ghostingfalse
    scrollfalse
    scrollSensitivity20
    scrollSpeed15
    format/^[^_]*_(.*)$/
    onChangeMochiKit.Base.noop
    onUpdateMochiKit.Base.noop
    treefalse
    treeTag'ul'
    +
    +
    tag:
    +
    Name of the tag used to make the draggable elements. It matches all +the childNodes of the Sortable element with this tag.
    +
    only:
    +
    Class or array of classes used to filter the children, combined with +the tag criteria.
    +
    format:
    +
    Regular expression which serves as a match filter for serialization, +on children' ids. For example, with the default value, you'll get +['1', '2', '3', '4'] with ids ['sort_1', 'sort_2', 'sort_3', 'sort_4'].
    +
    onChange:
    +
    Callback called when an element moves between others in the Sortable. +It's called for each movements, even if you don't release the mouse.
    +
    onUpdate:
    +
    Callback called when the order changes in the Sortable. It's called +only if the Sortable is modified, after you dropped an element.
    +
    tree:
    +
    Option for creating a Sortable tree. It's an experimental +setting, that can be very slow even with a few elements. You +can customize its behaviour with the treeTag option, that +defines the node used to make branches in your tree (that +contains leaves).
    +
    +

    Other options are passed to the Draggables and Droppables objects created. +Refer to MochiKit.DragAndDrop for more information.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Sortable.destroy(element):

    +
    +

    Destroy a previously created sortable. It prevents further use of +the Sortable functionnality on the element, unless recreated.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Sortable.serialize(element [, options]):

    +
    +

    Serialize the content of a Sortable. Useful to send this content +through a XMLHTTPRequest. The options overrides the ones of the Sortable +only for the serialization.

    + ++++ + + + + + + + + + + + + + + +
    tagtag from the Sortable
    onlyonly from the Sortable
    nameid of the element
    formatformat of the Sortable or /^[^_]*_(.*)$
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +

    Portions adapted from Scriptaculous are available under the terms +of the MIT License.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Style.html b/mochikit_v14/doc/html/MochiKit/Style.html new file mode 100644 index 0000000..51bffe6 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Style.html @@ -0,0 +1,332 @@ + + + + + + + +MochiKit.Style - painless Style manipulation API + + + + + + +
    +
    +

    Name

    +

    MochiKit.Style - painless Style manipulation API

    +
    +
    +

    Synopsis

    +
    +var messagePos = getElementPosition('message');
    +var messageSize = getElementDimensions('message');
    +
    +var notifyPos = new MochiKit.Style.Coordinates(
    +     messagePos.x + messageSize.w + 10,
    +     messagePos.y);
    +
    +setElementPosition('notify', notifyPos);
    +
    +
    +
    +

    Description

    +

    Refactored from MochiKit.DOM.

    +
    + +
    +

    Overview

    +

    Refactored from MochiKit.DOM.

    +
    +

    Element Visibility

    +

    The hideElement and showElement functions are +provided as a convenience, but only work for elements that are +display: block. For a general solution to showing, hiding, and +checking the explicit visibility of elements, we recommend using a +solution that involves a little CSS. Here's an example:

    +
    +<style type="text/css">
    +    .invisible { display: none; }
    +</style>
    +
    +<script type="text/javascript">
    +    function toggleVisible(elem) {
    +        toggleElementClass("invisible", elem);
    +    }
    +
    +    function makeVisible(elem) {
    +        removeElementClass(elem, "invisible");
    +    }
    +
    +    function makeInvisible(elem) {
    +        addElementClass(elem, "invisible");
    +    }
    +
    +    function isVisible(elem) {
    +        // you may also want to check for
    +        // getElement(elem).style.display == "none"
    +        return !hasElementClass(elem, "invisible");
    +    };
    +</script>
    +
    +

    MochiKit doesn't ship with such a solution, because there is no +reliable and portable method for adding CSS rules on the fly with +JavaScript.

    +
    +
    +
    +

    API Reference

    +
    +

    Functions

    +

    + +getStyle(element, cssSelector):

    +
    +

    Looks up a CSS property for the given element. The element can be +specified as either a string with the element's ID or the element +object itself.

    +
    +
    cssSelector:
    +
    The CSS selector, e.g. background-color.
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +setStyle(element, styles):

    +
    +

    Set CSS properties on a the given element. The element can be +specified as either a string with the element's ID or the element +object itself.

    +
    +
    styles:
    +
    Dictionnary holding CSS properties to set, e.g. +{'background-color': 'red', 'opacity': 0.5}.
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +setOpacity(element, opacity):

    +
    +

    Sets opacity for element. Valid opacity values range +from 0 (invisible) to 1 (opaque). element is looked up with +getElement, so string identifiers are also acceptable.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +getElementDimensions(element):

    +
    +

    Return the absolute pixel width and height (including padding and border, +but not margins) of element as an object with w and h +properties, or undefined if element is not in the document. +element may be specified as a string to be looked up with +getElement, a DOM element, or trivially as an object with +w and/or h properties.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +setElementDimensions(element, dimensions[, units='px']):

    +
    +

    Sets the dimensions of element in the document from an object +with w and h properties.

    +

    Warning: IE in quirks-mode seems to behave strange when you set +the height off an element containing text to 0. You can workaround this +by setting the value of visibly/display.

    +
    +
    element:
    +
    A reference to the DOM element to update (if a string is +given, getElement(node) will be used to locate the +node)
    +
    dimensions:
    +
    An object with w and h properties. You can also specify only +one property.
    +
    units:
    +
    Optionally set the units to use, default is px
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +getElementPosition(element[, relativeTo={x: 0, y: 0}]):

    +
    +

    Return the absolute pixel position of element in the document +as an object with x and y properties, or undefined if +element is not in the document. element may be specified +as a string to be looked up with getElement, a DOM +element, or trivially as an object with x and/or y +properties.

    +

    If relativeTo is given, then its coordinates are subtracted +from the absolute position of element, e.g.:

    +
    +var elemPos = getElementPosition(elem);
    +var anotherElemPos = getElementPosition(anotherElem);
    +var relPos = getElementPosition(elem, anotherElem);
    +assert( relPos.x == (elemPos.x - anotherElemPos.x) );
    +assert( relPos.y == (elemPos.y - anotherElemPos.y) );
    +
    +

    relativeTo may be specified as a string to be looked up with +getElement, a DOM element, or trivially as an object +with x and/or y properties.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +setElementPosition(element, position[, units='px']):

    +
    +

    Sets the absolute position of element in the document from an +object with x and y properties.

    +
    +
    element:
    +
    A reference to the DOM element to update (if a string is +given, getElement(node) will be used to locate the +node)
    +
    position:
    +
    An object with x and y properties. You can also specify only +one property.
    +
    units:
    +
    Optionally set the units to use, default is px
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +setDisplayForElement(display, element[, ...]):

    +
    +

    Change the style.display for the given element(s). Usually +used as the partial forms:

    + +

    Elements are looked up with getElement, so string +identifiers are acceptable.

    +

    For information about the caveats of using a style.display +based show/hide mechanism, and a CSS based alternative, see +Element Visibility.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +showElement(element, ...):

    +
    +

    Partial form of setDisplayForElement, specifically:

    +
    +partial(setDisplayForElement, "block")
    +
    +

    For information about the caveats of using a style.display +based show/hide mechanism, and a CSS based alternative, see +Element Visibility.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +hideElement(element, ...):

    +
    +

    Partial form of setDisplayForElement, specifically:

    +
    +partial(setDisplayForElement, "none")
    +
    +

    For information about the caveats of using a style.display +based show/hide mechanism, and a CSS based alternative, see +Element Visibility.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +getViewportDimensions():

    +
    +

    Return the pixel width and height of the viewport as an object +with w and h properties.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +getViewportPosition():

    +
    +

    Return the pixel position of the viewport inside the window, as a +Coordinates object.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +

    Objects

    +

    + +Coordinates(x, y):

    +
    +

    Constructs an object with x and y properties. obj.toString() +returns something like {x: 0, y: 42} for debugging.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Dimensions(w, h):

    +
    +

    Constructs an object with w and h properties. obj.toString() +returns something like {w: 0, h: 42} for debugging.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005-2006 Bob Ippolito <bob@redivi.com>, and Beau Hartshorne +<beau@hartshornesoftware.com>. This program is dual-licensed free +software; you can redistribute it and/or modify it under the terms of +the MIT License or the Academic Free License v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/VersionHistory.html b/mochikit_v14/doc/html/MochiKit/VersionHistory.html new file mode 100644 index 0000000..db7f459 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/VersionHistory.html @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + +
    +

    2006-XX-XX v1.4

    +
      +
    • MochiKit.Color's HSV to RGB conversion code fixed to return the correct +value (hsv.v for RGB values) in cases where saturation === 0.
    • +
    • doXHR workaround for a Mozilla bug when calling XMLHttpRequest in certain +situations. Always wraps call in a callLater(0, doXHR, url, opts).
    • +
    • parseQueryString will now parse values with embedded "="
    • +
    • Workaround for a Safari DOM crash when using MochiKit.Iter.list. +http://bugs.webkit.org/show_bug.cgi?id=12191
    • +
    • New removeNodeAttribute function in MochiKit.DOM.
    • +
    • MochiKit.Async.doXHR and dependent functions now accept 201 CREATED and +204 NO CONTENT as valid.
    • +
    • MochiKit.DOM.formContents now treats option tags the same way that +form posts do in the case of missing and empty string value attributes, +even in IE.
    • +
    • MochiKit.Base.queryString now accepts third queryString([names, values]) +form.
    • +
    • MochiKit.DOM.formContents now defaults to document.body if no element is +given.
    • +
    • New MochiKit.Selector module
    • +
    • MochiKit.LoggingPane fixes for Internet Explorer
    • +
    • MochiKit.DOM now creates XHTML nodes in XUL documents.
    • +
    • MochiKit.LoggingPane now works on pages with '#' in the URL on IE
    • +
    • New MochiKit.Async.doXHR as a convenient method for doing custom +XMLHttpRequests (e.g. extra headers, overrideMimeType, etc.)
    • +
    • New __connect__ protocol for MochiKit.Signal.connect source notifications
    • +
    • Added colSpan, bgColor to the list of DOM renames for Internet Explorer
    • +
    • New MochiKit.Signal.disconnectAllTo function
    • +
    • MochiKit.Base.parseQueryString now accepts leading question mark
    • +
    • New MochiKit.Base.values function
    • +
    • Fixed MochiKit.Signal.disconnect when called from a signal handler invoked +by MochiKit.Signal.signal
    • +
    • parseQueryString now splits on HTML entities equivalent to ampersand as well
    • +
    • Better XHTML compatibility (removed obvious cases where uppercase tagName or +nodeName was assumed)
    • +
    • MochiKit.Base.queryString now handles array values in the same way HTML +forms handle multiple elements of the same name.
    • +
    • MochiKit.Base.parseQueryString now returns {} for empty query string instead +of {"": "undefined"}
    • +
    • MochiKit.DOM.formContents now handles option value="" correctly.
    • +
    • MochiKit.DOM now checks for undefined className.
    • +
    • MochiKit.Iter.groupby() now uses compare() to group rather than == and !=
    • +
    • serializeJSON no longer serializes undefined, as per the JSON spec
    • +
    • Fixed an infinite recursion bug in serializeJSON if an adapter +returns the object itself.
    • +
    • New MochiKit.Base.operator.seq and sne to support strict comparison
    • +
    • MochiKit.Base.isArrayLike no longer returns true for DOM text nodes
    • +
    • Added readonly-readOnly to the list of DOM renames for Internet Explorer
    • +
    • New MochiKit.Signal event method: confirmUnload (sets returnValue for +onbeforeunload)
    • +
    • Fix interpreter help() function for Firefox and IE
    • +
    • API version compatibility notes added
    • +
    • New MochiKit.Base functions methodcaller and compose
    • +
    • Support IE-based native console logging (Debugger, Atlas)
    • +
    • Refactored style functions from MochiKit.DOM to MochiKit.Style
    • +
    • MochiKit.Async.DeferredList is now a proper Deferred
    • +
    • MochiKit.DOM.formContents now supports SELECT multiple tags
    • +
    • Re-use StopIteration Error if the browser already has it
    • +
    • Workaround IE type="" bug for INPUT elements
    • +
    • Allow LoggingPane to work in IE with hyphen-containing URLs
    • +
    • Replace percents for Safari native logging to avoid crashing
    • +
    • New MochiKit.DOM.coerceToDOM .dom(node) / .__dom__(node) protocol
    • +
    • MochiKit.DOM's MochiKit.Iter dependency is now optional
    • +
    • Added expand all link to the documentation index
    • +
    • Added MochiKit.DOM.isChildNode
    • +
    • Added synthesizing for onmouseenter/onmouseleave
    • +
    +

    2006-04-29 v1.3.1 (bug fix release)

    +
      +
    • Fix sendXMLHttpRequest sendContent regression
    • +
    • Internet Explorer fix in MochiKit.Logging (printfire exception)
    • +
    • Internet Explorer XMLHttpRequest object leak fixed in MochiKit.Async
    • +
    +

    2006-04-26 v1.3 "warp zone"

    +
      +
    • IMPORTANT: Renamed MochiKit.Base.forward to forwardCall (for export)
    • +
    • IMPORTANT: Renamed MochiKit.Base.find to findValue (for export)
    • +
    • New MochiKit.Base.method as a convenience form of bind that takes the +object before the method
    • +
    • New MochiKit.Base.flattenArguments for flattening a list of arguments to +a single Array
    • +
    • Refactored MochiRegExp example to use MochiKit.Signal
    • +
    • New key_events example demonstrating use of MochiKit.Signal's key handling +capabilities.
    • +
    • MochiKit.DOM.createDOM API change for convenience: if attrs is a string, +null is used and the string will be considered the first node. This +allows for the more natural P("foo") rather than P(null, "foo").
    • +
    • MochiKit Interpreter example refactored to use MochiKit.Signal and now +provides multi-line input and a help() function to get MochiKit function +signature from the documentation.
    • +
    • Native Console Logging for the default MochiKit.Logging logger
    • +
    • New MochiKit.Async.DeferredList, gatherResults, maybeDeferred
    • +
    • New MochiKit.Signal example: draggable
    • +
    • Added sanity checking to Deferred to ensure that errors happen when chaining +is used incorrectly
    • +
    • Opera sendXMLHttpRequest fix (sends empty string instead of null by default)
    • +
    • Fix a bug in MochiKit.Color that incorrectly generated hex colors for +component values smaller than 16/255.
    • +
    • Fix a bug in MochiKit.Logging that prevented logs from being capped at a +maximum size
    • +
    • MochiKit.Async.Deferred will now wrap thrown objects that are not instanceof +Error, so that the errback chain is used instead of the callback chain.
    • +
    • MochiKit.DOM.appendChildNodes and associated functions now append iterables +in the correct order.
    • +
    • New MochiKit-based SimpleTest test runner as a replacement for Test.Simple
    • +
    • MochiKit.Base.isNull no longer matches undefined
    • +
    • example doctypes changed to HTML4
    • +
    • isDateLike no longer throws error on null
    • +
    • New MochiKit.Signal module, modeled after the slot/signal mechanism in Qt
    • +
    • updated elementDimensions to calculate width from offsetWidth instead +of clientWidth
    • +
    • formContents now works with FORM tags that have a name attribute
    • +
    • Documentation now uses MochiKit to generate a function index
    • +
    +

    2006-01-26 v1.2 "the ocho"

    +
      +
    • Fixed MochiKit.Color.Color.lighterColorWithLevel
    • +
    • Added new MochiKit.Base.findIdentical function to find the index of an +element in an Array-like object. Uses === for identity comparison.
    • +
    • Added new MochiKit.Base.find function to find the index of an element in +an Array-like object. Uses compare for rich comparison.
    • +
    • MochiKit.Base.bind will accept a string for func, which will be immediately +looked up as self[func].
    • +
    • MochiKit.DOM.formContents no longer skips empty form elements for Zope +compatibility
    • +
    • MochiKit.Iter.forEach will now catch StopIteration to break
    • +
    • New MochiKit.DOM.elementDimensions(element) for determining the width and +height of an element in the document
    • +
    • MochiKit.DOM's initialization is now compatible with +HTMLUnit + JWebUnit + Rhino
    • +
    • MochiKit.LoggingPane will now re-use a _MochiKit_LoggingPane DIV element +currently in the document instead of always creating one.
    • +
    • MochiKit.Base now has operator.mul
    • +
    • MochiKit.DOM.formContents correctly handles unchecked checkboxes that have +a custom value attribute
    • +
    • Added new MochiKit.Color constructors fromComputedStyle and fromText
    • +
    • MochiKit.DOM.setNodeAttribute should work now
    • +
    • MochiKit.DOM now has a workaround for an IE bug when setting the style +property to a string
    • +
    • MochiKit.DOM.createDOM now has workarounds for IE bugs when setting the +name and for properties
    • +
    • MochiKit.DOM.scrapeText now walks the DOM tree in-order
    • +
    • MochiKit.LoggingPane now sanitizes the window name to work around IE bug
    • +
    • MochiKit.DOM now translates usemap to useMap to work around IE bug
    • +
    • MochiKit.Logging is now resistant to Prototype's dumb Object.prototype hacks
    • +
    • Added new MochiKit.DOM documentation on element visibility
    • +
    • New MochiKit.DOM.elementPosition(element[, relativeTo={x: 0, y: 0}]) +for determining the position of an element in the document
    • +
    • Added new MochiKit.DOM createDOMFunc aliases: CANVAS, STRONG
    • +
    +

    2005-11-14 v1.1

    +
      +
    • Fixed a bug in numberFormatter with large numbers
    • +
    • Massively overhauled documentation
    • +
    • Fast-path for primitives in MochiKit.Base.compare
    • +
    • New groupby and groupby_as_array in MochiKit.Iter
    • +
    • Added iterator factory adapter for objects that implement iterateNext()
    • +
    • Fixed isoTimestamp to handle timestamps with time zone correctly
    • +
    • Added new MochiKit.DOM createDOMFunc aliases: SELECT, OPTION, OPTGROUP, +LEGEND, FIELDSET
    • +
    • New MochiKit.DOM formContents and enhancement to queryString to support it
    • +
    • Updated view_source example to use dp.SyntaxHighlighter 1.3.0
    • +
    • MochiKit.LoggingPane now uses named windows based on the URL so that +a given URL will get the same LoggingPane window after a reload +(at the same position, etc.)
    • +
    • MochiKit.DOM now has currentWindow() and currentDocument() context +variables that are set with withWindow() and withDocument(). These +context variables affect all MochiKit.DOM functionality (getElement, +createDOM, etc.)
    • +
    • MochiKit.Base.items will now catch and ignore exceptions for properties +that are enumerable but not accessible (e.g. permission denied)
    • +
    • MochiKit.Async.Deferred's addCallback/addErrback/addBoth +now accept additional arguments that are used to create a partially +applied function. This differs from Twisted in that the callback/errback +result becomes the last argument, not the first when this feature +is used.
    • +
    • MochiKit.Async's doSimpleXMLHttpRequest will now accept additional +arguments which are used to create a GET query string
    • +
    • Did some refactoring to reduce the footprint of MochiKit by a few +kilobytes
    • +
    • escapeHTML to longer escapes ' (apos) and now uses +String.replace instead of iterating over every char.
    • +
    • Added DeferredLock to Async
    • +
    • Renamed getElementsComputedStyle to computedStyle and moved +it from MochiKit.Visual to MochiKit.DOM
    • +
    • Moved all color support out of MochiKit.Visual and into MochiKit.Color
    • +
    • Fixed range() to accept a negative step
    • +
    • New alias to MochiKit.swapDOM called removeElement
    • +
    • New MochiKit.DOM.setNodeAttribute(node, attr, value) which sets +an attribute on a node without raising, roughly equivalent to: +updateNodeAttributes(node, {attr: value})
    • +
    • New MochiKit.DOM.getNodeAttribute(node, attr) which gets the value of +a node's attribute or returns null without raising
    • +
    • Fixed a potential IE memory leak if using MochiKit.DOM.addToCallStack +directly (addLoadEvent did not leak, since it clears the handler)
    • +
    +

    2005-10-24 v1.0

    +
      +
    • New interpreter example that shows usage of MochiKit.DOM to make +an interactive JavaScript interpreter
    • +
    • New MochiKit.LoggingPane for use with the MochiKit.Logging +debuggingBookmarklet, with logging_pane example to show its usage
    • +
    • New mochiregexp example that demonstrates MochiKit.DOM and MochiKit.Async +in order to provide a live regular expression matching tool
    • +
    • Added advanced number formatting capabilities to MochiKit.Format: +numberFormatter(pattern, placeholder="", locale="default") and +formatLocale(locale="default")
    • +
    • Added updatetree(self, obj[, ...]) to MochiKit.Base, and changed +MochiKit.DOM's updateNodeAttributes(node, attrs) to use it when appropiate.
    • +
    • Added new MochiKit.DOM createDOMFunc aliases: BUTTON, TT, PRE
    • +
    • Added truncToFixed(aNumber, precision) and roundToFixed(aNumber, precision) +to MochiKit.Format
    • +
    • MochiKit.DateTime can now handle full ISO 8601 timestamps, specifically +isoTimestamp(isoString) will convert them to Date objects, and +toISOTimestamp(date, true) will return an ISO 8601 timestamp in UTC
    • +
    • Fixed missing errback for sendXMLHttpRequest when the server does not +respond
    • +
    • Fixed infinite recusion bug when using roundClass("DIV", ...)
    • +
    • Fixed a bug in MochiKit.Async wait (and callLater) that prevented them +from being cancelled properly
    • +
    • Workaround in MochiKit.Base bind (and partial) for functions that don't +have an apply method, such as alert
    • +
    • Reliably return null from the string parsing/manipulation functions if +the input can't be coerced to a string (s + "") or the input makes no sense; +e.g. isoTimestamp(null) and isoTimestamp("") return null
    • +
    +

    2005-10-08 v0.90

    +
      +
    • Fixed ISO compliance with toISODate
    • +
    • Added missing operator.sub
    • +
    • Placated Mozilla's strict warnings a bit
    • +
    • Added JSON serialization and unserialization support to MochiKit.Base: +serializeJSON, evalJSON, registerJSON. This is very similar to the repr +API.
    • +
    • Fixed a bug in the script loader that failed in some scenarios when a script +tag did not have a "src" attribute (thanks Ian!)
    • +
    • Added new MochiKit.DOM createDOMFunc aliases: H1, H2, H3, BR, HR, TEXTAREA, +P, FORM
    • +
    • Use encodeURIComponent / decodeURIComponent for MochiKit.Base urlEncode +and parseQueryString, when available.
    • +
    +

    2005-08-12 v0.80

    +
      +
    • Source highlighting in all examples, moved to a view-source example
    • +
    • Added some experimental syntax highlighting for the Rounded Corners example, +via the LGPL dp.SyntaxHighlighter 1.2.0 now included in examples/common/lib
    • +
    • Use an indirect binding for the logger conveniences, so that the global +logger could be replaced by setting MochiKit.Logger.logger to something else +(though an observer is probably a better choice).
    • +
    • Allow MochiKit.DOM.getElementsByTagAndClassName to take a string for parent, +which will be looked up with getElement
    • +
    • Fixed bug in MochiKit.Color.fromBackground (was using node.parent instead of +node.parentNode)
    • +
    • Consider a 304 (NOT_MODIFIED) response from XMLHttpRequest to be success
    • +
    • Disabled Mozilla map(...) fast-path due to Deer Park compatibility issues
    • +
    • Possible workaround for Safari issue with swapDOM, where it would get +confused because two elements were in the DOM at the same time with the +same id
    • +
    • Added missing THEAD convenience function to MochiKit.DOM
    • +
    • Added lstrip, rstrip, strip to MochiKit.Format
    • +
    • Added updateNodeAttributes, appendChildNodes, replaceChildNodes to +MochiKit.DOM
    • +
    • MochiKit.Iter.iextend now has a fast-path for array-like objects
    • +
    • Added HSV color space support to MochiKit.Visual
    • +
    • Fixed a bug in the sortable_tables example, it now converts types +correctly
    • +
    • Fixed a bug where MochiKit.DOM referenced MochiKit.Iter.next from global +scope
    • +
    +

    2005-08-04 v0.70

    +
      +
    • New ajax_tables example, which shows off XMLHttpRequest, ajax, json, and +a little TAL-ish DOM templating attribute language.
    • +
    • sendXMLHttpRequest and functions that use it (loadJSONDoc, etc.) no longer +ignore requests with status == 0, which seems to happen for cached or local +requests
    • +
    • Added sendXMLHttpRequest to MochiKit.Async.EXPORT, d'oh.
    • +
    • Changed scrapeText API to return a string by default. This is API-breaking! +It was dumb to have the default return value be the form you almost never +want. Sorry.
    • +
    • Added special form to swapDOM(dest, src). If src is null, dest is removed +(where previously you'd likely get a DOM exception).
    • +
    • Added three new functions to MochiKit.Base for dealing with URL query +strings: urlEncode, queryString, parseQueryString
    • +
    • MochiKit.DOM.createDOM will now use attr[k] = v for all browsers if the name +starts with "on" (e.g. "onclick"). If v is a string, it will set it to +new Function(v).
    • +
    • Another workaround for Internet "worst browser ever" Explorer's setAttribute +usage in MochiKit.DOM.createDOM (checked -> defaultChecked).
    • +
    • Added UL, OL, LI convenience createDOM aliases to MochiKit.DOM
    • +
    • Packing is now done by Dojo's custom Rhino interpreter, so it's much smaller +now!
    • +
    +

    2005-07-29 v0.60

    +
      +
    • Beefed up the MochiKit.DOM test suite
    • +
    • Fixed return value for MochiKit.DOM.swapElementClass, could return +false unexpectedly before
    • +
    • Added an optional "parent" argument to +MochiKit.DOM.getElementsByTagAndClassName
    • +
    • Added a "packed" version in packed/MochiKit/MochiKit.js
    • +
    • Changed build script to rewrite the URLs in tests to account for the +JSAN-required reorganization
    • +
    • MochiKit.Compat to potentially work around IE 5.5 issues +(5.0 still not supported). Test.Simple doesn't seem to work there, +though.
    • +
    • Several minor documentation corrections
    • +
    +

    2005-07-27 v0.50

    +
      +
    • Initial Release
    • +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/Visual.html b/mochikit_v14/doc/html/MochiKit/Visual.html new file mode 100644 index 0000000..234c82f --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/Visual.html @@ -0,0 +1,699 @@ + + + + + + + +MochiKit.Visual - visual effects + + + + + + +
    +
    +

    Name

    +

    MochiKit.Visual - visual effects

    +
    +
    +

    Synopsis

    +
    +// round the corners of all h1 elements
    +roundClass("h1", null);
    +
    +// round the top left corner of the element with the id "title"
    +roundElement("title", {corners: "tl"});
    +
    +// Add an fade effect to an element
    +fade('myelement');
    +
    +
    +
    +

    Description

    +

    MochiKit.Visual provides visual effects and support functions for +visuals.

    +
    + +
    +

    Overview

    +

    MochiKit.Visual provides different visual effect: rounded corners and +animations for your HTML elements. Rounded corners are created +completely through CSS manipulations and require no external images or +style sheets. This implementation was adapted from Rico. Dynamic +effects are ported from Scriptaculous.

    +
    +
    +

    API Reference

    +
    +

    Functions

    +

    + +roundClass(tagName[, className[, options]]):

    +
    +

    Rounds all of the elements that match the tagName and +className specifiers, using the options provided. tagName +or className can be null to match all tags or classes. +For more information about the options, see the +roundElement function.

    +
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +roundElement(element[, options]):

    +
    +

    Immediately round the corners of the specified element. The +element can be given as either a string with the element ID, or as +an element object.

    +

    The options mapping has the following defaults:

    + ++++ + + + + + + + + + + + + + + + + + + + + +
    corners"all"
    color"fromElement"
    bgColor"fromParent"
    blendtrue
    borderfalse
    compactfalse
    +

    corners:

    +
    +

    specifies which corners of the element should be rounded. +Choices are:

    +
      +
    • all
    • +
    • top
    • +
    • bottom
    • +
    • tl (top left)
    • +
    • bl (bottom left)
    • +
    • tr (top right)
    • +
    • br (bottom right)
    • +
    +
    +
    Example:
    +
    "tl br": top-left and bottom-right corners are rounded
    +
    +
    +
    +
    blend:
    +
    specifies whether the color and background color should be +blended together to produce the border color.
    +
    Availability:
    +
    Available in MochiKit 1.3.1+
    +
    +
    +

    + +toggle(element[, effect[, options]]):

    +
    +

    Toggle an element between visible and invisible state using an effect.

    +
    +
    effect:
    +
    One of the visual pairs to use, between 'slide', 'blind', +'appear', and 'size'.
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +tagifyText(element[, tagifyStyle]):

    +
    +

    Transform a node text into nodes containing one letter by tag.

    +
    +
    tagifyStyle:
    +
    style to apply to character nodes, default to 'position: +relative'.
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +multiple(elements, effect[, options]):

    +
    +

    Launch the same effect on a list of elements.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +

    Basic Effects classes

    +

    + +DefaultOptions:

    +
    +

    Default options for all Effect creation.

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    transitionMochiKit.Visual.Transitions.sinoidal
    duration1.0
    fps25.0
    syncfalse
    from0.0
    to1.0
    delay0.0
    queue'parallel'
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Base():

    +
    +

    Base class to all effects. Define a basic looping service, use it +for creating new effects.

    +

    You can override the methods setup, update and finish`.

    +

    The class defines a number of events that will be called during effect +life. The events are:

    +
      +
    • beforeStart
    • +
    • beforeSetup
    • +
    • beforeUpdate
    • +
    • afterUpdate
    • +
    • beforeFinish
    • +
    • afterFinish
    • +
    +

    If you want to define your own callbacks, define it in the options +parameter of the effect. Example:

    +
    +// I slide it up and then down again
    +slideUp('myelement', {afterFinish: function () {
    +    slideDown('myelement');
    +});
    +
    +

    Specific internal events are also available: for each one abone the +same exists with 'Internal' (example: 'beforeStartInternal'). Their purpose +is mainly for creating your own effect and keep the user access to event +callbacks (not overriding the library ones).

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Parallel(effects [, options]):

    +
    +

    Launch effects in parallel.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Opacity(element [, options]):

    +
    +

    Change the opacity of an element progressively.

    +

    options:

    + ++++ + + + + + + + + +
    from0.0
    to1.0
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Move(element [, options]):

    +
    +

    Change the position of an element in small steps, creating a +moving effect.

    +

    options:

    + ++++ + + + + + + + + + + + +
    x0
    y0
    position'relative'
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Scale(element, percent [, options]):

    +
    +

    Change the size of an element.

    +
    +
    percent:
    +
    Final wanted size in percent of current size. The size will be +reduced if the value is between 0 and 100, and raised if the +value is above 100.
    +
    +

    options:

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + +
    scaleXtrue
    scaleYtrue
    scaleContenttrue
    scaleFromCenterfalse
    scaleMode'box'
    scaleFrom100.0
    scaleTopercent
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Highlight(element [, options]):

    +
    +

    Highlight an element, flashing with one color.

    +

    options:

    + ++++ + + + + + +
    startcolor'#ffff99'
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +ScrollTo(element [, options]):

    +
    +

    Scroll the window to the position of the given element.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +Morph(element [, options]):

    +
    +

    Make a transformation to the given element. It's called with the option +style with an array holding the styles to change. It works with +properties for size (font-size, border-width, ...) and properties +for color (color, background-color, ...).

    +

    For size, it's better to have defined the original style. You must +use the same unit in the call to Morph (no translation exists between two +different units).

    +

    Parsed length are postfixed with: em, ex, px, in, cm, mm, pt, pc.

    +

    Example:

    +
    +<div id="foo" style="font-size: 1em">MyDiv</div>
    +...
    +Morph("foo", {"style": {"font-size": "2em"}});
    +
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +

    Combination Effects

    +

    + +fade(element [, options]):

    +
    +

    Change the opacity of an element until making it disappear.

    +

    options:

    + ++++ + + + + + + + + +
    fromelement.opacity || 1.0
    to0.0
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +appear(element [, options]):

    +
    +

    Slowly show an invisible element.

    +

    options:

    + ++++ + + + + + + + + +
    from0.0
    to1.0
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +puff(element [, options]):

    +
    +

    Make an element double size, and then make it disappear.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +blindUp(element [, options]):

    +
    +

    Blind an element up, changing its vertical size to 0.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +blindDown(element [, options]):

    +
    +

    Blind an element down, restoring its vertical size.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +switchOff(element [, options]):

    +
    +

    A switch-off like effect, making the element disappear.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +dropOut(element [, options]):

    +
    +

    Make the element fall and fade.

    +

    options:

    + ++++ + + + + + +
    distance100
    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +shake(element [, options]):

    +
    +

    Shake an element from left to right.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +slideDown(element [, options]):

    +
    +

    Slide an element down.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +slideUp(element [, options]):

    +
    +

    Slide an element up.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +squish(element [, options]):

    +
    +

    Reduce the horizontal and vertical sizes at the same time, using +the top left corner.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +grow(element [, options]):

    +
    +

    Restore the size of an element.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +shrink(element [, options]):

    +
    +

    Shrink an element to its center.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +pulsate(element [, options]):

    +
    +

    Switch an element between appear and fade.

    +

    options:

    + ++++ + + + + + +
    pulsesnull
    +

    pulses controls the number of pulses made during the effect.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +

    + +fold(element [, options]):

    +
    +

    Reduce first the vertical size, and then the horizontal size.

    +
    +
    Availability:
    +
    Available in MochiKit 1.4+
    +
    +
    +
    +
    +

    The Effects Queue

    +

    When you create effects based on user input (mouse clicks for example), it can +create conflicts between the effects if multiple effects are running at the +same time. To manage this problem, the Queue mechanism has been introduced: +it's responsible for running the effects as you desired.

    +

    By default, you have one Queue called 'global', and the effects run in 'parallel' +(see default options). Every effects have a queue option to customize this. +It can be a string, the scope is then global:

    +
      +
    • start: the effect will be run before any other;
    • +
    • end: the effect will be run after any other;
    • +
    • break: every other effects break when the the effect start;
    • +
    • parallel: the effect run normally with others.
    • +
    +

    But you have even more control if you use an array with the following keys:

    +
      +
    • position takes a value listed above;
    • +
    • scope manages how the information has to be taken. If it's global +then it's the same information for every effects. Otherwise you can define +your own scode. For example, if you add an effect on a specified element, +you may use the element id as scode;
    • +
    • limit defines how many effects can run in the current scode. If an +effect is added whereas the limit is reached, it will never be run (it's +lost).
    • +
    +
    +
    + +
    +

    Authors

    + +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +

    Portions adapted from Rico are available under the terms of the +Apache License, Version 2.0.

    +

    Portions adapted from Scriptaculous are available under the terms +of the MIT License.

    +
    +
    + + + diff --git a/mochikit_v14/doc/html/MochiKit/index.html b/mochikit_v14/doc/html/MochiKit/index.html new file mode 100644 index 0000000..ca62d38 --- /dev/null +++ b/mochikit_v14/doc/html/MochiKit/index.html @@ -0,0 +1,393 @@ + + + + + + + +MochiKit Documentation Index + + + + + + +
    +
    +

    Distribution

    +

    MochiKit - makes JavaScript suck a bit less

    + +
    +
    +

    Notes

    +

    To turn off MochiKit's export feature (which may be necessary for +compatibility with some existing code), do this before loading +MochiKit:

    +
    +<script type="text/javascript">MochiKit = {__export__: false};</script>
    +
    +

    When export mode is off, you must use fully qualified names for +all MochiKit functions (e.g. MochiKit.Base.map(...)).

    +
    + +
    +

    See Also

    + +
    +
    +

    Version History

    +

    2006-XX-XX v1.4

    +
      +
    • MochiKit.Color's HSV to RGB conversion code fixed to return the correct +value (hsv.v for RGB values) in cases where saturation === 0.
    • +
    • doXHR workaround for a Mozilla bug when calling XMLHttpRequest in certain +situations. Always wraps call in a callLater(0, doXHR, url, opts).
    • +
    • parseQueryString will now parse values with embedded "="
    • +
    • Workaround for a Safari DOM crash when using MochiKit.Iter.list. +http://bugs.webkit.org/show_bug.cgi?id=12191
    • +
    • New removeNodeAttribute function in MochiKit.DOM.
    • +
    • MochiKit.Async.doXHR and dependent functions now accept 201 CREATED and +204 NO CONTENT as valid.
    • +
    • MochiKit.DOM.formContents now treats option tags the same way that +form posts do in the case of missing and empty string value attributes, +even in IE.
    • +
    • MochiKit.Base.queryString now accepts third queryString([names, values]) +form.
    • +
    • MochiKit.DOM.formContents now defaults to document.body if no element is +given.
    • +
    • New MochiKit.Selector module
    • +
    • MochiKit.LoggingPane fixes for Internet Explorer
    • +
    • MochiKit.DOM now creates XHTML nodes in XUL documents.
    • +
    • MochiKit.LoggingPane now works on pages with '#' in the URL on IE
    • +
    • New MochiKit.Async.doXHR as a convenient method for doing custom +XMLHttpRequests (e.g. extra headers, overrideMimeType, etc.)
    • +
    • New __connect__ protocol for MochiKit.Signal.connect source notifications
    • +
    • Added colSpan, bgColor to the list of DOM renames for Internet Explorer
    • +
    • New MochiKit.Signal.disconnectAllTo function
    • +
    • MochiKit.Base.parseQueryString now accepts leading question mark
    • +
    • New MochiKit.Base.values function
    • +
    • Fixed MochiKit.Signal.disconnect when called from a signal handler invoked +by MochiKit.Signal.signal
    • +
    • parseQueryString now splits on HTML entities equivalent to ampersand as well
    • +
    • Better XHTML compatibility (removed obvious cases where uppercase tagName or +nodeName was assumed)
    • +
    • MochiKit.Base.queryString now handles array values in the same way HTML +forms handle multiple elements of the same name.
    • +
    • MochiKit.Base.parseQueryString now returns {} for empty query string instead +of {"": "undefined"}
    • +
    • MochiKit.DOM.formContents now handles option value="" correctly.
    • +
    • MochiKit.DOM now checks for undefined className.
    • +
    • MochiKit.Iter.groupby() now uses compare() to group rather than == and !=
    • +
    • serializeJSON no longer serializes undefined, as per the JSON spec
    • +
    • Fixed an infinite recursion bug in serializeJSON if an adapter +returns the object itself.
    • +
    • New MochiKit.Base.operator.seq and sne to support strict comparison
    • +
    • MochiKit.Base.isArrayLike no longer returns true for DOM text nodes
    • +
    • Added readonly-readOnly to the list of DOM renames for Internet Explorer
    • +
    • New MochiKit.Signal event method: confirmUnload (sets returnValue for +onbeforeunload)
    • +
    • Fix interpreter help() function for Firefox and IE
    • +
    • API version compatibility notes added
    • +
    • New MochiKit.Base functions methodcaller and compose
    • +
    • Support IE-based native console logging (Debugger, Atlas)
    • +
    • Refactored style functions from MochiKit.DOM to MochiKit.Style
    • +
    • MochiKit.Async.DeferredList is now a proper Deferred
    • +
    • MochiKit.DOM.formContents now supports SELECT multiple tags
    • +
    • Re-use StopIteration Error if the browser already has it
    • +
    • Workaround IE type="" bug for INPUT elements
    • +
    • Allow LoggingPane to work in IE with hyphen-containing URLs
    • +
    • Replace percents for Safari native logging to avoid crashing
    • +
    • New MochiKit.DOM.coerceToDOM .dom(node) / .__dom__(node) protocol
    • +
    • MochiKit.DOM's MochiKit.Iter dependency is now optional
    • +
    • Added expand all link to the documentation index
    • +
    • Added MochiKit.DOM.isChildNode
    • +
    • Added synthesizing for onmouseenter/onmouseleave
    • +
    +

    2006-04-29 v1.3.1 (bug fix release)

    +
      +
    • Fix sendXMLHttpRequest sendContent regression
    • +
    • Internet Explorer fix in MochiKit.Logging (printfire exception)
    • +
    • Internet Explorer XMLHttpRequest object leak fixed in MochiKit.Async
    • +
    +

    2006-04-26 v1.3 "warp zone"

    +
      +
    • IMPORTANT: Renamed MochiKit.Base.forward to forwardCall (for export)
    • +
    • IMPORTANT: Renamed MochiKit.Base.find to findValue (for export)
    • +
    • New MochiKit.Base.method as a convenience form of bind that takes the +object before the method
    • +
    • New MochiKit.Base.flattenArguments for flattening a list of arguments to +a single Array
    • +
    • Refactored MochiRegExp example to use MochiKit.Signal
    • +
    • New key_events example demonstrating use of MochiKit.Signal's key handling +capabilities.
    • +
    • MochiKit.DOM.createDOM API change for convenience: if attrs is a string, +null is used and the string will be considered the first node. This +allows for the more natural P("foo") rather than P(null, "foo").
    • +
    • MochiKit Interpreter example refactored to use MochiKit.Signal and now +provides multi-line input and a help() function to get MochiKit function +signature from the documentation.
    • +
    • Native Console Logging for the default MochiKit.Logging logger
    • +
    • New MochiKit.Async.DeferredList, gatherResults, maybeDeferred
    • +
    • New MochiKit.Signal example: draggable
    • +
    • Added sanity checking to Deferred to ensure that errors happen when chaining +is used incorrectly
    • +
    • Opera sendXMLHttpRequest fix (sends empty string instead of null by default)
    • +
    • Fix a bug in MochiKit.Color that incorrectly generated hex colors for +component values smaller than 16/255.
    • +
    • Fix a bug in MochiKit.Logging that prevented logs from being capped at a +maximum size
    • +
    • MochiKit.Async.Deferred will now wrap thrown objects that are not instanceof +Error, so that the errback chain is used instead of the callback chain.
    • +
    • MochiKit.DOM.appendChildNodes and associated functions now append iterables +in the correct order.
    • +
    • New MochiKit-based SimpleTest test runner as a replacement for Test.Simple
    • +
    • MochiKit.Base.isNull no longer matches undefined
    • +
    • example doctypes changed to HTML4
    • +
    • isDateLike no longer throws error on null
    • +
    • New MochiKit.Signal module, modeled after the slot/signal mechanism in Qt
    • +
    • updated elementDimensions to calculate width from offsetWidth instead +of clientWidth
    • +
    • formContents now works with FORM tags that have a name attribute
    • +
    • Documentation now uses MochiKit to generate a function index
    • +
    +

    2006-01-26 v1.2 "the ocho"

    +
      +
    • Fixed MochiKit.Color.Color.lighterColorWithLevel
    • +
    • Added new MochiKit.Base.findIdentical function to find the index of an +element in an Array-like object. Uses === for identity comparison.
    • +
    • Added new MochiKit.Base.find function to find the index of an element in +an Array-like object. Uses compare for rich comparison.
    • +
    • MochiKit.Base.bind will accept a string for func, which will be immediately +looked up as self[func].
    • +
    • MochiKit.DOM.formContents no longer skips empty form elements for Zope +compatibility
    • +
    • MochiKit.Iter.forEach will now catch StopIteration to break
    • +
    • New MochiKit.DOM.elementDimensions(element) for determining the width and +height of an element in the document
    • +
    • MochiKit.DOM's initialization is now compatible with +HTMLUnit + JWebUnit + Rhino
    • +
    • MochiKit.LoggingPane will now re-use a _MochiKit_LoggingPane DIV element +currently in the document instead of always creating one.
    • +
    • MochiKit.Base now has operator.mul
    • +
    • MochiKit.DOM.formContents correctly handles unchecked checkboxes that have +a custom value attribute
    • +
    • Added new MochiKit.Color constructors fromComputedStyle and fromText
    • +
    • MochiKit.DOM.setNodeAttribute should work now
    • +
    • MochiKit.DOM now has a workaround for an IE bug when setting the style +property to a string
    • +
    • MochiKit.DOM.createDOM now has workarounds for IE bugs when setting the +name and for properties
    • +
    • MochiKit.DOM.scrapeText now walks the DOM tree in-order
    • +
    • MochiKit.LoggingPane now sanitizes the window name to work around IE bug
    • +
    • MochiKit.DOM now translates usemap to useMap to work around IE bug
    • +
    • MochiKit.Logging is now resistant to Prototype's dumb Object.prototype hacks
    • +
    • Added new MochiKit.DOM documentation on element visibility
    • +
    • New MochiKit.DOM.elementPosition(element[, relativeTo={x: 0, y: 0}]) +for determining the position of an element in the document
    • +
    • Added new MochiKit.DOM createDOMFunc aliases: CANVAS, STRONG
    • +
    +

    2005-11-14 v1.1

    +
      +
    • Fixed a bug in numberFormatter with large numbers
    • +
    • Massively overhauled documentation
    • +
    • Fast-path for primitives in MochiKit.Base.compare
    • +
    • New groupby and groupby_as_array in MochiKit.Iter
    • +
    • Added iterator factory adapter for objects that implement iterateNext()
    • +
    • Fixed isoTimestamp to handle timestamps with time zone correctly
    • +
    • Added new MochiKit.DOM createDOMFunc aliases: SELECT, OPTION, OPTGROUP, +LEGEND, FIELDSET
    • +
    • New MochiKit.DOM formContents and enhancement to queryString to support it
    • +
    • Updated view_source example to use dp.SyntaxHighlighter 1.3.0
    • +
    • MochiKit.LoggingPane now uses named windows based on the URL so that +a given URL will get the same LoggingPane window after a reload +(at the same position, etc.)
    • +
    • MochiKit.DOM now has currentWindow() and currentDocument() context +variables that are set with withWindow() and withDocument(). These +context variables affect all MochiKit.DOM functionality (getElement, +createDOM, etc.)
    • +
    • MochiKit.Base.items will now catch and ignore exceptions for properties +that are enumerable but not accessible (e.g. permission denied)
    • +
    • MochiKit.Async.Deferred's addCallback/addErrback/addBoth +now accept additional arguments that are used to create a partially +applied function. This differs from Twisted in that the callback/errback +result becomes the last argument, not the first when this feature +is used.
    • +
    • MochiKit.Async's doSimpleXMLHttpRequest will now accept additional +arguments which are used to create a GET query string
    • +
    • Did some refactoring to reduce the footprint of MochiKit by a few +kilobytes
    • +
    • escapeHTML to longer escapes ' (apos) and now uses +String.replace instead of iterating over every char.
    • +
    • Added DeferredLock to Async
    • +
    • Renamed getElementsComputedStyle to computedStyle and moved +it from MochiKit.Visual to MochiKit.DOM
    • +
    • Moved all color support out of MochiKit.Visual and into MochiKit.Color
    • +
    • Fixed range() to accept a negative step
    • +
    • New alias to MochiKit.swapDOM called removeElement
    • +
    • New MochiKit.DOM.setNodeAttribute(node, attr, value) which sets +an attribute on a node without raising, roughly equivalent to: +updateNodeAttributes(node, {attr: value})
    • +
    • New MochiKit.DOM.getNodeAttribute(node, attr) which gets the value of +a node's attribute or returns null without raising
    • +
    • Fixed a potential IE memory leak if using MochiKit.DOM.addToCallStack +directly (addLoadEvent did not leak, since it clears the handler)
    • +
    +

    2005-10-24 v1.0

    +
      +
    • New interpreter example that shows usage of MochiKit.DOM to make +an interactive JavaScript interpreter
    • +
    • New MochiKit.LoggingPane for use with the MochiKit.Logging +debuggingBookmarklet, with logging_pane example to show its usage
    • +
    • New mochiregexp example that demonstrates MochiKit.DOM and MochiKit.Async +in order to provide a live regular expression matching tool
    • +
    • Added advanced number formatting capabilities to MochiKit.Format: +numberFormatter(pattern, placeholder="", locale="default") and +formatLocale(locale="default")
    • +
    • Added updatetree(self, obj[, ...]) to MochiKit.Base, and changed +MochiKit.DOM's updateNodeAttributes(node, attrs) to use it when appropiate.
    • +
    • Added new MochiKit.DOM createDOMFunc aliases: BUTTON, TT, PRE
    • +
    • Added truncToFixed(aNumber, precision) and roundToFixed(aNumber, precision) +to MochiKit.Format
    • +
    • MochiKit.DateTime can now handle full ISO 8601 timestamps, specifically +isoTimestamp(isoString) will convert them to Date objects, and +toISOTimestamp(date, true) will return an ISO 8601 timestamp in UTC
    • +
    • Fixed missing errback for sendXMLHttpRequest when the server does not +respond
    • +
    • Fixed infinite recusion bug when using roundClass("DIV", ...)
    • +
    • Fixed a bug in MochiKit.Async wait (and callLater) that prevented them +from being cancelled properly
    • +
    • Workaround in MochiKit.Base bind (and partial) for functions that don't +have an apply method, such as alert
    • +
    • Reliably return null from the string parsing/manipulation functions if +the input can't be coerced to a string (s + "") or the input makes no sense; +e.g. isoTimestamp(null) and isoTimestamp("") return null
    • +
    +

    2005-10-08 v0.90

    +
      +
    • Fixed ISO compliance with toISODate
    • +
    • Added missing operator.sub
    • +
    • Placated Mozilla's strict warnings a bit
    • +
    • Added JSON serialization and unserialization support to MochiKit.Base: +serializeJSON, evalJSON, registerJSON. This is very similar to the repr +API.
    • +
    • Fixed a bug in the script loader that failed in some scenarios when a script +tag did not have a "src" attribute (thanks Ian!)
    • +
    • Added new MochiKit.DOM createDOMFunc aliases: H1, H2, H3, BR, HR, TEXTAREA, +P, FORM
    • +
    • Use encodeURIComponent / decodeURIComponent for MochiKit.Base urlEncode +and parseQueryString, when available.
    • +
    +

    2005-08-12 v0.80

    +
      +
    • Source highlighting in all examples, moved to a view-source example
    • +
    • Added some experimental syntax highlighting for the Rounded Corners example, +via the LGPL dp.SyntaxHighlighter 1.2.0 now included in examples/common/lib
    • +
    • Use an indirect binding for the logger conveniences, so that the global +logger could be replaced by setting MochiKit.Logger.logger to something else +(though an observer is probably a better choice).
    • +
    • Allow MochiKit.DOM.getElementsByTagAndClassName to take a string for parent, +which will be looked up with getElement
    • +
    • Fixed bug in MochiKit.Color.fromBackground (was using node.parent instead of +node.parentNode)
    • +
    • Consider a 304 (NOT_MODIFIED) response from XMLHttpRequest to be success
    • +
    • Disabled Mozilla map(...) fast-path due to Deer Park compatibility issues
    • +
    • Possible workaround for Safari issue with swapDOM, where it would get +confused because two elements were in the DOM at the same time with the +same id
    • +
    • Added missing THEAD convenience function to MochiKit.DOM
    • +
    • Added lstrip, rstrip, strip to MochiKit.Format
    • +
    • Added updateNodeAttributes, appendChildNodes, replaceChildNodes to +MochiKit.DOM
    • +
    • MochiKit.Iter.iextend now has a fast-path for array-like objects
    • +
    • Added HSV color space support to MochiKit.Visual
    • +
    • Fixed a bug in the sortable_tables example, it now converts types +correctly
    • +
    • Fixed a bug where MochiKit.DOM referenced MochiKit.Iter.next from global +scope
    • +
    +

    2005-08-04 v0.70

    +
      +
    • New ajax_tables example, which shows off XMLHttpRequest, ajax, json, and +a little TAL-ish DOM templating attribute language.
    • +
    • sendXMLHttpRequest and functions that use it (loadJSONDoc, etc.) no longer +ignore requests with status == 0, which seems to happen for cached or local +requests
    • +
    • Added sendXMLHttpRequest to MochiKit.Async.EXPORT, d'oh.
    • +
    • Changed scrapeText API to return a string by default. This is API-breaking! +It was dumb to have the default return value be the form you almost never +want. Sorry.
    • +
    • Added special form to swapDOM(dest, src). If src is null, dest is removed +(where previously you'd likely get a DOM exception).
    • +
    • Added three new functions to MochiKit.Base for dealing with URL query +strings: urlEncode, queryString, parseQueryString
    • +
    • MochiKit.DOM.createDOM will now use attr[k] = v for all browsers if the name +starts with "on" (e.g. "onclick"). If v is a string, it will set it to +new Function(v).
    • +
    • Another workaround for Internet "worst browser ever" Explorer's setAttribute +usage in MochiKit.DOM.createDOM (checked -> defaultChecked).
    • +
    • Added UL, OL, LI convenience createDOM aliases to MochiKit.DOM
    • +
    • Packing is now done by Dojo's custom Rhino interpreter, so it's much smaller +now!
    • +
    +

    2005-07-29 v0.60

    +
      +
    • Beefed up the MochiKit.DOM test suite
    • +
    • Fixed return value for MochiKit.DOM.swapElementClass, could return +false unexpectedly before
    • +
    • Added an optional "parent" argument to +MochiKit.DOM.getElementsByTagAndClassName
    • +
    • Added a "packed" version in packed/MochiKit/MochiKit.js
    • +
    • Changed build script to rewrite the URLs in tests to account for the +JSAN-required reorganization
    • +
    • MochiKit.Compat to potentially work around IE 5.5 issues +(5.0 still not supported). Test.Simple doesn't seem to work there, +though.
    • +
    • Several minor documentation corrections
    • +
    +

    2005-07-27 v0.50

    +
      +
    • Initial Release
    • +
    +
    +
    +

    Copyright

    +

    Copyright 2005 Bob Ippolito <bob@redivi.com>. This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the MIT License or the Academic Free License +v2.1.

    +
    +
    + + + diff --git a/mochikit_v14/doc/js/toc.js b/mochikit_v14/doc/js/toc.js new file mode 100644 index 0000000..46b0fc8 --- /dev/null +++ b/mochikit_v14/doc/js/toc.js @@ -0,0 +1,113 @@ +function function_ref(fn) { + return A({"href": fn[1], "class": "mochiref reference"}, fn[0], BR()); +}; + +function toggle_docs() { + toggleElementClass("invisible", "show_index", "function_index"); + return false; +}; + +function create_toc() { + if (getElement("distribution")) { + return global_index(); + } + if (getElement("api-reference")) { + return module_index(); + } +}; + +function doXHTMLRequest(url) { + var d = doXHR(url, {mimeType: 'text/xml'}); + return d.addCallback(function (res) { + if (res.responseXML.documentElement) { + return res.responseXML.documentElement; + } else { + var container = document.createElement('div'); + container.innerHTML = res.responseText; + return container; + } + }); +}; + +function load_request(href, div, doc) { + var functions = withDocument(doc, spider_doc); + forEach(functions, function (func) { + // fix anchors + if (func[1].charAt(0) == "#") { + func[1] = href + func[1]; + } else if (func[1].lastIndexOf("#") != -1) { + func[1] = href + "#" + func[1].split("#")[1]; + } + }); + var showLink = A({"class": "force-pointer"}, "[+]"); + var hideLink = A({"class": "force-pointer"}, "[\u2013]"); + var functionIndex = DIV({"id": "function_index", "class": "invisible"}, + hideLink, + P(null, map(function_ref, functions)) + ); + var toggleFunc = function (e) { + toggleElementClass("invisible", showLink, functionIndex); + }; + connect(showLink, "onclick", toggleFunc); + connect(hideLink, "onclick", toggleFunc); + replaceChildNodes(div, + showLink, + functionIndex + ); + return [showLink, toggleFunc]; +}; + +function global_index() { + var distList = getElementsByTagAndClassName("ul")[0]; + var bullets = getElementsByTagAndClassName("li", null, distList); + var lst = []; + for (var i = 0; i < bullets.length; i++) { + var tag = bullets[i]; + var firstLink = getElementsByTagAndClassName("a", "mochiref", tag)[0]; + var href = getNodeAttribute(firstLink, "href"); + var div = DIV(null, "[\u2026]"); + appendChildNodes(tag, BR(), div); + lst.push(doXHTMLRequest(href).addCallback(load_request, href, div)); + } + + var loadingNode = DIV(null, "[loading index\u2026]"); + distList.parentNode.insertBefore(P(null, loadingNode), distList); + + var dl = gatherResults(lst).addCallback(function (res) { + var toggleFunc = function (e) { + for (var i = 0; i < res.length; i++) { + var item = res[i]; + if (!hasElementClass(item[0], "invisible")) { + item[1](); + } + } + }; + var node = A({"class": "force-pointer"}, "[click to expand all]"); + swapDOM(loadingNode, node); + connect(node, "onclick", toggleFunc); + }); +}; + +function spider_doc() { + return map( + function (tag) { + return [scrapeText(tag), getNodeAttribute(tag, "href")]; + }, + getElementsByTagAndClassName("a", "mochidef") + ); +}; + +function module_index() { + var sections = getElementsByTagAndClassName("div", "section"); + var ptr = sections[1]; + var ref = DIV({"class": "section"}, + H1(null, "Function Index"), + A({"id": "show_index", "href": "#", "onclick": toggle_docs}, "[show]"), + DIV({"id": "function_index", "class": "invisible"}, + A({"href":"#", "onclick": toggle_docs}, "[hide]"), + P(null, map(function_ref, spider_doc())))); + ptr.parentNode.insertBefore(ref, ptr); +}; + +connect(window, 'onload', create_toc); + diff --git a/mochikit_v14/doc/rst/MochiKit/Async.rst b/mochikit_v14/doc/rst/MochiKit/Async.rst new file mode 100755 index 0000000..d1f7b94 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Async.rst @@ -0,0 +1,735 @@ +.. title:: MochiKit.Async - manage asynchronous tasks + +Name +==== + +MochiKit.Async - manage asynchronous tasks + + +Synopsis +======== + +:: + + var url = "/src/b/bo/bob/MochiKit.Async/META.json"; + /* + + META.json looks something like this: + + {"name": "MochiKit", "version": "0.5"} + + */ + var d = loadJSONDoc(url); + var gotMetadata = function (meta) { + if (MochiKit.Async.VERSION == meta.version) { + alert("You have the newest MochiKit.Async!"); + } else { + alert("MochiKit.Async " + + meta.version + + " is available, upgrade!"); + } + }; + var metadataFetchFailed = function (err) { + alert("The metadata for MochiKit.Async could not be fetched :("); + }; + d.addCallbacks(gotMetadata, metadataFetchFailed); + + +Description +=========== + +MochiKit.Async provides facilities to manage asynchronous (as in AJAX +[1]_) tasks. The model for asynchronous computation used in this +module is heavily inspired by Twisted [2]_. + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` + + +Overview +======== + +Deferred +-------- + +The Deferred constructor encapsulates a single value that is not +available yet. The most important example of this in the context of a +web browser would be an ``XMLHttpRequest`` to a server. The importance +of the Deferred is that it allows a consistent API to be exposed for +all asynchronous computations that occur exactly once. + +The producer of the Deferred is responsible for doing all of the +complicated work behind the scenes. This often means waiting for a +timer to fire, or waiting for an event (e.g. ``onreadystatechange`` of +``XMLHttpRequest``). It could also be coordinating several events +(e.g. ``XMLHttpRequest`` with a timeout, or several Deferreds +(e.g. fetching a set of XML documents that should be processed at the +same time). + +Since these sorts of tasks do not respond immediately, the producer of +the Deferred does the following steps before returning to the +consumer: + +1. Create a ``new`` :mochiref:`Deferred();` object and keep a + reference to it, because it will be needed later when the value is + ready. +2. Setup the conditions to create the value requested (e.g. create a + new ``XMLHttpRequest``, set its ``onreadystatechange``). +3. Return the :mochiref:`Deferred` object. + +Since the value is not yet ready, the consumer attaches a function to +the Deferred that will be called when the value is ready. This is not +unlike ``setTimeout``, or other similar facilities you may already be +familiar with. The consumer can also attach an "errback" to the +:mochiref:`Deferred`, which is a callback for error handling. + +When the value is ready, the producer simply calls +``myDeferred.callback(theValue)``. If an error occurred, it should +call ``myDeferred.errback(theValue)`` instead. As soon as this +happens, the callback that the consumer attached to the +:mochiref:`Deferred` is called with ``theValue`` as the only argument. + +There are quite a few additional "advanced" features baked into +:mochiref:`Deferred`, such as cancellation and callback chains, so +take a look at the API reference if you would like to know more! + +API Reference +============= + +Errors +------ + +:mochidef:`AlreadyCalledError`: + + Thrown by a :mochiref:`Deferred` if ``.callback`` or ``.errback`` + are called more than once. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`BrowserComplianceError`: + + Thrown when the JavaScript runtime is not capable of performing + the given function. Currently, this happens if the browser does + not support ``XMLHttpRequest``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`CancelledError`: + + Thrown by a :mochiref:`Deferred` when it is cancelled, unless a + canceller is present and throws something else. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`GenericError`: + + Results passed to ``.fail`` or ``.errback`` of a + :mochiref:`Deferred` are wrapped by this ``Error`` if ``!(result + instanceof Error)``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`XMLHttpRequestError`: + + Thrown when an ``XMLHttpRequest`` does not complete successfully + for any reason. The ``req`` property of the error is the failed + ``XMLHttpRequest`` object, and for convenience the ``number`` + property corresponds to ``req.status``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +Constructors +------------ + +:mochidef:`Deferred()`: + + Encapsulates a sequence of callbacks in response to a value that + may not yet be available. This is modeled after the Deferred class + from Twisted [3]_. + +.. _`Twisted`: http://twistedmatrix.com/ + + Why do we want this? JavaScript has no threads, and even if it + did, threads are hard. Deferreds are a way of abstracting + non-blocking events, such as the final response to an + ``XMLHttpRequest``. + + The sequence of callbacks is internally represented as a list of + 2-tuples containing the callback/errback pair. For example, the + following call sequence:: + + var d = new Deferred(); + d.addCallback(myCallback); + d.addErrback(myErrback); + d.addBoth(myBoth); + d.addCallbacks(myCallback, myErrback); + + is translated into a :mochiref:`Deferred` with the following + internal representation:: + + [ + [myCallback, null], + [null, myErrback], + [myBoth, myBoth], + [myCallback, myErrback] + ] + + The :mochiref:`Deferred` also keeps track of its current status + (fired). Its status may be one of the following three values: + + + ===== ================================ + Value Condition + ===== ================================ + -1 no value yet (initial condition) + 0 success + 1 error + ===== ================================ + + A :mochiref:`Deferred` will be in the error state if one of the + following conditions are met: + + 1. The result given to callback or errback is "``instanceof + Error``" + 2. The callback or errback threw while executing. If the thrown + object is not ``instanceof Error``, it will be wrapped with + :mochiref:`GenericError`. + + Otherwise, the :mochiref:`Deferred` will be in the success + state. The state of the :mochiref:`Deferred` determines the next + element in the callback sequence to run. + + When a callback or errback occurs with the example deferred chain, + something equivalent to the following will happen (imagine that + exceptions are caught and returned as-is):: + + // d.callback(result) or d.errback(result) + if (!(result instanceof Error)) { + result = myCallback(result); + } + if (result instanceof Error) { + result = myErrback(result); + } + result = myBoth(result); + if (result instanceof Error) { + result = myErrback(result); + } else { + result = myCallback(result); + } + + The result is then stored away in case another step is added to + the callback sequence. Since the :mochiref:`Deferred` already has + a value available, any new callbacks added will be called + immediately. + + There are two other "advanced" details about this implementation + that are useful: + + Callbacks are allowed to return :mochiref:`Deferred` instances, so + you can build complicated sequences of events with (relative) + ease. + + The creator of the :mochiref:`Deferred` may specify a + canceller. The canceller is a function that will be called if + :mochiref:`Deferred.prototype.cancel` is called before the + :mochiref:`Deferred` fires. You can use this to allow an + ``XMLHttpRequest`` to be cleanly cancelled, for example. Note that + cancel will fire the :mochiref:`Deferred` with a + :mochiref:`CancelledError` (unless your canceller throws or + returns a different ``Error``), so errbacks should be prepared to + handle that ``Error`` gracefully for cancellable + :mochiref:`Deferred` instances. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Deferred.prototype.addBoth(func)`: + + Add the same function as both a callback and an errback as the + next element on the callback sequence. This is useful for code + that you want to guarantee to run, e.g. a finalizer. + + If additional arguments are given, then ``func`` will be replaced + with :mochiref:`MochiKit.Base.partial.apply(null, + arguments)`. This differs from `Twisted`_, because the result of + the callback or errback will be the *last* argument passed to + ``func``. + + If ``func`` returns a :mochiref:`Deferred`, then it will be + chained (its value or error will be passed to the next + callback). Note that once the returned ``Deferred`` is chained, it + can no longer accept new callbacks. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Deferred.prototype.addCallback(func[, ...])`: + + Add a single callback to the end of the callback sequence. + + If additional arguments are given, then ``func`` will be replaced + with :mochiref:`MochiKit.Base.partial.apply(null, + arguments)`. This differs from `Twisted`_, because the result of + the callback will be the *last* argument passed to ``func``. + + If ``func`` returns a :mochiref:`Deferred`, then it will be + chained (its value or error will be passed to the next + callback). Note that once the returned ``Deferred`` is chained, it + can no longer accept new callbacks. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Deferred.prototype.addCallbacks(callback, errback)`: + + Add separate callback and errback to the end of the callback + sequence. Either callback or errback may be ``null``, but not + both. + + If ``callback`` or ``errback`` returns a :mochiref:`Deferred`, + then it will be chained (its value or error will be passed to the + next callback). Note that once the returned ``Deferred`` is + chained, it can no longer accept new callbacks. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Deferred.prototype.addErrback(func)`: + + Add a single errback to the end of the callback sequence. + + If additional arguments are given, then ``func`` will be replaced + with :mochiref:`MochiKit.Base.partial.apply(null, + arguments)`. This differs from `Twisted`_, because the result of + the errback will be the *last* argument passed to ``func``. + + If ``func`` returns a :mochiref:`Deferred`, then it will be + chained (its value or error will be passed to the next + callback). Note that once the returned ``Deferred`` is chained, it + can no longer accept new callbacks. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Deferred.prototype.callback([result])`: + + Begin the callback sequence with a non-``Error`` result. Result + may be any value except for a :mochiref:`Deferred`. + + Either ``.callback`` or ``.errback`` should be called exactly once + on a :mochiref:`Deferred`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Deferred.prototype.cancel()`: + + Cancels a :mochiref:`Deferred` that has not yet received a value, + or is waiting on another :mochiref:`Deferred` as its value. + + If a canceller is defined, the canceller is called. If the + canceller did not return an ``Error``, or there was no canceller, + then the errback chain is started with :mochiref:`CancelledError`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Deferred.prototype.errback([result])`: + + Begin the callback sequence with an error result. Result may be + any value except for a :mochiref:`Deferred`, but if ``!(result + instanceof Error)``, it will be wrapped with + :mochiref:`GenericError`. + + Either ``.callback`` or ``.errback`` should be called exactly once + on a :mochidef:`Deferred`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`DeferredLock()`: + + A lock for asynchronous systems. + + The ``locked`` property of a :mochiref:`DeferredLock` will be + ``true`` if it locked, ``false`` otherwise. Do not change this + property. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`DeferredLock.prototype.acquire()`: + + Attempt to acquire the lock. Returns a :mochiref:`Deferred` that + fires on lock acquisition with the :mochiref:`DeferredLock` as the + value. If the lock is locked, then the :mochiref:`Deferred` goes + into a waiting list. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`DeferredLock.prototype.release()`: + + Release the lock. If there is a waiting list, then the first + :mochiref:`Deferred` in that waiting list will be called back. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`DeferredList(list, [fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller])`: + + Combine a list of :mochiref:`Deferred` into one. Track the + callbacks and return a list of (success, result) tuples, 'success' + being a boolean indicating whether result is a normal result or an + error. + + Once created, you have access to all :mochiref:`Deferred` methods, + like addCallback, addErrback, addBoth. The behaviour can be + changed by the following options: + + ``fireOnOneCallback``: + Flag for launching the callback once the first Deferred of the + list has returned. + + ``fireOnOneErrback``: + Flag for calling the errback at the first error of a Deferred. + + ``consumeErrors``: + Flag indicating that any errors raised in the Deferreds should + be consumed by the DeferredList. + + Example:: + + // We need to fetch data from 2 different urls + var d1 = loadJSONDoc(url1); + var d2 = loadJSONDoc(url2); + var l1 = new DeferredList([d1, d2], false, false, true); + l1.addCallback(function (resultList) { + MochiKit.Base.map(function (result) { + if (result[0]) { + alert("Data is here: " + result[1]); + } else { + alert("Got an error: " + result[1]); + } + }, resultList); + }); + + *Availability*: + Available in MochiKit 1.3.1+ + + +Functions +--------- + +:mochidef:`callLater(seconds, func[, args...])`: + + Call ``func(args...)`` after at least ``seconds`` seconds have + elapsed. This is a convenience method for:: + + func = partial.apply(extend(null, arguments, 1)); + return wait(seconds).addCallback(function (res) { return func() }); + + Returns a cancellable :mochiref:`Deferred`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`doXHR(url[, {option: value, ...}])`: + + Perform a customized ``XMLHttpRequest`` and wrap it with a + :mochiref:`Deferred` that may be cancelled. + + Note that only ``200`` (OK), ``201`` (CREATED), + ``204`` (NO CONTENT) and ``304`` (NOT MODIFIED) are considered + success codes. All other status codes will + result in an errback with an ``XMLHttpRequestError``. + + ``url``: + The URL for this request. + + The following options are currently accepted: + + ``method``: + The HTTP method. Default is ``'GET'``. + + ``sendContent``: + The content to send (e.g. with POST). Default is no content. + + ``queryString``: + If present it will be used to build a query string to append to + the url using :mochiref:`MochiKit.Base.queryString`. Default is + no query string. + + ``username``: + The username for the request. Default is no username. + + ``password``: + The password for the request. Default is no password. + + ``headers``: + Additional headers to set in the request, either as an object + such as ``{'Accept': 'text/xml'}`` or as an Array of 2-Arrays + ``[['Accept', 'text/xml']]``. Default is no additional headers. + + ``mimeType``: + An override mime type. The typical use of this is to pass + 'text/xml' to force XMLHttpRequest to attempt to parse responseXML. + Default is no override. + + *returns*: + :mochiref:`Deferred` that will callback with the + ``XMLHttpRequest`` instance on success + + *Availability*: + Available in MochiKit 1.4+. + + +:mochidef:`doSimpleXMLHttpRequest(url[, queryArguments...])`: + + Perform a simple ``XMLHttpRequest`` and wrap it with a + :mochiref:`Deferred` that may be cancelled. + + Note that only ``200`` (OK), ``201`` (CREATED), + ``204`` (NO CONTENT) and ``304`` (NOT MODIFIED) are considered + success codes. All other status codes will + result in an errback with an ``XMLHttpRequestError``. + + ``url``: + The URL to GET + + ``queryArguments``: + If this function is called with more than one argument, a + ``"?"`` and the result of + :mochiref:`MochiKit.Base.queryString` with the rest of the + arguments are appended to the URL. + + For example, this will do a GET request to the URL + ``http://example.com?bar=baz``:: + + doSimpleXMLHttpRequest("http://example.com", {bar: "baz"}); + + *returns*: + :mochiref:`Deferred` that will callback with the + ``XMLHttpRequest`` instance on success + + *Availability*: + Available in MochiKit 1.3.1+. Support for 201 and 204 were added in + MochiKit 1.4. + + +:mochidef:`evalJSONRequest(req)`: + + Evaluate a JSON [4]_ ``XMLHttpRequest`` + + ``req``: + The request whose ``.responseText`` property is to be + evaluated + + *returns*: + A JavaScript object + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`fail([result])`: + + Return a :mochiref:`Deferred` that has already had + ``.errback(result)`` called. + + See ``succeed`` documentation for rationale. + + ``result``: + The result to give to + :mochiref:`Deferred.prototype.errback(result)`. + + *returns*: + A ``new`` :mochiref:`Deferred()` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`gatherResults(deferreds)`: + + A convenience function that returns a :mochiref:`DeferredList` + from the given ``Array`` of :mochiref:`Deferred` instances that + will callback with an ``Array`` of just results when they're + available, or errback on the first array. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`getXMLHttpRequest()`: + + Return an ``XMLHttpRequest`` compliant object for the current + platform. + + In order of preference: + + - ``new XMLHttpRequest()`` + - ``new ActiveXObject('Msxml2.XMLHTTP')`` + - ``new ActiveXObject('Microsoft.XMLHTTP')`` + - ``new ActiveXObject('Msxml2.XMLHTTP.4.0')`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`maybeDeferred(func[, argument...])`: + + Call a ``func`` with the given arguments and ensure the result is + a :mochiref:`Deferred`. + + ``func``: + The function to call. + + *returns*: + A new :mochiref:`Deferred` based on the call to ``func``. If + ``func`` does not naturally return a :mochiref:`Deferred`, its + result or error value will be wrapped by one. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`loadJSONDoc(url[, queryArguments...])`: + + Do a simple ``XMLHttpRequest`` to a URL and get the response as a + JSON [4]_ document. + + ``url``: + The URL to GET + + ``queryArguments``: + If this function is called with more than one argument, a + ``"?"`` and the result of + :mochiref:`MochiKit.Base.queryString` with the rest of the + arguments are appended to the URL. + + For example, this will do a GET request to the URL + ``http://example.com?bar=baz``:: + + loadJSONDoc("http://example.com", {bar: "baz"}); + + *returns*: + :mochiref:`Deferred` that will callback with the evaluated + JSON [4]_ response upon successful ``XMLHttpRequest`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`sendXMLHttpRequest(req[, sendContent])`: + + Set an ``onreadystatechange`` handler on an ``XMLHttpRequest`` + object and send it off. Will return a cancellable + :mochiref:`Deferred` that will callback on success. + + Note that only ``200`` (OK), ``201`` (CREATED), + ``204`` (NO CONTENT) and ``304`` (NOT MODIFIED) are considered + success codes. All other status codes will + result in an errback with an ``XMLHttpRequestError``. + + ``req``: + An preconfigured ``XMLHttpRequest`` object (open has been + called). + + ``sendContent``: + Optional string or DOM content to send over the + ``XMLHttpRequest``. + + *returns*: + :mochiref:`Deferred` that will callback with the + ``XMLHttpRequest`` instance on success. + + *Availability*: + Available in MochiKit 1.3.1+. Support for 201 and 204 were added in + MochiKit 1.4. + + +:mochidef:`succeed([result])`: + + Return a :mochiref:`Deferred` that has already had + ``.callback(result)`` called. + + This is useful when you're writing synchronous code to an + asynchronous interface: i.e., some code is calling you expecting a + :mochiref:`Deferred` result, but you don't actually need to do + anything asynchronous. Just return ``succeed(theResult)``. + + See ``fail`` for a version of this function that uses a failing + :mochiref:`Deferred` rather than a successful one. + + ``result``: + The result to give to + :mochiref:`Deferred.prototype.callback(result)` + + *returns*: + a ``new`` :mochiref:`Deferred` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`wait(seconds[, res])`: + + Return a new cancellable :mochiref:`Deferred` that will + ``.callback(res)`` after at least ``seconds`` seconds have + elapsed. + + *Availability*: + Available in MochiKit 1.3.1+ + + +See Also +======== + +.. [1] AJAX, Asynchronous JavaScript and XML: http://en.wikipedia.org/wiki/AJAX +.. [2] Twisted, an event-driven networking framework written in Python: http://twistedmatrix.com/ +.. [3] Twisted Deferred Reference: http://twistedmatrix.com/projects/core/documentation/howto/defer.html +.. [4] JSON, JavaScript Object Notation: http://json.org/ + + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/Base.rst b/mochikit_v14/doc/rst/MochiKit/Base.rst new file mode 100755 index 0000000..4740ffd --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Base.rst @@ -0,0 +1,1416 @@ +.. title:: MochiKit.Base - functional programming and useful comparisons + +Name +==== + +MochiKit.Base - functional programming and useful comparisons + + +Synopsis +======== + +:: + + myObjectRepr = function () { + // gives a nice, stable string representation for objects, + // ignoring any methods + var keyValuePairs = []; + for (var k in this) { + var v = this[k]; + if (typeof(v) != 'function') { + keyValuePairs.push([k, v]); + } + }; + keyValuePairs.sort(compare); + return "{" + map( + function (pair) { + return map(repr, pair).join(":"); + }, + keyValuePairs + ).join(", ") + "}"; + }; + + // repr() will look for objects that have a repr method + myObjectArray = [ + {"a": 3, "b": 2, "repr": myObjectRepr}, + {"a": 1, "b": 2, "repr": myObjectRepr} + ]; + + // sort it by the "a" property, check to see if it matches + myObjectArray.sort(keyComparator("a")); + expectedRepr = '[{"a": 1, "b": 2}, {"a": 3, "b": 2}]'; + assert( repr(myObjectArray) == expectedRepr ); + + // get just the "a" values out into an array + sortedAValues = map(itemgetter("a"), myObjectArray); + assert( compare(sortedAValues, [1, 3]) == 0 ); + + // serialize an array as JSON, unserialize it, expect something equivalent + myArray = [1, 2, "3", null, undefined]; + assert( objEqual(evalJSON(serializeJSON(myArray)), myArray) ); + + +Description +=========== + +:mochiref:`MochiKit.Base` is the foundation for the MochiKit suite. +It provides: + +- An extensible comparison facility + (:mochiref:`compare`, :mochiref:`registerComparator`) +- An extensible programmer representation facility + (:mochiref:`repr`, :mochiref:`registerRepr`) +- An extensible JSON [1]_ serialization and evaluation facility + (:mochiref:`serializeJSON`, :mochiref:`evalJSON`, + :mochiref:`registerJSON`) +- A simple adaptation facility (:mochiref:`AdapterRegistry`) +- Convenience functions for manipulating objects and Arrays + (:mochiref:`update`, :mochiref:`setdefault`, :mochiref:`extend`, etc.) +- Array-based functional programming + (:mochiref:`map`, :mochiref:`filter`, etc.) +- Bound and partially applied functions + (:mochiref:`bind`, :mochiref:`method`, :mochiref:`partial`) + +Python users will feel at home with :mochiref:`MochiKit.Base`, as the +facilities are quite similar to those available as part of Python and +the Python standard library. + + +Dependencies +============ + +None. + + +Overview +======== + +Comparison +---------- + +The comparators (operators for comparison) in JavaScript are deeply +broken, and it is not possible to teach them new tricks. + +MochiKit exposes an extensible comparison facility as a simple +:mochiref:`compare(a, b)` function, which should be used in lieu of +JavaScript's operators whenever comparing objects other than numbers +or strings (though you can certainly use :mochiref:`compare` for +those, too!). + +The :mochiref:`compare` function has the same signature and return +value as a sort function for ``Array.prototype.sort``, and is often +used in that context. + +Defining new comparators for the :mochiref:`compare` function to use +is done by adding an entry to its :mochiref:`AdapterRegistry` with the +:mochiref:`registerComparator` function. + + +Programmer Representation +------------------------- + +JavaScript's default representation mechanism, ``toString``, is +notorious for having terrible default behavior. It's also very unwise +to change that default, as other JavaScript code you may be using may +depend on it. + +It's also useful to separate the concept of a "string representation" +and a "string representation for programmers", much like Python does +with its str and repr protocols. + +:mochiref:`repr` provides this programmer representation for +JavaScript, in a way that doesn't require object prototype hacking: +using an :mochiref:`AdapterRegistry`. + +Objects that implement the repr protocol can either implement a +``.repr()`` or ``.__repr__()`` method, or they can simply have an +adapter setup to generate programmer representations. By default, the +registry provides nice representations for ``null``, ``undefined``, +``Array``, and objects or functions with a ``NAME`` attribute that use +the default ``toString``. For objects that ``repr`` doesn't already +understand, it simply defaults to ``toString``, so it will integrate +seamlessly with code that implements the idiomatic JavaScript +``toString`` method! + +To define a programmer representation for your own objects, simply add +a ``.repr()`` or ``.__repr__()`` method that returns a string. For +objects that you didn't create (e.g., from a script you didn't write, +or a built-in object), it is instead recommended that you create an +adapter with :mochiref:`registerRepr`. + + +JSON Serialization +------------------ + +JSON [1]_, JavaScript Object Notation, is a widely used serialization +format in the context of web development. It's extremely simple, +lightweight, and fast. In its essence, JSON is a restricted subset of +JavaScript syntax suitable for sending over the wire that can be +unserialized with a simple eval. It's often used as an alternative to +XML in "AJAX" contexts because it is compact, fast, and much simpler +to use for most purposes. + +To create a JSON serialization of any object, simply call +:mochiref:`serializeJSON()` with that object. To unserialize a JSON +string, simply call :mochiref:`evalJSON()` with the serialization. + +In order of precedence, :mochiref:`serializeJSON` coerces the given +argument into a JSON serialization: + +1. Primitive types are returned as their JSON representation: + ``string``, ``number``, ``boolean``, ``null``. +2. If the object has a ``__json__`` or ``json`` method, then it is + called with no arguments. If the result of this method is not the + object itself, then the new object goes through rule processing + again (e.g. it may return a string, which is then serialized in + JSON format). +3. If the object is ``Array``-like (has a ``length`` property that is + a number, and is not a function), then it is serialized as a JSON + array. Each element will be processed according to these rules in + order. Elements that can not be serialized (e.g. functions) will + be replaced with ``undefined``. +4. The ``jsonRegistry`` :mochiref:`AdapterRegistry` is consulted for + an adapter for this object. JSON adapters take one argument (the + object), and are expected to behave like a ``__json__`` or + ``json`` method (return another object to be serialized, or + itself). +5. If the object is ``undefined``, a ``TypeError`` is thrown. If you + wish to serialize ``undefined`` as ``null`` or some other value, you + should create an adapter to do so. +6. If no adapter is available, the object is enumerated and + serialized as a JSON object (name:value pairs). All names are + expected to be strings. Each value is serialized according to + these rules, and if it can not be serialized (e.g. methods), then + that name:value pair will be skipped. + + +Adapter Registries +------------------ + +MochiKit makes extensive use of adapter registries, which enable you +to implement object-specific behaviors for objects that you do not +necessarily want to modify, such as built-in objects. This is +especially useful because JavaScript does not provide a method for +hiding user-defined properties from ``for propName in obj`` +enumeration. + +:mochiref:`AdapterRegistry` is simply an encapsulation for an ordered +list of "check" and "wrap" function pairs. Each +:mochiref:`AdapterRegistry` instance should perform one function, but +may have multiple ways to achieve that function based upon the +arguments. One way to think of it is as a poor man's generic function, +or multiple dispatch (on arbitrary functions, not just type!). + +Check functions take one or more arguments, and return ``true`` if the +argument list is suitable for the wrap function. Check functions +should perform "cheap" checks of an object's type or contents, before +the "expensive" wrap function is called. + +Wrap functions take the same arguments as check functions and do some +operation, such as creating a programmer representation or comparing +both arguments. + + +Convenience Functions +--------------------- + +Much of :mochiref:`MochiKit.Base` is there to simply remove the grunt +work of doing generic JavaScript programming. + +Need to take every property from one object and set them on another? +No problem, just call :mochiref:`update(dest, src)`! What if you just +wanted to update keys that weren't already set? Look no further than +:mochiref:`setdefault(dest, src[, ...])`. + +Want to return a mutable object, but don't want to suffer the +consequences if the user mutates it? Just :mochiref:`clone(it)` and +you'll get a copy-on-write clone. Cheaper than a copy! + +Need to extend an ``Array`` with another array? Or even an +``Array``-like object such as a ``NodeList`` or the special +``arguments`` object? Even if you need to skip the first few elements +of the source ``Array``-like object, it's no problem with +:mochiref:`extend(dstArray, srcArrayLike[, skip])`! + +Wouldn't it be convenient to have all of the JavaScript operators were +available as functions somewhere? That's what the +:mochiref:`operators` table is for, and it even comes with additional +operators based on the :mochiref:`compare` function. + +Need to walk some tree of objects and manipulate or find something in +it? A DOM element tree perhaps? Use :mochiref:`nodeWalk(node, +visitor)`! + +There's plenty more, so check out the `API Reference`_ below. + + +Functional Programming +---------------------- + +Functional programming constructs such as :mochiref:`map` and +:mochiref:`filter` can save you a lot of time, because JavaScript +iteration is error-prone and arduous. Writing less code is the best +way to prevent bugs, and functional programming can help you do that. + +:mochiref:`MochiKit.Base` ships with a few simple Array-based +functional programming constructs, namely :mochiref:`map` and +:mochiref:`filter`, and their "extended" brethren, :mochiref:`xmap` +and :mochiref:`xfilter`. + +:mochiref:`map(func, arrayLike[, ...])` takes a function and an +``Array``-like object, and creates a new ``Array``. The new ``Array`` +is the result of ``func(element)`` for every element of ``arrayLike``, +much like the ``Array.prototype.map`` extension in Mozilla. However, +:mochiref:`MochiKit.Base` takes that a step further and gives you the +full blown Python version of :mochiref:`map`, which will take several +``Array``-like objects, and calls the function with one argument per +given ``Array``-like, e.g.:: + + var arrayOne = [1, 2, 3, 4, 5]; + var arrayTwo = [1, 5, 2, 4, 3]; + var arrayThree = [5, 2, 1, 3, 4]; + var biggestElements = map(objMax, arrayOne, arrayTwo, arrayThree); + assert( objEqual(biggestElements, [5, 5, 3, 4, 5]) ); + +:mochiref:`filter(func, arrayLike[, self])` takes a function and an +``Array``-like object, and returns a new ``Array``. This is basically +identical to the ``Array.prototype.filter`` extension in +Mozilla. self, if given, will be used as ``this`` in the context of +func when called. + +:mochiref:`xmap` and :mochiref:`xfilter` are just special forms of +:mochiref:`map` and :mochiref:`filter` that accept a function as the +first argument, and use the extra arguments as the ``Array``-like. Not +terribly interesting, but a definite time-saver in some cases. + +If you appreciate the functional programming facilities here, you +should definitely check out :mochiref:`MochiKit.Iter`, which provides +full blown iterators, :mochiref:`MochiKit.Iter.range`, +:mochiref:`MochiKit.Iter.reduce`, and a near-complete port of Python's +itertools [2]_ module, with some extra stuff thrown in for good +measure! + + +Bound and Partial Functions +--------------------------- + +JavaScript's method-calling special form and lack of bound functions +(functions that know what ``this`` should be) are one of the first +stumbling blocks that programmers new to JavaScript face. The +:mochiref:`bind(func, self)` method fixes that right up by returning a +new function that calls func with the right ``this``. + +In order to take real advantage of all this fancy functional +programming stuff, you're probably going to want partial +application. This allows you to create a new function from an existing +function that remembers some of the arguments. For example, if you +wanted to compare a given object to a slew of other objects, you could +do something like this:: + + compareWithOne = partial(compare, 1); + results = map(compareWithOne, [0, 1, 2, 3]); + assert( objEqual(results, [-1, 0, 1, 1]) ); + +One of the better uses of partial functions is in +:mochiref:`MochiKit.DOM`, which is certainly a must-see for those of +you creating lots of DOM elements with JavaScript! + + +API Reference +============= + +Errors +------ + +:mochidef:`NotFound`: + + A singleton error raised when no suitable adapter is found + + *Availability*: + Available in MochiKit 1.3.1+ + + +Constructors +------------ + +:mochidef:`AdapterRegistry`: + + A registry to facilitate adaptation. + + All ``check``/``wrap`` function pairs in a given registry should + take the same number of arguments. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`AdapterRegistry.prototype.register(name, check, wrap[, override])`: + + ``name``: + a unique identifier used to identify this adapter so that it + may be unregistered. + + ``check``: + function that should return ``true`` if the given arguments + are appropriate for the ``wrap`` function. + + ``wrap``: + function that takes the same parameters as ``check`` and does + the adaptation. Every ``wrap``/``check`` function pair in the + registry should have the same number of arguments. + + ``override``: + if ``true``, the ``check`` function will be + given highest priority. Otherwise, the lowest. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`AdapterRegistry.prototype.match(obj[, ...])`: + + Find an adapter for the given arguments by calling every ``check`` + function until one returns ``true``. + + If no suitable adapter is found, throws :mochiref:`NotFound`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`AdapterRegistry.prototype.unregister(name)`: + + Remove a named adapter from the registry + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`NamedError`: + + Convenience constructor for creating new errors + (e.g. :mochiref:`NotFound`) + + *Availability*: + Available in MochiKit 1.3.1+ + + +Functions +--------- + +:mochidef:`arrayEqual(self, arr)`: + + Compare the arrays ``self`` and ``arr`` for equality using + ``compare`` on each element. Uses a fast-path for length + differences. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`average(lst[, ...])`: + + This function is an alias of :mochiref:`mean()`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`bind(func, self[, arg, ...])`: + + Return a copy of ``func`` bound to ``self``. This means whenever + and however the returned function is called, ``this`` will always + reference the given ``self``. ``func`` may be either a function + object, or a string. If it is a string, then ``self[func]`` will + be used, making these two statements equivalent:: + + bind("method", self); + bind(self.method, self); + + Calling :mochiref:`bind(func, self)` on an already bound function + will return a new function that is bound to the new ``self``! If + ``self`` is ``undefined``, then the previous ``self`` is used. If + ``self`` is ``null``, then the ``this`` object is used (which may + or may not be the global object). To force binding to the global + object, you should pass it explicitly. + + Additional arguments, if given, will be partially applied to the + function. These three expressions are equivalent and return + equally efficient functions (:mochiref:`bind` and + :mochiref:`partial` share the same code path): + + - :mochiref:`bind(oldfunc, self, arg1, arg2)` + - :mochiref:`bind(partial(oldfunc, arg1, arg2), self)` + - :mochiref:`partial(bind(oldfunc, self), arg1, arg2)` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`bindMethods(self)`: + + Replace all functions ``meth`` on ``self`` with + :mochiref:`bind(meth, self)`. This emulates Python's bound + instance methods, where there is no need to worry about preserving + ``this`` when the method is used as a callback. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`camelize(str)`: + + Converts hyphenated strings to camelCase:: + + assert( camelize("border-left") == "borderLeft" ); + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`clone(obj)`: + + Return a new object using ``obj`` as its prototype. Use this if + you want to return a mutable object (e.g. instance state), but + don't want the user to mutate it. If they do, it won't have any + effect on the original ``obj``. + + Note that this is a shallow clone, so mutable properties will have + to be cloned separately if you want to "protect" them. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`compare(a, b)`: + + Compare two objects in a sensible manner. Currently this is: + + 1. ``undefined`` and ``null`` compare equal to each other + 2. ``undefined`` and ``null`` are less than anything else + 3. If JavaScript says ``a == b``, then we trust it + 4. comparators registered with registerComparator are used to + find a good comparator. Built-in comparators are currently + available for ``Array``-like and ``Date``-like objects. + 5. Otherwise hope that the built-in comparison operators do + something useful, which should work for numbers and strings. + 6. If neither ``a < b`` or ``a > b``, then throw a ``TypeError`` + + Returns what one would expect from a comparison function: + + +-----------+---------------+ + | Value | Condition | + +-----------+---------------+ + | ``0`` | ``a == b`` | + +-----------+---------------+ + | ``1`` | ``a > b`` | + +-----------+---------------+ + | ``-1`` | ``a < b`` | + +-----------+---------------+ + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`compose(f1, f2, ..., fN)`: + + Return a new function as the combination of the given function + arguments, equivalent to ``f1(f2(arguments))``. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`concat(lst[, ...])`: + + Concatenates all given ``Array``-like arguments and returns + a new ``Array``:: + + var lst = concat(["1","3","5"], ["2","4","6"]); + assert( lst.toString() == "1,3,5,2,4,6" ); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`counter(n=1)`: + + Returns a function that will return a number one greater than + the previous returned value, starting at ``n``. For example:: + + nextId = counter() + assert( nextId() == 1 ) + assert( nextId() == 2 ) + + For an iterator with this behavior, see + :mochiref:`MochiKit.Iter.count`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`extend(self, obj, skip=0)`: + + Mutate the array ``self`` by extending it with an ``Array``-like + ``obj``, starting from index ``skip``. If ``null`` is given as the + initial array, a new one will be created. + + This mutates *and returns* ``self``, be warned. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`evalJSON(aJSONString)`: + + Unserialize a JSON [1]_ represenation of an object. + + Note that this uses the ``eval`` function of the interpreter, and + therefore trusts the contents of ``aJSONString`` to be safe. This + is acceptable when the JSON and JavaScript application originate + from the same server, but in other scenarios it may not be the + appropriate security model. Currently, a validating JSON parser is + beyond the scope of MochiKit, but there is one available from + json.org [1]_. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`filter(fn, lst)`: + + Returns a new ``Array`` composed of all elements from ``lst`` + where ``fn(lst[i])`` returns a true value. + + If ``fn`` is ``null``, ``operator.truth`` will be used. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`findValue(lst, value, start=0, end=lst.length)`: + + Finds the index of ``value`` in the ``Array``-like object ``lst`` + using :mochiref:`compare`. The search starts at the index + ``start``, and ends at the index ``end - 1``. If ``value`` is not + found in ``lst``, it will return ``-1``. + + For example:: + + assert( findValue([1, 2, 3, 2, 1], 2) == 1 ) + assert( findValue([1, 2, 3, 2, 1], 2, 2) == 3 ) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`findIdentical(lst, value, start=0, end=lst.length)`: + + Finds the index of ``value`` in the ``Array``-like object ``lst`` + using the ``===`` operator. The search starts at the index + ``start``, and ends at the index ``end - 1``. If ``value`` is not + found in ``lst``, it will return ``-1``. + + You should use this function instead of :mochiref:`findValue` if + ``lst`` may be comprised of objects for which no comparator is + defined and all you care about is finding an identical object + (e.g. the same instance), or if ``lst`` is comprised of just + numbers or strings and performance is important. + + For example:: + + assert( findIdentical([1, 2, 3, 2, 1], 2) == 1 ) + assert( findIdentical([1, 2, 3, 2, 1], 2, 2) == 3 ) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`flattenArguments(arg[, ...])`: + + Given a bunch of arguments, return a single ``Array`` containing + all of those arguments. Any ``Array``-like argument will be extended + in-place, e.g.:: + + compare(flattenArguments(1, [2, 3, [4, 5]]), [1, 2, 3, 4, 5]) == 0 + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`flattenArray(lst)`: + + Return a new ``Array`` consisting of every item in lst with ``Array`` + items expanded in-place recursively. This differs from + :mochiref:`flattenArguments` in that it only takes one argument and + it only flattens items that are ``instanceof Array``. + + compare(flattenArray([1, [2, 3, [4, 5]]]), [1, 2, 3, 4, 5]) == 0 + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`forwardCall(name)`: + + Returns a function that forwards a method call to + ``this.name(...)`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`isArrayLike(obj[, ...])`: + + Returns ``true`` if all given arguments are ``Array``-like (have a + ``.length`` property and ``typeof(obj) == 'object'``) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`isDateLike(obj[, ...])`: + + Returns ``true`` if all given arguments are ``Date``-like (have a + ``.getTime()`` method) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`isEmpty(obj[, ...])`: + + Returns ``true`` if all the given ``Array``-like or string + arguments are empty ``(obj.length == 0)`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`isNotEmpty(obj[, ...])`: + + Returns ``true`` if all the given ``Array``-like or string + arguments are not empty ``(obj.length > 0)`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`isNull(obj[, ...])`: + + Returns ``true`` if all arguments are ``null``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`isUndefinedOrNull(obj[, ...])`: + + Returns ``true`` if all arguments are undefined or ``null`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`itemgetter(name)`: + + Returns a ``function(obj)`` that returns ``obj[name]`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`items(obj)`: + + Return an ``Array`` of ``[propertyName, propertyValue]`` pairs for + the given ``obj`` (in the order determined by ``for propName in + obj``). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`keyComparator(key[, ...])`: + + A comparator factory that compares ``a[key]`` with ``b[key]``. + e.g.:: + + var lst = ["a", "bbb", "cc"]; + lst.sort(keyComparator("length")); + assert( lst.toString() == "a,cc,bbb" ); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`keys(obj)`: + + Return an ``Array`` of the property names of an object (in the + order determined by ``for propName in obj``). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`listMax(lst)`: + + Return the largest element of an ``Array``-like object, as + determined by :mochiref:`compare`. This is a special form of + :mochiref:`listMinMax`, specifically + :mochiref:`partial(listMinMax, 1)`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`listMin(lst)`: + + Return the smallest element of an ``Array``-like object, as + determined by :mochiref:`compare`. This is a special form of + :mochiref:`listMinMax`, specifically + :mochiref:`partial(listMinMax, -1)`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`listMinMax(which, lst)`: + + If ``which == -1`` then it will return the smallest element of the + ``Array``-like ``lst``. This is also available as + :mochiref:`listMin(lst)`. + + If ``which == 1`` then it will return the largest element of the + ``Array``-like ``lst``. This is also available as + :mochiref:`listMax(list)`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`map(fn, lst[, ...])`: + + Return a new array composed of the results of ``fn(x)`` for every + ``x`` in ``lst``. + + If ``fn`` is ``null``, and only one sequence argument is given the + identity function is used. + + :mochiref:`map(null, lst)` -> ``lst.slice()``; + + If ``fn`` is not ``null`` and more than one sequence argument is + given, then one element from each sequence is used to build the + argument list for ``fn``. + + :mochiref:`map(fn, p, q, ...)` + -> ``[fn(p[0], q[0], ..), fn(p[1], q[1], ...), ...]`` + + If ``fn`` is ``null``, and more than one sequence is given as + arguments, then the ``Array`` function is used, making it + equivalent to :mochiref:`MochiKit.Iter.zip`. + + :mochiref:`map(null, p, q, ...)` + -> :mochiref:`MochiKit.Iter.zip(p, q, ...)` + -> ``[[p0, q0, ...], [p1, q1, ...], ...];`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`mean(lst[, ...])`: + + Returns the arithmetic mean (average) of the argument list, or an array. + This function applies :mochiref:`flattenArguments()` to the argument list. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`median(lst[, ...])`: + + Returns the median of the argument list, or an array. This function + applies :mochiref:`flattenArguments()` to the argument list. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`merge(obj[, ...])`: + + Create a new instance of ``Object`` that contains every property + from all given objects. If a property is defined on more than one + of the objects, the last property is used. + + This is a special form of :mochiref:`update(self, obj[, ...])`, + specifically, it is defined as :mochiref:`partial(update, null)`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`method(self, func, ...)`: + + Alternate form of :mochiref:`bind` that takes the object before + the function. These two calls are equivalent:: + + bind("method", myobject) + method(myobject, "method") + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`methodcaller(name[, args...])`: + + Return a new function that calls a method on its argument, + for example:: + + lst = map(methodcaller("toLowerCase"), ["THIS", "is", "LoWeRCaSe"]); + assert( lst.join(" ") == "this is lowercase" ); + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`nameFunctions(namespace)`: + + Given a ``namespace`` (object or function) with a ``NAME`` + property, find all methods in it and give them nice ``NAME`` + properties too (for use with :mochiref:`repr`). e.g.:: + + namespace = { + NAME: "Awesome", + Dude: function () {} + } + nameFunctions(namespace); + assert( namespace.Dude.NAME == 'Awesome.Dude' ); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`noop()`: + + A function that performs no operation. Use this where you would + otherwise use ``(function () {})`` in order to avoid Internet + Explorer cyclic garbage leakage. + + *Availability*: + Available in MochiKit 1.4 + + +:mochidef:`objEqual(a, b)`: + + Return ``true`` if ``compare(a, b) == 0`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`nodeWalk(node, visitor)`: + + Non-recursive generic node walking function (e.g. for a DOM). + + The walk order for nodeWalk is breadth first, meaning that all + siblings will be visited before any children. + + ``node``: + The initial node to be searched. + + ``visitor``: + The visitor function, will be called as ``visitor(node)``, and + should return an ``Array``-like of nodes to be searched next + (e.g. ``node.childNodes``). Leaf nodes may return ``null`` or + ``undefined``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`objMax(obj[, ...])`: + + Return the maximum object according to :mochiref:`compare` out of + the given arguments. This is similar to :mochiref:`listMax`, + except is uses the arguments instead of a given ``Array``-like. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`objMin(obj[, ...])`: + + Return the minimum object according to :mochiref:`compare` out of + the given arguments. This is similar to :mochiref:`listMin`, + except it uses the arguments instead of a given ``Array``-like. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`operator`: + + A table of JavaScript's operators for usage with :mochiref:`map`, + :mochiref:`filter`, etc. + + + Unary Logic Operators: + + +--------------------+--------------------------+-------------------+ + | Operator | Implementation | Description | + +====================+==========================+===================+ + | ``truth(a)`` | ``!!a`` | Logical truth | + +--------------------+--------------------------+-------------------+ + | ``lognot(a)`` | ``!a`` | Logical not | + +--------------------+--------------------------+-------------------+ + | ``identity(a)`` | ``a`` | Logical identity | + +--------------------+--------------------------+-------------------+ + + + + Unary Math Operators: + + +--------------------+--------------------------+---------------+ + | Operator | Implementation | Description | + +====================+==========================+===============+ + | ``not(a)`` | ``~a`` | Bitwise not | + +--------------------+--------------------------+---------------+ + | ``neg(a)`` | ``-a`` | Negation | + +--------------------+--------------------------+---------------+ + + + + Binary Operators: + + +-------------------+-------------------+-------------------------------+ + | Operator | Implementation | Description | + +===================+===================+===============================+ + | ``add(a, b)`` | ``a + b`` | Addition | + +-------------------+-------------------+-------------------------------+ + | ``sub(a, b)`` | ``a - b`` | Subtraction | + +-------------------+-------------------+-------------------------------+ + | ``div(a, b)`` | ``a / b`` | Division | + +-------------------+-------------------+-------------------------------+ + | ``mod(a, b)`` | ``a % b`` | Modulus | + +-------------------+-------------------+-------------------------------+ + | ``mul(a, b)`` | ``a * b`` | Multiplication | + +-------------------+-------------------+-------------------------------+ + | ``and(a, b)`` | ``a & b`` | Bitwise and | + +-------------------+-------------------+-------------------------------+ + | ``or(a, b)`` | ``a | b`` | Bitwise or | + +-------------------+-------------------+-------------------------------+ + | ``xor(a, b)`` | ``a ^ b`` | Bitwise exclusive or | + +-------------------+-------------------+-------------------------------+ + | ``lshift(a, b)`` | ``a << b`` | Bitwise left shift | + +-------------------+-------------------+-------------------------------+ + | ``rshift(a, b)`` | ``a >> b`` | Bitwise signed right shift | + +-------------------+-------------------+-------------------------------+ + | ``zrshift(a, b)`` | ``a >>> b`` | Bitwise unsigned right shift | + +-------------------+-------------------+-------------------------------+ + + + + Built-in Comparators: + + +---------------+-------------------+---------------------------+ + | Operator | Implementation | Description | + +===============+===================+===========================+ + | ``eq(a, b)`` | ``a == b`` | Equals | + +---------------+-------------------+---------------------------+ + | ``ne(a, b)`` | ``a != b`` | Not equals | + +---------------+-------------------+---------------------------+ + | ``gt(a, b)`` | ``a > b`` | Greater than | + +---------------+-------------------+---------------------------+ + | ``ge(a, b)`` | ``a >= b`` | Greater than or equal to | + +---------------+-------------------+---------------------------+ + | ``lt(a, b)`` | ``a < b`` | Less than | + +---------------+-------------------+---------------------------+ + | ``le(a, b)`` | ``a <= b`` | Less than or equal to | + +---------------+-------------------+---------------------------+ + + + + Strict Built-in Comparators: + + +---------------+-------------------+---------------------------+ + | Operator | Implementation | Description | + +===============+===================+===========================+ + | ``seq(a, b)`` | ``a === b`` | Strict equals | + +---------------+-------------------+---------------------------+ + | ``sne(a, b)`` | ``a !== b`` | Strict not equals | + +---------------+-------------------+---------------------------+ + + + + Extended Comparators (uses :mochiref:`compare`): + + +---------------+---------------------------+---------------------------+ + | Operator | Implementation | Description | + +===============+===========================+===========================+ + | ``ceq(a, b)`` | ``compare(a, b) == 0`` | Equals | + +---------------+---------------------------+---------------------------+ + | ``cne(a, b)`` | ``compare(a, b) != 0`` | Not equals | + +---------------+---------------------------+---------------------------+ + | ``cgt(a, b)`` | ``compare(a, b) == 1`` | Greater than | + +---------------+---------------------------+---------------------------+ + | ``cge(a, b)`` | ``compare(a, b) != -1`` | Greater than or equal to | + +---------------+---------------------------+---------------------------+ + | ``clt(a, b)`` | ``compare(a, b) == -1`` | Less than | + +---------------+---------------------------+---------------------------+ + | ``cle(a, b)`` | ``compare(a, b) != 1`` | Less than or equal to | + +---------------+---------------------------+---------------------------+ + + + + Binary Logical Operators: + + +-----------------------+-------------------+---------------------------+ + | Operator | Implementation | Description | + +=======================+===================+===========================+ + | ``logand(a, b)`` | ``a && b`` | Logical and | + +-----------------------+-------------------+---------------------------+ + | ``logor(a, b)`` | ``a || b`` | Logical or | + +-----------------------+-------------------+---------------------------+ + | ``contains(a, b)`` | ``b in a`` | Has property (note order) | + +-----------------------+-------------------+---------------------------+ + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`parseQueryString(encodedString[, useArrays=false])`: + + Parse a name=value pair URL query string into an object with a + property for each pair. e.g.:: + + var args = parseQueryString("foo=value%20one&bar=two"); + assert( args.foo == "value one" && args.bar == "two" ); + + If you expect that the query string will reuse the same name, then + give ``true`` as a second argument, which will use arrays to store + the values. e.g.:: + + var args = parseQueryString("foo=one&foo=two", true); + assert( args.foo[0] == "one" && args.foo[1] == "two" ); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`partial(func, arg[, ...])`: + + Return a partially applied function, e.g.:: + + addNumbers = function (a, b) { + return a + b; + } + + addOne = partial(addNumbers, 1); + + assert(addOne(2) == 3); + + :mochiref:`partial` is a special form of :mochiref:`bind` that + does not alter the bound ``self`` (if any). It is equivalent to + calling:: + + bind(func, undefined, arg[, ...]); + + See the documentation for :mochiref:`bind` for more details about + this facility. + + This could be used to implement, but is NOT currying. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`queryString(names, values)`: + + Creates a URL query string from a pair of ``Array``-like objects + representing ``names`` and ``values``. Each name=value pair will + be URL encoded by :mochiref:`urlEncode`. name=value pairs with a + value of ``undefined`` or ``null`` will be skipped. e.g.:: + + var keys = ["foo", "bar"]; + var values = ["value one", "two"]; + assert( queryString(keys, values) == "foo=value%20one&bar=two" ); + + Alternate form 1: + :mochiref:`queryString(domElement)` + + If :mochiref:`MochiKit.DOM` is loaded, one argument is given, and + that argument is either a string or has a ``nodeType`` property + greater than zero, then ``names`` and ``values`` will be the + result of :mochiref:`MochiKit.DOM.formContents(domElement)`. + + Alternate form 2: + :mochiref:`queryString({name: value, ...})` + + Note that when using the alternate form, the order of the + name=value pairs in the resultant query string is dependent on how + the particular JavaScript implementation handles ``for (..in..)`` + property enumeration. + + When using the second alternate form, name=value pairs with + ``typeof(value) == "function"`` are ignored. This is a workaround + for the case where a poorly designed library has modified + ``Object.prototype`` and inserted "convenience functions". + + Values that are Array-like will be expanded as if they were multiply + defined HTML elements. For example:: + + assert( queryString({a: [1,2]}) === "a=1&a=2" ); + + Alternate form 2 (MochiKit 1.4+): + :mochiref:`queryString([names, values])` + + This form behaves identically to :mochiref:`queryString(names, values)`, + except it takes both arguments as a single Array. This mirrors the + return value of :mochiref:`MochiKit.DOM.formContents`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`registerComparator(name, check, comparator[, override])`: + + Register a comparator for use with :mochiref:`compare`. + + ``name``: + unique identifier describing the comparator. + + ``check``: + ``function(a, b)`` that returns ``true`` if ``a`` and ``b`` + can be compared with ``comparator``. + + ``comparator``: + ``function(a, b)`` that returns: + + +-------+-----------+ + | Value | Condition | + +-------+-----------+ + | 0 | a == b | + +-------+-----------+ + | 1 | a > b | + +-------+-----------+ + | -1 | a < b | + +-------+-----------+ + + ``comparator`` is guaranteed to only be called if ``check(a, + b)`` returns a ``true`` value. + + ``override``: + if ``true``, then this will be made the highest precedence + comparator. Otherwise, the lowest. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`registerJSON(name, check, simplifier[, override])`: + + Register a simplifier function for use with + :mochiref:`serializeJSON`. + + ``name``: + unique identifier describing the serialization. + + ``check``: + ``function(obj)`` that returns ``true`` if ``obj`` can + can be simplified for serialization by ``simplifier``. + + ``simplifier``: + ``function(obj)`` that returns a simpler object that can be + further serialized by :mochiref:`serializeJSON`. For example, + you could simplify ``Date``-like objects to ISO 8601 timestamp + strings with the following simplifier:: + + var simplifyDateAsISO = function (obj) { + return toISOTimestamp(obj, true); + }; + registerJSON("DateLike", isDateLike, simplifyDateAsISO); + + ``simplifier`` is guaranteed to only be called if + ``check(obj)`` returns a ``true`` value. + + ``override``: + if ``true``, then this will be made the highest precedence + serialization. Otherwise, the lowest. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`registerRepr(name, check, wrap[, override])`: + + Register a programmer representation function. :mochiref:`repr` + functions should take one argument and return a string + representation of it suitable for developers, primarily used when + debugging. + + If ``override`` is given, it is used as the highest priority repr, + otherwise it will be used as the lowest. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`repr(obj)`: + + Return a programmer representation for ``obj``. See the + `Programmer Representation`_ overview for more information about + this function. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`reverseKeyComparator(key)`: + + A comparator factory that compares ``a[key]`` with ``b[key]`` in + reverse. e.g.:: + + var lst = ["a", "bbb", "cc"]; + lst.sort(reverseKeyComparator("length")); + assert(lst.toString() == "bbb,cc,a"); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`serializeJSON(anObject)`: + + Serialize ``anObject`` in the JSON [1]_ format, see `JSON + Serialization`_ for the coercion rules. For unserializable objects + (functions that do not have an adapter, ``__json__`` method, or + ``json`` method), this will return ``undefined``. + + For those familiar with Python, JSON is similar in scope to + pickle, but it can not handle recursive object graphs. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`setdefault(self, obj[, ...])`: + + Mutate ``self`` by adding all properties from other object(s) that + it does not already have set. + + If ``self`` is ``null``, a new ``Object`` instance will be created + and returned. + + This mutates *and returns* ``self``, be warned. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`typeMatcher(typ[, ...])`: + + Given a set of types (as string arguments), returns a + ``function(obj[, ...])`` that will return ``true`` if the types of + the given arguments are all members of that set. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`update(self, obj[, ...])`: + + Mutate ``self`` by replacing its key:value pairs with those from + other object(s). Key:value pairs from later objects will overwrite + those from earlier objects. + + If ``self`` is ``null``, a new ``Object`` instance will be created + and returned. + + This mutates *and returns* ``self``, be warned. + + A version of this function that creates a new object is available + as :mochiref:`merge(a, b[, ...])` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`updatetree(self, obj[, ...])`: + + Mutate ``self`` by replacing its key:value pairs with those from + other object(s). If a given key has an object value in both + ``self`` and ``obj``, then this function will be called + recursively, updating instead of replacing that object. + + If ``self`` is ``null``, a new ``Object`` instance will be created + and returned. + + This mutates *and returns* ``self``, be warned. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`urlEncode(unencoded)`: + + Converts ``unencoded`` into a URL-encoded string. In this + implementation, spaces are converted to %20 instead of "+". e.g.:: + + assert( URLencode("1+2=2") == "1%2B2%3D2"); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`values(obj)`: + + Return an ``Array`` of the property values of an object (in the + order determined by ``for propName in obj``). + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`xfilter(fn, obj[, ...])`: + + Returns a new ``Array`` composed of the arguments where + ``fn(obj)`` returns a true value. + + If ``fn`` is ``null``, ``operator.truth`` will be used. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`xmap(fn, obj[, ...)`: + + Return a new ``Array`` composed of ``fn(obj)`` for every ``obj`` + given as an argument. + + If ``fn`` is ``null``, ``operator.identity`` is used. + + *Availability*: + Available in MochiKit 1.3.1+ + + +See Also +======== + +.. [1] JSON, JavaScript Object Notation: http://json.org/ +.. [2] Python's itertools + module: http://docs.python.org/lib/module-itertools.html + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/Color.rst b/mochikit_v14/doc/rst/MochiKit/Color.rst new file mode 100755 index 0000000..d21ae06 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Color.rst @@ -0,0 +1,651 @@ +.. title:: MochiKit.Color - color abstraction with CSS3 support + +Name +==== + +MochiKit.Color - color abstraction with CSS3 support + + +Synopsis +======== + +:: + + // RGB color expressions are supported + assert( + objEqual(Color.whiteColor(), Color.fromString("rgb(255,100%, 255)")) + ); + + // So is instantiating directly from HSL or RGB values. + // Note that fromRGB and fromHSL take numbers between 0.0 and 1.0! + assert( objEqual(Color.fromRGB(1.0, 1.0, 1.0), Color.fromHSL(0.0, 0.0, 1.0) ); + + // Or even SVG color keyword names, as per CSS3! + assert( Color.fromString("aquamarine"), "#7fffd4" ); + + // NSColor-like colors built in + assert( Color.whiteColor().toHexString() == "#ffffff" ); + + +Description +=========== + +MochiKit.Color is an abstraction for handling colors and strings that +represent colors. + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.DOM` +- :mochiref:`MochiKit.Style` + + +Overview +======== + +MochiKit.Color provides an abstraction of RGB, HSL and HSV colors with +alpha. It supports parsing and generating of CSS3 colors, and has a +full CSS3 (SVG) color table. + +All of the functionality in this module is exposed through a Color +constructor and its prototype, but a few of its internals are +available for direct use at module level. + + +API Reference +============= + +Constructors +------------ + +:mochidef:`Color()`: + + Represents a color. Component values should be integers between + ``0.0`` and ``1.0``. You should use one of the :mochiref:`Color` + factory functions such as :mochiref:`Color.fromRGB`, + :mochiref:`Color.fromHSL`, etc. instead of constructing + :mochiref:`Color` objects directly. + + :mochiref:`Color` instances can be compared with + :mochiref:`MochiKit.Base.compare` (though ordering is on RGB, so + is not particularly meaningful except for equality), and the + default ``toString`` implementation returns + :mochiref:`Color.prototype.toHexString()`. + + :mochiref:`Color` instances are immutable, and much of the + architecture is inspired by AppKit's NSColor [1]_ + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromBackground(elem)`: + + Returns a :mochiref:`Color` object based on the background of the + provided element. Equivalent to:: + + c = Color.fromComputedStyle( + elem, "backgroundColor", "background-color") || Color.whiteColor(); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromComputedStyle(elem, style)`: + + Returns a :mochiref:`Color` object based on the result of + :mochiref:`MochiKit.Style.getStyle(elem, style)` or ``null`` if not + found. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromHexString(hexString)`: + + Returns a :mochiref:`Color` object from the given hexadecimal + color string. For example, ``"#FFFFFF"`` would return a + :mochiref:`Color` with RGB values ``[255/255, 255/255, 255/255]`` + (white). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromHSL(hue, saturation, lightness, alpha=1.0)`: + + Return a :mochiref:`Color` object from the given ``hue``, + ``saturation``, ``lightness`` values. Values should be numbers + between ``0.0`` and ``1.0``. + + If ``alpha`` is not given, then ``1.0`` (completely opaque) will + be used. + + Alternate form: + :mochiref:`Color.fromHSL({h: hue, s: saturation, l: lightness, + a: alpha})` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromHSLString(hslString)`: + + Returns a :mochiref:`Color` object from the given decimal hsl + color string. For example, ``"hsl(0,0%,100%)"`` would return a + :mochiref:`Color` with HSL values ``[0/360, 0/360, 360/360]`` + (white). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromHSV(hue, saturation, value, alpha=1.0)`: + + Return a :mochiref:`Color` object from the given ``hue``, + ``saturation``, ``value`` values. Values should be numbers between + ``0.0`` and ``1.0``. + + If ``alpha`` is not given, then ``1.0`` (completely opaque) will + be used. + + Alternate form: + :mochiref:`Color.fromHSV({h: hue, s: saturation, v: value, a: + alpha})` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromName(colorName)`: + + Returns a :mochiref:`Color` object corresponding to the given SVG + 1.0 color keyword name [2]_ as per the W3C CSS3 Color Module + [3]_. ``"transparent"`` is also accepted as a color name, and will + return :mochiref:`Color.transparentColor()`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromRGB(red, green, blue, alpha=1.0)`: + + Return a :mochiref:`Color` object from the given ``red``, + ``green``, ``blue``, and ``alpha`` values. Values should be + numbers between ``0`` and ``1.0``. + + If ``alpha`` is not given, then ``1.0`` (completely opaque) will + be used. + + Alternate form: + :mochiref:`Color.fromRGB({r: red, g: green, b: blue, a: + alpha})` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromRGBString(rgbString)`: + + Returns a :mochiref:`Color` object from the given decimal rgb + color string. For example, ``"rgb(255,255,255)"`` would return a + :mochiref:`Color` with RGB values ``[255/255, 255/255, 255/255]`` + (white). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromText(elem)`: + + Returns a :mochiref:`Color` object based on the text color of the + provided element. Equivalent to:: + + c = Color.fromComputedStyle(elem, "color") || Color.whiteColor(); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.fromString(rgbOrHexString)`: + + Returns a :mochiref:`Color` object from the given RGB, HSL, hex, + or name. Will return ``null`` if the string can not be parsed by + any of these methods. + + See :mochiref:`Color.fromHexString`, + :mochiref:`Color.fromRGBString`, :mochiref:`Color.fromHSLString` + and :mochiref:`Color.fromName` more information. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.namedColors()`: + + Returns an object with properties for each SVG 1.0 color keyword + name [2]_ supported by CSS3 [3]_. Property names are the color + keyword name in lowercase, and the value is a string suitable for + :mochiref:`Color.fromString()`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.colorWithAlpha(alpha)`: + + Return a new :mochiref:`Color` based on this color, but with the + provided ``alpha`` value. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.colorWithHue(hue)`: + + Return a new :mochiref:`Color` based on this color, but with the + provided ``hue`` value. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.colorWithSaturation(saturation)`: + + Return a new :mochiref:`Color` based on this color, but with the + provided ``saturation`` value (using the HSL color model). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.colorWithLightness(lightness)`: + + Return a new :mochiref:`Color` based on this color, but with the + provided ``lightness`` value. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.darkerColorWithLevel(level)`: + + Return a new :mochiref:`Color` based on this color, but darker by + the given ``level`` (between ``0`` and ``1.0``). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.lighterColorWithLevel(level)`: + + Return a new :mochiref:`Color` based on this color, but lighter by + the given ``level`` (between ``0`` and ``1.0``). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.blendedColor(other, fraction=0.5)`: + + Return a new :mochiref:`Color` whose RGBA component values are a + weighted sum of this color and ``other``. Each component of the + returned color is the ``fraction`` of other's value plus ``1 - + fraction`` of this color's. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.isLight()`: + + Return ``true`` if the lightness value of this color is greater + than ``0.5``. + + Note that ``alpha`` is ignored for this calculation (color + components are not premultiplied). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.isDark()`: + + Return ``true`` if the lightness value of this color is less than + or equal to ``0.5``. + + Note that ``alpha`` is ignored for this calculation (color + components are not premultiplied). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.toRGBString()`: + + Return the decimal ``"rgb(red, green, blue)"`` string + representation of this color. + + If the alpha component is not ``1.0`` (fully opaque), the + ``"rgba(red, green, blue, alpha)"`` string representation will be + used. + + For example:: + + assert( Color.whiteColor().toRGBString() == "rgb(255,255,255)" ); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.toHSLString()`: + + Return the decimal ``"hsl(hue, saturation, lightness)"`` string + representation of this color. + + If the alpha component is not ``1.0`` (fully opaque), the + ``"hsla(hue, saturation, lightness, alpha)"`` string + representation will be used. + + For example:: + + assert( Color.whiteColor().toHSLString() == "hsl(0,0,360)" ); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.toHexString()`: + + Return the hexadecimal ``"#RRGGBB"`` string representation of this + color. + + Note that the alpha component is completely ignored for + hexadecimal string representations! + + For example:: + + assert( Color.whiteColor().toHexString() == "#FFFFFF" ); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.asRGB()`: + + Return the RGB (red, green, blue, alpha) components of this color + as an object with ``r``, ``g``, ``b``, and ``a`` properties that + have values between ``0.0`` and ``1.0``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.asHSL()`: + + Return the HSL (hue, saturation, lightness, alpha) components of + this color as an object with ``h``, ``s``, ``l`` and ``a`` + properties that have values between ``0.0`` and ``1.0``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.prototype.asHSV()`: + + Return the HSV (hue, saturation, value, alpha) components of this + color as an object with ``h``, ``s``, ``v`` and ``a`` properties + that have values between ``0.0`` and ``1.0``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.blackColor()`: + + Return a :mochiref:`Color` object whose RGB values are 0, 0, 0 + (#000000). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.blueColor()`: + + Return a :mochiref:`Color` object whose RGB values are 0, 0, 1 + (#0000ff). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.brownColor()`: + + Return a :mochiref:`Color` object whose RGB values are 0.6, 0.4, + 0.2 (#996633). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.cyanColor()`: + + Return a :mochiref:`Color` object whose RGB values are 0, 1, 1 + (#00ffff). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.darkGrayColor()`: + + Return a :mochiref:`Color` object whose RGB values are 1/3, 1/3, + 1/3 (#555555). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.grayColor()`: + + Return a :mochiref:`Color` object whose RGB values are 0.5, 0.5, + 0.5 (#808080). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.greenColor()`: + + Return a :mochiref:`Color` object whose RGB values are 0, 1, 0. + (#00ff00). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.lightGrayColor()`: + + Return a :mochiref:`Color` object whose RGB values are 2/3, 2/3, + 2/3 (#aaaaaa). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.magentaColor()`: + + Return a :mochiref:`Color` object whose RGB values are 1, 0, 1 + (#ff00ff). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.orangeColor()`: + + Return a :mochiref:`Color` object whose RGB values are 1, 0.5, 0 + (#ff8000). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.purpleColor()`: + + Return a :mochiref:`Color` object whose RGB values are 0.5, 0, 0.5 + (#800080). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.redColor()`: + + Return a :mochiref:`Color` object whose RGB values are 1, 0, 0 + (#ff0000). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.whiteColor()`: + + Return a :mochiref:`Color` object whose RGB values are 1, 1, 1 + (#ffffff). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.yellowColor()`: + + Return a :mochiref:`Color` object whose RGB values are 1, 1, 0 + (#ffff00). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Color.transparentColor()`: + + Return a :mochiref:`Color` object that is completely transparent + (has alpha component of 0). + + *Availability*: + Available in MochiKit 1.3.1+ + + +Functions +--------- + +:mochidef:`clampColorComponent(num, scale)`: + + Returns ``num * scale`` clamped between ``0`` and ``scale``. + + :mochiref:`clampColorComponent` is not exported by default when + using JSAN. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`hslToRGB(hue, saturation, lightness, alpha)`: + + Computes RGB values from the provided HSL values. The return value + is a mapping with ``"r"``, ``"g"``, ``"b"`` and ``"a"`` keys. + + Alternate form: + :mochiref:`hslToRGB({h: hue, s: saturation, l: lightness, a: + alpha})`. + + :mochiref:`hslToRGB` is not exported by default when using JSAN. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`hsvToRGB(hue, saturation, value, alpha)`: + + Computes RGB values from the provided HSV values. The return value + is a mapping with ``"r"``, ``"g"``, ``"b"`` and ``"a"`` keys. + + Alternate form: + :mochiref:`hsvToRGB({h: hue, s: saturation, v: value, a: + alpha})`. + + :mochiref:`hsvToRGB` is not exported by default when using JSAN. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toColorPart(num)`: + + Convert num to a zero padded hexadecimal digit for use in a + hexadecimal color string. Num should be an integer between ``0`` + and ``255``. + + :mochiref:`toColorPart` is not exported by default when using + JSAN. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`rgbToHSL(red, green, blue, alpha)`: + + Computes HSL values based on the provided RGB values. The return + value is a mapping with ``"h"``, ``"s"``, ``"l"`` and ``"a"`` + keys. + + Alternate form: + :mochiref:`rgbToHSL({r: red, g: green, b: blue, a: alpha})`. + + :mochiref:`rgbToHSL` is not exported by default when using JSAN. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`rgbToHSV(red, green, blue, alpha)`: + + Computes HSV values based on the provided RGB values. The return + value is a mapping with ``"h"``, ``"s"``, ``"v"`` and ``"a"`` + keys. + + Alternate form: + :mochiref:`rgbToHSV({r: red, g: green, b: blue, a: alpha})`. + + :mochiref:`rgbToHSV` is not exported by default when using JSAN. + + *Availability*: + Available in MochiKit 1.3.1+ + + +See Also +======== + +.. [1] Application Kit Reference - NSColor: http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSColor.html +.. [2] SVG 1.0 color keywords: http://www.w3.org/TR/SVG/types.html#ColorKeywords +.. [3] W3C CSS3 Color Module: http://www.w3.org/TR/css3-color/#svg-color + + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/DOM.rst b/mochikit_v14/doc/rst/MochiKit/DOM.rst new file mode 100755 index 0000000..bad57f9 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/DOM.rst @@ -0,0 +1,1130 @@ +.. title:: MochiKit.DOM - painless DOM manipulation API + +Name +==== + +MochiKit.DOM - painless DOM manipulation API + + +Synopsis +======== + +:: + + var rows = [ + ["dataA1", "dataA2", "dataA3"], + ["dataB1", "dataB2", "dataB3"] + ]; + row_display = function (row) { + return TR(null, map(partial(TD, null), row)); + } + var newTable = TABLE({'class': 'prettytable'}, + THEAD(null, + row_display(["head1", "head2", "head3"])), + TFOOT(null, + row_display(["foot1", "foot2", "foot3"])), + TBODY(null, + map(row_display, rows))); + // put that in your document.createElement and smoke it! + swapDOM(oldTable, newTable); + + +Description +=========== + +As you probably know, the DOM APIs are some of the most painful +Java-inspired APIs you'll run across from a highly dynamic +language. Don't worry about that though, because they provide a +reasonable basis to build something that sucks a lot less. + +MochiKit.DOM takes much of its inspiration from Nevow's [1]_ stan +[2]_. This means you choose a tag, give it some attributes, then +stuff it full of *whatever objects you want*. MochiKit.DOM isn't +stupid, it knows that a string should be a text node, and that you +want functions to be called, and that ``Array``-like objects should be +expanded, and stupid ``null`` values should be skipped. + +Hell, it will let you return strings from functions, and use iterators +from :mochiref:`MochiKit.Iter`. If that's not enough, just teach it +new tricks with :mochiref:`registerDOMConverter`. If you have never +used an API like this for creating DOM elements, you've been wasting +your damn time. Get with it! + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.Style` (optional since MochiKit 1.4 for + backwards-compatibility) +- :mochiref:`MochiKit.Iter` (optional since MochiKit 1.4) + + +Overview +======== + +DOM Coercion Rules +------------------ + +In order of precedence, :mochiref:`createDOM` coerces given arguments +to DOM nodes using the following rules: + +1. Functions are called with a ``this`` and first argument of the + parent node and their return value is subject to the following + rules (even this one). +2. ``undefined`` and ``null`` are ignored. +3. If :mochiref:`MochiKit.Iter` is loaded, iterables are flattened + (as if they were passed in-line as nodes) and each return value is + subject to these rules. +4. Values that look like DOM nodes (objects with a ``.nodeType > 0``) + are ``.appendChild``'ed to the created DOM fragment. +5. Strings are wrapped up with ``document.createTextNode`` +6. Objects that have a ``.dom(node)`` or ``.__dom__(node)`` method + are called with the parent node and their result is coerced using + these rules. (MochiKit 1.4+). +7. Objects that are not strings are run through the ``domConverters`` + :mochiref:`MochiKit.Base.AdapterRegistry` (see + :mochiref:`registerDOMConverter`). The adapted value is subject + to these same rules (e.g. if the adapter returns a string, it + will be coerced to a text node). +8. If no adapter is available, ``.toString()`` is used to create a + text node. + + +Creating DOM Element Trees +-------------------------- + +:mochiref:`createDOM` provides you with an excellent facility for +creating DOM trees that is easy on the wrists. One of the best ways to +understand how to use it is to take a look at an example:: + + var rows = [ + ["dataA1", "dataA2", "dataA3"], + ["dataB1", "dataB2", "dataB3"] + ]; + row_display = function (row) { + return TR(null, map(partial(TD, null), row)); + } + var newTable = TABLE({'class': 'prettytable'}, + THEAD(null, + row_display(["head1", "head2", "head3"])), + TFOOT(null, + row_display(["foot1", "foot2", "foot3"])), + TBODY(null, + map(row_display, rows))); + + +This will create a table with the following visual layout (if it were +inserted into the document DOM): + + +--------+--------+--------+ + | head1 | head2 | head3 | + +========+========+========+ + | dataA1 | dataA2 | dataA3 | + +--------+--------+--------+ + | dataB1 | dataB2 | dataB3 | + +--------+--------+--------+ + | foot1 | foot2 | foot3 | + +--------+--------+--------+ + +Corresponding to the following HTML:: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    head1head2head3
    foot1foot2foot3
    dataA1dataA2dataA3
    dataB1dataB2dataB3
    + + +DOM Context +----------- + +In order to prevent having to pass a ``window`` and/or ``document`` +variable to every MochiKit.DOM function (e.g. when working with a +child window), MochiKit.DOM maintains a context variable for each of +them. They are managed with the :mochiref:`withWindow` and +:mochiref:`withDocument` functions, and can be acquired with +:mochiref:`currentWindow()` and :mochiref:`currentDocument()` + +For example, if you are creating DOM nodes in a child window, you +could do something like this:: + + withWindow(child, function () { + var doc = currentDocument(); + appendChildNodes(doc.body, H1(null, "This is in the child!")); + }); + +Note that :mochiref:`withWindow(win, ...)` also implies +:mochiref:`withDocument(win.document, ...)`. + + +DOM Gotchas +----------- + +Performance Tradeoff: + DOM is much easier to get correct and more flexible than working + directly with markup as strings. Modifying ``innerHTML`` is still + the fastest way to make document changes. + +Internet Explorer: + Internet Explorer's DOM implementation is quite poor in comparison + to the other popular implementations. In order to avoid memory + leaks due to circular references, you should use + :mochiref:`MochiKit.Signal.connect` for all of your event handling + needs. Additionally, when creating tables with DOM, it is required + to use a ``TBODY`` tag (see `Creating DOM Element Trees`_ for an + example of this). + + +API Reference +============= + +Functions +--------- + +:mochidef:`$(id[, ...])`: + + An alias for :mochiref:`getElement(id[, ...])` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`addElementClass(element, className)`: + + Ensure that the given ``element`` has ``className`` set as part of + its class attribute. This will not disturb other class names. + ``element`` is looked up with :mochiref:`getElement`, so string + identifiers are also acceptable. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`addLoadEvent(func)`: + + Note that :mochiref:`addLoadEvent` can not be used in combination + with :mochiref:`MochiKit.Signal` if the ``onload`` event is + connected. Once an event is connected with + :mochiref:`MochiKit.Signal`, no other APIs may be used for that + same event. + + This will stack ``window.onload`` functions on top of each other. + Each function added will be called after ``onload`` in the order + that they were added. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`addToCallStack(target, path, func[, once])`: + + Note that :mochiref:`addToCallStack` is not compatible with + :mochiref:`MochiKit.Signal`. Once an event is connected with + :mochiref:`MochiKit.Signal`, no other APIs may be used for that + same event. + + Set the property ``path`` of ``target`` to a function that calls + the existing function at that property (if any), then calls + ``func``. + + If ``target[path]()`` returns exactly ``false``, then ``func`` + will not be called. + + If ``once`` is ``true``, then ``target[path]`` is set to ``null`` + after the function call stack has completed. + + If called several times for the same ``target[path]``, it will + create a stack of functions (instead of just a pair). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`appendChildNodes(node[, childNode[, ...]])`: + + Append children to a DOM element using the `DOM Coercion Rules`_. + + ``node``: + A reference to the DOM element to add children to (if a string + is given, :mochiref:`getElement(node)` will be used to locate + the node) + + ``childNode``...: + All additional arguments, if any, will be coerced into DOM + nodes that are appended as children using the `DOM Coercion + Rules`_. + + *returns*: + The given DOM element + + *Availability*: + Available in MochiKit 1.3.1+ + +:mochidef:`insertSiblingNodesBefore(node[, siblingNode[, ...]])`: + + Insert children into the DOM structure using the `DOM Coercion + Rules`_. + + ``node``: + A reference to the DOM element you want to insert children + before (if a string is given, :mochiref:`getElement(node)` + will be used to locate the node) + + ``siblingNode``...: + All additional arguments, if any, will be coerced into DOM + nodes that are inserted as siblings using the `DOM Coercion + Rules`_. + + *returns*: + The parent of the given DOM element + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`insertSiblingNodesAfter(node[, siblingNode[, ...]])`: + + Insert children into the DOM structure using the `DOM Coercion + Rules`_. + + ``node``: + A reference to the DOM element you want to insert children + after (if a string is given, :mochiref:`getElement(node)` + will be used to locate the node) + + ``siblingNode``...: + All additional arguments, if any, will be coerced into DOM + nodes that are inserted as siblings using the `DOM Coercion + Rules`_. + + *returns*: + The parent of the given DOM element + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`createDOM(name[, attrs[, node[, ...]]])`: + + Create a DOM fragment in a really convenient manner, much like + Nevow`s [1]_ stan [2]_. + + Partially applied versions of this function for common tags are + available as aliases: + + - ``A`` + - ``BUTTON`` + - ``BR`` + - ``CANVAS`` + - ``DIV`` + - ``FIELDSET`` + - ``FORM`` + - ``H1`` + - ``H2`` + - ``H3`` + - ``HR`` + - ``IMG`` + - ``INPUT`` + - ``LABEL`` + - ``LEGEND`` + - ``LI`` + - ``OL`` + - ``OPTGROUP`` + - ``OPTION`` + - ``P`` + - ``PRE`` + - ``SELECT`` + - ``SPAN`` + - ``STRONG`` + - ``TABLE`` + - ``TBODY`` + - ``TD`` + - ``TEXTAREA`` + - ``TFOOT`` + - ``TH`` + - ``THEAD`` + - ``TR`` + - ``TT`` + - ``UL`` + + See `Creating DOM Element Trees`_ for a comprehensive example. + + ``name``: + The kind of fragment to create (e.g. 'span'), such as you + would pass to ``document.createElement``. + + ``attrs``: + An object whose properties will be used as the attributes + (e.g. ``{'style': 'display:block'}``), or ``null`` if no + attributes need to be set. + + See :mochiref:`updateNodeAttributes` for more information. + + For convenience, if ``attrs`` is a string, ``null`` is used + and the string will be considered the first ``node``. + + ``node``...: + All additional arguments, if any, will be coerced into DOM + nodes that are appended as children using the `DOM Coercion + Rules`_. + + *returns*: + A DOM element + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`createDOMFunc(tag[, attrs[, node[, ...]]])`: + + Convenience function to create a partially applied createDOM + function. You'd want to use this if you add additional convenience + functions for creating tags, or if you find yourself creating a + lot of tags with a bunch of the same attributes or contents. + + See :mochiref:`createDOM` for more detailed descriptions of the + arguments. + + ``tag``: + The name of the tag + + ``attrs``: + Optionally specify the attributes to apply + + ``node``...: + Optionally specify any children nodes it should have + + *returns*: + function that takes additional arguments and calls + :mochiref:`createDOM` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`currentDocument()`: + + Return the current ``document`` `DOM Context`_. This will always + be the same as the global ``document`` unless + :mochiref:`withDocument` or :mochiref:`withWindow` is currently + executing. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`currentWindow()`: + + Return the current ``window`` `DOM Context`_. This will always be + the same as the global ``window`` unless :mochiref:`withWindow` is + currently executing. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`emitHTML(dom[, lst])`: + + Convert a DOM tree to an ``Array`` of HTML string fragments. This should + be used for debugging/testing purposes only. + + The DOM property ``innerHTML`` or ``cloneNode(true)`` method should + be used for most purposes. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`escapeHTML(s)`: + + Make a string safe for HTML, converting the usual suspects (lt, + gt, quot, amp) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`focusOnLoad(element)`: + + Note that :mochiref:`focusOnLoad` can not be used in combination + with :mochiref:`MochiKit.Signal` if the ``onload`` event is + connected. Once an event is connected with + :mochiref:`MochiKit.Signal`, no other APIs may be used for that + same event. + + This adds an onload event to focus the given element. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`formContents(elem=document.body)`: + + Search the DOM tree, starting at ``elem``, for any elements with a + ``name`` and ``value`` attribute. Return a 2-element ``Array`` of + ``names`` and ``values`` suitable for use with + :mochiref:`MochiKit.Base.queryString`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`getElement(id[, ...])`: + + A small quick little function to encapsulate the + ``getElementById`` method. It includes a check to ensure we can + use that method. + + If the id isn't a string, it will be returned as-is. + + Also available as :mochiref:`$(...)` for convenience and + compatibility with other JavaScript frameworks. + + If multiple arguments are given, an ``Array`` will be returned. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`getElementsByTagAndClassName(tagName, className, parent=document)`: + + Returns an array of elements in ``parent`` that match the tag name + and class name provided. If ``parent`` is a string, it will be + looked up with :mochiref:`getElement`. + + If ``tagName`` is ``null`` or ``"*"``, all elements will be + searched for the matching class. + + If ``className`` is ``null``, all elements matching the provided + tag are returned. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`getFirstElementByTagAndClassName(tagName, className, parent=document)`: + + Return the first element in ``parent`` that matches the tag name + and class name provided. If ``parent`` is a string, it will be + looked up with :mochiref:`getElement`. + + If ``tagName`` is ``null`` or ``"*"``, all elements will be searched + for the matching class. + + If ``className`` is ``null``, the first element matching the provided + tag will be returned. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`getFirstParentByTagAndClassName(elem, tagName='*', className=null)`: + + Returns the first parent of ``elem`` matches the tag name and class name + provided. If parent is a string, it will be looked up using + :mochiref:`getElement`. + + If ``tagName`` is ``null`` or ``"*"``, all elements will be searched + for the matching class. + + If ``className`` is ``null``, the first element matching the provided + tag will be returned. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`getNodeAttribute(node, attr)`: + + Get the value of the given attribute for a DOM element without + ever raising an exception (will return ``null`` on exception). + + ``node``: + A reference to the DOM element to update (if a string is + given, :mochiref:`getElement(node)` will be used to locate the + node) + + ``attr``: + The name of the attribute + + Note that it will do the right thing for IE, so don't do + the ``class`` -> ``className`` hack yourself. + + *returns*: + The attribute's value, or ``null`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`hasElementClass(element, className[, ...])`: + + Return ``true`` if ``className`` is found on the ``element``. + ``element`` is looked up with :mochiref:`getElement`, so string + identifiers are also acceptable. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`isChildNode(node, maybeParent)`: + + Determine whether ``node`` is a child node of ``maybeParent``. + Returns ``true`` if so, and ``false`` if not. A node is considered + a child node of itself for the purposes of this function. + + If either ``node`` or ``maybeParent`` are strings, the related + nodes will be looked up with :mochiref:`getElement`. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`isParent(child, element)`: + + Returns ``true`` if ``element`` contains ``child``. Returns ``false`` + if ``element == child`` or ``child`` is not contained in ``element``. + If ``child`` or ``element`` are strings, they will be looked up with + :mochiref:`getElement`. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`makeClipping(element)`: + + Ensure that ``element.style.overflow = 'hidden'``. If ``element`` is a + string, then it will be looked up with :mochiref:`getElement`. + + Returns the original value of ``element.style.overflow``, so that it + may be restored with :mochiref:`undoClipping(element, overflow)`. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`makePositioned(element)`: + + Ensure that ``element.style.position`` is set to ``"relative"`` if it + is not set or is ``"static"``. If ``element`` is a + string, then it will be looked up with :mochiref:`getElement`. + + Returns the original value of ``element.style.position``, so that it + may be restored with :mochiref:`undoPositioned(element, position)`. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`registerDOMConverter(name, check, wrap[, override])`: + + Register an adapter to convert objects that match ``check(obj, + ctx)`` to a DOM element, or something that can be converted to a + DOM element (i.e. number, bool, string, function, iterable). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`removeElement(node)`: + + Remove and return ``node`` from a DOM tree. + + ``node``: + the DOM element (or string id of one) to be removed + + *returns* + The removed element + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`removeElementClass(element, className)`: + + Ensure that the given ``element`` does not have ``className`` set + as part of its class attribute. This will not disturb other class + names. ``element`` is looked up with :mochiref:`getElement`, so + string identifiers are also acceptable. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`removeEmptyTextNodes(node)`: + + Remove all text node children that contain only whitespace from + ``node``. Useful in situations where such empty text nodes can + interfere with DOM traversal. + + ``node``: + the DOM element (or string id of one) to remove whitespace child + nodes from. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`replaceChildNodes(node[, childNode[, ...]])`: + + Remove all children from the given DOM element, then append any + given childNodes to it (by calling :mochiref:`appendChildNodes`). + + ``node``: + A reference to the DOM element to add children to (if a string + is given, :mochiref:`getElement(node)` will be used to locate + the node) + + ``childNode``...: + All additional arguments, if any, will be coerced into DOM + nodes that are appended as children using the `DOM Coercion + Rules`_. + + *returns*: + The given DOM element + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`scrapeText(node[, asArray=false])`: + + Walk a DOM tree in-order and scrape all of the text out of it as a + ``string``. + + If ``asArray`` is ``true``, then an ``Array`` will be returned + with each individual text node. These two are equivalent:: + + assert( scrapeText(node) == scrapeText(node, true).join("") ); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`setElementClass(element, className)`: + + Set the entire class attribute of ``element`` to ``className``. + ``element`` is looked up with :mochiref:`getElement`, so string + identifiers are also acceptable. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`setNodeAttribute(node, attr, value)`: + + Set the value of the given attribute for a DOM element without + ever raising an exception (will return null on exception). If + setting more than one attribute, you should use + :mochiref:`updateNodeAttributes`. + + ``node``: + A reference to the DOM element to update (if a string is + given, :mochiref:`getElement(node)` will be used to locate the + node) + + ``attr``: + The name of the attribute + + Note that it will do the right thing for IE, so don't do the + ``class`` -> ``className`` hack yourself. + + ``value``: + The value of the attribute, may be an object to be merged + (e.g. for setting style). + + *returns*: + The given DOM element or ``null`` on failure + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`swapDOM(dest, src)`: + + Replace ``dest`` in a DOM tree with ``src``, returning ``src``. + + ``dest``: + a DOM element (or string id of one) to be replaced + + ``src``: + the DOM element (or string id of one) to replace it with, or + ``null`` if ``dest`` is to be removed (replaced with nothing). + + *returns*: + a DOM element (``src``) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`swapElementClass(element, fromClass, toClass)`: + + If ``fromClass`` is set on ``element``, replace it with + ``toClass``. This will not disturb other classes on that element. + ``element`` is looked up with :mochiref:`getElement`, so string + identifiers are also acceptable. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toggleElementClass(className[, element[, ...]])`: + + Toggle the presence of a given ``className`` in the class + attribute of all given elements. All elements will be looked up + with :mochiref:`getElement`, so string identifiers are acceptable. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toHTML(dom)`: + + Convert a DOM tree to a HTML string using :mochiref:`emitHTML`. + This should be used for debugging/testing purposes only. + + The DOM property ``innerHTML`` or ``cloneNode(true)`` method should + be used for most purposes. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`undoClipping(element, overflow)`: + + Restore the setting of ``element.style.overflow`` set by + :mochiref:`makeClipping(element)`. If ``element`` is a string, then + it will be looked up with :mochiref:`getElement`. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`undoPositioned(element, overflow)`: + + Restore the setting of ``element.style.position`` set by + :mochiref:`makePositioned(element)`. If ``element`` is a string, then + it will be looked up with :mochiref:`getElement`. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`updateNodeAttributes(node, attrs)`: + + Update the attributes of a DOM element from a given object. + + ``node``: + A reference to the DOM element to update (if a string is + given, :mochiref:`getElement(node)` will be used to locate the + node) + + ``attrs``: + An object whose properties will be used to set the attributes + (e.g. ``{'class': 'invisible'}``), or ``null`` if no + attributes need to be set. If an object is given for the + attribute value (e.g. ``{'style': {'display': 'block'}}``) + then :mochiref:`MochiKit.Base.updatetree` will be used to set + that attribute. + + Note that it will do the right thing for IE, so don't do the + ``class`` -> ``className`` hack yourself, and it deals with + setting "on..." event handlers correctly. + + *returns*: + The given DOM element + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`withWindow(win, func)`: + + Call ``func`` with the ``window`` `DOM Context`_ set to ``win`` + and the ``document`` `DOM Context`_ set to ``win.document``. When + ``func()`` returns or throws an error, the `DOM Context`_ will be + restored to its previous state. + + The return value of ``func()`` is returned by this function. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`withDocument(doc, func)`: + + Call ``func`` with the ``doc`` `DOM Context`_ set to ``doc``. + When ``func()`` returns or throws an error, the `DOM Context`_ + will be restored to its previous state. + + The return value of ``func()`` is returned by this function. + + *Availability*: + Available in MochiKit 1.3.1+ + + +Style Functions +--------------- + +These functions are available in MochiKit 1.3.1, but have been moved to +:mochiref:`MochiKit.Style` in 1.4+. + + +:mochidef:`computedStyle(htmlElement, cssProperty, mozillaEquivalentCSS)`: + + Looks up a CSS property for the given element. The element can be + specified as either a string with the element's ID or the element + object itself. + + ``cssProperty``: + MochiKit 1.3.1 expects camel case, e.g. ``backgroundColor``. + MochiKit 1.4+ expects CSS selector case, e.g. ``background-color``, + but will accept camel case for backwards-compatibility. + + ``mozillaEquivalentCSS``: + MochiKit 1.3.1 expects selector case. + MochiKit 1.4+ ignores this argument. + + *Availability*: + Available in MochiKit 1.3.1, deprecated in favor of + :mochiref:`MochiKit.Style.getStyle` in 1.4+ + + +:mochidef:`elementDimensions(element)`: + + Return the absolute pixel width and height (including padding and border, + but not margins) of ``element`` as an object with ``w`` and ``h`` + properties, or ``undefined`` if ``element`` is not in the document. + ``element`` may be specified as a string to be looked up with + :mochiref:`getElement`, a DOM element, or trivially as an object with + ``w`` and/or ``h`` properties. + + *Availability*: + Available in MochiKit 1.3.1, deprecated in favor of + :mochiref:`MochiKit.Style.getElementDimensions` in 1.4+ + + +:mochidef:`elementPosition(element[, relativeTo={x: 0, y: 0}])`: + + Return the absolute pixel position of ``element`` in the document + as an object with ``x`` and ``y`` properties, or ``undefined`` if + ``element`` is not in the document. ``element`` may be specified + as a string to be looked up with :mochiref:`getElement`, a DOM + element, or trivially as an object with ``x`` and/or ``y`` + properties. + + If ``relativeTo`` is given, then its coordinates are subtracted from + the absolute position of ``element``, e.g.:: + + var elemPos = elementPosition(elem); + var anotherElemPos = elementPosition(anotherElem); + var relPos = elementPosition(elem, anotherElem); + assert( relPos.x == (elemPos.x - anotherElemPos.x) ); + assert( relPos.y == (elemPos.y - anotherElemPos.y) ); + + ``relativeTo`` may be specified as a string to be looked up with + :mochiref:`getElement`, a DOM element, or trivially as an object + with ``x`` and/or ``y`` properties. + + *Availability*: + Available in MochiKit 1.3.1, deprecated in favor of + :mochiref:`MochiKit.Style.getElementPosition` in 1.4+ + + +:mochidef:`getViewportDimensions()`: + + Return the pixel width and height of the viewport as an object + with ``w`` and ``h`` properties. ``element`` is looked up with + :mochiref:`getElement`, so string identifiers are also acceptable. + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.getViewportDimensions` in 1.4+ + + +:mochidef:`hideElement(element, ...)`: + + Partial form of :mochiref:`setDisplayForElement`, specifically:: + + partial(setDisplayForElement, "none") + + For information about the caveats of using a ``style.display`` + based show/hide mechanism, and a CSS based alternative, see + `Element Visibility`_. + +.. _`Element Visibility`: Style.html#element-visibility + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.hideElement` in 1.4+ + + +:mochidef:`setElementDimensions(element, dimensions[, units='px'])`: + + Sets the dimensions of ``element`` in the document from an object + with ``w`` and ``h`` properties. + + ``node``: + A reference to the DOM element to update (if a string is + given, :mochiref:`getElement(node)` will be used to locate the + node) + + ``dimensions``: + An object with ``w`` and ``h`` properties + + ``units``: + Optionally set the units to use, default is ``px`` + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.setElementDimensions` in 1.4+ + + +:mochidef:`setElementPosition(element, position[, units='px'])`: + + Sets the absolute position of ``element`` in the document from an + object with ``x`` and ``y`` properties. + + ``node``: + A reference to the DOM element to update (if a string is + given, :mochiref:`getElement(node)` will be used to locate the + node) + + ``position``: + An object with ``x`` and ``y`` properties + + ``units``: + Optionally set the units to use, default is ``px`` + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.setElementPosition` in 1.4+ + + +:mochidef:`setDisplayForElement(display, element[, ...])`: + + Change the ``style.display`` for the given element(s). Usually + used as the partial forms: + + - :mochiref:`showElement(element, ...)` + - :mochiref:`hideElement(element, ...)` + + Elements are looked up with :mochiref:`getElement`, so string + identifiers are acceptable. + + For information about the caveats of using a ``style.display`` + based show/hide mechanism, and a CSS based alternative, see + `Element Visibility`_. + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.setDisplayForElement` in 1.4+ + + +:mochidef:`setOpacity(element, opacity)`: + + Sets ``opacity`` for ``element``. Valid ``opacity`` values range + from 0 (invisible) to 1 (opaque). ``element`` is looked up with + :mochiref:`getElement`, so string identifiers are also acceptable. + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.setOpacity` in 1.4+ + + +:mochidef:`showElement(element, ...)`: + + Partial form of :mochiref:`setDisplayForElement`, specifically:: + + partial(setDisplayForElement, "block") + + For information about the caveats of using a ``style.display`` + based show/hide mechanism, and a CSS based alternative, see + `Element Visibility`_. + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.showElement` in 1.4+ + + +Style Objects +------------- + +These objects are available in MochiKit 1.3.1, but have been moved to +:mochiref:`MochiKit.Style` in 1.4+. + +:mochidef:`Coordinates(x, y)`: + + Constructs an object with ``x`` and ``y`` properties. ``obj.toString()`` + returns something like ``{x: 0, y: 42}`` for debugging. + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.Coordinates` in 1.4+ + +:mochidef:`Dimensions(w, h)`: + + Constructs an object with ``w`` and ``h`` properties. ``obj.toString()`` + returns something like ``{w: 0, h: 42}`` for debugging. + + *Availability*: + Available in MochiKit 1.3.1, moved to + :mochiref:`MochiKit.Style.Dimensions` in 1.4+ + + + +See Also +======== + +.. [1] Nevow, a web application construction kit for Python: + http://divmod.org/trac/wiki/DivmodNevow +.. [2] nevow.stan is a domain specific language for Python (read as + "crazy getitem/call overloading abuse") that Donovan and I + schemed up at PyCon 2003 at this super ninja Python/C++ + programmer's (David Abrahams) hotel room. Donovan later + inflicted this upon the masses in Nevow. Check out the Nevow + Guide for some examples: + http://divmod.org/trac/wiki/DivmodNevow + + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/DateTime.rst b/mochikit_v14/doc/rst/MochiKit/DateTime.rst new file mode 100755 index 0000000..48f36e3 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/DateTime.rst @@ -0,0 +1,145 @@ +.. title:: MochiKit.DateTime - "what time is it anyway?" + +Name +==== + +MochiKit.DateTime - "what time is it anyway?" + + +Synopsis +======== + +:: + + stringDate = toISOTimestamp(new Date()); + dateObject = isoTimestamp(stringDate); + + +Description +=========== + +Remote servers don't give you JavaScript Date objects, and they +certainly don't want them from you, so you need to deal with string +representations of dates and timestamps. MochiKit.Date does that. + + +Dependencies +============ + +None. + + +API Reference +============= + +Functions +--------- + +:mochidef:`isoDate(str)`: + + Convert an ISO 8601 date (YYYY-MM-DD) to a ``Date`` object. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`isoTimestamp(str)`: + + Convert any ISO 8601 [1]_ timestamp (or something reasonably close + to it) to a ``Date`` object. Will accept the "de facto" form: + + YYYY-MM-DD hh:mm:ss + + or (the proper form): + + YYYY-MM-DDThh:mm:ssZ + + If a time zone designator ("Z" or "[+-]HH:MM") is not present, + then the local timezone is used. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toISOTime(date)`: + + Convert a ``Date`` object to a string in the form of hh:mm:ss + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toISOTimestamp(date, realISO=false)`: + + Convert a ``Date`` object to something that's ALMOST but not quite + an ISO 8601 [1]_timestamp. If it was a proper ISO timestamp it + would be: + + YYYY-MM-DDThh:mm:ssZ + + However, we see junk in SQL and other places that looks like this: + + YYYY-MM-DD hh:mm:ss + + So, this function returns the latter form, despite its name, + unless you pass ``true`` for ``realISO``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toISODate(date)`: + + Convert a ``Date`` object to an ISO 8601 [1]_ date string + (YYYY-MM-DD) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`americanDate(str)`: + + Converts a MM/DD/YYYY date to a ``Date`` object + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toPaddedAmericanDate(date)`: + + Converts a ``Date`` object to an MM/DD/YYYY date, e.g. 01/01/2001 + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toAmericanDate(date)`: + + Converts a ``Date`` object to an M/D/YYYY date, e.g. 1/1/2001 + + *Availability*: + Available in MochiKit 1.3.1+ + + +See Also +======== + +.. [1] W3C profile of ISO 8601: http://www.w3.org/TR/NOTE-datetime + + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/DragAndDrop.rst b/mochikit_v14/doc/rst/MochiKit/DragAndDrop.rst new file mode 100755 index 0000000..b42caf4 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/DragAndDrop.rst @@ -0,0 +1,197 @@ +.. title:: MochiKit.DragAndDrop - drag and drop elements with MochiKit + +Name +==== + +MochiKit.DragAndDrop - drag and drop elements with MochiKit + +Synopsis +======== + +:: + + // Create a draggable + new Draggable('mydrag'); + + // Create a corresponding droppable + new Droppable('mydrop', { + accept: ['drag-class'], + ondrop: function (element) { + alert('"' + element.id + '" was dropped on me'); + } + }); + +Description +=========== + +MochiKit.DragAndDrop enables you the power of dragging elements +through your pages, for richer interfaces. + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.Iter` +- :mochiref:`MochiKit.DOM` +- :mochiref:`MochiKit.Color` +- :mochiref:`MochiKit.Visual` +- :mochiref:`MochiKit.Signal` + +Overview +======== + +The implementation was adapted from Scriptaculous_. + +.. _Scriptaculous: http://script.aculo.us + +API Reference +============= + +Constructors +------------ + +:mochidef:`Draggable(element[, options])`: + + A object that can be drag with the mouse. + + You have the following options, with corresponding default values: + + ``handle (false)``: + Option for giving the element where starting the drag. By + default it's the element itself, but you can either put a + class of a subelement or the id of another element as handle. + + ``starteffect (MochiKit.Visual.Opacity)``: + Function called once the drag has begun, taking the dragged + element as argument. It's an effect by default but you can + define any callback. + + ``reverteffect (MochiKit.Visual.Move)``: + Effect applied when drag is cancelled. You have to define the + ``revert`` option to enable the call. By default it brings the + element back to its initial position, so you should know what + you want when you modify this. The function should return an + effect that can be cancelled. + + ``endeffect (MochiKit.Visual.Opacity)``: + Pending part of starteffect. If you have modified your element + during start, you'd usually want to revert it in the function. + + ``zindex (1000)``: + Zindex of the drag element. By default it brings it to front. + + ``revert (false)``: + Indicate if the reverteffect function should be called. If you + define a function here, this function will be called before + reverteffect, with the element as first argument. + + ``snap (false)``: + Define the behaviour of the drag element when moving. It can + either be a function, a value or an array of two values. If + it's a function, it should take the (x, y) position of the + element as arguments, and return the position draw in the + browser. If its a value, it's used as a modulo for each + coordinates. If it's an array, each value is applied for the + corresponding coordinate. + + ``selectclass (null)``: + If defined, name of CSS class applied during the drag. + + ``ghosting (null)``: + Make a ghost from the draggable: clone it at start, then + remove the clone at end. + + ``onchange (MochiKit.Base.noop)``: + Function called when updates are made on the draggable object. + + ``scroll (false)``: + Element to scroll around, if precised. For example, 'window' + will allow the draggable to scroll in the page. + + ``scrollSensitivity (20)``: + Scroll sensitivity, used when scroll is used. + + ``scrollSpeed (15)``: + Scroll speed, used when scroll is used. + + A draggable generates some signals during its lifetime: start, drag and + end. They are available through the Draggables handler, and are called + with a draggable as argument. You can register a callback for these events + like this:: + + onStart = function (draggable) { + // Do some stuff + }; + + connect(Draggables, 'start', onStart); + + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Droppable(element[, options])`: + + A object where you can drop a draggable. + + You have the following options, with corresponding default values: + + ``greedy (true)``: + Stop on this droppable when a draggable drops over it. + + ``hoverclass (null)``: + If defined, name of CSS class applied when a draggable is + hover the droppable element (hover state). + + ``hoverfunc (MochiKit.Base.noop)``: + Function called on hover state. + + ``accept (null)``: + Array of CSS classes allowed to drop on this. + + ``activeclass (null)``: + If defined, name of CSS class applied if a possible draggable + begins its start (active state). + + ``onactive (MochiKit.Base.noop)``: + Function called on active state. + + ``containment ([])``: + Specify a list of elements to check for active state: only the + children of the specified elements can be dropped. Mainly + useful for Sortable. + + ``onhover (MochiKit.Base.noop)``: + Specific hover function, mainly used for Sortable. + + ``ondrop (MochiKit.Base.noop)``: + Function called when a draggable is dropped. The function + takes three arguments: the draggable element, the droppable + element, and the event that raised the drop. + + *Availability*: + Available in MochiKit 1.4+ + + +Authors +======= + +- Thomas Herve +- Bob Ippolito +- Originally adapted from Script.aculo.us + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php + +Portions adapted from `Scriptaculous`_ are available under the terms +of the `MIT License`_. + + diff --git a/mochikit_v14/doc/rst/MochiKit/Format.rst b/mochikit_v14/doc/rst/MochiKit/Format.rst new file mode 100755 index 0000000..f1e29ac --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Format.rst @@ -0,0 +1,249 @@ +.. title:: MochiKit.Format - string formatting goes here + +Name +==== + +MochiKit.Format - string formatting goes here + + +Synopsis +======== + +:: + + assert( truncToFixed(0.12345, 4) == "0.1234" ); + assert( roundToFixed(0.12345, 4) == "0.1235" ); + assert( twoDigitAverage(1, 0) == "0" ); + assert( twoDigitFloat(1.2345) == "1.23" ); + assert( twoDigitFloat(1) == "1" ); + assert( percentFormat(1.234567) == "123.46%" ); + assert( numberFormatter("###,###%")(125) == "12,500%" ); + assert( numberFormatter("##.000")(1.25) == "1.250" ); + + +Description +=========== + +Formatting strings and stringifying numbers is boring, so a couple +useful functions in that domain live here. + + +Dependencies +============ + +None. + + +Overview +======== + +Formatting Numbers +------------------ + +MochiKit provides an extensible number formatting facility, modeled +loosely after the Number Format Pattern Syntax [1]_ from Java. +:mochiref:`numberFormatter(pattern[, placeholder=""[, +locale="default"])` returns a function that converts Number to string +using the given information. ``pattern`` is a string consisting of +the following symbols: + ++-----------+---------------------------------------------------------------+ +| Symbol | Meaning | ++===========+===============================================================+ +| ``-`` | If given, used as the position of the minus sign | +| | for negative numbers. If not given, the position | +| | to the left of the first number placeholder is used. | ++-----------+---------------------------------------------------------------+ +| ``#`` | The placeholder for a number that does not imply zero | +| | padding. | ++-----------+---------------------------------------------------------------+ +| ``0`` | The placeholder for a number that implies zero padding. | +| | If it is used to the right of a decimal separator, it | +| | implies trailing zeros, otherwise leading zeros. | ++-----------+---------------------------------------------------------------+ +| ``,`` | The placeholder for a "thousands separator". May be used | +| | at most once, and it must be to the left of a decimal | +| | separator. Will be replaced by ``locale.separator`` in the | +| | result (the default is also ``,``). | ++-----------+---------------------------------------------------------------+ +| ``.`` | The decimal separator. The quantity of ``#`` or ``0`` | +| | after the decimal separator will determine the precision of | +| | the result. If no decimal separator is present, the | +| | fractional precision is ``0`` -- meaning that it will be | +| | rounded to the nearest integer. | ++-----------+---------------------------------------------------------------+ +| ``%`` | If present, the number will be multiplied by ``100`` and | +| | the ``%`` will be replaced by ``locale.percent``. | ++-----------+---------------------------------------------------------------+ + + +API Reference +============= + +Functions +--------- + +:mochidef:`formatLocale(locale="default")`: + + Return a locale object for the given locale. ``locale`` may be + either a string, which is looked up in the + ``MochiKit.Format.LOCALE`` object, or a locale object. If no + locale is given, ``LOCALE.default`` is used (equivalent to + ``LOCALE.en_US``). + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`lstrip(str, chars="\\s")`: + + Returns a string based on ``str`` with leading whitespace + stripped. + + If ``chars`` is given, then that expression will be used instead + of whitespace. ``chars`` should be a string suitable for use in a + ``RegExp`` ``[character set]``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`numberFormatter(pattern, placeholder="", locale="default")`: + + Return a function ``formatNumber(aNumber)`` that formats numbers + as a string according to the given pattern, placeholder and + locale. + + ``pattern`` is a string that describes how the numbers should be + formatted, for more information see `Formatting Numbers`_. + + ``locale`` is a string of a known locale (en_US, de_DE, fr_FR, + default) or an object with the following fields: + + +-----------+-----------------------------------------------------------+ + | separator | The "thousands" separator for this locale (en_US is ",") | + +-----------+-----------------------------------------------------------+ + | decimal | The decimal separator for this locale (en_US is ".") | + +-----------+-----------------------------------------------------------+ + | percent | The percent symbol for this locale (en_US is "%") | + +-----------+-----------------------------------------------------------+ + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`percentFormat(someFloat)`: + + Roughly equivalent to: ``sprintf("%.2f%%", someFloat * 100)`` + + In new code, you probably want to use: + :mochiref:`numberFormatter("#.##%")(someFloat)` instead. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`roundToFixed(aNumber, precision)`: + + Return a string representation of ``aNumber``, rounded to + ``precision`` digits with trailing zeros. This is similar to + ``Number.toFixed(aNumber, precision)``, but this has + implementation consistent rounding behavior (some versions of + Safari round 0.5 down!) and also includes preceding ``0`` for + numbers less than ``1`` (Safari, again). + + For example, :mochiref:`roundToFixed(0.1357, 2)` returns ``0.14`` + on every supported platform, where some return ``.13`` for + ``(0.1357).toFixed(2)``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`rstrip(str, chars="\\s")`: + + Returns a string based on ``str`` with trailing whitespace stripped. + + If ``chars`` is given, then that expression will be used instead + of whitespace. ``chars`` should be a string suitable for use in a + ``RegExp`` ``[character set]``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`strip(str, chars="\\s")`: + + Returns a string based on ``str`` with leading and trailing + whitespace stripped (equivalent to :mochiref:`lstrip(rstrip(str, + chars), chars)`). + + If ``chars`` is given, then that expression will be used instead + of whitespace. ``chars`` should be a string suitable for use in a + ``RegExp`` ``[character set]``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`truncToFixed(aNumber, precision)`: + + Return a string representation of ``aNumber``, truncated to + ``precision`` digits with trailing zeros. This is similar to + ``aNumber.toFixed(precision)``, but this truncates rather than + rounds and has implementation consistent behavior for numbers less + than 1. Specifically, :mochiref:`truncToFixed(aNumber, + precision)` will always have a preceding ``0`` for numbers less + than ``1``. + + For example, :mochiref:`truncToFixed(0.1357, 2)` returns ``0.13``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`twoDigitAverage(numerator, denominator)`: + + Calculate an average from a numerator and a denominator and return + it as a string with two digits of precision (e.g. "1.23"). + + If the denominator is 0, "0" will be returned instead of ``NaN``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`twoDigitFloat(someFloat)`: + + Roughly equivalent to: ``sprintf("%.2f", someFloat)`` + + In new code, you probably want to use + :mochiref:`numberFormatter("#.##")(someFloat)` instead. + + *Availability*: + Available in MochiKit 1.3.1+ + + +See Also +======== + +.. [1] Java Number Format Pattern Syntax: + http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html + + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/Iter.rst b/mochikit_v14/doc/rst/MochiKit/Iter.rst new file mode 100755 index 0000000..689eec9 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Iter.rst @@ -0,0 +1,454 @@ +.. title:: MochiKit.Iter - itertools for JavaScript; iteration made HARD, and then easy + +Name +==== + +MochiKit.Iter - itertools for JavaScript; iteration made HARD, and +then easy + + +Synopsis +======== + +:: + + + theSum = sum(takewhile( + partial(operator.gt, 10), + imap( + partial(operator.mul, 2), + count() + ) + ) + )); + + assert( theSum == (0 + 0 + 2 + 4 + 6 + 8) ); + + +Description +=========== + +All of the functional programming missing from +:mochiref:`MochiKit.Base` lives here. The functionality in this module +is largely inspired by Python's iteration protocol [1]_, and the +itertools module [2]_. + +MochiKit.Iter defines a standard way to iterate over anything, that +you can extend with :mochiref:`registerIterator`, or by implementing +the ``.iter()`` or ``.__iterator__()`` (in MochiKit 1.4+) protocol. +Iterators are lazy, so it can potentially be +cheaper to build a filter chain of iterators than to build lots of +intermediate arrays. Especially when the data set is very large, but +the result is not. + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` + + +Overview +======== + +Iteration for JavaScript +------------------------ + +The best overview right now is in my Iteration for JavaScript [3]_ +blog entry. This information will migrate here eventually. + +API Reference +============= + +Errors +------ + +:mochidef:`StopIteration`: + + The singleton :mochiref:`MochiKit.Base.NamedError` that signifies + the end of an iterator + + *Availability*: + Available in MochiKit 1.3.1+ + + +Functions +--------- + +:mochidef:`applymap(fun, seq[, self])`: + + ``applymap(fun, seq)`` --> + fun.apply(self, seq0), fun.apply(self, seq1), ... + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`chain(p, q[, ...])`: + + ``chain(p, q, ...)`` --> p0, p1, ... plast, q0, q1, ... + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`count(n=0)`: + + ``count(n=0)`` --> n, n + 1, n + 2, ... + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`cycle(p)`: + + ``cycle(p)`` --> p0, p1, ... plast, p0, p1, ... + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`dropwhile(pred, seq)`: + + ``dropwhile(pred, seq)`` --> seq[n], seq[n + 1], starting when + pred(seq[n]) fails + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`every(iterable, func)`: + + Return ``true`` if ``func(item)`` is ``true`` for every item in + ``iterable``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`exhaust(iterable)`: + + Exhausts an iterable without saving the results anywhere, like + :mochiref:`list(iterable)` when you don't care what the output is. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`forEach(iterable, func[, self])`: + + Call ``func`` for each item in ``iterable``, and don't save the + results. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`groupby(iterable[, keyfunc])`: + + Make an iterator that returns consecutive keys and groups from the + iterable. The key is a function computing a key value for each + element. If not specified or is None, key defaults to an identity + function and returns the element unchanged. Generally, the + iterable needs to already be sorted on the same key function. + + The returned group is itself an iterator that shares the + underlying iterable with :mochiref:`groupby()`. Because the source + is shared, when the groupby object is advanced, the previous group + is no longer visible. So, if that data is needed later, it should + be stored as an array:: + + var groups = []; + var uniquekeys = []; + forEach(groupby(data, keyfunc), function (key_group) { + groups.push(list(key_group[1])); + uniquekeys.push(key_group[0]); + }); + + As a convenience, :mochiref:`groupby_as_array()` is provided to + suit the above use case. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`groupby_as_array(iterable[, keyfunc])`: + + Perform the same task as :mochiref:`groupby()`, except return an + array of arrays instead of an iterator of iterators. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`iextend(lst, iterable)`: + + Just like :mochiref:`list(iterable)`, except it pushes results on + ``lst`` rather than creating a new one. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`ifilter(pred, seq)`: + + ``ifilter(pred, seq)`` --> elements of seq where ``pred(elem)`` is + ``true`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`ifilterfalse(pred, seq)`: + + ``ifilterfalse(pred, seq)`` --> elements of seq where + ``pred(elem)`` is ``false`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`imap(fun, p, q[, ...])`: + + ``imap(fun, p, q, ...)`` --> fun(p0, q0, ...), fun(p1, q1, ...), + ... + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`islice(seq, [start,] stop[, step])`: + + ``islice(seq, [start,] stop[, step])`` --> elements from + seq[start:stop:step] (in Python slice syntax) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`iter(iterable[, sentinel])`: + + Convert the given argument to an iterator (object implementing + ``.next()``). + + 1. If ``iterable`` is an iterator (implements ``.next()``), then + it will be returned as-is. + 2. If ``iterable`` is an iterator factory (implements + ``.iter()``), then the result of ``iterable.iter()`` will be + returned. + 3. If ``iterable`` is a JavaScript 1.7 iterator factory (implements + ``.__iterable__()``), then the result of ``iterable.__iterable__()`` + will be returned (MochiKit 1.4+). + 4. Otherwise, the iterator factory + :mochiref:`MochiKit.Base.AdapterRegistry` is used to find a + match. + 5. If no factory is found, it will throw ``TypeError`` + + Built-in iterator factories are present for Array-like objects, + and objects that implement the ``iterateNext`` protocol (e.g. the + result of Mozilla's ``document.evaluate``). + + When used directly, using an iterator should look like this:: + + var it = iter(iterable); + try { + while (var o = it.next()) { + // use o + } + } catch (e) { + if (e != StopIteration) { + throw e; + } + // pass + } + + This is ugly, so you should use the higher order functions to work + with iterators whenever possible. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`izip(p, q[, ...])`: + + ``izip(p, q, ...)`` --> [p0, q0, ...], [p1, q1, ...], ... + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`list(iterable)`: + + Convert ``iterable`` to a new ``Array`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`next(iterator)`: + + Return ``iterator.next()`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`range([start,] stop[, step])`: + + Return an iterator containing an arithmetic progression of integers. + + ``range(i, j)`` returns :mochiref:`iter([i, i + 1, i + 2, ..., j - + 1])` + + ``start`` (!) defaults to ``0``. When ``step`` is given, it + specifies the increment (or decrement). The end point is omitted! + + For example, ``range(4)`` returns :mochiref:`iter([0, 1, 2, 3])`. + This iterates over exactly the valid indexes for an array of 4 + elements. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`reduce(fn, iterable[, initial])`: + + Apply ``fn(a, b)`` cumulatively to the items of an iterable from + left to right, so as to reduce the iterable to a single value. + + For example:: + + reduce(function (a, b) { return x + y; }, [1, 2, 3, 4, 5]) + + calculates:: + + ((((1 + 2) + 3) + 4) + 5). + + If initial is given, it is placed before the items of the sequence + in the calculation, and serves as a default when the sequence is + empty. + + Note that the above example could be written more clearly as:: + + reduce(operator.add, [1, 2, 3, 4, 5]) + + Or even simpler:: + + sum([1, 2, 3, 4, 5]) + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`registerIteratorFactory(name, check, iterfactory[, override])`: + + Register an iterator factory for use with the iter function. + + ``check`` is a ``function(a)`` that returns ``true`` if ``a`` can + be converted into an iterator with ``iterfactory``. + + ``iterfactory`` is a ``function(a)`` that returns an object with a + ``.next()`` method that returns the next value in the sequence. + + ``iterfactory`` is guaranteed to only be called if ``check(a)`` + returns a true value. + + If ``override`` is ``true``, then it will be made the + highest precedence iterator factory. Otherwise, the lowest. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`repeat(elem[, n])`: + + ``repeat(elem, [,n])`` --> elem, elem, elem, ... endlessly or up + to n times + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`reversed(iterable)`: + + Return a reversed array from iterable. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`some(iterable, func)`: + + Return ``true`` if ``func(item)`` is ``true`` for at least one + item in ``iterable``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`sorted(iterable[, cmp])`: + + Return a sorted array from iterable. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`sum(iterable, start=0)`: + + Returns the sum of a sequence of numbers plus the value of + parameter ``start`` (with a default of 0). When the sequence is + empty, returns start. + + Equivalent to:: + + reduce(operator.add, iterable, start); + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`takewhile(pred, seq)`: + + ``takewhile(pred, seq)`` --> seq[0], seq[1], ... until + pred(seq[n]) fails + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`tee(iterable, n=2)`: + + ``tee(it, n=2)`` --> [it1, it2, it3, ... itn] splits one iterator + into n + + *Availability*: + Available in MochiKit 1.3.1+ + + +See Also +======== + +.. [1] The iteration protocol is described in + PEP 234 - Iterators: http://www.python.org/peps/pep-0234.html +.. [2] Python's itertools + module: http://docs.python.org/lib/module-itertools.html +.. [3] Iteration in JavaScript: http://bob.pythonmac.org/archives/2005/07/06/iteration-in-javascript/ + + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/Logging.rst b/mochikit_v14/doc/rst/MochiKit/Logging.rst new file mode 100755 index 0000000..9ea8b21 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Logging.rst @@ -0,0 +1,345 @@ +.. title:: MochiKit.Logging - we're all tired of alert() + +Name +==== + +MochiKit.Logging - we're all tired of alert() + + +Synopsis +======== + +:: + + log("INFO messages are so boring"); + logDebug("DEBUG messages are even worse"); + log("good thing I can pass", objects, "conveniently"); + + +Description +=========== + +MochiKit.Logging steals some ideas from Python's logging module [1]_, +but completely forgot about the Java [2]_ inspiration. This is a KISS +module for logging that provides enough flexibility to do just about +anything via listeners, but without all the cruft. + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` + + +Overview +======== + +Native Console Logging +---------------------- + +As of MochiKit 1.3, the default logger will log all messages to your +browser's native console. This is currently supported in Safari, Opera +9, and Firefox when the `FireBug`_ extension is installed. MochiKit +1.4 adds support for the relevant APIs for Internet Explorer (the +Debugger and the Atlas framework, see `here`__). + +.. __: http://www.nikhilk.net/Entry.aspx?id=93 +.. _`FireBug`: http://www.joehewitt.com/software/firebug/ + +To disable this behavior:: + + MochiKit.Logging.logger.useNativeConsole = false; + + +Bookmarklet Based Debugging +--------------------------- + +JavaScript is at a serious disadvantage without a standard console for +"print" statements. Everything else has one. The closest thing that +you get in a browser environment is the ``alert`` function, which is +absolutely evil. + +This leaves you with one reasonable solution: do your logging in the +page somehow. The problem here is that you don't want to clutter the +page with debugging tools. The solution to that problem is what we +call BBD, or Bookmarklet Based Debugging [3]_. + +Simply create a bookmarklet for +`javascript:MochiKit.Logging.logger.debuggingBookmarklet()`__, and +whack it whenever you want to see what's in the logger. Of course, +this means you must drink the MochiKit.Logging kool-aid. It's tangy +and sweet, don't worry. + +.. __: javascript:MochiKit.Logging.logger.debuggingBookmarklet() + +Currently this is an ugly ``alert``, but we'll have something spiffy +Real Soon Now, and when we do, you only have to upgrade +MochiKit.Logging, not your bookmarklet! + + +API Reference +============= + +Constructors +------------ + +:mochidef:`LogMessage(num, level, info)`: + + Properties: + + ``num``: + Identifier for the log message + + ``level``: + Level of the log message (``"INFO"``, ``"WARN"``, + ``"DEBUG"``, etc.) + + ``info``: + All other arguments passed to log function as an ``Array`` + + ``timestamp``: + ``Date`` object timestamping the log message + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger([maxSize])`: + + A basic logger object that has a buffer of recent messages plus a + listener dispatch mechanism for "real-time" logging of important + messages. + + ``maxSize`` is the maximum number of entries in the log. If + ``maxSize >= 0``, then the log will not buffer more than that many + messages. So if you don't like logging at all, be sure to pass + ``0``. + + There is a default logger available named "logger", and several of + its methods are also global functions: + + ``logger.log`` -> ``log`` + ``logger.debug`` -> ``logDebug`` + ``logger.warning`` -> ``logWarning`` + ``logger.error`` -> ``logError`` + ``logger.fatal`` -> ``logFatal`` + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger.prototype.addListener(ident, filter, listener)`: + + Add a listener for log messages. + + ``ident`` is a unique identifier that may be used to remove the + listener later on. + + ``filter`` can be one of the following: + + ``null``: + ``listener(msg)`` will be called for every log message + received. + + ``string``: + :mochiref:`logLevelAtLeast(filter)` will be used as the + function (see below). + + ``function``: + ``filter(msg)`` will be called for every msg, if it + returns true then ``listener(msg)`` will be called. + + ``listener`` is a function that takes one argument, a log + message. A log message is an object (:mochiref:`LogMessage` + instance) that has at least these properties: + + ``num``: + A counter that uniquely identifies a log message + (per-logger) + + ``level``: + A string or number representing the log level. If string, + you may want to use ``LogLevel[level]`` for comparison. + + ``info``: + An Array of objects passed as additional arguments to the + ``log`` function. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger.prototype.baseLog(level, message[, ...])`: + + The base functionality behind all of the log functions. The first + argument is the log level as a string or number, and all other + arguments are used as the info list. + + This function is available partially applied as: + + ============== ========= + Logger.debug 'DEBUG' + Logger.log 'INFO' + Logger.error 'ERROR' + Logger.fatal 'FATAL' + Logger.warning 'WARNING' + ============== ========= + + For the default logger, these are also available as global + functions, see the :mochiref:`Logger` constructor documentation + for more info. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger.prototype.clear()`: + + Clear all messages from the message buffer. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger.prototype.debuggingBookmarklet()`: + + Display the contents of the logger in a useful way for browsers. + + Currently, if :mochiref:`MochiKit.LoggingPane` is loaded, then a + pop-up :mochiref:`MochiKit.LoggingPane.LoggingPane` will be + used. Otherwise, it will be an alert with + :mochiref:`Logger.prototype.getMessageText()`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger.prototype.dispatchListeners(msg)`: + + Dispatch a log message to all listeners. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger.prototype.getMessages(howMany)`: + + Return a list of up to ``howMany`` messages from the message + buffer. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger.prototype.getMessageText(howMany)`: + + Get a string representing up to the last ``howMany`` messages in + the message buffer. The default is ``30``. + + The message looks like this:: + + LAST {messages.length} MESSAGES: + [{msg.num}] {msg.level}: {m.info.join(' ')} + [{msg.num}] {msg.level}: {m.info.join(' ')} + ... + + If you want some other format, use + :mochiref:`Logger.prototype.getMessages` and do it yourself. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`Logger.prototype.removeListener(ident)`: + + Remove a listener using the ident given to + :mochiref:`Logger.prototype.addListener` + + *Availability*: + Available in MochiKit 1.3.1+ + + +Functions +--------- + +:mochidef:`alertListener(msg)`: + + Ultra-obnoxious ``alert(...)`` listener + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`log(message[, info[, ...]])`: + + Log an INFO message to the default logger + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`logDebug(message[, info[, ...]])`: + + Log a DEBUG message to the default logger + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`logError(message[, info[, ...]])`: + + Log an ERROR message to the default logger + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`logFatal(message[, info[, ...]])`: + + Log a FATAL message to the default logger + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`logLevelAtLeast(minLevel)`: + + Return a function that will match log messages whose level is at + least minLevel + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`logWarning(message[, info[, ...]])`: + + Log a WARNING message to the default logger + + *Availability*: + Available in MochiKit 1.3.1+ + + +See Also +======== + +.. [1] Python's logging module: http://docs.python.org/lib/module-logging.html +.. [2] PEP 282, where they admit all of the Java influence: http://www.python.org/peps/pep-0282.html +.. [3] Original Bookmarklet Based Debugging blather: http://bob.pythonmac.org/archives/2005/07/03/bookmarklet-based-debugging/ + + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/LoggingPane.rst b/mochikit_v14/doc/rst/MochiKit/LoggingPane.rst new file mode 100755 index 0000000..7a7575e --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/LoggingPane.rst @@ -0,0 +1,128 @@ +.. title:: MochiKit.LoggingPane - Interactive MochiKit.Logging pane + +Name +==== + +MochiKit.LoggingPane - Interactive MochiKit.Logging pane + + +Synopsis +======== + +:: + + // open a pop-up window + createLoggingPane() + // use a div at the bottom of the document + createLoggingPane(true); + + +Description +=========== + +MochiKit.Logging does not have any browser dependencies and is +completely unobtrusive. MochiKit.LoggingPane is a browser-based +colored viewing pane for your :mochiref:`MochiKit.Logging` output that +can be used as a pop-up or inline. + +It also allows for regex and level filtering! MochiKit.LoggingPane is +used as the default +:mochiref:`MochiKit.Logging.debuggingBookmarklet()` if it is loaded. + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.Logging` + + +API Reference +============= + +Constructors +------------ + +:mochidef:`LoggingPane(inline=false, logger=MochiKit.Logging.logger)`: + + A listener for a :mochiref:`MochiKit.Logging` logger with an + interactive DOM representation. + + If ``inline`` is ``true``, then the ``LoggingPane`` will be a + ``DIV`` at the bottom of the document. Otherwise, it will be in a + pop-up window with a name based on the calling page's URL. If + there is an element in the document with an id of + ``_MochiKit_LoggingPane``, it will be used instead of appending a + new ``DIV`` to the body. + + ``logger`` is the reference to the + :mochiref:`MochiKit.Logging.Logger` to listen to. If not + specified, the global default logger is used. + + Properties: + + ``win``: + Reference to the pop-up window (``undefined`` if + ``inline``) + + ``inline``: + ``true`` if the ``LoggingPane`` is inline + + ``colorTable``: + An object with property->value mappings for each log level + and its color. May also be mutated on + ``LoggingPane.prototype`` to affect all instances. For + example:: + + MochiKit.LoggingPane.LoggingPane.prototype.colorTable = { + DEBUG: "green", + INFO: "black", + WARNING: "blue", + ERROR: "red", + FATAL: "darkred" + }; + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`LoggingPane.prototype.closePane()`: + + Close the :mochiref:`LoggingPane` (close the child window, or + remove the ``_MochiKit_LoggingPane`` ``DIV`` from the document). + + *Availability*: + Available in MochiKit 1.3.1+ + + +Functions +--------- + + +:mochidef:`createLoggingPane(inline=false)`: + + Create or return an existing :mochiref:`LoggingPane` for this + document with the given inline setting. This is preferred over + using :mochiref:`LoggingPane` directly, as only one + :mochiref:`LoggingPane` should be present in a given document. + + *Availability*: + Available in MochiKit 1.3.1+ + + +Authors +======= + +- Bob Ippolito + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/Position.rst b/mochikit_v14/doc/rst/MochiKit/Position.rst new file mode 100644 index 0000000..1d459cf --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Position.rst @@ -0,0 +1,26 @@ +.. title:: MochiKit.Position - DOM Position manipulation API + +Name +==== + +MochiKit.Position - DOM Position manipulation API + + +Synopsis +======== + +This module is experimental and is present in MochiKit 1.4+ only. No +functions are currently exported from this module. Documentation is +forthcoming. + + +Copyright +========= + +Copyright 2005-2006 Bob Ippolito , and others. +This program is dual-licensed free +software; you can redistribute it and/or modify it under the terms of +the `MIT License`_ or the `Academic Free License v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/Selector.rst b/mochikit_v14/doc/rst/MochiKit/Selector.rst new file mode 100644 index 0000000..5c1c6ab --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Selector.rst @@ -0,0 +1,182 @@ +.. title:: MochiKit.Selector - Selecting elements by CSS selector syntax + +Name +==== + +MochiKit.Selector - Selecting elements by CSS selector syntax + + +Synopsis +======== + +:: + + MochiKit.Base.map(MochiKit.Visual.fade, $$('p.fademe')); + + +Description +=========== + +MochiKit.Selector provides utilities to select elements by CSS +selector syntax. In particular it provides the :mochiref:`$$` +function. + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.DOM` +- :mochiref:`MochiKit.Iter` + + +Overview +======== + +This module provides facilities to select childs of a DOM node by +using CSS selector syntax. In particular, it provides the +:mochiref:`$$` function, which performs such a selection on the +current document. + +Many of CSS3 [1]_ selectors are supported: + +- Select by tag name (``A``) +- Select by class (``.theclass``) +- Select by id (``#someid``) +- Combinators + - Descendant: ``E F`` + - Child: ``E > F`` + - Immediate following sibling: ``E + F`` + - Following sibling: ``E ~ F`` +- Attribute selectors + - simple "has attribute" (without operator) + - ``=`` equal + - ``!=`` not equal (not in CSS std.) + - ``~=`` word containment + - ``^=`` starts-with + - ``$=`` ends-with + - ``*=`` substring containment + - ``|=`` first part of hyphen deleimited (eg. lang|="en" matches lang="en-US") +- Pseudo-classes + - ``:root``, ``:nth-child``, ``:nth-last-child``, ``:nth-of-type``, ``:nth-last-of-type``, ``:first-child``, ``:last-child``, ``:first-of-type``, ``:last-of-type``, ``:only-child``, ``:only-of-type``, ``:empty``, ``:enabled``, ``:disabled``, ``:checked``, ``:not()`` + +Multiple selectors can be concatenated, like this: ``P.quote[author~='Torvalds']``, +in which case elements matching *all* the selectors are returned. Furthermore, such +concatenations can be *combined* by joining them with spaces and combinators. +This invokes the regular CSS behaviour of matching parts of the combination in +sequence, starting off each part from the elements returned by the preceeding part. + +For the ``:nth-*`` pseudoclasses, the ``an+b`` syntax is partially +supported, specifically a and b must be non-negative and only a is +optional (this differs from the CSS std.) Also, ``odd`` and ``even`` +are supported, e.g. ``table tr:nth-child(odd)`` gives you every +other row of table starting with the first one. + +For further documentation of CSS selectors, refer to the W3C CSS standard. [1]_ + +The original version of this module was ported from Prototype. + +**Note:** Due to how Internet Explorer handles node attributes, some attribute +selectors may not work as expected. In particular ``a[title]`` will not work +as all ``A`` elements in the Internet Explorer DOM model have a title attribute +regardless of whether it's specified in the markup or not. + + +API Reference +============= + +Functions +--------- + +:mochidef:`$$(expression[, ...])`: + + Performs a selection on the active document. Equivalent + to ``findChildElements(MochiKit.DOM.currentDocument(), [expression, ...])`` + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`findChildElements(element, expressions)`: + + Traverses the child nodes of ``element`` and returns the subset + of those that match any of the selector expressions in ``expressions``. + + Each expression can be a combination of simple expressions, by concatenating + them with spaces or combinators. In that case, normal CSS rules apply, each + simple expression is evaluated in turn and the results of that one is used + as the scope for the succeeding expression (see :mochiref:`Selector.findElements`). + Finally, the results of the last simple expression is returned as the search result. + + *Availability*: + Available in MochiKit 1.4+ + + +Constructors +------------- + +:mochidef:`Selector(simpleExpression)`: + + An object storing the parsed version of a simple CSS selector expression + and providing functions for executing searches. + + *Simple* means that the expression is not a combination of expressions, + i.e. it does not contain any spaces. + + Usually the user would not instantiate or use this object directly, but + heres how:: + + var selector = MochiKit.Selector.Selector('#someelementid'); + var searchResults = selector.findElements(rootElement); + + *Availability*: + Available in MochiKit 1.4+ + +:mochidef:`Selector.findElements(scope[, axis=""])`: + + Performs a search on ``scope``. The value of axis controls what relatives + of ``scope`` are considered. + + ``scope``: + A DOM node that acts as a starting point for the search. + + ``axis``: + One of ``">"``, ``"+"``, ``"~"`` or the empty string (default). + If the empty string, all descendant nodes of ``scope`` are tested against + the expression. If ``>`` only direct child nodes of ``scope`` are tested, + if ``+`` only the next sibling (if any) of ``scope`` is tested and if + ``~`` all succeeding siblings of ``scope`` are tested. + + *Availability*: + Available in MochiKit 1.4+ + + +See Also +======== + +.. [1] CSS Selectors Level 3 (Last Call, oct. 2006): + http://www.w3.org/TR/2005/WD-css3-selectors-20051215/ + + +Authors +======= + +- Arnar Birgisson +- Thomas Herve +- Originally ported from Prototype + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php + +Based on Prototype, (c) 2005 Sam Stephenson, available under the `Prototype +license`_ + +.. _`Prototype license`: http://dev.rubyonrails.org/browser/spinoffs/prototype/LICENSE?rev=3362 diff --git a/mochikit_v14/doc/rst/MochiKit/Signal.rst b/mochikit_v14/doc/rst/MochiKit/Signal.rst new file mode 100755 index 0000000..4c097a8 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Signal.rst @@ -0,0 +1,468 @@ +.. title:: MochiKit.Signal - Simple universal event handling +.. |---| unicode:: U+2014 .. em dash, trimming surrounding whitespace + :trim: + +Name +==== + +MochiKit.Signal - Simple universal event handling + + +Synopsis +======== + +Signal for DOM events:: + + // DOM events are also signals. Connect freely! The functions will be + // called with the custom event as a parameter. + + // calls myClicked.apply(getElement('myID'), [event]) + connect('myID', 'onclick', myClicked); + + // calls wasClicked.apply(myObject, [event]) + connect('myID', 'onclick', myObject, wasClicked); + + // calls myObject.wasClicked(event) + connect('myID', 'onclick', myObject, 'wasClicked'); + + // the event is normalized, no more e = e || window.event! + myObject.wasClicked = function(e) { + var crossBrowserCoordinates = e.mouse().page; + // e.mouse().page is a MochiKit.Style.Coordinates object + } + + +Signal for non-DOM events:: + + // otherObject.gotFlash() will be called when 'flash' signalled. + connect(myObject, 'flash', otherObject, 'gotFlash'); + + // gotBang.apply(otherObject, [...]) will be called when 'bang' signalled. + // You can access otherObject from within gotBang as 'this'. + connect(myObject, 'bang', otherObject, gotBang); + + // myFunc.apply(myObject, [...]) will be called when 'flash' signalled. + // You can access myObject from within myFunc as 'this'. + var ident = connect(myObject, 'flash', myFunc); + + // You may disconnect with the return value from connect + disconnect(ident); + + // Signal can take parameters. These will be passed along to the + // connected functions. + signal(myObject, 'flash'); + signal(myObject, 'bang', 'BANG!'); + + +Description +=========== + +Event handling was never so easy! + +This module takes care of all the hard work |---| figuring out which +event model to use, trying to retrieve the event object, and handling +your own internal events, as well as cleanup when the page is unloaded +to clean up IE's nasty memory leakage. + +This event system is largely based on Qt's signal/slot system. Read +more on how that is handled and also how it is used in model/view +programming at: http://doc.trolltech.com/ + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.DOM` + + +Overview +======== + +Using Signal for DOM Events +--------------------------- + +When using MochiKit.Signal, do not use the browser's native event +API. That means, no ``onclick="blah"``, no +``elem.addEventListener(...)``, and certainly no +``elem.attachEvent(...)``. This also means that +:mochiref:`MochiKit.DOM.addToCallStack` and +:mochiref:`MochiKit.DOM.addLoadEvent` should not be used in +combination with this module. + +Signals for DOM objects are named with the ``'on'`` prefix, e.g.: +``'onclick'``, ``'onkeyup'``, etc. + +When the signal fires, your slot will be called with one parameter, +the custom event object. + + +Custom Event Objects for DOM events +----------------------------------- + +Signals triggered by DOM events are called with a custom event object +as a parameter. The custom event object presents a consistent view of +the event across all supported platforms and browsers, and provides +many conveniences not available even in a correct W3C implementation. + +See the `DOM Custom Event Object Reference`_ for a detailed API +description of this object. + +If you find that you're accessing the native event for any reason, +create a `new ticket`_ and we'll look into normalizing the behavior +you're looking for. + +.. _`new ticket`: http://trac.mochikit.com/newticket +.. _`Safari bug 6595`: http://bugs.webkit.org/show_bug.cgi?id=6595 +.. _`Safari bug 7790`: http://bugs.webkit.org/show_bug.cgi?id=7790 +.. _`Safari bug 8707`: http://bugs.webkit.org/show_bug.cgi?id=8707 +.. _`stopPropagation()`: http://developer.mozilla.org/en/docs/DOM:event.stopPropagation +.. _`preventDefault()`: http://developer.mozilla.org/en/docs/DOM:event.preventDefault + + +Memory Usage +------------ + +Any object that has connected slots (via :mochiref:`connect()`) is +referenced by the Signal mechanism until it is disconnected via +:mochiref:`disconnect()` or :mochiref:`disconnectAll()`. + +Signal does not leak. It registers an ``'onunload'`` event that +disconnects all objects on the page when the browser leaves the +page. However, memory usage will grow during the page view for every +connection made until it is disconnected. Even if the DOM object is +removed from the document, it will still be referenced by Signal until +it is explicitly disconnected. + +In order to conserve memory during the page view, +:mochiref:`disconnectAll()` any DOM elements that are about to be +removed from the document. + + +Synthesized Events +------------------ + +Certain events supported by MochiKit are not generated natively by all +browsers. MochiKit can synthesize these events even for non-supporting +browsers, however, by watching for related events and triggering the +appropriate signals at the right times. + +These events include: + +``onmouseenter`` + + Similar to ``'onmouseover'``, but does not "bubble" up to parent + nodes. Such bubbling is often a cause of confusion. On an + ``'onmouseenter'`` event, you can be certain that the mouse has + left the node attached to the event. + + *Availability:* + Available in MochiKit 1.4+ + +``onmouseleave`` + + Similar to ``'onmouseout'``, but does not "bubble" up to parent + nodes. This is the analog to ``'onmouseenter'``. + + *Availability:* + Available in MochiKit 1.4+ + + +Using Signal for non-DOM objects +-------------------------------- + +Signals are triggered with the :mochiref:`signal(src, 'signal', ...)` +function. Additional parameters passed to this are passed onto the +connected slots. Explicit signals are not required for DOM events. + +Slots that are connected to a signal are called in the following +manner when that signal is signalled: + +- If the slot was a single function, then it is called with ``this`` + set to the object originating the signal with whatever parameters + it was signalled with. + +- If the slot was an object and a function, then it is called with + ``this`` set to the object, and with whatever parameters it was + signalled with. + +- If the slot was an object and a string, then ``object[string]`` is + called with the parameters to the signal. + + +API Reference +============= + + +Signal API Reference +-------------------- + +:mochidef:`connect(src, signal, dest[, func])`: + + Connects a signal to a slot, and return a unique identifier that + can be used to disconnect that signal. + + ``src`` is the object that has the signal. You may pass in a + string, in which case, it is interpreted as an id for an HTML + element. + + ``signal`` is a string that represents a signal name. If 'src' is + an HTML Element, ``window``, or the ``document``, then it can be + one of the 'on-XYZ' events. You must include the 'on' prefix, and + it must be all lower-case. + + ``dest`` and ``func`` describe the slot, or the action to take + when the signal is triggered. + + - If ``dest`` is an object and ``func`` is a string, then + ``dest[func].apply(dest, [...])`` will be called when the + signal is signalled. + + - If ``dest`` is an object and ``func`` is a function, then + ``func.apply(dest, [...])`` will be called when the signal + is signalled. + + - If ``func`` is undefined and ``dest`` is a function, then + ``dest.apply(src, [...])`` will be called when the signal is + signalled. + + No other combinations are allowed and will raise an exception. + + The return value can be passed to :mochiref:`disconnect` to + disconnect the signal. + + In MochiKit 1.4+, if ``src`` is an object that has a ``__connect__`` + method, then ``src.__connect__(ident, signal, objOrFunc, funcOrStr)`` + will be called. This method may be used to disconnect the signal. + DOM objects can not implement this feature. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`disconnect(ident)`: + + To disconnect a signal, pass its ident returned by + :mochiref:`connect()`. This is similar to how the browser's + ``setTimeout`` and ``clearTimeout`` works. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`disconnectAll(src[, signal, ...])`: + + ``disconnectAll(src)`` removes all signals from src. + + ``disconnectAll(src, 'onmousedown', 'mySignal')`` will remove all + ``'onmousedown'`` and ``'mySignal'`` signals from src. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`disconnectAllTo(dest[, func])`: + + ``disconnectAllTo(dest)`` removes all signals connected to dest. + + ``disconnectAllTo(dest, func)`` will remove all + signals connected to dest using func. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`signal(src, signal, ...)`: + + This will signal a signal, passing whatever additional parameters + on to the connected slots. ``src`` and ``signal`` are the same as + for :mochiref:`connect()`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +DOM Custom Event Object Reference +--------------------------------- + +:mochidef:`event()`: + + The native event produced by the browser. You should not need to + use this. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`src()`: + + The element that this signal is connected to. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`type()`: + + The event type (``'click'``, ``'mouseover'``, ``'keypress'``, + etc.) as a string. Does not include the ``'on'`` prefix. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`target()`: + + The element that triggered the event. This may be a child of + :mochiref:`src()`. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`modifier()`: + + Returns ``{shift, ctrl, meta, alt, any}``, where each property is + ``true`` if its respective modifier key was pressed, ``false`` + otherwise. ``any`` is ``true`` if any modifier is pressed, + ``false`` otherwise. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`stopPropagation()`: + + Works like W3C's `stopPropagation()`_. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`preventDefault()`: + + Works like W3C's `preventDefault()`_. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`stop()`: + + Shortcut that calls ``stopPropagation()`` and + ``preventDefault()``. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`key()`: + + Returns ``{code, string}``. + + Use ``'onkeydown'`` and ``'onkeyup'`` handlers to detect control + characters such as ``'KEY_F1'``. Use the ``'onkeypress'`` + handler to detect "printable" characters, such as ``'é'``. + + When a user presses F1, in ``'onkeydown'`` and ``'onkeyup'`` this + method returns ``{code: 122, string: 'KEY_F1'}``. In + ``'onkeypress'``, it returns ``{code: 0, string: ''}``. + + If a user presses Shift+2 on a US keyboard, this method returns + ``{code: 50, string: 'KEY_2'}`` in ``'onkeydown'`` and + ``'onkeyup'``. In ``'onkeypress'``, it returns ``{code: 64, + string: '@'}``. + + See ``_specialKeys`` in the source code for a comprehensive list + of control characters. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`mouse()`: + + Properties for ``'onmouse*'``, ``'onclick'``, ``'ondblclick'``, + and ``'oncontextmenu'``: + + - ``page`` is a :mochiref:`MochiKit.Style.Coordinates` object + that represents the cursor position relative to the HTML + document. Equivalent to ``pageX`` and ``pageY`` in + Safari, Mozilla, and Opera. + + - ``client`` is a :mochiref:`MochiKit.Style.Coordinates` + object that represents the cursor position relative to the + visible portion of the HTML document. Equivalent to + ``clientX`` and ``clientY`` on all browsers. Current versions of + Safari incorrectly return clientX as relative to the canvas + instead of relative to the viewport (`Safari Bug 8707`_). + + Properties for ``'onmouseup'``, ``'onmousedown'``, ``'onclick'``, + and ``'ondblclick'``: + + - ``mouse().button`` returns ``{left, right, middle}`` where + each property is ``true`` if the mouse button was pressed, + ``false`` otherwise. + + Known browser bugs: + + - Current versions of Safari won't signal ``'ondblclick'`` + when attached via ``connect()`` (`Safari Bug 7790`_). + + - In Safari < 2.0.4, calling ``preventDefault()`` or ``stop()`` + in ``'onclick'`` events signalled from ```` tags does not + prevent the browser from following those links. + + - Mac browsers don't report right-click consistently. Firefox + signals the slot and sets ``modifier().ctrl`` to true, + Opera signals the slot and sets ``modifier().meta`` to + ``true``, and Safari doesn't signal the slot at all + (`Safari Bug 6595`_). + + To find a right-click in Safari, Firefox, and IE, you can + connect an element to ``'oncontextmenu'``. This doesn't + work in Opera. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`relatedTarget()`: + + Returns the document element that the mouse has moved to. This is + generated for ``'onmouseover'`` and ``'onmouseout'`` events. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`confirmUnload(msg)`: + + In browsers that support the ``'onbeforeunload'`` event (IE and + Firefox), calling this in the event handler will show a dialog box + that allows the user to confirm or cancel the navigation away from + the page. + + *Availability*: + Available in MochiKit 1.4+ + + +Authors +======= + +- Jonathan Gardner +- Beau Hartshorne +- Bob Ippolito + + +Copyright +========= + +Copyright 2006 Jonathan Gardner , Beau +Hartshorne , and Bob Ippolito +. This program is dual-licensed free software; you +can redistribute it and/or modify it under the terms of the `MIT +License`_ or the `Academic Free License v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/Sortable.rst b/mochikit_v14/doc/rst/MochiKit/Sortable.rst new file mode 100755 index 0000000..7d03b06 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Sortable.rst @@ -0,0 +1,181 @@ +.. title:: MochiKit.Sortable - sortable with drag and drop lists + +Name +==== + +MochiKit.Sortable - sortable with drag and drop lists + + +Synopsis +======== + +:: + +
      +
    • mochibot.com
    • +
    • pythonmac.org
    • +
    • undefined.org
    • +
    • python.org
    • +
    + + + +Description +=========== + +MochiKit.Sortable add a new Sortable object to manipulate easily +drag&drop in lists. + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.Iter` +- :mochiref:`MochiKit.DOM` +- :mochiref:`MochiKit.Color` +- :mochiref:`MochiKit.Visual` +- :mochiref:`MochiKit.Signal` +- :mochiref:`MochiKit.DragAndDrop` + +Overview +======== + +MochiKit.Sortable mainly contains the Sortable object offering +facilities to manipulate a list and drag its items to reorder it. It +can also be serialized for being send to server. It is ported from +Scriptaculous_. + +.. _Scriptaculous: http://script.aculo.us + + +API Reference +============= + +Objects defined +--------------- + +:mochidef:`SortableObserver`: + + Observer for DragAndDrop object. You normally don't have to access + this, only for customization purpose. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Sortable.create(element [, options])`: + + Create a new Sortable. Usually you'll call it with a UL element, + but it can be customized with options to use something else. + + You have the following options: + + ================= ================== + element element + tag 'li' + dropOnEmpty false + overlap 'vertical' + constraint 'vertical' + containment element + handle false + only false + hoverclass null + ghosting false + scroll false + scrollSensitivity 20 + scrollSpeed 15 + format /^[^_]*_(.*)$/ + onChange MochiKit.Base.noop + onUpdate MochiKit.Base.noop + tree false + treeTag 'ul' + ================= ================== + + ``tag``: + Name of the tag used to make the draggable elements. It matches all + the childNodes of the Sortable element with this tag. + + ``only``: + Class or array of classes used to filter the children, combined with + the tag criteria. + + ``format``: + Regular expression which serves as a match filter for serialization, + on children' ids. For example, with the default value, you'll get + ['1', '2', '3', '4'] with ids ['sort_1', 'sort_2', 'sort_3', 'sort_4']. + + ``onChange``: + Callback called when an element moves between others in the Sortable. + It's called for *each* movements, even if you don't release the mouse. + + ``onUpdate``: + Callback called when the order changes in the Sortable. It's called + only if the Sortable is modified, after you dropped an element. + + ``tree``: + Option for creating a Sortable tree. It's an experimental + setting, that can be very slow even with a few elements. You + can customize its behaviour with the ``treeTag`` option, that + defines the node used to make branches in your tree (that + contains leaves). + + Other options are passed to the Draggables and Droppables objects created. + Refer to :mochiref:`MochiKit.DragAndDrop` for more information. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Sortable.destroy(element)`: + + Destroy a previously created sortable. It prevents further use of + the Sortable functionnality on the element, unless recreated. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Sortable.serialize(element [, options])`: + + Serialize the content of a Sortable. Useful to send this content + through a XMLHTTPRequest. The options overrides the ones of the Sortable + only for the serialization. + + ====== ========================================== + tag tag from the Sortable + only only from the Sortable + name id of the element + format format of the Sortable or /^[^_]*_(.*)$ + ====== ========================================== + + *Availability*: + Available in MochiKit 1.4+ + + +Authors +======= + +- Thomas Herve +- Bob Ippolito +- Originally adapted from Script.aculo.us + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php + +Portions adapted from `Scriptaculous`_ are available under the terms +of the `MIT License`_. + +.. _`Apache License, Version 2.0`: http://www.apache.org/licenses/LICENSE-2.0.html + diff --git a/mochikit_v14/doc/rst/MochiKit/Style.rst b/mochikit_v14/doc/rst/MochiKit/Style.rst new file mode 100755 index 0000000..3b5c563 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Style.rst @@ -0,0 +1,309 @@ +.. title:: MochiKit.Style - painless Style manipulation API + +Name +==== + +MochiKit.Style - painless Style manipulation API + + +Synopsis +======== + +:: + + var messagePos = getElementPosition('message'); + var messageSize = getElementDimensions('message'); + + var notifyPos = new MochiKit.Style.Coordinates( + messagePos.x + messageSize.w + 10, + messagePos.y); + + setElementPosition('notify', notifyPos); + + +Description +=========== + +Refactored from :mochiref:`MochiKit.DOM`. + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.DOM` + + +Overview +======== + +Refactored from :mochiref:`MochiKit.DOM`. + + +Element Visibility +------------------ + +The :mochiref:`hideElement` and :mochiref:`showElement` functions are +provided as a convenience, but only work for elements that are +``display: block``. For a general solution to showing, hiding, and +checking the explicit visibility of elements, we recommend using a +solution that involves a little CSS. Here's an example:: + + + + + +MochiKit doesn't ship with such a solution, because there is no +reliable and portable method for adding CSS rules on the fly with +JavaScript. + + +API Reference +============= + +Functions +--------- + +:mochidef:`getStyle(element, cssSelector)`: + + Looks up a CSS property for the given element. The element can be + specified as either a string with the element's ID or the element + object itself. + + ``cssSelector``: + The CSS selector, e.g. ``background-color``. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`setStyle(element, styles)`: + + Set CSS properties on a the given element. The element can be + specified as either a string with the element's ID or the element + object itself. + + ``styles``: + Dictionnary holding CSS properties to set, e.g. + ``{'background-color': 'red', 'opacity': 0.5}``. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`setOpacity(element, opacity)`: + + Sets ``opacity`` for ``element``. Valid ``opacity`` values range + from 0 (invisible) to 1 (opaque). ``element`` is looked up with + :mochiref:`getElement`, so string identifiers are also acceptable. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`getElementDimensions(element)`: + + Return the absolute pixel width and height (including padding and border, + but not margins) of ``element`` as an object with ``w`` and ``h`` + properties, or ``undefined`` if ``element`` is not in the document. + ``element`` may be specified as a string to be looked up with + :mochiref:`getElement`, a DOM element, or trivially as an object with + ``w`` and/or ``h`` properties. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`setElementDimensions(element, dimensions[, units='px'])`: + + Sets the dimensions of ``element`` in the document from an object + with ``w`` and ``h`` properties. + + Warning: IE in quirks-mode seems to behave strange when you set + the height off an element containing text to 0. You can workaround this + by setting the value of visibly/display. + + ``element``: + A reference to the DOM element to update (if a string is + given, :mochiref:`getElement(node)` will be used to locate the + node) + + ``dimensions``: + An object with ``w`` and ``h`` properties. You can also specify only + one property. + + ``units``: + Optionally set the units to use, default is ``px`` + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`getElementPosition(element[, relativeTo={x: 0, y: 0}])`: + + Return the absolute pixel position of ``element`` in the document + as an object with ``x`` and ``y`` properties, or ``undefined`` if + ``element`` is not in the document. ``element`` may be specified + as a string to be looked up with :mochiref:`getElement`, a DOM + element, or trivially as an object with ``x`` and/or ``y`` + properties. + + If ``relativeTo`` is given, then its coordinates are subtracted + from the absolute position of ``element``, e.g.:: + + var elemPos = getElementPosition(elem); + var anotherElemPos = getElementPosition(anotherElem); + var relPos = getElementPosition(elem, anotherElem); + assert( relPos.x == (elemPos.x - anotherElemPos.x) ); + assert( relPos.y == (elemPos.y - anotherElemPos.y) ); + + ``relativeTo`` may be specified as a string to be looked up with + :mochiref:`getElement`, a DOM element, or trivially as an object + with ``x`` and/or ``y`` properties. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`setElementPosition(element, position[, units='px'])`: + + Sets the absolute position of ``element`` in the document from an + object with ``x`` and ``y`` properties. + + ``element``: + A reference to the DOM element to update (if a string is + given, :mochiref:`getElement(node)` will be used to locate the + node) + + ``position``: + An object with ``x`` and ``y`` properties. You can also specify only + one property. + + ``units``: + Optionally set the units to use, default is ``px`` + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`setDisplayForElement(display, element[, ...])`: + + Change the ``style.display`` for the given element(s). Usually + used as the partial forms: + + - :mochiref:`showElement(element, ...)` + - :mochiref:`hideElement(element, ...)` + + Elements are looked up with :mochiref:`getElement`, so string + identifiers are acceptable. + + For information about the caveats of using a ``style.display`` + based show/hide mechanism, and a CSS based alternative, see + `Element Visibility`_. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`showElement(element, ...)`: + + Partial form of :mochiref:`setDisplayForElement`, specifically:: + + partial(setDisplayForElement, "block") + + For information about the caveats of using a ``style.display`` + based show/hide mechanism, and a CSS based alternative, see + `Element Visibility`_. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`hideElement(element, ...)`: + + Partial form of :mochiref:`setDisplayForElement`, specifically:: + + partial(setDisplayForElement, "none") + + For information about the caveats of using a ``style.display`` + based show/hide mechanism, and a CSS based alternative, see + `Element Visibility`_. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`getViewportDimensions()`: + + Return the pixel width and height of the viewport as an object + with ``w`` and ``h`` properties. + + *Availability*: + Available in MochiKit 1.4+ + +:mochidef:`getViewportPosition()`: + + Return the pixel position of the viewport inside the window, as a + :mochiref:`Coordinates` object. + + *Availability*: + Available in MochiKit 1.4+ + + +Objects +------- + +:mochidef:`Coordinates(x, y)`: + + Constructs an object with ``x`` and ``y`` properties. ``obj.toString()`` + returns something like ``{x: 0, y: 42}`` for debugging. + + *Availability*: + Available in MochiKit 1.4+ + +:mochidef:`Dimensions(w, h)`: + + Constructs an object with ``w`` and ``h`` properties. ``obj.toString()`` + returns something like ``{w: 0, h: 42}`` for debugging. + + *Availability*: + Available in MochiKit 1.4+ + + +Authors +======= + +- Bob Ippolito +- Beau Hartshorne + + +Copyright +========= + +Copyright 2005-2006 Bob Ippolito , and Beau Hartshorne +. This program is dual-licensed free +software; you can redistribute it and/or modify it under the terms of +the `MIT License`_ or the `Academic Free License v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/doc/rst/MochiKit/VersionHistory.rst b/mochikit_v14/doc/rst/MochiKit/VersionHistory.rst new file mode 100755 index 0000000..e026e0e --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/VersionHistory.rst @@ -0,0 +1,311 @@ +2006-XX-XX v1.4 + +- MochiKit.Color's HSV to RGB conversion code fixed to return the correct + value (hsv.v for RGB values) in cases where saturation === 0. +- doXHR workaround for a Mozilla bug when calling XMLHttpRequest in certain + situations. Always wraps call in a callLater(0, doXHR, url, opts). +- parseQueryString will now parse values with embedded "=" +- Workaround for a Safari DOM crash when using MochiKit.Iter.list. + http://bugs.webkit.org/show_bug.cgi?id=12191 +- New removeNodeAttribute function in MochiKit.DOM. +- MochiKit.Async.doXHR and dependent functions now accept 201 CREATED and + 204 NO CONTENT as valid. +- MochiKit.DOM.formContents now treats option tags the same way that + form posts do in the case of missing and empty string value attributes, + even in IE. +- MochiKit.Base.queryString now accepts third queryString([names, values]) + form. +- MochiKit.DOM.formContents now defaults to document.body if no element is + given. +- New MochiKit.Selector module +- MochiKit.LoggingPane fixes for Internet Explorer +- MochiKit.DOM now creates XHTML nodes in XUL documents. +- MochiKit.LoggingPane now works on pages with '#' in the URL on IE +- New MochiKit.Async.doXHR as a convenient method for doing custom + XMLHttpRequests (e.g. extra headers, overrideMimeType, etc.) +- New __connect__ protocol for MochiKit.Signal.connect source notifications +- Added colSpan, bgColor to the list of DOM renames for Internet Explorer +- New MochiKit.Signal.disconnectAllTo function +- MochiKit.Base.parseQueryString now accepts leading question mark +- New MochiKit.Base.values function +- Fixed MochiKit.Signal.disconnect when called from a signal handler invoked + by MochiKit.Signal.signal +- parseQueryString now splits on HTML entities equivalent to ampersand as well +- Better XHTML compatibility (removed obvious cases where uppercase tagName or + nodeName was assumed) +- MochiKit.Base.queryString now handles array values in the same way HTML + forms handle multiple elements of the same name. +- MochiKit.Base.parseQueryString now returns {} for empty query string instead + of {"": "undefined"} +- MochiKit.DOM.formContents now handles option value="" correctly. +- MochiKit.DOM now checks for undefined className. +- MochiKit.Iter.groupby() now uses compare() to group rather than == and != +- serializeJSON no longer serializes undefined, as per the JSON spec +- Fixed an infinite recursion bug in serializeJSON if an adapter + returns the object itself. +- New MochiKit.Base.operator.seq and sne to support strict comparison +- MochiKit.Base.isArrayLike no longer returns true for DOM text nodes +- Added readonly-readOnly to the list of DOM renames for Internet Explorer +- New MochiKit.Signal event method: confirmUnload (sets returnValue for + onbeforeunload) +- Fix interpreter help() function for Firefox and IE +- API version compatibility notes added +- New MochiKit.Base functions methodcaller and compose +- Support IE-based native console logging (Debugger, Atlas) +- Refactored style functions from MochiKit.DOM to MochiKit.Style +- MochiKit.Async.DeferredList is now a proper Deferred +- MochiKit.DOM.formContents now supports SELECT multiple tags +- Re-use StopIteration Error if the browser already has it +- Workaround IE type="" bug for INPUT elements +- Allow LoggingPane to work in IE with hyphen-containing URLs +- Replace percents for Safari native logging to avoid crashing +- New MochiKit.DOM.coerceToDOM .dom(node) / .__dom__(node) protocol +- MochiKit.DOM's MochiKit.Iter dependency is now optional +- Added expand all link to the documentation index +- Added MochiKit.DOM.isChildNode +- Added synthesizing for onmouseenter/onmouseleave + +2006-04-29 v1.3.1 (bug fix release) + +- Fix sendXMLHttpRequest sendContent regression +- Internet Explorer fix in MochiKit.Logging (printfire exception) +- Internet Explorer XMLHttpRequest object leak fixed in MochiKit.Async + +2006-04-26 v1.3 "warp zone" + +- IMPORTANT: Renamed MochiKit.Base.forward to forwardCall (for export) +- IMPORTANT: Renamed MochiKit.Base.find to findValue (for export) +- New MochiKit.Base.method as a convenience form of bind that takes the + object before the method +- New MochiKit.Base.flattenArguments for flattening a list of arguments to + a single Array +- Refactored MochiRegExp example to use MochiKit.Signal +- New key_events example demonstrating use of MochiKit.Signal's key handling + capabilities. +- MochiKit.DOM.createDOM API change for convenience: if attrs is a string, + null is used and the string will be considered the first node. This + allows for the more natural P("foo") rather than P(null, "foo"). +- MochiKit Interpreter example refactored to use MochiKit.Signal and now + provides multi-line input and a help() function to get MochiKit function + signature from the documentation. +- Native Console Logging for the default MochiKit.Logging logger +- New MochiKit.Async.DeferredList, gatherResults, maybeDeferred +- New MochiKit.Signal example: draggable +- Added sanity checking to Deferred to ensure that errors happen when chaining + is used incorrectly +- Opera sendXMLHttpRequest fix (sends empty string instead of null by default) +- Fix a bug in MochiKit.Color that incorrectly generated hex colors for + component values smaller than 16/255. +- Fix a bug in MochiKit.Logging that prevented logs from being capped at a + maximum size +- MochiKit.Async.Deferred will now wrap thrown objects that are not instanceof + Error, so that the errback chain is used instead of the callback chain. +- MochiKit.DOM.appendChildNodes and associated functions now append iterables + in the correct order. +- New MochiKit-based SimpleTest test runner as a replacement for Test.Simple +- MochiKit.Base.isNull no longer matches undefined +- example doctypes changed to HTML4 +- isDateLike no longer throws error on null +- New MochiKit.Signal module, modeled after the slot/signal mechanism in Qt +- updated elementDimensions to calculate width from offsetWidth instead + of clientWidth +- formContents now works with FORM tags that have a name attribute +- Documentation now uses MochiKit to generate a function index + +2006-01-26 v1.2 "the ocho" + +- Fixed MochiKit.Color.Color.lighterColorWithLevel +- Added new MochiKit.Base.findIdentical function to find the index of an + element in an Array-like object. Uses === for identity comparison. +- Added new MochiKit.Base.find function to find the index of an element in + an Array-like object. Uses compare for rich comparison. +- MochiKit.Base.bind will accept a string for func, which will be immediately + looked up as self[func]. +- MochiKit.DOM.formContents no longer skips empty form elements for Zope + compatibility +- MochiKit.Iter.forEach will now catch StopIteration to break +- New MochiKit.DOM.elementDimensions(element) for determining the width and + height of an element in the document +- MochiKit.DOM's initialization is now compatible with + HTMLUnit + JWebUnit + Rhino +- MochiKit.LoggingPane will now re-use a ``_MochiKit_LoggingPane`` DIV element + currently in the document instead of always creating one. +- MochiKit.Base now has operator.mul +- MochiKit.DOM.formContents correctly handles unchecked checkboxes that have + a custom value attribute +- Added new MochiKit.Color constructors fromComputedStyle and fromText +- MochiKit.DOM.setNodeAttribute should work now +- MochiKit.DOM now has a workaround for an IE bug when setting the style + property to a string +- MochiKit.DOM.createDOM now has workarounds for IE bugs when setting the + name and for properties +- MochiKit.DOM.scrapeText now walks the DOM tree in-order +- MochiKit.LoggingPane now sanitizes the window name to work around IE bug +- MochiKit.DOM now translates usemap to useMap to work around IE bug +- MochiKit.Logging is now resistant to Prototype's dumb Object.prototype hacks +- Added new MochiKit.DOM documentation on element visibility +- New MochiKit.DOM.elementPosition(element[, relativeTo={x: 0, y: 0}]) + for determining the position of an element in the document +- Added new MochiKit.DOM createDOMFunc aliases: CANVAS, STRONG + +2005-11-14 v1.1 + +- Fixed a bug in numberFormatter with large numbers +- Massively overhauled documentation +- Fast-path for primitives in MochiKit.Base.compare +- New groupby and groupby_as_array in MochiKit.Iter +- Added iterator factory adapter for objects that implement iterateNext() +- Fixed isoTimestamp to handle timestamps with time zone correctly +- Added new MochiKit.DOM createDOMFunc aliases: SELECT, OPTION, OPTGROUP, + LEGEND, FIELDSET +- New MochiKit.DOM formContents and enhancement to queryString to support it +- Updated view_source example to use dp.SyntaxHighlighter 1.3.0 +- MochiKit.LoggingPane now uses named windows based on the URL so that + a given URL will get the same LoggingPane window after a reload + (at the same position, etc.) +- MochiKit.DOM now has currentWindow() and currentDocument() context + variables that are set with withWindow() and withDocument(). These + context variables affect all MochiKit.DOM functionality (getElement, + createDOM, etc.) +- MochiKit.Base.items will now catch and ignore exceptions for properties + that are enumerable but not accessible (e.g. permission denied) +- MochiKit.Async.Deferred's addCallback/addErrback/addBoth + now accept additional arguments that are used to create a partially + applied function. This differs from Twisted in that the callback/errback + result becomes the *last* argument, not the first when this feature + is used. +- MochiKit.Async's doSimpleXMLHttpRequest will now accept additional + arguments which are used to create a GET query string +- Did some refactoring to reduce the footprint of MochiKit by a few + kilobytes +- escapeHTML to longer escapes ' (apos) and now uses + String.replace instead of iterating over every char. +- Added DeferredLock to Async +- Renamed getElementsComputedStyle to computedStyle and moved + it from MochiKit.Visual to MochiKit.DOM +- Moved all color support out of MochiKit.Visual and into MochiKit.Color +- Fixed range() to accept a negative step +- New alias to MochiKit.swapDOM called removeElement +- New MochiKit.DOM.setNodeAttribute(node, attr, value) which sets + an attribute on a node without raising, roughly equivalent to: + updateNodeAttributes(node, {attr: value}) +- New MochiKit.DOM.getNodeAttribute(node, attr) which gets the value of + a node's attribute or returns null without raising +- Fixed a potential IE memory leak if using MochiKit.DOM.addToCallStack + directly (addLoadEvent did not leak, since it clears the handler) + +2005-10-24 v1.0 + +- New interpreter example that shows usage of MochiKit.DOM to make + an interactive JavaScript interpreter +- New MochiKit.LoggingPane for use with the MochiKit.Logging + debuggingBookmarklet, with logging_pane example to show its usage +- New mochiregexp example that demonstrates MochiKit.DOM and MochiKit.Async + in order to provide a live regular expression matching tool +- Added advanced number formatting capabilities to MochiKit.Format: + numberFormatter(pattern, placeholder="", locale="default") and + formatLocale(locale="default") +- Added updatetree(self, obj[, ...]) to MochiKit.Base, and changed + MochiKit.DOM's updateNodeAttributes(node, attrs) to use it when appropiate. +- Added new MochiKit.DOM createDOMFunc aliases: BUTTON, TT, PRE +- Added truncToFixed(aNumber, precision) and roundToFixed(aNumber, precision) + to MochiKit.Format +- MochiKit.DateTime can now handle full ISO 8601 timestamps, specifically + isoTimestamp(isoString) will convert them to Date objects, and + toISOTimestamp(date, true) will return an ISO 8601 timestamp in UTC +- Fixed missing errback for sendXMLHttpRequest when the server does not + respond +- Fixed infinite recusion bug when using roundClass("DIV", ...) +- Fixed a bug in MochiKit.Async wait (and callLater) that prevented them + from being cancelled properly +- Workaround in MochiKit.Base bind (and partial) for functions that don't + have an apply method, such as alert +- Reliably return null from the string parsing/manipulation functions if + the input can't be coerced to a string (s + "") or the input makes no sense; + e.g. isoTimestamp(null) and isoTimestamp("") return null + +2005-10-08 v0.90 + +- Fixed ISO compliance with toISODate +- Added missing operator.sub +- Placated Mozilla's strict warnings a bit +- Added JSON serialization and unserialization support to MochiKit.Base: + serializeJSON, evalJSON, registerJSON. This is very similar to the repr + API. +- Fixed a bug in the script loader that failed in some scenarios when a script + tag did not have a "src" attribute (thanks Ian!) +- Added new MochiKit.DOM createDOMFunc aliases: H1, H2, H3, BR, HR, TEXTAREA, + P, FORM +- Use encodeURIComponent / decodeURIComponent for MochiKit.Base urlEncode + and parseQueryString, when available. + +2005-08-12 v0.80 + +- Source highlighting in all examples, moved to a view-source example +- Added some experimental syntax highlighting for the Rounded Corners example, + via the LGPL dp.SyntaxHighlighter 1.2.0 now included in examples/common/lib +- Use an indirect binding for the logger conveniences, so that the global + logger could be replaced by setting MochiKit.Logger.logger to something else + (though an observer is probably a better choice). +- Allow MochiKit.DOM.getElementsByTagAndClassName to take a string for parent, + which will be looked up with getElement +- Fixed bug in MochiKit.Color.fromBackground (was using node.parent instead of + node.parentNode) +- Consider a 304 (NOT_MODIFIED) response from XMLHttpRequest to be success +- Disabled Mozilla map(...) fast-path due to Deer Park compatibility issues +- Possible workaround for Safari issue with swapDOM, where it would get + confused because two elements were in the DOM at the same time with the + same id +- Added missing THEAD convenience function to MochiKit.DOM +- Added lstrip, rstrip, strip to MochiKit.Format +- Added updateNodeAttributes, appendChildNodes, replaceChildNodes to + MochiKit.DOM +- MochiKit.Iter.iextend now has a fast-path for array-like objects +- Added HSV color space support to MochiKit.Visual +- Fixed a bug in the sortable_tables example, it now converts types + correctly +- Fixed a bug where MochiKit.DOM referenced MochiKit.Iter.next from global + scope + +2005-08-04 v0.70 + +- New ajax_tables example, which shows off XMLHttpRequest, ajax, json, and + a little TAL-ish DOM templating attribute language. +- sendXMLHttpRequest and functions that use it (loadJSONDoc, etc.) no longer + ignore requests with status == 0, which seems to happen for cached or local + requests +- Added sendXMLHttpRequest to MochiKit.Async.EXPORT, d'oh. +- Changed scrapeText API to return a string by default. This is API-breaking! + It was dumb to have the default return value be the form you almost never + want. Sorry. +- Added special form to swapDOM(dest, src). If src is null, dest is removed + (where previously you'd likely get a DOM exception). +- Added three new functions to MochiKit.Base for dealing with URL query + strings: urlEncode, queryString, parseQueryString +- MochiKit.DOM.createDOM will now use attr[k] = v for all browsers if the name + starts with "on" (e.g. "onclick"). If v is a string, it will set it to + new Function(v). +- Another workaround for Internet "worst browser ever" Explorer's setAttribute + usage in MochiKit.DOM.createDOM (checked -> defaultChecked). +- Added UL, OL, LI convenience createDOM aliases to MochiKit.DOM +- Packing is now done by Dojo's custom Rhino interpreter, so it's much smaller + now! + +2005-07-29 v0.60 + +- Beefed up the MochiKit.DOM test suite +- Fixed return value for MochiKit.DOM.swapElementClass, could return + false unexpectedly before +- Added an optional "parent" argument to + MochiKit.DOM.getElementsByTagAndClassName +- Added a "packed" version in packed/MochiKit/MochiKit.js +- Changed build script to rewrite the URLs in tests to account for the + JSAN-required reorganization +- MochiKit.Compat to potentially work around IE 5.5 issues + (5.0 still not supported). Test.Simple doesn't seem to work there, + though. +- Several minor documentation corrections + +2005-07-27 v0.50 + +- Initial Release diff --git a/mochikit_v14/doc/rst/MochiKit/Visual.rst b/mochikit_v14/doc/rst/MochiKit/Visual.rst new file mode 100755 index 0000000..00a6b99 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/Visual.rst @@ -0,0 +1,531 @@ +.. title:: MochiKit.Visual - visual effects + +Name +==== + +MochiKit.Visual - visual effects + + +Synopsis +======== + +:: + + // round the corners of all h1 elements + roundClass("h1", null); + + // round the top left corner of the element with the id "title" + roundElement("title", {corners: "tl"}); + + // Add an fade effect to an element + fade('myelement'); + + +Description +=========== + +MochiKit.Visual provides visual effects and support functions for +visuals. + + +Dependencies +============ + +- :mochiref:`MochiKit.Base` +- :mochiref:`MochiKit.Iter` +- :mochiref:`MochiKit.DOM` +- :mochiref:`MochiKit.Color` +- :mochiref:`MochiKit.Position` + +Overview +======== + +MochiKit.Visual provides different visual effect: rounded corners and +animations for your HTML elements. Rounded corners are created +completely through CSS manipulations and require no external images or +style sheets. This implementation was adapted from Rico_. Dynamic +effects are ported from Scriptaculous_. + +.. _Rico: http://www.openrico.org + +.. _Scriptaculous: http://script.aculo.us + + +API Reference +============= + +Functions +--------- + +:mochidef:`roundClass(tagName[, className[, options]])`: + + Rounds all of the elements that match the ``tagName`` and + ``className`` specifiers, using the options provided. ``tagName`` + or ``className`` can be ``null`` to match all tags or classes. + For more information about the options, see the + :mochiref:`roundElement` function. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`roundElement(element[, options])`: + + Immediately round the corners of the specified element. The + element can be given as either a string with the element ID, or as + an element object. + + The options mapping has the following defaults: + + ========= ================= + corners ``"all"`` + color ``"fromElement"`` + bgColor ``"fromParent"`` + blend ``true`` + border ``false`` + compact ``false`` + ========= ================= + + corners: + + specifies which corners of the element should be rounded. + Choices are: + + - all + - top + - bottom + - tl (top left) + - bl (bottom left) + - tr (top right) + - br (bottom right) + + Example: + ``"tl br"``: top-left and bottom-right corners are rounded + + blend: + specifies whether the color and background color should be + blended together to produce the border color. + + *Availability*: + Available in MochiKit 1.3.1+ + + +:mochidef:`toggle(element[, effect[, options]])`: + + Toggle an element between visible and invisible state using an effect. + + effect: + One of the visual pairs to use, between 'slide', 'blind', + 'appear', and 'size'. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`tagifyText(element[, tagifyStyle])`: + + Transform a node text into nodes containing one letter by tag. + + tagifyStyle: + style to apply to character nodes, default to 'position: + relative'. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`multiple(elements, effect[, options])`: + + Launch the same effect on a list of elements. + + *Availability*: + Available in MochiKit 1.4+ + + +Basic Effects classes +--------------------- + +:mochidef:`DefaultOptions`: + + Default options for all Effect creation. + + =========== ======================================== + transition ``MochiKit.Visual.Transitions.sinoidal`` + duration ``1.0`` + fps ``25.0`` + sync ``false`` + from ``0.0`` + to ``1.0`` + delay ``0.0`` + queue ``'parallel'`` + =========== ======================================== + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Base()`: + + Base class to all effects. Define a basic looping service, use it + for creating new effects. + + You can override the methods ``setup``, ``update`` and ``finish```. + + The class defines a number of events that will be called during effect + life. The events are: + + - beforeStart + - beforeSetup + - beforeUpdate + - afterUpdate + - beforeFinish + - afterFinish + + If you want to define your own callbacks, define it in the options + parameter of the effect. Example:: + + // I slide it up and then down again + slideUp('myelement', {afterFinish: function () { + slideDown('myelement'); + }); + + Specific ``internal`` events are also available: for each one abone the + same exists with 'Internal' (example: 'beforeStartInternal'). Their purpose + is mainly for creating your own effect and keep the user access to event + callbacks (not overriding the library ones). + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Parallel(effects [, options])`: + + Launch effects in parallel. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Opacity(element [, options])`: + + Change the opacity of an element progressively. + + options: + + ====== ======== + from ``0.0`` + to ``1.0`` + ====== ======== + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Move(element [, options])`: + + Change the position of an element in small steps, creating a + moving effect. + + options: + + ========= ================ + x ``0`` + y ``0`` + position ``'relative'`` + ========= ================ + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Scale(element, percent [, options])`: + + Change the size of an element. + + percent: + Final wanted size in percent of current size. The size will be + reduced if the value is between 0 and 100, and raised if the + value is above 100. + + options: + + ================ ============ + scaleX ``true`` + scaleY ``true`` + scaleContent ``true`` + scaleFromCenter ``false`` + scaleMode ``'box'`` + scaleFrom ``100.0`` + scaleTo ``percent`` + ================ ============ + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Highlight(element [, options])`: + + Highlight an element, flashing with one color. + + options: + + =========== ============== + startcolor ``'#ffff99'`` + =========== ============== + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`ScrollTo(element [, options])`: + + Scroll the window to the position of the given element. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`Morph(element [, options])`: + + Make a transformation to the given element. It's called with the option + ``style`` with an array holding the styles to change. It works with + properties for size (``font-size``, ``border-width``, ...) and properties + for color (``color``, ``background-color``, ...). + + For size, it's better to have defined the original style. You *must* + use the same unit in the call to Morph (no translation exists between two + different units). + + Parsed length are postfixed with: em, ex, px, in, cm, mm, pt, pc. + + Example:: + +
    MyDiv
    + ... + Morph("foo", {"style": {"font-size": "2em"}}); + + + *Availability*: + Available in MochiKit 1.4+ + + +Combination Effects +------------------- + +:mochidef:`fade(element [, options])`: + + Change the opacity of an element until making it disappear. + + options: + + ====== ============================================= + from ``element.opacity || 1.0`` + to ``0.0`` + ====== ============================================= + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`appear(element [, options])`: + + Slowly show an invisible element. + + options: + + ===== ========= + from ``0.0`` + to ``1.0`` + ===== ========= + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`puff(element [, options])`: + + Make an element double size, and then make it disappear. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`blindUp(element [, options])`: + + Blind an element up, changing its vertical size to 0. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`blindDown(element [, options])`: + + Blind an element down, restoring its vertical size. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`switchOff(element [, options])`: + + A switch-off like effect, making the element disappear. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`dropOut(element [, options])`: + + Make the element fall and fade. + + options: + + ======== ======= + distance ``100`` + ======== ======= + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`shake(element [, options])`: + + Shake an element from left to right. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`slideDown(element [, options])`: + + Slide an element down. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`slideUp(element [, options])`: + + Slide an element up. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`squish(element [, options])`: + + Reduce the horizontal and vertical sizes at the same time, using + the top left corner. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`grow(element [, options])`: + + Restore the size of an element. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`shrink(element [, options])`: + + Shrink an element to its center. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`pulsate(element [, options])`: + + Switch an element between appear and fade. + + options: + + ====== ======== + pulses ``null`` + ====== ======== + + pulses controls the number of pulses made during the effect. + + *Availability*: + Available in MochiKit 1.4+ + + +:mochidef:`fold(element [, options])`: + + Reduce first the vertical size, and then the horizontal size. + + *Availability*: + Available in MochiKit 1.4+ + + +The Effects Queue +----------------- + +When you create effects based on user input (mouse clicks for example), it can +create conflicts between the effects if multiple effects are running at the +same time. To manage this problem, the Queue mechanism has been introduced: +it's responsible for running the effects as you desired. + +By default, you have one Queue called 'global', and the effects run in 'parallel' +(see default options). Every effects have a queue option to customize this. +It can be a string, the scope is then global: + +- `start`: the effect will be run before any other; +- `end`: the effect will be run after any other; +- `break`: every other effects break when the the effect start; +- `parallel`: the effect run normally with others. + + +But you have even more control if you use an array with the following keys: + +- `position` takes a value listed above; +- `scope` manages how the information has to be taken. If it's `global` + then it's the same information for every effects. Otherwise you can define + your own scode. For example, if you add an effect on a specified element, + you may use the element id as scode; +- `limit` defines how many effects can run in the current scode. If an + effect is added whereas the limit is reached, it will never be run (it's + lost). + + +See Also +======== + +.. [1] Application Kit Reference - NSColor: http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSColor.html +.. [2] SVG 1.0 color keywords: http://www.w3.org/TR/SVG/types.html#ColorKeywords +.. [3] W3C CSS3 Color Module: http://www.w3.org/TR/css3-color/#svg-color + + +Authors +======= + +- Kevin Dangoor +- Bob Ippolito +- Thomas Herve +- Round corners originally adapted from Rico + (though little remains) +- Effects originally adapted from Script.aculo.us + + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php + +Portions adapted from `Rico`_ are available under the terms of the +`Apache License, Version 2.0`_. + +Portions adapted from `Scriptaculous`_ are available under the terms +of the `MIT License`_. + +.. _`Apache License, Version 2.0`: http://www.apache.org/licenses/LICENSE-2.0.html diff --git a/mochikit_v14/doc/rst/MochiKit/index.rst b/mochikit_v14/doc/rst/MochiKit/index.rst new file mode 100755 index 0000000..59ff018 --- /dev/null +++ b/mochikit_v14/doc/rst/MochiKit/index.rst @@ -0,0 +1,81 @@ +.. title:: MochiKit Documentation Index + +Distribution +============ + +MochiKit - makes JavaScript suck a bit less + +- :mochiref:`MochiKit.Async` - manage asynchronous tasks +- :mochiref:`MochiKit.Base` - functional programming and useful comparisons +- :mochiref:`MochiKit.DOM` - painless DOM manipulation API +- :mochiref:`MochiKit.DragAndDrop` - drag and drop +- :mochiref:`MochiKit.Color` - color abstraction with CSS3 support +- :mochiref:`MochiKit.DateTime` - "what time is it anyway?" +- :mochiref:`MochiKit.Format` - string formatting goes here +- :mochiref:`MochiKit.Iter` - itertools for JavaScript; iteration made HARD, + and then easy +- :mochiref:`MochiKit.Logging` - we're all tired of ``alert()`` +- :mochiref:`MochiKit.LoggingPane` - interactive :mochiref:`MochiKit.Logging` + pane +- :mochiref:`MochiKit.Selector` - selecting elements by CSS selector syntax +- :mochiref:`MochiKit.Signal` - simple universal event handling +- :mochiref:`MochiKit.Style` - painless CSS manipulation API +- :mochiref:`MochiKit.Sortable` - sortable +- :mochiref:`MochiKit.Visual` - visual effects + + +Notes +===== + +To turn off MochiKit's export feature (which may be necessary for +compatibility with some existing code), do this before loading +MochiKit:: + + + +When export mode is off, you must use fully qualified names for +all MochiKit functions (e.g. ``MochiKit.Base.map(...)``). + + +Screencasts +=========== + +- `MochiKit 1.1 Intro`__ + +.. __: http://mochikit.com/screencasts/MochiKit_Intro-1 + +See Also +======== + +.. _`mochikit.com`: http://mochikit.com/ +.. _`from __future__ import *`: http://bob.pythonmac.org/ +.. _`MochiKit on JSAN`: http://openjsan.org/doc/b/bo/bob/MochiKit/ +.. _`MochiKit tag on del.icio.us`: http://del.icio.us/tag/mochikit +.. _`MochiKit tag on Technorati`: http://technorati.com/tag/mochikit +.. _`Google Groups: MochiKit`: http://groups.google.com/group/mochikit + +- `Google Groups: MochiKit`_: The official mailing list for discussions + related to development of and with MochiKit +- `mochikit.com`_: MochiKit's home on the web +- `from __future__ import *`_: Bob Ippolito's blog +- `MochiKit on JSAN`_: the JSAN distribution page for MochiKit +- `MochiKit tag on del.icio.us`_: Recent bookmarks related to MochiKit +- `MochiKit tag on Technorati`_: Recent blog entries related to MochiKit + + +Version History +=============== + +.. include:: VersionHistory.rst + + +Copyright +========= + +Copyright 2005 Bob Ippolito . This program is +dual-licensed free software; you can redistribute it and/or modify it +under the terms of the `MIT License`_ or the `Academic Free License +v2.1`_. + +.. _`MIT License`: http://www.opensource.org/licenses/mit-license.php +.. _`Academic Free License v2.1`: http://www.opensource.org/licenses/afl-2.1.php diff --git a/mochikit_v14/examples/ajax_tables/ajax_tables.css b/mochikit_v14/examples/ajax_tables/ajax_tables.css new file mode 100755 index 0000000..d214965 --- /dev/null +++ b/mochikit_v14/examples/ajax_tables/ajax_tables.css @@ -0,0 +1,69 @@ +h1 { + font-size: 2em; + color: #4B4545; + text-align: center; +} + +table.datagrid { + width: 100%; + border-collapse: collapse; +} + +table.datagrid thead th { + text-align: left; + background-color: #4B4545; + background-repeat: no-repeat; + background-position: right center; + color: white; + font-weight: bold; + padding: .3em .7em; + font-size: .9em; + padding-right: 5px; + background-repeat: no-repeat; + background-position: 95% right; +} + +table.datagrid thead th a { + color: white; + text-decoration: none; + font-size: 1.0em; + background-repeat: no-repeat; + background-position: center right; + padding-right: 15px; +} + +table.datagrid thead th.over { + background-color: #746B6B; + cursor: pointer; +} + +table.datagrid tbody th { + font-weight: bold; +} + +table.datagrid tbody td, table.datagrid tbody th { + text-align: left; + padding: .3em .7em; + border-bottom: 1px solid #eee; +} + +table.datagrid tbody tr.alternate td, table.datagrid tbody tr.alternate th { + background-color: #f1f1f1; +} + +table.datagrid tfoot td, table.datagrid tfoot th { + background-color: #FFFEE3; + color: #4B4545; + padding: .5em; + font-weight: bold; + border-top: 2px solid #4B4545; +} + +table.datagrid tfoot th { text-align: left; } + +table.datagrid tfoot td { } + +.invisible { display: none; } + +.mochi-template { display: none; } +.mochi-example { display: none; } diff --git a/mochikit_v14/examples/ajax_tables/ajax_tables.js b/mochikit_v14/examples/ajax_tables/ajax_tables.js new file mode 100644 index 0000000..5390dd7 --- /dev/null +++ b/mochikit_v14/examples/ajax_tables/ajax_tables.js @@ -0,0 +1,401 @@ +/* + +On page load, the SortableManager: + +- Rips out all of the elements with the mochi-example class. +- Finds the elements with the mochi-template class and saves them for + later parsing with "MochiTAL". +- Finds the anchor tags with the mochi:dataformat attribute and gives them + onclick behvaiors to load new data, using their href as the data source. + This makes your XML or JSON look like a normal link to a search engine + (or javascript-disabled browser). +- Clones the thead element from the table because it will be replaced on each + sort. +- Sets up a default sort key of "domain_name" and queues a load of the json + document. + + +On data load, the SortableManager: + +- Parses the table data from the document (columns list, rows list-of-lists) + and turns them into a list of [{column:value, ...}] objects for easy sorting + and column order stability. +- Chooses the default (or previous) sort state and triggers a sort request + + +On sort request: + +- Replaces the cloned thead element with a copy of it that has the sort + indicator (↑ or ↓) for the most recently sorted column (matched up + to the first field in the th's mochi:sortcolumn attribute), and attaches + onclick, onmousedown, onmouseover, onmouseout behaviors to them. The second + field of mochi:sortcolumn attribute is used to perform a non-string sort. +- Performs the sort on the domains list. If the second field of + mochi:sortcolumn was not "str", then a custom function is used and the + results are stored away in a __sort__ key, which is then used to perform the + sort (read: shwartzian transform). +- Calls processMochiTAL on the page, which finds the mochi-template sections + and then looks for mochi:repeat and mochi:content attributes on them, using + the data object. + +*/ + +processMochiTAL = function (dom, data) { + /*** + + A TAL-esque template attribute language processor, + including content replacement and repeat + + ***/ + + // nodeType == 1 is an element, we're leaving + // text nodes alone. + if (dom.nodeType != 1) { + return; + } + var attr; + // duplicate this element for each item in the + // given list, and then process the duplicated + // element again (sans mochi:repeat tag) + attr = getAttribute(dom, "mochi:repeat"); + if (attr) { + dom.removeAttribute("mochi:repeat"); + var parent = dom.parentNode; + attr = attr.split(" "); + var name = attr[0]; + var lst = valueForKeyPath(data, attr[1]); + if (!lst) { + return; + } + for (var i = 0; i < lst.length; i++) { + data[name] = lst[i]; + var newDOM = dom.cloneNode(true); + processMochiTAL(newDOM, data); + parent.insertBefore(newDOM, dom); + } + parent.removeChild(dom); + return; + } + // do content replacement if there's a mochi:content attribute + // on the element + attr = getAttribute(dom, "mochi:content"); + if (attr) { + dom.removeAttribute("mochi:content"); + replaceChildNodes(dom, valueForKeyPath(data, attr)); + return; + } + // we make a shallow copy of the current list of child nodes + // because it *will* change if there's a mochi:repeat in there! + var nodes = list(dom.childNodes); + for (var i = 0; i < nodes.length; i++) { + processMochiTAL(nodes[i], data); + } +}; + +mouseOverFunc = function () { + addElementClass(this, "over"); +}; + +mouseOutFunc = function () { + removeElementClass(this, "over"); +}; + +ignoreEvent = function (ev) { + if (ev && ev.preventDefault) { + ev.preventDefault(); + ev.stopPropagation(); + } else if (typeof(event) != 'undefined') { + event.cancelBubble = false; + event.returnValue = false; + } +}; + +SortTransforms = { + "str": operator.identity, + "istr": function (s) { return s.toLowerCase(); }, + "isoDate": isoDate +}; + +getAttribute = function (dom, key) { + try { + return dom.getAttribute(key); + } catch (e) { + return null; + } +}; + +datatableFromXMLRequest = function (req) { + /*** + + This effectively converts domains.xml to the + same form as domains.json + + ***/ + var xml = req.responseXML; + var nodes = xml.getElementsByTagName("column"); + var rval = {"columns": map(scrapeText, nodes)}; + var rows = []; + nodes = xml.getElementsByTagName("row") + for (var i = 0; i < nodes.length; i++) { + var cells = nodes[i].getElementsByTagName("cell"); + rows.push(map(scrapeText, cells)); + } + rval.rows = rows; + return rval; +}; + +loadFromDataAnchor = function (ev) { + ignoreEvent(ev); + var format = this.getAttribute("mochi:dataformat"); + var href = this.href; + sortableManager.loadFromURL(format, href); +}; + +valueForKeyPath = function (data, keyPath) { + var chunks = keyPath.split("."); + while (chunks.length && data) { + data = data[chunks.shift()]; + } + return data; +}; + + +SortableManager = function () { + this.thead = null; + this.thead_proto = null; + this.tbody = null; + this.deferred = null; + this.columns = []; + this.rows = []; + this.templates = []; + this.sortState = {}; + bindMethods(this); +}; + +SortableManager.prototype = { + + "initialize": function () { + // just rip all mochi-examples out of the DOM + var examples = getElementsByTagAndClassName(null, "mochi-example"); + while (examples.length) { + swapDOM(examples.pop(), null); + } + // make a template list + var templates = getElementsByTagAndClassName(null, "mochi-template"); + for (var i = 0; i < templates.length; i++) { + var template = templates[i]; + var proto = template.cloneNode(true); + removeElementClass(proto, "mochi-template"); + this.templates.push({ + "template": proto, + "node": template + }); + } + // set up the data anchors to do loads + var anchors = getElementsByTagAndClassName("a", null); + for (var i = 0; i < anchors.length; i++) { + var node = anchors[i]; + var format = getAttribute(node, "mochi:dataformat"); + if (format) { + node.onclick = loadFromDataAnchor; + } + } + + // to find sort columns + this.thead = getElementsByTagAndClassName("thead", null)[0]; + this.thead_proto = this.thead.cloneNode(true); + + this.sortkey = "domain_name"; + this.loadFromURL("json", "domains.json"); + }, + + "loadFromURL": function (format, url) { + log('loadFromURL', format, url); + var d; + if (this.deferred) { + this.deferred.cancel(); + } + if (format == "xml") { + var d = doXHR(url, { + mimeType: 'text/xml', + headers: {Accept: 'text/xml'} + }); + d.addCallback(datatableFromXMLRequest); + } else if (format == "json") { + d = loadJSONDoc(url); + } else { + throw new TypeError("format " + repr(format) + " not supported"); + } + // keep track of the current deferred, so that we can cancel it + this.deferred = d; + var self = this; + // on success or error, remove the current deferred because it has + // completed, and pass through the result or error + d.addBoth(function (res) { + self.deferred = null; + log('loadFromURL success'); + return res; + }); + // on success, tag the result with the format used so we can display + // it + d.addCallback(function (res) { + res.format = format; + return res; + }); + // call this.initWithData(data) once it's ready + d.addCallback(this.initWithData); + // if anything goes wrong, except for a simple cancellation, + // then log the error and show the logger + d.addErrback(function (err) { + if (err instanceof CancelledError) { + return; + } + logError(err); + logger.debuggingBookmarklet(); + }); + return d; + }, + + "initWithData": function (data) { + /*** + + Initialize the SortableManager with a table object + + ***/ + + // reformat to [{column:value, ...}, ...] style as the domains key + var domains = []; + var rows = data.rows; + var cols = data.columns; + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + var domain = {}; + for (var j = 0; j < cols.length; j++) { + domain[cols[j]] = row[j]; + } + domains.push(domain); + } + data.domains = domains; + this.data = data; + // perform a sort and display based upon the previous sort state, + // defaulting to an ascending sort if this is the first sort + var order = this.sortState[this.sortkey]; + if (typeof(order) == 'undefined') { + order = true; + } + this.drawSortedRows(this.sortkey, order, false); + + }, + + "onSortClick": function (name) { + /*** + + Return a sort function for click events + + ***/ + // save ourselves from doing a bind + var self = this; + // on click, flip the last sort order of that column and sort + return function () { + log('onSortClick', name); + var order = self.sortState[name]; + if (typeof(order) == 'undefined') { + // if it's never been sorted by this column, sort ascending + order = true; + } else if (self.sortkey == name) { + // if this column was sorted most recently, flip the sort order + order = !((typeof(order) == 'undefined') ? false : order); + } + self.drawSortedRows(name, order, true); + }; + }, + + "drawSortedRows": function (key, forward, clicked) { + /*** + + Draw the new sorted table body, and modify the column headers + if appropriate + + ***/ + log('drawSortedRows', key, forward); + + // save it so we can flip next time + this.sortState[key] = forward; + this.sortkey = key; + var sortstyle; + + // setup the sort columns + var thead = this.thead_proto.cloneNode(true); + var cols = thead.getElementsByTagName("th"); + for (var i = 0; i < cols.length; i++) { + var col = cols[i]; + var sortinfo = getAttribute(col, "mochi:sortcolumn").split(" "); + var sortkey = sortinfo[0]; + col.onclick = this.onSortClick(sortkey); + col.onmousedown = ignoreEvent; + col.onmouseover = mouseOverFunc; + col.onmouseout = mouseOutFunc; + // if this is the sorted column + if (sortkey == key) { + sortstyle = sortinfo[1]; + // \u2193 is down arrow, \u2191 is up arrow + // forward sorts mean the rows get bigger going down + var arrow = (forward ? "\u2193" : "\u2191"); + // add the character to the column header + col.appendChild(SPAN(null, arrow)); + if (clicked) { + col.onmouseover(); + } + } + } + this.thead = swapDOM(this.thead, thead); + + // apply a sort transform to a temporary column named __sort__, + // and do the sort based on that column + if (!sortstyle) { + sortstyle = "str"; + } + var sortfunc = SortTransforms[sortstyle]; + if (!sortfunc) { + throw new TypeError("unsupported sort style " + repr(sortstyle)); + } + var domains = this.data.domains; + for (var i = 0; i < domains.length; i++) { + var domain = domains[i]; + domain.__sort__ = sortfunc(domain[key]); + } + + // perform the sort based on the state given (forward or reverse) + var cmp = (forward ? keyComparator : reverseKeyComparator); + domains.sort(cmp("__sort__")); + + // process every template with the given data + // and put the processed templates in the DOM + for (var i = 0; i < this.templates.length; i++) { + log('template', i, template); + var template = this.templates[i]; + var dom = template.template.cloneNode(true); + processMochiTAL(dom, this.data); + template.node = swapDOM(template.node, dom); + } + + + } + +}; + +// create the global SortableManager and initialize it on page load +sortableManager = new SortableManager(); +addLoadEvent(sortableManager.initialize); + +// rewrite the view-source links +addLoadEvent(function () { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "ajax_tables/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } +}); diff --git a/mochikit_v14/examples/ajax_tables/domains.json b/mochikit_v14/examples/ajax_tables/domains.json new file mode 100755 index 0000000..61624d8 --- /dev/null +++ b/mochikit_v14/examples/ajax_tables/domains.json @@ -0,0 +1,10 @@ +{ + "columns": [ "domain_name", "create_date", "expiry_date", "organization_name"], + "rows": [ + ["json.org", "2000-05-08", "2006-05-08", "Douglas Crockford"], + ["mochibot.com", "2005-02-10", "2007-02-10", "Jameson Hsu"], + ["pythonmac.org", "2003-09-24", "2006-09-24", "Bob Ippolito"], + ["undefined.org", "2000-01-10", "2006-01-10", "Robert J Ippolito"], + ["python.org", "1995-03-27", "2007-03-28", "Python Software Foundation"] + ] +} diff --git a/mochikit_v14/examples/ajax_tables/domains.xml b/mochikit_v14/examples/ajax_tables/domains.xml new file mode 100755 index 0000000..ba9f24b --- /dev/null +++ b/mochikit_v14/examples/ajax_tables/domains.xml @@ -0,0 +1,40 @@ + + + domain_name + create_date + expiry_date + organization_name + + + + xml.com + 1996-09-30 + 2012-09-29 + Tim Bray + + + mochibot.com + 2005-02-10 + 2007-02-10 + Jameson Hsu + + + pythonmac.org + 2003-09-24 + 2006-09-24 + Bob Ippolito + + + undefined.org + 2000-01-10 + 2006-01-10 + Robert J Ippolito + + + python.org + 1995-03-27 + 2007-03-28 + Python Software Foundation + + + diff --git a/mochikit_v14/examples/ajax_tables/index.html b/mochikit_v14/examples/ajax_tables/index.html new file mode 100644 index 0000000..e90aa84 --- /dev/null +++ b/mochikit_v14/examples/ajax_tables/index.html @@ -0,0 +1,96 @@ + + + + + Sortable Tables from Scratch with MochiKit + + + + + +

    + Sortable Ajax Tables in JSON and XML with MochiKit +

    +
    +
    +

    + This is an example of how one might use MochiKit to do + sortable tables from data given by the server in either JSON + or XML format. It uses + MochiKit.Async + to fetch the data, and + MochiKit.DOM + to display it. +

    +

    + Includes a micro implementation of something + TAL-esque + (called "MochiTAL" in the source, using a mochi: namespace). + For a more detailed description of what happens under the + covers, view the ajax_tables.js + source and look at the comments. +

    +
    +
    +
    + View Source: [ + index.html | + ajax_tables.js | + domains.json | + domains.xml + ] +
    +
    + Load data: [ + domains.json + | domains.xml + ] + (current format: loading) +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Domain NameCreation DateExpiry DateOrganization Name
    mochibot.com2005-02-102007-02-10Jameson Hsu
    pythonmac.org2003-09-242006-09-24Bob Ippolito
    undefined.org2000-01-102006-01-10Robert J Ippolito
    python.org1995-03-272007-03-28Python Software Foundation
    + + diff --git a/mochikit_v14/examples/color_wheel/color_wheel.css b/mochikit_v14/examples/color_wheel/color_wheel.css new file mode 100755 index 0000000..21b4ace --- /dev/null +++ b/mochikit_v14/examples/color_wheel/color_wheel.css @@ -0,0 +1,4 @@ +h1 { text-align: center; } +#docs { text-align: center; } +#source { text-align: center; } +#color_wheel_container { position:absolute; left: 50%; top: 50% } diff --git a/mochikit_v14/examples/color_wheel/color_wheel.js b/mochikit_v14/examples/color_wheel/color_wheel.js new file mode 100644 index 0000000..4d844b0 --- /dev/null +++ b/mochikit_v14/examples/color_wheel/color_wheel.js @@ -0,0 +1,95 @@ +var radius = 225; +var twoPI = Math.PI * 2; +var amplification = 10; + +var calcAlpha = function (target, lightness) { + return Math.max(1.0 - (Math.abs(lightness - target) * amplification), 0); +}; + +var makeColorDiv = function (name) { + var c = Color.fromName(name); + var hsl = c.asHSL(); + var r = hsl.s * radius; + var e = DIV({"style": { + "color": Color.fromHSL(hsl).toString(), + "width": "100px", + "height": "30px", + "position": "absolute", + "verticalAlign": "middle", + "textAlign": "center", + "left": Math.floor((Math.cos(hsl.h * twoPI) * r) - 50) + "px", + "top": Math.floor((Math.sin(hsl.h * twoPI) * r)) + "px" + }}, + name + ); + // hsl.a = 0; + return [c, e]; +}; + +var colorWheelOnLoad = function () { + var seenColors = {}; + var colors = Color.namedColors(); + var colorDivs = []; + for (var k in colors) { + var val = colors[k]; + if (val in seenColors) { + continue; + } + colorDivs.push(makeColorDiv(k)); + } + swapDOM( + "color_wheel", + DIV(null, map(itemgetter(1), colorDivs)) + ); + var colorCanary = DIV({"style":{"color": "blue"}}, ""); + try { + colorCanary.style.color = "rgba(100,100,100,0.5)"; + } catch (e) { + // IE passtastic + } + var colorFunc; + // Check for CSS3 HSL support + if (colorCanary.style.color == "blue") { + var bgColor = Color.fromBackground(); + colorFunc = function (color, alpha) { + return bgColor.blendedColor(color, alpha).toHexString(); + }; + } else { + colorFunc = function (color, alpha) { + return color.colorWithAlpha(alpha).toRGBString(); + } + } + // Per-frame animation + var intervalFunc = function (cycle, timeout) { + var target = 0.5 + (0.5 * Math.sin(Math.PI * (cycle / 180))); + for (var i = 0; i < colorDivs.length; i++) { + var cd = colorDivs[i]; + var color = cd[0]; + var alpha = calcAlpha(target, color.asHSL().l); + var style = cd[1].style; + if (alpha == 0) { + style.display = "none"; + } else { + style.display =""; + style.color = colorFunc(color, alpha); + } + } + callLater(timeout, arguments.callee, cycle + 2, timeout); + }; + // < 5 fps + intervalFunc(0, 1/5); +}; + +addLoadEvent(colorWheelOnLoad); + +// rewrite the view-source links +addLoadEvent(function () { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "color_wheel/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } +}); diff --git a/mochikit_v14/examples/color_wheel/index.html b/mochikit_v14/examples/color_wheel/index.html new file mode 100644 index 0000000..2464e15 --- /dev/null +++ b/mochikit_v14/examples/color_wheel/index.html @@ -0,0 +1,31 @@ + + + + Demo of MochiKit.Color + + + + + +

    Color Wheel

    +
    + Animated visualization of all the CSS3 colors by: + hue (angle), saturation (distance), luminance (time/alpha). +
    + Uses MochiKit's + MochiKit.Color, + MochiKit.DOM, + and MochiKit.Async. +
    +
    + View Source: [ + index.html | + color_wheel.js + ] +
    + +
    +
    +
    + + diff --git a/mochikit_v14/examples/dnd_sortable/dnd_sortable.css b/mochikit_v14/examples/dnd_sortable/dnd_sortable.css new file mode 100755 index 0000000..080d6b9 --- /dev/null +++ b/mochikit_v14/examples/dnd_sortable/dnd_sortable.css @@ -0,0 +1,23 @@ +h1 { + font-size: 2em; + color: #4B4545; + text-align: center; +} + +#dnd_sortable { + margin: 0; + margin-top: 10px; + padding: 0; + list-style-type: none; + width: 250px; +} + +#dnd_sortable li { + margin: 0; + margin-bottom: 4px; + padding: 5px; + border: 1px solid #888; + cursor: move; + text-align: center; +} + diff --git a/mochikit_v14/examples/dnd_sortable/dropmarker.png b/mochikit_v14/examples/dnd_sortable/dropmarker.png new file mode 100755 index 0000000000000000000000000000000000000000..77d7387b6390749d9d05e73ad797ef6e4c6f28b2 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0y~yVEh7PvvDv3NhZ}fazKhD-O<;Pf#KSXEB+BiK)z&& zYeY$Kep*R+Vo@rCV@iHfs)A>3VtQ&&YGO)d;mK4Rpdz6FpAc7jdwX_v_H*aXH8eB; z#s2^Q|Gmr_Y<@|QUoepS|3Aa#{Y&-(<;*=@978H@y}8!N%V5C4l_A#9tMX0|NmDrFsx-@c(b-S8E8nF zr;B4q#jTu9ZlOaC9L}3>_eUu@yswW~7@EHA@&RV25BJ&+*}XdV*_+ouef4?fIlmXb z-lMzg3V+M=d7kM{OWM^66nWFuZByIY`}FDgE%Pd6cKYaTm>@Q-Wm|@Ri|beZBP&+_ b=P+Opo5*u_^+#4gpp6Wku6{1-oD!M<-aKpU literal 0 HcmV?d00001 diff --git a/mochikit_v14/examples/dnd_sortable/index.html b/mochikit_v14/examples/dnd_sortable/index.html new file mode 100644 index 0000000..718de3f --- /dev/null +++ b/mochikit_v14/examples/dnd_sortable/index.html @@ -0,0 +1,54 @@ + + + + Drag and Drop Sortable Tables with MochiKit + + + + + + + + + +

    + Drag and Drop Sortable Tables with MochiKit +

    +

    + View Source: [ + index.html + ] +

    +
      +
    • mochibot.com
    • +
    • pythonmac.org
    • +
    • undefined.org
    • +
    • python.org
    • +
    +

    + Validate order choice +

    + +

    +

    +

    + + diff --git a/mochikit_v14/examples/dnd_sortable/sortable2_test.html b/mochikit_v14/examples/dnd_sortable/sortable2_test.html new file mode 100644 index 0000000..f969e83 --- /dev/null +++ b/mochikit_v14/examples/dnd_sortable/sortable2_test.html @@ -0,0 +1,150 @@ + + + + script.aculo.us Sortable ghosting functional test file + + + + + + + + + + +

    script.aculo.us Sortable ghosting functional test file

    + +

    Ghosting

    + +
      +
    • Lorem ipsum dolor
    • +
    • sit amet
    • +
    • consectetur adipisicing
    • +
    • elit
    • +
    • sed do eiusmod
    • +
    • tempor incididunt
    • +
    • ut labore et dolore
    • +
    • magna aliqua
    • +
    + +

    (waiting for onChange)

    + + + +

    No ghosting

    + +
      +
    • Lorem ipsum dolor
    • +
    • sit amet
    • +
    • consectetur adipisicing
    • +
    • elit
    • +
    • sed do eiusmod
    • +
    • tempor incididunt
    • +
    • ut labore et dolore
    • +
    • magna aliqua
    • +
    + +

    (waiting for onChange)

    + + + +

    Ghosting (inside position:relative container)

    +
    +
      +
    • Lorem ipsum dolor
    • +
    • sit amet
    • +
    • consectetur adipisicing
    • +
    • elit
    • +
    • sed do eiusmod
    • +
    • tempor incididunt
    • +
    • ut labore et dolore
    • +
    • magna aliqua
    • +
    +
    +

    (waiting for onChange)

    + + + + +

    Ghosting (inside position:relative container)

    +
    +
      +
    • Lorem ipsum dolor
    • +
    • sit amet
    • +
    • consectetur adipisicing
    • +
    • elit
    • +
    • sed do eiusmod
    • +
    • tempor incididunt
    • +
    • ut labore et dolore
    • +
    • magna aliqua
    • +
    +
    +

    (waiting for onChange)

    + + + + +
    + + + diff --git a/mochikit_v14/examples/dnd_sortable/sortable3_test.html b/mochikit_v14/examples/dnd_sortable/sortable3_test.html new file mode 100644 index 0000000..bfcf0d2 --- /dev/null +++ b/mochikit_v14/examples/dnd_sortable/sortable3_test.html @@ -0,0 +1,42 @@ + + + + script.aculo.us sortable functional test file + + + + + + + + + + +

    script.aculo.us Sortable two-lists w/ dropOnEmpty functional test file

    + +
      +
    • Hey there! I'm item#1/1
    • +
    • Hey there! I'm item#1/2
    • +
    • Hey there! I'm item#1/3
    • +
    + +
      +
    + + + +Serialize sortable1 +Serialize sortable2 + +
    + + + diff --git a/mochikit_v14/examples/dnd_sortable/sortable4_test.html b/mochikit_v14/examples/dnd_sortable/sortable4_test.html new file mode 100644 index 0000000..657f157 --- /dev/null +++ b/mochikit_v14/examples/dnd_sortable/sortable4_test.html @@ -0,0 +1,90 @@ + + + + script.aculo.us sortable functional test file + + + + + + + + + + +

    script.aculo.us: Two floating sortables with containment and dropOnEmpty

    + +
    +
    +

    This is the first list

    +
      +
    • Item 1 from first list.
    • +
    • Item 2 from first list.
    • +
    • Item 3 from first list.
    • +
    +
    +
    +

    And now the second list

    +
      +
    • + DRAG HERE Item 1 from second list. +
    • +
    • + DRAG HERE Item 2 from second list. +
    • +
    • + DRAG HERE Item 3 from second list. +
    • +
    +
    +
    + +
    + +
    
    +
    
    +
    + 
    + 
    + 
    + 
    diff --git a/mochikit_v14/examples/dnd_sortable/sortable5_test.html b/mochikit_v14/examples/dnd_sortable/sortable5_test.html
    new file mode 100644
    index 0000000..3a3bbe1
    --- /dev/null
    +++ b/mochikit_v14/examples/dnd_sortable/sortable5_test.html
    @@ -0,0 +1,45 @@
    +
    +
    +
    +  script.aculo.us sortable functional test file
    +  
    +        
    +        
    +        
    +        
    +        
    +        
    +
    +
    +  
    +  
    + +
    + + + + + diff --git a/mochikit_v14/examples/dnd_sortable/sortable_test.html b/mochikit_v14/examples/dnd_sortable/sortable_test.html new file mode 100644 index 0000000..9272fa1 --- /dev/null +++ b/mochikit_v14/examples/dnd_sortable/sortable_test.html @@ -0,0 +1,38 @@ + + + + script.aculo.us sortable functional test file + + + + + + + + + + +
      +
    • Hey there! I'm item#1
    • +
    • Hey there! I'm item#2
    • +
    • Hey there! I'm item#3
    • +
    + +Create sortable | +Destroy sortable | +Serialize sortable + + + diff --git a/mochikit_v14/examples/dnd_sortable/sortable_tree_test.html b/mochikit_v14/examples/dnd_sortable/sortable_tree_test.html new file mode 100644 index 0000000..6a11671 --- /dev/null +++ b/mochikit_v14/examples/dnd_sortable/sortable_tree_test.html @@ -0,0 +1,189 @@ + + + + + Sortable tree test + + + + + + + + + + + serialize 1 + + + + + + + + + + + diff --git a/mochikit_v14/examples/draggable/draggable.css b/mochikit_v14/examples/draggable/draggable.css new file mode 100755 index 0000000..b9b3ba0 --- /dev/null +++ b/mochikit_v14/examples/draggable/draggable.css @@ -0,0 +1,28 @@ +h1 { + font-size: 2em; + color: #4B4545; + text-align: center; +} + +.draggable +{ + color: white; + cursor: move; + font-size: 25px; + height: 100px; + line-height: 100px; + position: absolute; + text-align: center; + top: 200px; + width: 100px; +} + +.blue { background: blue; } +.green { background: green; } +.red { background: red; } +.white +{ + background: white; + border: 1px solid black; + color: black; +} diff --git a/mochikit_v14/examples/draggable/draggable.js b/mochikit_v14/examples/draggable/draggable.js new file mode 100644 index 0000000..6f56d76 --- /dev/null +++ b/mochikit_v14/examples/draggable/draggable.js @@ -0,0 +1,73 @@ +/* + + Drag: A Really Simple Drag Handler + +*/ +Drag = { + _move: null, + _down: null, + + start: function(e) { + e.stop(); + + // We need to remember what we're dragging. + Drag._target = e.target(); + + /* + There's no cross-browser way to get offsetX and offsetY, so we + have to do it ourselves. For performance, we do this once and + cache it. + */ + Drag._offset = Drag._diff( + e.mouse().page, + getElementPosition(Drag._target)); + + Drag._move = connect(document, 'onmousemove', Drag._drag); + Drag._down = connect(document, 'onmouseup', Drag._stop); + }, + + _offset: null, + _target: null, + + _diff: function(lhs, rhs) { + return new MochiKit.Style.Coordinates(lhs.x - rhs.x, lhs.y - rhs.y); + }, + + _drag: function(e) { + e.stop(); + setElementPosition( + Drag._target, + Drag._diff(e.mouse().page, Drag._offset)); + }, + + _stop: function(e) { + disconnect(Drag._move); + disconnect(Drag._down); + } +}; + +connect(window, 'onload', + function() { + /* + Find all DIVs tagged with the draggable class, and connect them to + the Drag handler. + */ + var d = getElementsByTagAndClassName('DIV', 'draggable'); + forEach(d, + function(elem) { + connect(elem, 'onmousedown', Drag.start); + }); + + }); + +connect(window, 'onload', + function() { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "draggable/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } + }); diff --git a/mochikit_v14/examples/draggable/index.html b/mochikit_v14/examples/draggable/index.html new file mode 100644 index 0000000..21a134f --- /dev/null +++ b/mochikit_v14/examples/draggable/index.html @@ -0,0 +1,38 @@ + + + + Signal Example + + + + + + +

    + Dragging with MochiKit +

    +

    + This is an example of one might implement a drag handler with + MochiKit’s Signal. +

    +

    + For a detailed description of what happens under the hood, check out + draggable.js. +

    +

    + View Source: [ + index.html | + draggable.js | + draggable.css + ] +

    + + +
    R
    +
    G
    +
    B
    +
    W
    + + + diff --git a/mochikit_v14/examples/effects/effects_bigslide.html b/mochikit_v14/examples/effects/effects_bigslide.html new file mode 100644 index 0000000..37cf9e1 --- /dev/null +++ b/mochikit_v14/examples/effects/effects_bigslide.html @@ -0,0 +1,36 @@ + + + + script.aculo.us Effects functional test file + + + + + + +

    script.aculo.us Effects functional test file

    + +

    Effect.SlideDown/Effect.SlideUp

    + + + +Start slide down | +Start slide up | +cancel() | +inspect() | +add content + + + + + + diff --git a/mochikit_v14/examples/effects/effects_blind.html b/mochikit_v14/examples/effects/effects_blind.html new file mode 100644 index 0000000..a7b6bb1 --- /dev/null +++ b/mochikit_v14/examples/effects/effects_blind.html @@ -0,0 +1,65 @@ + + + + script.aculo.us Effects functional test file + + + + + + + + +

    script.aculo.us Effects functional test file

    + +

    Effect.BlindUp/Effect.BlindDown

    + +
    + Lorem ipsum dolor sit amet +
      +
    • test!
    • +
    • test!
    • +
    + test! + test! + test! + test! + test! + test! + test! + test! + test! + test! + Lorem ipsum dolor sit amet +
      +
    • test!
    • +
    • test!
    • +
    + Lorem ipsum dolor sit amet +
      +
    • test!
    • +
    • test!
    • +
    + Lorem ipsum dolor sit amet +
      +
    • test!
    • +
    • test!
    • +
    +
    + +

    + BlindDown() +

    + +

    + BlindUp() +

    + + + + diff --git a/mochikit_v14/examples/effects/effects_blindslide.html b/mochikit_v14/examples/effects/effects_blindslide.html new file mode 100644 index 0000000..b7c258a --- /dev/null +++ b/mochikit_v14/examples/effects/effects_blindslide.html @@ -0,0 +1,31 @@ + + + + script.aculo.us Effects functional test file + + + + + + + + +

    script.aculo.us Effects functional test file

    + +Highlight | +BlindUp | +BlindDown | +SlideUp | +SlideDown + +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas enim. Nulla facilisi. Vestibulum accumsan augue vulputate justo. Fusce faucibus. Sed blandit, neque sed lacinia nonummy, diam quam imperdiet justo, at dictum augue nunc a neque. Sed urna lacus, tincidunt at, aliquam id, fringilla id, felis. Vivamus feugiat molestie quam. Sed id dolor. Sed ac purus id sapien sollicitudin ultricies. Aliquam hendrerit orci et odio. Suspendisse volutpat wisi at sem. Integer eget nulla. Duis eu diam a nunc condimentum tempus. Praesent gravida metus vitae massa. Aliquam neque magna, fringilla eu, porta id, interdum sit amet, dui. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin lorem est, ultrices sit amet, condimentum vitae, vehicula a, massa. +
    + + + diff --git a/mochikit_v14/examples/effects/effects_combi.css b/mochikit_v14/examples/effects/effects_combi.css new file mode 100755 index 0000000..4658886 --- /dev/null +++ b/mochikit_v14/examples/effects/effects_combi.css @@ -0,0 +1,34 @@ +h3 { + clear: both; +} +.example { + font-size: 1.0em; + float: left; + margin-right: 10px; + margin-bottom: 10px; + width: 120px; + height: 120px; + background-color: #AAAAAA; + text-align: center; + padding: 1em 0.2em 0.2em 0.2em; +} +.demo { + clear: both; +} +#reset { + position: absolute; + top: 600px; + left: 600px; +} +#demo-all { + position: absolute; + top: 600px; + left: 400px; + font-size: 1.0em; + width: 120px; + height: 120px; + background-color: #AAAAAA; + text-align: center; + padding: 1em 0.2em 0.2em 0.2em; +} + diff --git a/mochikit_v14/examples/effects/effects_fadeappear.html b/mochikit_v14/examples/effects/effects_fadeappear.html new file mode 100644 index 0000000..46d7aec --- /dev/null +++ b/mochikit_v14/examples/effects/effects_fadeappear.html @@ -0,0 +1,61 @@ + + + + script.aculo.us Effects functional test file + + + + + + +

    script.aculo.us fade/appear effect functional test

    +

    Note: these tests use the browser default CSS style rules.

    + +

    DIV

    +
    TEST
    +MochiKit.Visual.fade | +MochiKit.Visual.appear + +

    SPAN

    +TEST
    +MochiKit.Visual.fade | +MochiKit.Visual.appear + +

    P

    +

    TEST


    +MochiKit.Visual.fade | +MochiKit.Visual.appear + +

    IMG

    +test image
    +MochiKit.Visual.fade | +MochiKit.Visual.appear + + +
    + +

    The following elements are not supported with fade/appear on all browsers!

    + +

    TABLE

    +
    TEST
    +MochiKit.Visual.fade | +MochiKit.Visual.appear + +

    TBODY

    +
    TEST
    +MochiKit.Visual.fade | +MochiKit.Visual.appear + +

    TR

    +
    TEST
    +MochiKit.Visual.fade | +MochiKit.Visual.appear + +

    TD

    +
    TEST
    +MochiKit.Visual.fade | +MochiKit.Visual.appear + + + diff --git a/mochikit_v14/examples/effects/effects_grow_shrink.html b/mochikit_v14/examples/effects/effects_grow_shrink.html new file mode 100644 index 0000000..2fd3d23 --- /dev/null +++ b/mochikit_v14/examples/effects/effects_grow_shrink.html @@ -0,0 +1,38 @@ + + + + script.aculo.us Effects functional test file + + + + + + + + +

    script.aculo.us Effects functional test file

    + +

    Effect.Grow/Effect.Shrink

    + +
    +

    Lorem ipsum dolor sit amet

    +
    + +

    + Grow: + Grow() +

    + +

    + Shrink: + Shrink() +

    + + + + diff --git a/mochikit_v14/examples/effects/effects_onload.html b/mochikit_v14/examples/effects/effects_onload.html new file mode 100644 index 0000000..312e70a --- /dev/null +++ b/mochikit_v14/examples/effects/effects_onload.html @@ -0,0 +1,66 @@ + + + + script.aculo.us Effects functional test file + + + + + +

    script.aculo.us Effects functional test file

    + +

    Effect.Highlight

    + +
    + +asdasd + +
    + + (highlight to red) + +
    + +
    + (highlight to greenish) +
    + +
    + (bottom-right-grow) +
    + +
    + click to test shake +
    + +
    + click to test puff +
    +show puff div again + +test appear + + +test grow + + +test pulsate +
    + pulsate +
    + + + + + diff --git a/mochikit_v14/examples/effects/effects_queue.html b/mochikit_v14/examples/effects/effects_queue.html new file mode 100644 index 0000000..f5a307b --- /dev/null +++ b/mochikit_v14/examples/effects/effects_queue.html @@ -0,0 +1,67 @@ + + + + script.aculo.us Effects functional test file + + + + + + + + +

    script.aculo.us Effects functional test file

    + +

    Effect.Queue

    + +
    +

    Lorem ipsum dolor sit amet

    +
    + +
    +

    Lorem ipsum dolor sit amet

    +
    + +
    +

    Lorem ipsum dolor sit amet

    +
    + +
    + Start queued effects (in 'global' queue) +
    + + + + + + + + diff --git a/mochikit_v14/examples/effects/effects_queue_limit.html b/mochikit_v14/examples/effects/effects_queue_limit.html new file mode 100644 index 0000000..c885833 --- /dev/null +++ b/mochikit_v14/examples/effects/effects_queue_limit.html @@ -0,0 +1,30 @@ + + + + script.aculo.us Effects functional test file + + + + + + + + +

    script.aculo.us Effects functional test file

    + +

    Effect.Queue limit

    + +up +down +
    + Do a bit sliding in parallel, with a scoped queue, but I am limited to one : ) so don't try over and over again... +
    + + + diff --git a/mochikit_v14/examples/effects/effects_scroll.html b/mochikit_v14/examples/effects/effects_scroll.html new file mode 100644 index 0000000..1738c8c --- /dev/null +++ b/mochikit_v14/examples/effects/effects_scroll.html @@ -0,0 +1,483 @@ + + + + script.aculo.us Effects functional test file + + + + + + +

    script.aculo.us ScrollTo effect functional test

    + +scroll (slow-mo) down-below..., +scroll last-heading + +

    first-headingHeading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    DOWN BELOWHeading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +scroll... + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + +

    Heading 2

    +
      +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    • item
    • +
    + + + + diff --git a/mochikit_v14/examples/effects/effects_slide.html b/mochikit_v14/examples/effects/effects_slide.html new file mode 100644 index 0000000..346f284 --- /dev/null +++ b/mochikit_v14/examples/effects/effects_slide.html @@ -0,0 +1,63 @@ + + + + +Untitled Document + + + + + + + + + diff --git a/mochikit_v14/examples/effects/full.html b/mochikit_v14/examples/effects/full.html new file mode 100644 index 0000000..c980d2a --- /dev/null +++ b/mochikit_v14/examples/effects/full.html @@ -0,0 +1,71 @@ + + + + Full Effects Test Suite + + + + + + + +
    +
    +

    Full Effects Test Suite

    +
      +
    • fade
    • +
    • appear
    • +
    • puff
    • +
    • blindDown
    • +
    • blindUp
    • +
    • switchOff
    • +
    • slideDown
    • +
    • slideUp
    • +
    • dropOut
    • +
    • shake
    • +
    • pulsate
    • +
    • squish
    • +
    • fold
    • +
    • grow
    • +
    • shrink
    • +
    • Highlight
    • +
    • Morph font
    • +
    • Morph color
    • +
    • toggle (blind)
    • +
    • toggle (slide)
    • +
    • toggle (appear)
    • +
    • toggle (size)
    • +
    +
    +
    Click on one of the left to see the effect
    +
    +
    +
    + + diff --git a/mochikit_v14/examples/effects/icon.png b/mochikit_v14/examples/effects/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..f752986b7e13a7a2f6eba78c031245d6d5619883 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^{2l_A#9tMX0|NmDrFsx-@c(b-S8E8nF zr;B4q#jTu9ZlOaC9L}3>_eUu@yswW~7@EHA@&RV25BJ&+*}XdV*_+ouef4?fIlmXb z-lMzg3V+M=d7kM{OWM^66nWFuZByIY`}FDgE%Pd6cKYaTm>@Q-Wm|@Ri|beZBP&+_ b=P+Opo5*u_^+#4gpp6Wku6{1-oD!M<-aKpU literal 0 HcmV?d00001 diff --git a/mochikit_v14/examples/effects/index.html b/mochikit_v14/examples/effects/index.html new file mode 100644 index 0000000..05f9569 --- /dev/null +++ b/mochikit_v14/examples/effects/index.html @@ -0,0 +1,113 @@ + + + + Test Effects + + + + + + + + +

    Here are demos of all combination effects:

    +
    +
    + Click for Visual.appear demo +
    +
    + Click for Visual.fade demo +
    +
    + Click for Visual.puff demo +
    +
    +
    + + Click for Visual.blindDown demo +
    +
    +
    + Click for Visual.blindUp demo +
    +
    + Click for Visual.switchOff demo +
    +
    + Click for Visual.slideDown demo +
    +
    + Click for Visual.slideUp demo +
    +
    + Click for Visual.dropOut demo +
    +
    + Click for Visual.shake demo +
    +
    + Click for Visual.pulsate demo +
    +
    + Click for Visual.squish demo +
    +
    + Click for Visual.fold demo +
    +
    + Click for Visual.grow demo +
    +
    + Click for Visual.shrink demo +
    +
    + Click for Visual.Highlight demo +
    +
    + +

    Here are all demos on one single element:

    +
      +
    • Click for Visual.appear demo
    • +
    • Click for Visual.fade demo
    • +
    • Click for Visual.puff demo
    • +
    • Click for Visual.blindDown demo
    • +
    • Click for Visual.blindUp demo
    • +
    • Click for Visual.switchOff demo
    • +
    • Click for Visual.slideDown demo
    • +
    • Click for Visual.slideUp demo
    • +
    • Click for Visual.dropOut demo
    • +
    • Click for Visual.shake demo
    • +
    • Click for Visual.pulsate demo
    • +
    • Click for Visual.squish demo
    • +
    • Click for Visual.fold demo
    • +
    • Click for Visual.grow demo
    • +
    • Click for Visual.shrink demo
    • +
    • Click for Visual.Highlight demo
    • +
    • Click for Visual.toggle demo (blind)
    • +
    • Click for Visual.toggle demo (slide)
    • +
    • Click for Visual.toggle demo (appear)
    • +
    • Click for Visual.toggle demo (size)
    • +
    +
    + Click on one of the left to see the effect +
    +Click here to reset box + + + + diff --git a/mochikit_v14/examples/interpreter/index.html b/mochikit_v14/examples/interpreter/index.html new file mode 100644 index 0000000..d9c8a3e --- /dev/null +++ b/mochikit_v14/examples/interpreter/index.html @@ -0,0 +1,88 @@ + + + + Interpreter - JavaScript Interactive Interpreter + + + + + +

    + Interpreter - JavaScript Interactive Interpreter +

    +
    +

    + This demo is a JavaScript interpreter. Type some code into + the text input and press enter to see the results. It uses + MochiKit's + MochiKit.DOM + to manipulate the display. It also supports waiting for + MochiKit.Async + Deferreds via blockOn(aDeferred). +

    +
    + +
    + View Source: [ + index.html | + interpreter.js + ] +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + Notes: +
      +
    • + To show the signature of a MochiKit function and link + to its documentation, type help(fn) on any MochiKit + function. +
    • +
    • + To write multi-line code snippets, use the lower text area + and press ctrl-enter or cmd-enter to submit. +
    • +
    • + function name() {} syntax might not end up in + window scope, so use name = function () {} + syntax instead +
    • +
    • + If you want to stuff something into the output window + other than the repr(...) of the expression + result, use the writeln(...) function. + It accepts anything that MochiKit.DOM does, so you can + even put styled stuff in there! +
    • +
    • + Use clear() to clear the interpreter window. +
    • +
    • + You can use blockOn(aDeferred) to wait on a + Deferred. This expression must be used by itself, so + the value must be obtained from _ or + last_exc. Typing any expression will + cancel the Deferred. +
    • +
    • + Up and down arrow keys work as a rudimentary history +
    • +
    • + _ is the value of the last expression + that was not undefined, last_exc is + the value of the last unhandled exception. +
    • +
    +
    + + diff --git a/mochikit_v14/examples/interpreter/interpreter.css b/mochikit_v14/examples/interpreter/interpreter.css new file mode 100755 index 0000000..56c7320 --- /dev/null +++ b/mochikit_v14/examples/interpreter/interpreter.css @@ -0,0 +1,54 @@ +h1 { + font-size: 2em; + color: #4B4545; + text-align: center; +} + +textarea.textbox { + font-family: Monaco, "lucida console", Courier; + border: 1px solid #CCCCCC; + font-size: .60em; + padding: 2px 4px; + margin-top: .3em; +} + +input.textbox { + font-family: Monaco, "lucida console", Courier; + border: 1px solid #CCCCCC; + font-size: .60em; + padding: 2px 4px; + margin-top: .3em; +} + +#interpreter_area { + display: block; + border: 1px solid #CCCCCC; + padding: 2px 4px; + margin-top: .3em; + width: 600px; + height: 300px; + overflow: auto; +} + +#interpreter_output { + display: inline; + font-family: Monaco, "lucida console", Courier; + font-size: .60em; +} + +#interpreter_output span { + white-space: -moz-pre-wrap; /* Mozilla */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS 2.1 */ + white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */ + word-wrap: break-word; /* IE */ + wrap-option: emergency; /* CSS 3 */ +} + +input.textbox:focus { background-color: #FFFEE3; } + +.code { color: blue; } +.data { color: black; } +.error { color: red; } +.banner { color: green; } +.invisible { display: none; } diff --git a/mochikit_v14/examples/interpreter/interpreter.js b/mochikit_v14/examples/interpreter/interpreter.js new file mode 100644 index 0000000..c79021a --- /dev/null +++ b/mochikit_v14/examples/interpreter/interpreter.js @@ -0,0 +1,373 @@ +/* + + Interpreter: JavaScript Interactive Interpreter + +*/ +InterpreterManager = function () { + bindMethods(this); +}; + +InterpreterManager.prototype.initialize = function () { + connect("interpreter_text", "onkeyup", this.keyUp); + connect("interpreter_textarea", "onkeydown", this.areaKeyDown); + connect("interpreter_form", "onsubmit", this.submit); + getElement("interpreter_text").focus(); + + this.banner(); + this.lines = []; + this.history = []; + this.currentHistory = ""; + this.historyPos = -1; + this.blockingOn = null; + if (typeof(this.doEval) == "undefined") { + // detect broken eval, warn at some point if a namespace ever gets used + this.doEval = function () { + return eval(arguments[0]); + } + } + window.help = this.help; + this.help.NAME = 'type help(func) for help on a MochiKit function'; +}; + +InterpreterManager.prototype.banner = function () { + var _ua = window.navigator.userAgent; + var ua = _ua.replace(/^Mozilla\/.*?\(.*?\)\s*/, ""); + if (ua == "") { + // MSIE + ua = _ua.replace(/^Mozilla\/4\.0 \(compatible; MS(IE .*?);.*$/, "$1"); + } + appendChildNodes("interpreter_output", + SPAN({"class": "banner"}, + "MochiKit v" + MochiKit.Base.VERSION + " [" + ua + "]", + BR(), + "Type your expression in the input box below and press return, or see the notes below for more information.", + BR() + ), + BR() + ); +}; + +InterpreterManager.prototype.submit = function (event) { + if (this.blockingOn) { + try { + this.blockingOn.cancel(); + } catch (e) { + this.showError(e); + } + this.blockingOn = null; + } + this.doSubmit(); + this.doScroll(); + event.stop(); +}; + +InterpreterManager.prototype.help = function (fn) { + if (fn && fn.NAME) { + fn = fn.NAME; + } + if (typeof(fn) != "string" || fn.length == 0) { + writeln("help(func) on any MochiKit function for help"); + return; + } + var comps = fn.split('.'); + var base = comps.splice(0, 2); + var shortfn = comps.join('.'); + var url = '../../doc/html/' + base.join('/') + '.html'; + var d = doXHR(url, {mimeType: 'text/xml'}); + d.addCallback(function (req) { + var els = getElementsByTagAndClassName( + 'a', 'mochidef', req.responseXML); + var match = '#fn-' + shortfn.toLowerCase(); + for (var i = 0; i < els.length; i++) { + var elem = els[i]; + var href = elem.href; + var idx = href.indexOf('#'); + if (idx != -1 && href.substring(idx) == match) { + writeln(A({href: url + match, target: '_blank'}, + scrapeText(elem))); + return; + } + } + writeln('documentation for ' + fn + ' not found'); + }); + blockOn(d); +}; + + +InterpreterManager.prototype.doScroll = function () { + var p = getElement("interpreter_output").lastChild; + if (typeof(p) == "undefined" || p == null) { + return; + } + var area = getElement("interpreter_area"); + if (area.offsetHeight > area.scrollHeight) { + area.scrollTop = 0; + } else { + area.scrollTop = area.scrollHeight; + } +}; + +InterpreterManager.prototype.moveHistory = function (dir) { + // totally bogus value + if (dir == 0 || this.history.length == 0) { + return; + } + var elem = getElement("interpreter_text"); + if (this.historyPos == -1) { + this.currentHistory = elem.value; + if (dir > 0) { + return; + } + this.historyPos = this.history.length - 1; + elem.value = this.history[this.historyPos]; + return; + } + if (this.historyPos == 0 && dir < 0) { + return; + } + if (this.historyPos == this.history.length - 1 && dir > 0) { + this.historyPos = -1; + elem.value = this.currentHistory; + return; + } + this.historyPos += dir; + elem.value = this.history[this.historyPos]; +} + +InterpreterManager.prototype.runMultipleLines = function (text) { + var lines = rstrip(text).replace("\r\n", "\n").split(/\n/); + appendChildNodes("interpreter_output", + SPAN({"class": "code"}, ">>> ", izip(lines, imap(BR, cycle([null])))) + ); + this.runCode(text); +} + +InterpreterManager.prototype.areaKeyDown = function (e) { + var mod = e.modifier(); + var hasMod = mod.alt || mod.ctrl || mod.meta; + if (e.key().string == 'KEY_ENTER' && hasMod) { + var elem = getElement("interpreter_textarea"); + var text = elem.value; + elem.value = ""; + this.runMultipleLines(text); + e.stop(); + } +}; + +InterpreterManager.prototype.keyUp = function (e) { + var key = e.key(); + // if any meta key is pressed, don't handle the signal + if (e.modifier().any) { + return; + } + switch (key.string) { + case 'KEY_ARROW_UP': this.moveHistory(-1); break; + case 'KEY_ARROW_DOWN': this.moveHistory(1); break; + default: return; + } + e.stop(); +}; + +InterpreterManager.prototype.blockOn = function (d) { + var node = SPAN({"class": "banner"}, "blocking on " + repr(d) + "..."); + this.blockingOn = d; + appendChildNodes("interpreter_output", node); + this.doScroll(); + d.addBoth(function (res) { + swapDOM(node); + this.blockingOn = null; + if (res instanceof CancelledError) { + window.writeln(SPAN({"class": "error"}, repr(d) + " cancelled!")); + return undefined; + } + return res; + }); + d.addCallbacks(this.showResult, this.showError); +}; + +InterpreterManager.prototype.showError = function (e) { + if (typeof(e) != "object") { + e = new Error(e); + } + appendChildNodes("interpreter_output", + SPAN({"class": "error"}, "Error:"), + TABLE({"class": "error"}, + THEAD({"class": "invisible"}, TD({"colspan": 2})), + TFOOT({"class": "invisible"}, TD({"colspan": 2})), + TBODY(null, + map(function (kv) { + var v = kv[1]; + if (typeof(v) == "function") { + return; + } + if (typeof(v) == "object") { + v = repr(v); + } + return TR(null, + TD({"class": "error"}, kv[0]), + TD({"class": "data"}, v) + ); + }, sorted(items(e))) + ) + ) + ); + window.last_exc = e; + this.doScroll(); +}; + +EvalFunctions = { + evalWith: function () { + with (arguments[1] || window) { return eval(arguments[0]); }; + }, + evalCall: function () { + return eval.call(arguments[1] || window, arguments[0]); + }, + choose: function () { + var ns = {__test__: this}; + var e; + try { + if (this.evalWith("return __test__", ns) === this) { + return this.evalWith; + } + } catch (e) { + // pass + } + try { + if (this.evalCall("return __test__", ns) === this) { + return this.evalCall; + } + } catch (e) { + // pass + } + return undefined; + } +}; + +InterpreterManager.prototype.doEval = EvalFunctions.choose(); + +InterpreterManager.prototype.doSubmit = function () { + var elem = getElement("interpreter_text"); + var code = elem.value; + elem.value = ""; + var isContinuation = false; + if (code.length >= 2 && code.lastIndexOf("//") == code.length - 2) { + isContinuation = true; + code = code.substr(0, code.length - 2); + } + appendChildNodes("interpreter_output", + SPAN({"class": "code"}, ">>> ", code), + BR() + ); + this.lines.push(code); + this.history.push(code); + this.historyPos = -1; + this.currentHistory = ""; + if (isContinuation) { + return; + } + var allCode = this.lines.join("\n"); + this.lines = []; + this.runCode(allCode); + return; +}; + +InterpreterManager.prototype.runCode = function (allCode) { + var res; + try { + res = this.doEval(allCode); + } catch (e) { + // mozilla shows some keys more than once! + this.showError(e); + return; + } + this.showResult(res); +}; + +InterpreterManager.prototype.showResult = function (res) { + if (typeof(res) != "undefined") { + window._ = res; + } + if (typeof(res) != "undefined") { + appendChildNodes("interpreter_output", + SPAN({"class": "data"}, repr(res)), + BR() + ); + this.doScroll(); + } +}; + +window.writeln = function () { + appendChildNodes("interpreter_output", + SPAN({"class": "data"}, arguments), + BR() + ); + interpreterManager.doScroll(); +}; + +window.clear = function () { + replaceChildNodes("interpreter_output"); + getElement("interpreter_area").scrollTop = 0; +}; + +window.blockOn = function (d) { + if (!(d instanceof Deferred)) { + throw new TypeError(repr(d) + " is not a Deferred!"); + } + interpreterManager.blockOn(d); +}; + +window.dir = function (o) { + // Python muscle memory! + return sorted(keys(o)); +}; + +window.inspect = function (o) { + window._ = o; + if ((typeof(o) != "function" && typeof(o) != "object") || o == null) { + window.writeln(repr(o)); + return; + } + var pairs = items(o); + if (pairs.length == 0) { + window.writeln(repr(o)); + return; + } + window.writeln(TABLE({"border": "1"}, + THEAD({"class": "invisible"}, TR(null, TD(), TD())), + TFOOT({"class": "invisible"}, TR(null, TD(), TD())), + TBODY(null, + map( + function (kv) { + var click = function () { + try { + window.inspect(kv[1]); + } catch (e) { + interpreterManager.showError(e); + } + return false; + } + return TR(null, + TD(null, A({href: "#", onclick: click}, kv[0])), + TD(null, repr(kv[1])) + ); + }, + pairs + ) + ) + )); +}; + +interpreterManager = new InterpreterManager(); +addLoadEvent(interpreterManager.initialize); + +// rewrite the view-source links +addLoadEvent(function () { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "interpreter/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } +}); diff --git a/mochikit_v14/examples/key_events/index.html b/mochikit_v14/examples/key_events/index.html new file mode 100644 index 0000000..e58e5e6 --- /dev/null +++ b/mochikit_v14/examples/key_events/index.html @@ -0,0 +1,78 @@ + + + + Signal Example + + + + + + +

    + Key Events with MochiKit +

    +

    + This is an example of one might implement a key listener with + MochiKit’s Signal. +

    +

    + For a detailed description of what happens under the hood, check out + key_events.js. +

    + +

    + View Source: [ + index.html | + key_events.js | + key_events.css + ] +

    + +

    Check this box to test + preventDefault() in your browser: +

    + +

    This text is replaced with a message when you press Escape or F1.

    + + + + + + + + + + + + + + + + + + + + + + +
    EventKey CodeKey String
    onkeydown--
    onkeyup--
    onkeypress--
    + +

    Modifiers

    + + + + + + + + + + + + + +
    ShiftCtrlAlt (Option)Meta (Command)
    ----
    + + + diff --git a/mochikit_v14/examples/key_events/key_events.css b/mochikit_v14/examples/key_events/key_events.css new file mode 100755 index 0000000..1e71029 --- /dev/null +++ b/mochikit_v14/examples/key_events/key_events.css @@ -0,0 +1,5 @@ +h1 { + font-size: 2em; + color: #4B4545; + text-align: center; +} \ No newline at end of file diff --git a/mochikit_v14/examples/key_events/key_events.js b/mochikit_v14/examples/key_events/key_events.js new file mode 100644 index 0000000..9eab2fa --- /dev/null +++ b/mochikit_v14/examples/key_events/key_events.js @@ -0,0 +1,85 @@ +/* + + Key Events: A Really Simple Key Handler + +*/ + +KeyEvents = { + handled: false, + handleF1: function() { + replaceChildNodes('specialMessage', 'You invoked the special F1 handler!'); + }, + handleEscape: function() { + replaceChildNodes('specialMessage', 'You invoked the special Escape handler!'); + }, + updateModifiers: function(e) { + var modifiers = e.modifier(); + replaceChildNodes('shift', modifiers.shift); + replaceChildNodes('ctrl', modifiers.ctrl); + replaceChildNodes('alt', modifiers.alt); + replaceChildNodes('meta', modifiers.meta); + } +}; + +KeyEvents.specialKeyMap = { + 'KEY_F1': KeyEvents.handleF1, + 'KEY_ESCAPE': KeyEvents.handleEscape +}; + +connect(document, 'onkeydown', + function(e) { + if (getElement('stopBox').checked == true) { + e.preventDefault(); + } + + // We're storing a handled flag to work around a Safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=3387 + if (!KeyEvents.handled) { + var key = e.key(); + var fn = KeyEvents.specialKeyMap[key.string]; + if (fn) { + fn(); + } + replaceChildNodes('onkeydown_code', key.code); + replaceChildNodes('onkeydown_string', key.string); + KeyEvents.updateModifiers(e); + } + KeyEvents.handled = true; + }); + +connect(document, 'onkeyup', + function(e) { + if (getElement('stopBox').checked == true) { + e.preventDefault(); + } + + KeyEvents.handled = false; + var key = e.key(); + replaceChildNodes('onkeyup_code', key.code); + replaceChildNodes('onkeyup_string', key.string); + KeyEvents.updateModifiers(e); + }); + +connect(document, 'onkeypress', + function(e) { + if (getElement('stopBox').checked == true) { + e.preventDefault(); + } + + var key = e.key(); + replaceChildNodes('onkeypress_code', key.code); + replaceChildNodes('onkeypress_string', key.string); + KeyEvents.updateModifiers(e); + }); + +connect(window, 'onload', + function() { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "key_events/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } + }); \ No newline at end of file diff --git a/mochikit_v14/examples/logging_pane/index.html b/mochikit_v14/examples/logging_pane/index.html new file mode 100644 index 0000000..d046f19 --- /dev/null +++ b/mochikit_v14/examples/logging_pane/index.html @@ -0,0 +1,46 @@ + + + + Demo of MochiKit.LoggingPane + + + + + +

    MochiKit.LoggingPane

    +
    +

    + Demonstrates MochiKit's + MochiKit.Logging + and MochiKit.LoggingPane. +

    +

    + Click one of the Logging Panes to pop up a view, and then + start clicking on Logging Actions to see it in action! +

    +
    +
    + Logging Panes: + +
    +
    + Logging Actions: + +
    + View Source: + +
    + + diff --git a/mochikit_v14/examples/logging_pane/logging_pane.css b/mochikit_v14/examples/logging_pane/logging_pane.css new file mode 100755 index 0000000..350065a --- /dev/null +++ b/mochikit_v14/examples/logging_pane/logging_pane.css @@ -0,0 +1,78 @@ +h1 { + font-size: 2em; + color: #4B4545; + text-align: center; +} + +table.datagrid { + width: 100%; + border-collapse: collapse; +} + +table.datagrid thead th { + text-align: left; + background-color: #4B4545; + background-repeat: no-repeat; + background-position: right center; + color: white; + font-weight: bold; + padding: .3em .7em; + font-size: .9em; + padding-right: 5px; + background-repeat: no-repeat; + background-position: 95% right; +} + +table.datagrid thead th a { + color: white; + text-decoration: none; + font-size: 1.0em; + background-repeat: no-repeat; + background-position: center right; + padding-right: 15px; +} + +table.datagrid thead th.over { + background-color: #746B6B; + cursor: pointer; +} + +table.datagrid tbody th { + font-weight: bold; +} + +table.datagrid tbody td, table.datagrid tbody th { + text-align: left; + padding: .3em .7em; + border-bottom: 1px solid #eee; +} + +table.datagrid tbody tr.alternate td, table.datagrid tbody tr.alternate th { + background-color: #f1f1f1; +} + +table.datagrid tfoot td, table.datagrid tfoot th { + background-color: #FFFEE3; + color: #4B4545; + padding: .5em; + font-weight: bold; + border-top: 2px solid #4B4545; +} + +table.datagrid tfoot th { text-align: left; } + +table.datagrid tfoot td { } + +.invisible { display: none; } + +input.textbox, textarea { border: 1px solid #CCCCCC; font-size: .95em; padding: 2px 4px; margin-top: .3em; } +input.textbox:focus, textarea:focus { background-color: #FFFEE3; } + +.highlight { font-weight: bold; }; +form { margin: 0; padding: 0; } + +fieldset { border: none; margin: 0; padding: 0; } +fieldset label { font-weight: bold; color: #4B4545; } +fieldset .field { margin-bottom: 1em; } + +label.error { color: red; } diff --git a/mochikit_v14/examples/logging_pane/logging_pane.js b/mochikit_v14/examples/logging_pane/logging_pane.js new file mode 100644 index 0000000..61bd1ee --- /dev/null +++ b/mochikit_v14/examples/logging_pane/logging_pane.js @@ -0,0 +1,11 @@ +// rewrite the view-source links +addLoadEvent(function () { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "logging_pane/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } +}); diff --git a/mochikit_v14/examples/mochiregexp/index.html b/mochikit_v14/examples/mochiregexp/index.html new file mode 100644 index 0000000..bd2ad09 --- /dev/null +++ b/mochikit_v14/examples/mochiregexp/index.html @@ -0,0 +1,74 @@ + + + + MochiRegExp - JavaScript Regular Expression (RegExp) Explorer + + + + + +

    + MochiRegExp - JavaScript Regular Expression (RegExp) Explorer +

    +
    +

    + This demo does "live" Regular Expression matching to help you + toy with JavaScript Regular Expressions. + It takes advantage of + MochiKit's + MochiKit.DOM + to manipulate the display and + MochiKit.Async + to facilitate the "half a second" live updating. +

    +

    + The table will update while you're typing if you're idle for + half a second or when you tab away from the field, whichever + comes first. If you enter an invalid RegExp, the RegExp label + will turn red (the "error" class). + For a good JavaScript's RegExp reference, see + Regular Expressions + over at DevMo. +

    +
    + +
    + + + + + + + + + + + + + + + + + +
    +
    + +
    + View Source: [ + index.html | + mochiregexp.js + ] +
    + + + + + + + + + + +
    PropertyResultRepr
    + + diff --git a/mochikit_v14/examples/mochiregexp/mochiregexp.css b/mochikit_v14/examples/mochiregexp/mochiregexp.css new file mode 100755 index 0000000..be4e78e --- /dev/null +++ b/mochikit_v14/examples/mochiregexp/mochiregexp.css @@ -0,0 +1,73 @@ +h1 { + font-size: 2em; + color: #4B4545; + text-align: center; +} + +table.datagrid { + width: 100%; + border-collapse: collapse; +} + +table.datagrid thead th { + text-align: left; + background-color: #4B4545; + background-repeat: no-repeat; + background-position: right center; + color: white; + font-weight: bold; + padding: .3em .7em; + font-size: .9em; + padding-right: 5px; + background-repeat: no-repeat; + background-position: 95% right; +} + +table.datagrid thead th a { + color: white; + text-decoration: none; + font-size: 1.0em; + background-repeat: no-repeat; + background-position: center right; + padding-right: 15px; +} + +table.datagrid tbody th { + font-weight: bold; +} + +table.datagrid tbody td, table.datagrid tbody th { + text-align: left; + padding: .3em .7em; + border-bottom: 1px solid #eee; +} + +table.datagrid tbody tr.alternate td, table.datagrid tbody tr.alternate th { + background-color: #f1f1f1; +} + +table.datagrid tfoot td, table.datagrid tfoot th { + background-color: #FFFEE3; + color: #4B4545; + padding: .5em; + font-weight: bold; + border-top: 2px solid #4B4545; +} + +table.datagrid tfoot th { text-align: left; } + +table.datagrid tfoot td { } + +.invisible { display: none; } + +input.textbox, textarea { border: 1px solid #CCCCCC; font-size: .95em; padding: 2px 4px; margin-top: .3em; } +input.textbox:focus, textarea:focus { background-color: #FFFEE3; } + +.highlight { font-weight: bold; }; +form { margin: 0; padding: 0; } + +fieldset { border: none; margin: 0; padding: 0; } +fieldset label { font-weight: bold; color: #4B4545; } +fieldset .field { margin-bottom: 1em; } + +.error { color: red; } diff --git a/mochikit_v14/examples/mochiregexp/mochiregexp.js b/mochikit_v14/examples/mochiregexp/mochiregexp.js new file mode 100644 index 0000000..911c6cf --- /dev/null +++ b/mochikit_v14/examples/mochiregexp/mochiregexp.js @@ -0,0 +1,125 @@ +/* + + MochiRegExp: JavaScript Regular Expression Explorer + +*/ +RegExpManager = function () { + this.timer = null; + bindMethods(this); +}; + +RegExpManager.prototype.initialize = function () { + /* + Fill in the event handlers and sample text, and do the initial update + The reason we do the sample text here is so that "clear" really does + clear the fields. + */ + setNodeAttribute("inp_text", "value", "matched with your pattern"); + connect("inp_text", "onkeyup", this, "updateSoon"); + connect("inp_text", "onchange", this, "update"); + + setNodeAttribute("inp_regexp", "value", "/(pattern)/"); + connect("inp_regexp", "onkeyup", this, "updateSoon"); + connect("inp_regexp", "onchange", this, "update"); + + connect("regexp_form", "onsubmit", this, "submit"); + + this.update(); +}; + +RegExpManager.prototype.updateSoon = function () { + /* + If the user stops typing for half a second, do one update. + */ + this.cancelTimer(); + this.timer = callLater(0.5, this.update); +}; + +RegExpManager.prototype.cancelTimer = function () { + /* + Cancel the timer that waits for the user to idle for half a second. + */ + if (this.timer) { + this.timer.cancel(); + } + this.timer = null; +}; + +RegExpManager.prototype.update = function () { + /* + Cancel the update timer and actually do an update of the + RegExp + */ + this.cancelTimer(); + var re; + try { + // Evaluate the regexp + re = eval("(" + getElement("inp_regexp").value + ")"); + } catch (e) { + // If invalid, color it red and stop + addElementClass("lab_regexp", "error"); + return; + } + // Make sure that it's not red + removeElementClass("lab_regexp", "error"); + + // replace the contents of the tbody + var match = getElement("inp_text").value.match(re); + replaceChildNodes("result_body", this.getRows(match)); +}; + +RegExpManager.prototype.getRows = function (match) { + /* + Return rows for the tbody given a match object + */ + if (!match) { + // No match, bail with a no match row + return TR(null, TD({"colspan": "3"}, "No match!")); + } + var isAlternate = true; + var res = []; + for (var k in match) { + isAlternate = !isAlternate; + var trAttribs = isAlternate ? {"class": "alternate"} : null; + var v = match[k]; + var result = v; + // Highlight the result for the input property as three spans: + // [beforeMatch, duringMatch, afterMatch] + if (k == "input") { + var end = match.index + match[0].length; + result = [ + SPAN(null, v.substr(0, match.index)), + SPAN({"class": "highlight"}, v.substring(match.index, end)), + SPAN(null, v.substr(end)) + ]; + } + res.push( + TR((isAlternate ? {"class": "alternate"} : null), + TD(null, k), + TD(null, result), + TD(null, repr(v)) + ) + ); + } + return res; +}; + +RegExpManager.prototype.submit = function () { + this.update(); + return false; +}; + +regExpManager = new RegExpManager(); +addLoadEvent(regExpManager.initialize); + +// rewrite the view-source links +addLoadEvent(function () { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "mochiregexp/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } +}); diff --git a/mochikit_v14/examples/rounded_corners/index.html b/mochikit_v14/examples/rounded_corners/index.html new file mode 100644 index 0000000..9513631 --- /dev/null +++ b/mochikit_v14/examples/rounded_corners/index.html @@ -0,0 +1,28 @@ + + + + Demo of MochiKit Visual Elements + + + + + +

    MochiKit.Visual

    +

    Rounded Corners

    +

    + This example demonstrates the rounded corners functionality of + MochiKit's + MochiKit.Visual. +

    +

    + The heading at the top of this page should have all four corners + rounded. The heading for this section should just have the bottom + corners rounded. +

    + View Source: + + + diff --git a/mochikit_v14/examples/rounded_corners/rounded_corners.css b/mochikit_v14/examples/rounded_corners/rounded_corners.css new file mode 100755 index 0000000..a700b69 --- /dev/null +++ b/mochikit_v14/examples/rounded_corners/rounded_corners.css @@ -0,0 +1,3 @@ +h1 { background: darkgreen; color: yellow; text-align: center; } +h2 { background: darkgreen; color: yellow; padding-top: 0.25em;} +.invisible { display: none; } diff --git a/mochikit_v14/examples/rounded_corners/rounded_corners.js b/mochikit_v14/examples/rounded_corners/rounded_corners.js new file mode 100644 index 0000000..d063ae1 --- /dev/null +++ b/mochikit_v14/examples/rounded_corners/rounded_corners.js @@ -0,0 +1,19 @@ +var roundedCornersOnLoad = function () { + swapDOM("visual_version", SPAN(null, MochiKit.Visual.VERSION)); + roundClass("h1", null); + roundClass("h2", null, {corners: "bottom"}); +}; +addLoadEvent(roundedCornersOnLoad); + +// rewrite the view-source links +addLoadEvent(function () { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "rounded_corners/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } +}); + diff --git a/mochikit_v14/examples/simple_dnd/dnd_boxes.html b/mochikit_v14/examples/simple_dnd/dnd_boxes.html new file mode 100644 index 0000000..81074e4 --- /dev/null +++ b/mochikit_v14/examples/simple_dnd/dnd_boxes.html @@ -0,0 +1,45 @@ + + + + script.aculo.us Drag and drop functional test file + + + + + + + + +

    script.aculo.us Drag and drop functional test file

    + +

    Draggables/Droppables

    + +
    + drag here
    + Revert? +
    + +
    + drag here
    + Revert? +
    + +
    accepts first box
    +
    accepts second box
    + + + + + + diff --git a/mochikit_v14/examples/simple_dnd/dnd_full.html b/mochikit_v14/examples/simple_dnd/dnd_full.html new file mode 100644 index 0000000..da8e613 --- /dev/null +++ b/mochikit_v14/examples/simple_dnd/dnd_full.html @@ -0,0 +1,119 @@ + + + + script.aculo.us Drag and drop functional test file + + + + + + + + + +

    script.aculo.us Drag and drop functional test file

    + +

    Draggables/Droppables

    + +
    + drag here
    + Revert? +
    + +
    + drag here
    + Revert? +
    + +
    testtest
    + + + + + + +
      +
    • Hey there! I'm absolutely positioned
    • +
    • one
    • +
    • two
    • +
    • three
    • +
    + +
      +
    • Relatively here!
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    + + + + + + + diff --git a/mochikit_v14/examples/simple_dnd/dnd_ghost.html b/mochikit_v14/examples/simple_dnd/dnd_ghost.html new file mode 100644 index 0000000..5f6806b --- /dev/null +++ b/mochikit_v14/examples/simple_dnd/dnd_ghost.html @@ -0,0 +1,40 @@ + + + + script.aculo.us Drag and drop functional test file + + + + + + + +
    +(inside position:relative container) +

    script.aculo.us Drag and drop functional test file

    + +

    Draggables/Droppables

    + +
    + Ghosting effect + +
    test!
    +
    +
    + +alert contents of test div + +
    + Ghost effect
    +
    + + +
    + + diff --git a/mochikit_v14/examples/simple_dnd/dnd_hoverclass.html b/mochikit_v14/examples/simple_dnd/dnd_hoverclass.html new file mode 100644 index 0000000..65e43ca --- /dev/null +++ b/mochikit_v14/examples/simple_dnd/dnd_hoverclass.html @@ -0,0 +1,43 @@ + + +script.aculo.us Drag and drop functional test file + + + + + + + + +

    script.aculo.us Drag and drop functional test file

    + +

    w/o hoverclass

    + +
    +### DROP HERE ### +
    + + + +
    + +Product2 <-- drag this! + + + +

    w/ hoverclass

    + + +
    +### DROP HERE ### +
    + + + + + + diff --git a/mochikit_v14/examples/simple_dnd/dnd_scroll.html b/mochikit_v14/examples/simple_dnd/dnd_scroll.html new file mode 100644 index 0000000..829425e --- /dev/null +++ b/mochikit_v14/examples/simple_dnd/dnd_scroll.html @@ -0,0 +1,91 @@ + + + + script.aculo.us Drag and drop functional test file + + + + + + + + + +

    script.aculo.us Drag and drop functional test file

    + +

    Draggables/Droppables

    + +
    + +
      +
    • Relatively here!
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    • one
    • +
    + +
    + +
    
    +
    +
    +
    +
    diff --git a/mochikit_v14/examples/simple_dnd/dnd_snap.html b/mochikit_v14/examples/simple_dnd/dnd_snap.html
    new file mode 100644
    index 0000000..936557f
    --- /dev/null
    +++ b/mochikit_v14/examples/simple_dnd/dnd_snap.html
    @@ -0,0 +1,54 @@
    +
    +
    +
    +  script.aculo.us Drag and drop functional test file
    +  
    +    
    +    
    +    
    +    
    +  
    +
    +
    +

    script.aculo.us Drag and drop functional test file

    + +

    Draggables/Droppables

    + +
    + Normal box +
    + +
    + snap: 25 +
    + +
    + snap: [5,25] +
    + +
    + snap: procedural (e.g. constrain to box) +
    + + + + + + diff --git a/mochikit_v14/examples/simple_dnd/index.html b/mochikit_v14/examples/simple_dnd/index.html new file mode 100644 index 0000000..1401e96 --- /dev/null +++ b/mochikit_v14/examples/simple_dnd/index.html @@ -0,0 +1,93 @@ + + + + Test Drag and drop with MochiKit + + + + + + + + +

    Drag and Drop examples.

    +
    +
    test drag 1
    +
    test drag 2 (horizontal)
    +
    test drag 3 (vertical)
    +
    test drag 4 (selectclass)
    +
    test drag 5 (fixed)
    +
    test drag 6 (absolute)
    +
    test drag 7 (relative)
    +
    test drag 8 (handle)
    +
    handle for drag 8
    +
    +
    +
    test drop 1
    +
    test drop 2 (hoverclass)
    +
    test drop 3 (activeclass)
    +
    test drop 4 (hoverFunc)
    +
    test drop 5 (activeFunc)
    +
    test drop 6
    +
    No select
    +
    + +
    + Links to other samples: + +
    + + diff --git a/mochikit_v14/examples/simple_dnd/simple_dnd.css b/mochikit_v14/examples/simple_dnd/simple_dnd.css new file mode 100755 index 0000000..78554aa --- /dev/null +++ b/mochikit_v14/examples/simple_dnd/simple_dnd.css @@ -0,0 +1,64 @@ +.drag { + background-color: blue; + width: 100px; + padding: 5px; + margin: 10px; + border: 1px solid black; +} + +#dropzones { + margin-top: 100px; + display: inline; +} + +.drop { + background-color: red; + width: 100px; + padding: 5px; + margin: 10px; + border: 1px solid black; + display: inline; +} + +.droptrans { + width: 100px; + padding: 5px; + margin: 10px; + border: 1px solid black; +} + +.drop-hover { + border: 2px solid green; +} + +.drop-active { + background-color: #FF79ED; +} + +.drag-select { + background-color: green; +} + +#drag-5 { + position: fixed; + top: 100px; + left: 200px; +} +#drag-6 { + position: absolute; + top: 100px; + left: 350px; +} +#drag-7 { + position: relative; + top: -100px; + left: 500px; +} +#drop-6 { + display: inline; +} +#droptext { + margin-top: 20px; + border: 1px dashed black; + padding: 10px; +} diff --git a/mochikit_v14/examples/sortable_tables/index.html b/mochikit_v14/examples/sortable_tables/index.html new file mode 100644 index 0000000..404e2b3 --- /dev/null +++ b/mochikit_v14/examples/sortable_tables/index.html @@ -0,0 +1,71 @@ + + + + Sortable Tables from Scratch with MochiKit + + + + + +

    + Sortable Tables from Scratch with MochiKit +

    +

    + This is an example of how one might do sortable tables in + an inobtrusive manner. The data is supplied by the server + and is already in the table. +

    +

    + For a detailed description of what happens under the hood, + check out + sortable_tables.js. +

    +

    + View Source: [ + index.html | + sortable_tables.js + ] +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Domain NameCreation DateExpiry DateOrganization Name
    mochibot.com2005-02-102007-02-10Jameson Hsu
    pythonmac.org2003-09-242006-09-24Bob Ippolito
    undefined.org2000-01-102006-01-10Robert J Ippolito
    python.org1995-03-272007-03-28Python Software Foundation
    + + diff --git a/mochikit_v14/examples/sortable_tables/sortable_tables.css b/mochikit_v14/examples/sortable_tables/sortable_tables.css new file mode 100755 index 0000000..902bc05 --- /dev/null +++ b/mochikit_v14/examples/sortable_tables/sortable_tables.css @@ -0,0 +1,66 @@ +h1 { + font-size: 2em; + color: #4B4545; + text-align: center; +} + +table.datagrid { + width: 100%; + border-collapse: collapse; +} + +table.datagrid thead th { + text-align: left; + background-color: #4B4545; + background-repeat: no-repeat; + background-position: right center; + color: white; + font-weight: bold; + padding: .3em .7em; + font-size: .9em; + padding-right: 5px; + background-repeat: no-repeat; + background-position: 95% right; +} + +table.datagrid thead th a { + color: white; + text-decoration: none; + font-size: 1.0em; + background-repeat: no-repeat; + background-position: center right; + padding-right: 15px; +} + +table.datagrid thead th.over { + background-color: #746B6B; + cursor: pointer; +} + +table.datagrid tbody th { + font-weight: bold; +} + +table.datagrid tbody td, table.datagrid tbody th { + text-align: left; + padding: .3em .7em; + border-bottom: 1px solid #eee; +} + +table.datagrid tbody tr.alternate td, table.datagrid tbody tr.alternate th { + background-color: #f1f1f1; +} + +table.datagrid tfoot td, table.datagrid tfoot th { + background-color: #FFFEE3; + color: #4B4545; + padding: .5em; + font-weight: bold; + border-top: 2px solid #4B4545; +} + +table.datagrid tfoot th { text-align: left; } + +table.datagrid tfoot td { } + +.invisible { display: none; } diff --git a/mochikit_v14/examples/sortable_tables/sortable_tables.js b/mochikit_v14/examples/sortable_tables/sortable_tables.js new file mode 100644 index 0000000..2466f90 --- /dev/null +++ b/mochikit_v14/examples/sortable_tables/sortable_tables.js @@ -0,0 +1,203 @@ +/* + +On page load, the SortableManager: + +- Finds the table by its id (sortable_table). +- Parses its thead for columns with a "mochi:format" attribute. +- Parses the data out of the tbody based upon information given in the + "mochi:format" attribute, and clones the tr elements for later re-use. +- Clones the column header th elements for use as a template when drawing + sort arrow columns. +- Stores away a reference to the tbody, as it will be replaced on each sort. +- Performs the first sort. + + +On sort request: + +- Sorts the data based on the given key and direction +- Creates a new tbody from the rows in the new ordering +- Replaces the column header th elements with clickable versions, adding an + indicator (↑ or ↓) to the most recently sorted column. + +*/ + +SortableManager = function () { + this.thead = null; + this.tbody = null; + this.columns = []; + this.rows = []; + this.sortState = {}; + this.sortkey = 0; +}; + +mouseOverFunc = function () { + addElementClass(this, "over"); +}; + +mouseOutFunc = function () { + removeElementClass(this, "over"); +}; + +ignoreEvent = function (ev) { + if (ev && ev.preventDefault) { + ev.preventDefault(); + ev.stopPropagation(); + } else if (typeof(event) != 'undefined') { + event.cancelBubble = false; + event.returnValue = false; + } +}; + + +update(SortableManager.prototype, { + + "initWithTable": function (table) { + /*** + + Initialize the SortableManager with a table object + + ***/ + // Ensure that it's a DOM element + table = getElement(table); + // Find the thead + this.thead = table.getElementsByTagName('thead')[0]; + // get the mochi:format key and contents for each column header + var cols = this.thead.getElementsByTagName('th'); + for (var i = 0; i < cols.length; i++) { + var node = cols[i]; + var attr = null; + try { + attr = node.getAttribute("mochi:format"); + } catch (err) { + // pass + } + var o = node.childNodes; + this.columns.push({ + "format": attr, + "element": node, + "proto": node.cloneNode(true) + }); + } + // scrape the tbody for data + this.tbody = table.getElementsByTagName('tbody')[0]; + // every row + var rows = this.tbody.getElementsByTagName('tr'); + for (var i = 0; i < rows.length; i++) { + // every cell + var row = rows[i]; + var cols = row.getElementsByTagName('td'); + var rowData = []; + for (var j = 0; j < cols.length; j++) { + // scrape the text and build the appropriate object out of it + var cell = cols[j]; + var obj = scrapeText(cell); + switch (this.columns[j].format) { + case 'isodate': + obj = isoDate(obj); + break; + case 'str': + break; + case 'istr': + obj = obj.toLowerCase(); + break; + // cases for numbers, etc. could be here + default: + break; + } + rowData.push(obj); + } + // stow away a reference to the TR and save it + rowData.row = row.cloneNode(true); + this.rows.push(rowData); + + } + + // do initial sort on first column + this.drawSortedRows(this.sortkey, true, false); + + }, + + "onSortClick": function (name) { + /*** + + Return a sort function for click events + + ***/ + return method(this, function () { + log('onSortClick', name); + var order = this.sortState[name]; + if (order == null) { + order = true; + } else if (name == this.sortkey) { + order = !order; + } + this.drawSortedRows(name, order, true); + }); + }, + + "drawSortedRows": function (key, forward, clicked) { + /*** + + Draw the new sorted table body, and modify the column headers + if appropriate + + ***/ + log('drawSortedRows', key, forward); + this.sortkey = key; + // sort based on the state given (forward or reverse) + var cmp = (forward ? keyComparator : reverseKeyComparator); + this.rows.sort(cmp(key)); + // save it so we can flip next time + this.sortState[key] = forward; + // get every "row" element from this.rows and make a new tbody + var newBody = TBODY(null, map(itemgetter("row"), this.rows)); + // swap in the new tbody + this.tbody = swapDOM(this.tbody, newBody); + for (var i = 0; i < this.columns.length; i++) { + var col = this.columns[i]; + var node = col.proto.cloneNode(true); + // remove the existing events to minimize IE leaks + col.element.onclick = null; + col.element.onmousedown = null; + col.element.onmouseover = null; + col.element.onmouseout = null; + // set new events for the new node + node.onclick = this.onSortClick(i); + node.onmousedown = ignoreEvent; + node.onmouseover = mouseOverFunc; + node.onmouseout = mouseOutFunc; + // if this is the sorted column + if (key == i) { + // \u2193 is down arrow, \u2191 is up arrow + // forward sorts mean the rows get bigger going down + var arrow = (forward ? "\u2193" : "\u2191"); + // add the character to the column header + node.appendChild(SPAN(null, arrow)); + if (clicked) { + node.onmouseover(); + } + } + + // swap in the new th + col.element = swapDOM(col.element, node); + } + } +}); + +sortableManager = new SortableManager(); + +addLoadEvent(function () { + sortableManager.initWithTable('sortable_table'); +}); + +// rewrite the view-source links +addLoadEvent(function () { + var elems = getElementsByTagAndClassName("A", "view-source"); + var page = "sortable_tables/"; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + var href = elem.href.split(/\//).pop(); + elem.target = "_blank"; + elem.href = "../view-source/view-source.html#" + page + href; + } +}); diff --git a/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/SyntaxHighlighter.css b/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/SyntaxHighlighter.css new file mode 100755 index 0000000..9649794 --- /dev/null +++ b/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/SyntaxHighlighter.css @@ -0,0 +1,177 @@ + +/* Main style for the table */ + +.dp-highlighter { + width: 100%; + overflow: auto; + line-height: 100% !important; + margin: 18px 0px 18px 0px; +} + +.dp-highlighter table { + width: 100%; + margin: 2px 0px 2px 0px; + border-collapse: collapse; + border-bottom: 2px solid #eee; + background-color: #fff; +} + +.dp-highlighter tbody.hide { display: none; } +.dp-highlighter tbody.show { display: table-row-group; _display: block; } + +.dp-highlighter td +{ + font-family: Courier New; + font-size: 11px; +} + +/* Styles for the tools */ + +.dp-highlighter .tools-corner { + background-color: #eee; + font-size: 9px; +} + +.dp-highlighter .tools { + background-color: #eee; + padding: 3px 8px 3px 10px; + border-bottom: 1px solid gray; + font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif; + color: silver; +} + +.dp-highlighter .tools-corner { + background-color: #eee; +} + +.dp-highlighter .tools a { + font-size: 9px; + color: gray; + text-decoration: none; +} + +.dp-highlighter .tools a:hover { + color: red; + text-decoration: underline; +} + +/* Gutter with line number */ + +.dp-highlighter .gutter { + padding-right: 5px; + padding-left: 10px; + width: 5px; + background-color: #eee; + border-right: 1px solid gray; + color: gray; + text-align: right; + vertical-align: top; +} + +/* Single line style */ + +.dp-highlighter .line1, .line2 { + padding-left: 10px; + border-bottom: 1px solid #F7F7F7; + white-space:nowrap; +} + +.dp-highlighter .line2 { + background-color: #F7F7F7; +} + +/* About dialog styles */ + +.dp-about { + background-color: #fff; + margin: 0px; +} + +.dp-about table { + width: 100%; + height: 100%; + font-size: 11px; + font-family: Tahoma, Verdana, Arial, sans-serif !important; +} + +.dp-about td { + padding: 10px; + vertical-align: top; +} + +.dp-about .copy { + border-bottom: 1px solid #ACA899; + height: 95%; +} + +.dp-about .title { + color: red; + font-weight: bold; +} + +.dp-about .para { + margin-bottom: 4px; +} + +.dp-about .footer { + background-color: #ECEADB; + border-top: 1px solid #fff; + text-align: right; +} + +.dp-about .close { + font-size: 11px; + font-family: Tahoma, Verdana, Arial, sans-serif !important; + background-color: #ECEADB; + width: 60px; + height: 22px; +} + +/* Language specific styles */ + +.dp-c {} +.dp-c .comment { color: green; } +.dp-c .string { color: blue; } +.dp-c .preprocessor { color: gray; } +.dp-c .keyword { color: blue; } +.dp-c .vars { color: #d00; } + +.dp-vb {} +.dp-vb .comment { color: green; } +.dp-vb .string { color: blue; } +.dp-vb .preprocessor { color: gray; } +.dp-vb .keyword { color: blue; } + +.dp-sql {} +.dp-sql .comment { color: green; } +.dp-sql .string { color: red; } +.dp-sql .keyword { color: blue; } +.dp-sql .func { color: #ff1493; } +.dp-sql .op { color: #808080; } + +.dp-xml {} +.dp-xml .cdata { color: #ff1493; } +.dp-xml .comments { color: green; } +.dp-xml .tag { color: blue; } +.dp-xml .tag-name { color: black; font-weight: bold; } +.dp-xml .attribute { color: red; } +.dp-xml .attribute-value { color: blue; } + +.dp-delphi {} +.dp-delphi .comment { color: #008200; font-style: italic; } +.dp-delphi .string { color: blue; } +.dp-delphi .number { color: blue; } +.dp-delphi .directive { color: #008284; } +.dp-delphi .keyword { font-weight: bold; color: navy; } +.dp-delphi .vars { color: #000; } + +.dp-py {} +.dp-py .comment { color: green; } +.dp-py .string { color: red; } +.dp-py .docstring { color: brown; } +.dp-py .keyword { color: blue; font-weight: bold;} +.dp-py .builtins { color: #ff1493; } +.dp-py .magicmethods { color: #808080; } +.dp-py .exceptions { color: brown; } +.dp-py .types { color: brown; font-style: italic; } +.dp-py .commonlibs { color: #8A2BE2; font-style: italic; } diff --git a/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/Tests.html b/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/Tests.html new file mode 100644 index 0000000..71eb63f --- /dev/null +++ b/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/Tests.html @@ -0,0 +1,339 @@ + + + + dp.SyntaxHighlighter testing + + + + + + + + + +

    Smart Tabs & First Line

    + + + +

    C Sharp

    + + + +

    JavaScript

    + + + +

    Visual Basic

    + + + +

    XML / HTML

    + + + +

    PHP

    + + + +

    SQL

    + + + +

    Delphi

    + + + +

    Python

    + + + +

    Auto Overflow Test

    + +400px +
    + + + +
    + +
    + + + + + + + + + + + + + diff --git a/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushCSharp.js b/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushCSharp.js new file mode 100644 index 0000000..5743b93 --- /dev/null +++ b/mochikit_v14/examples/view-source/lib/SyntaxHighlighter/shBrushCSharp.js @@ -0,0 +1,30 @@ +dp.sh.Brushes.CSharp = function() +{ + var keywords = 'abstract as base bool break byte case catch char checked class const ' + + 'continue decimal default delegate do double else enum event explicit ' + + 'extern false finally fixed float for foreach get goto if implicit in int ' + + 'interface internal is lock long namespace new null object operator out ' + + 'override params private protected public readonly ref return sbyte sealed set ' + + 'short sizeof stackalloc static string struct switch this throw true try ' + + 'typeof uint ulong unchecked unsafe ushort using virtual void while'; + + this.regexList = [ + // There's a slight problem with matching single line comments and figuring out + // a difference between // and ///. Using lookahead and lookbehind solves the + // problem, unfortunately JavaScript doesn't support lookbehind. So I'm at a + // loss how to translate that regular expression to JavaScript compatible one. +// { regex: new RegExp('(?) + | () + | (<)*(\w+)*\s*(\w+)\s*=\s*(".*?"|'.*?'|\w+)(/*>)* + | () + */ + var index = 0; + var match = null; + var regex = null; + + // Match CDATA in the following format + // <\!\[[\w\s]*?\[(.|\s)*?\]\]> + this.GetMatches(new RegExp('<\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\]>', 'gm'), 'cdata'); + + // Match comments + // + this.GetMatches(new RegExp('', 'gm'), 'comments'); + + // Match attributes and their values + // (\w+)\s*=\s*(".*?"|\'.*?\'|\w+)* + regex = new RegExp('([\\w-\.]+)\\s*=\\s*(".*?"|\'.*?\'|\\w+)*', 'gm'); + while((match = regex.exec(this.code)) != null) + { + push(this.matches, new dp.sh.Match(match[1], match.index, 'attribute')); + + // if xml is invalid and attribute has no property value, ignore it + if(match[2] != undefined) + { + push(this.matches, new dp.sh.Match(match[2], match.index + match[0].indexOf(match[2]), 'attribute-value')); + } + } + + // Match opening and closing tag brackets + // + this.GetMatches(new RegExp('', 'gm'), 'tag'); + + // Match tag names + // About...

    dp.SyntaxHighlighter

    Version: {V}

    http://www.dreamprojections.com/SyntaxHighlighter

    ©2004-2005 Alex Gorbatchev. All right reserved.
    ', + + // tools + ExpandCode : '+ expand code', + ViewPlain : 'view plain', + Print : 'print', + CopyToClipboard : 'copy to clipboard', + About : '?', + + CopiedToClipboard : 'The code is in your clipboard now.' +}; + +dp.SyntaxHighlighter = dp.sh; + +// +// Dialog and toolbar functions +// + +dp.sh.Utils.Expand = function(sender) +{ + var table = sender; + var span = sender; + + // find the span in which the text label and pipe contained so we can hide it + while(span != null && span.tagName.toUpperCase() != 'SPAN') + span = span.parentNode; + + // find the table + while(table != null && table.tagName.toUpperCase() != 'TABLE') + table = table.parentNode; + + // remove the 'expand code' button + span.parentNode.removeChild(span); + + table.tBodies[0].className = 'show'; + table.parentNode.style.height = '100%'; // containing div isn't getting updated properly when the TBODY is shown +} + +// opens a new windows and puts the original unformatted source code inside. +dp.sh.Utils.ViewSource = function(sender) +{ + var code = sender.parentNode.originalCode; + var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=1'); + + code = code.replace(/' + code + ''); + wnd.document.close(); +} + +// copies the original source code in to the clipboard (IE only) +dp.sh.Utils.ToClipboard = function(sender) +{ + var code = sender.parentNode.originalCode; + + // This works only for IE. There's a way to make it work with Mozilla as well, + // but it requires security settings changed on the client, which isn't by + // default, so 99% of users won't have it working anyways. + if(window.clipboardData) + { + window.clipboardData.setData('text', code); + + alert(dp.sh.Strings.CopiedToClipboard); + } +} + +// creates an invisible iframe, puts the original source code inside and prints it +dp.sh.Utils.PrintSource = function(sender) +{ + var td = sender.parentNode; + var code = td.processedCode; + var iframe = document.createElement('IFRAME'); + var doc = null; + var wnd = + + // this hides the iframe + iframe.style.cssText = 'position:absolute; width:0px; height:0px; left:-5px; top:-5px;'; + + td.appendChild(iframe); + + doc = iframe.contentWindow.document; + code = code.replace(/' + code + ''); + doc.close(); + + iframe.contentWindow.focus(); + iframe.contentWindow.print(); + + td.removeChild(iframe); +} + +dp.sh.Utils.About = function() +{ + var wnd = window.open('', '_blank', 'dialog,width=320,height=150,scrollbars=0'); + var doc = wnd.document; + + var styles = document.getElementsByTagName('style'); + var links = document.getElementsByTagName('link'); + + doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version)); + + // copy over ALL the styles from the parent page + for(var i = 0; i < styles.length; i++) + doc.write(''); + + for(var i = 0; i < links.length; i++) + if(links[i].rel.toLowerCase() == 'stylesheet') + doc.write(''); + + doc.close(); + wnd.focus(); +} + +// +// Match object +// +dp.sh.Match = function(value, index, css) +{ + this.value = value; + this.index = index; + this.length = value.length; + this.css = css; +} + +// +// Highlighter object +// +dp.sh.Highlighter = function() +{ + this.addGutter = true; + this.addControls = true; + this.collapse = false; + this.tabsToSpaces = true; +} + +// static callback for the match sorting +dp.sh.Highlighter.SortCallback = function(m1, m2) +{ + // sort matches by index first + if(m1.index < m2.index) + return -1; + else if(m1.index > m2.index) + return 1; + else + { + // if index is the same, sort by length + if(m1.length < m2.length) + return -1; + else if(m1.length > m2.length) + return 1; + } + return 0; +} + +// gets a list of all matches for a given regular expression +dp.sh.Highlighter.prototype.GetMatches = function(regex, css) +{ + var index = 0; + var match = null; + + while((match = regex.exec(this.code)) != null) + { + this.matches[this.matches.length] = new dp.sh.Match(match[0], match.index, css); + } +} + +dp.sh.Highlighter.prototype.AddBit = function(str, css) +{ + var span = document.createElement('span'); + + str = str.replace(/&/g, '&'); + str = str.replace(/ /g, ' '); + str = str.replace(/'); + + // when adding a piece of code, check to see if it has line breaks in it + // and if it does, wrap individual line breaks with span tags + if(css != null) + { + var regex = new RegExp('
    ', 'gi'); + + if(regex.test(str)) + { + var lines = str.split(' 
    '); + + str = ''; + + for(var i = 0; i < lines.length; i++) + { + span = document.createElement('SPAN'); + span.className = css; + span.innerHTML = lines[i]; + + this.div.appendChild(span); + + // don't add a
    for the last line + if(i + 1 < lines.length) + this.div.appendChild(document.createElement('BR')); + } + } + else + { + span.className = css; + span.innerHTML = str; + this.div.appendChild(span); + } + } + else + { + span.innerHTML = str; + this.div.appendChild(span); + } +} + +// checks if one match is inside any other match +dp.sh.Highlighter.prototype.IsInside = function(match) +{ + if(match == null || match.length == 0) + return; + + for(var i = 0; i < this.matches.length; i++) + { + var c = this.matches[i]; + + if(c == null) + continue; + + if((match.index > c.index) && (match.index <= c.index + c.length)) + return true; + } + + return false; +} + +dp.sh.Highlighter.prototype.ProcessRegexList = function() +{ + for(var i = 0; i < this.regexList.length; i++) + this.GetMatches(this.regexList[i].regex, this.regexList[i].css); +} + +dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code) +{ + var lines = code.split('\n'); + var result = ''; + var tabSize = 4; + var tab = '\t'; + + // This function inserts specified amount of spaces in the string + // where a tab is while removing that given tab. + function InsertSpaces(line, pos, count) + { + var left = line.substr(0, pos); + var right = line.substr(pos + 1, line.length); // pos + 1 will get rid of the tab + var spaces = ''; + + for(var i = 0; i < count; i++) + spaces += ' '; + + return left + spaces + right; + } + + // This function process one line for 'smart tabs' + function ProcessLine(line, tabSize) + { + if(line.indexOf(tab) == -1) + return line; + + var pos = 0; + + while((pos = line.indexOf(tab)) != -1) + { + // This is pretty much all there is to the 'smart tabs' logic. + // Based on the position within the line and size of a tab, + // calculate the amount of spaces we need to insert. + var spaces = tabSize - pos % tabSize; + + line = InsertSpaces(line, pos, spaces); + } + + return line; + } + + // Go through all the lines and do the 'smart tabs' magic. + for(var i = 0; i < lines.length; i++) + result += ProcessLine(lines[i], tabSize) + '\n'; + + return result; +} + +dp.sh.Highlighter.prototype.SwitchToTable = function() +{ + // thanks to Lachlan Donald from SitePoint.com for this
    tag fix. + var html = this.div.innerHTML.replace(/<(br)\/?>/gi, '\n'); + var lines = html.split('\n'); + var row = null; + var cell = null; + var tBody = null; + var html = ''; + var pipe = ' | '; + + // creates an anchor to a utility + function UtilHref(util, text) + { + return '' + text + ''; + } + + tBody = document.createElement('TBODY'); // can be created and all others go to tBodies collection. + + this.table.appendChild(tBody); + + if(this.addGutter == true) + { + row = tBody.insertRow(-1); + cell = row.insertCell(-1); + cell.className = 'tools-corner'; + } + + if(this.addControls == true) + { + var tHead = document.createElement('THEAD'); // controls will be placed in here + this.table.appendChild(tHead); + + row = tHead.insertRow(-1); + + // add corner if there's a gutter + if(this.addGutter == true) + { + cell = row.insertCell(-1); + cell.className = 'tools-corner'; + } + + cell = row.insertCell(-1); + + // preserve some variables for the controls + cell.originalCode = this.originalCode; + cell.processedCode = this.code; + cell.className = 'tools'; + + if(this.collapse == true) + { + tBody.className = 'hide'; + cell.innerHTML += '' + UtilHref('Expand', dp.sh.Strings.ExpandCode) + '' + pipe + ''; + } + + cell.innerHTML += UtilHref('ViewSource', dp.sh.Strings.ViewPlain) + pipe + UtilHref('PrintSource', dp.sh.Strings.Print); + + // IE has this clipboard object which is easy enough to use + if(window.clipboardData) + cell.innerHTML += pipe + UtilHref('ToClipboard', dp.sh.Strings.CopyToClipboard); + + cell.innerHTML += pipe + UtilHref('About', dp.sh.Strings.About); + } + + for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, lineIndex++) + { + row = tBody.insertRow(-1); + + if(this.addGutter == true) + { + cell = row.insertCell(-1); + cell.className = 'gutter'; + cell.innerHTML = lineIndex; + } + + cell = row.insertCell(-1); + cell.className = 'line' + (i % 2 + 1); // uses .line1 and .line2 css styles for alternating lines + cell.innerHTML = lines[i]; + } + + this.div.innerHTML = ''; +} + +dp.sh.Highlighter.prototype.Highlight = function(code) +{ + function Trim(str) + { + return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1'); + } + + function Chop(str) + { + return str.replace(/\n*$/, '').replace(/^\n*/, ''); + } + + function Unindent(str) + { + var lines = str.split('\n'); + var indents = new Array(); + var regex = new RegExp('^\\s*', 'g'); + var min = 1000; + + // go through every line and check for common number of indents + for(var i = 0; i < lines.length && min > 0; i++) + { + if(Trim(lines[i]).length == 0) + continue; + + var matches = regex.exec(lines[i]); + + if(matches != null && matches.length > 0) + min = Math.min(matches[0].length, min); + } + + // trim minimum common number of white space from the begining of every line + if(min > 0) + for(var i = 0; i < lines.length; i++) + lines[i] = lines[i].substr(min); + + return lines.join('\n'); + } + + // This function returns a portions of the string from pos1 to pos2 inclusive + function Copy(string, pos1, pos2) + { + return string.substr(pos1, pos2 - pos1); + } + + var pos = 0; + + this.originalCode = code; + this.code = Chop(Unindent(code)); + this.div = document.createElement('DIV'); + this.table = document.createElement('TABLE'); + this.matches = new Array(); + + if(this.CssClass != null) + this.table.className = this.CssClass; + + // replace tabs with spaces + if(this.tabsToSpaces == true) + this.code = this.ProcessSmartTabs(this.code); + + this.table.border = 0; + this.table.cellSpacing = 0; + this.table.cellPadding = 0; + + this.ProcessRegexList(); + + // if no matches found, add entire code as plain text + if(this.matches.length == 0) + { + this.AddBit(this.code, null); + this.SwitchToTable(); + return; + } + + // sort the matches + this.matches = this.matches.sort(dp.sh.Highlighter.SortCallback); + + // The following loop checks to see if any of the matches are inside + // of other matches. This process would get rid of highligting strings + // inside comments, keywords inside strings and so on. + for(var i = 0; i < this.matches.length; i++) + if(this.IsInside(this.matches[i])) + this.matches[i] = null; + + // Finally, go through the final list of matches and pull the all + // together adding everything in between that isn't a match. + for(var i = 0; i < this.matches.length; i++) + { + var match = this.matches[i]; + + if(match == null || match.length == 0) + continue; + + this.AddBit(Copy(this.code, pos, match.index), null); + this.AddBit(match.value, match.css); + + pos = match.index + match.length; + } + + this.AddBit(this.code.substr(pos), null); + + this.SwitchToTable(); +} + +dp.sh.Highlighter.prototype.GetKeywords = function(str) +{ + return '\\b' + str.replace(/ /g, '\\b|\\b') + '\\b'; +} + +// highlightes all elements identified by name and gets source code from specified property +dp.sh.HighlightAll = function(name, showGutter /* optional */, showControls /* optional */, collapseAll /* optional */, firstLine /* optional */) +{ + function FindValue() + { + var a = arguments; + + for(var i = 0; i < a.length; i++) + { + if(a[i] == null) + continue; + + if(typeof(a[i]) == 'string' && a[i] != '') + return a[i] + ''; + + if(typeof(a[i]) == 'object' && a[i].value != '') + return a[i].value + ''; + } + + return null; + } + + function IsOptionSet(value, list) + { + for(var i = 0; i < list.length; i++) + if(list[i] == value) + return true; + + return false; + } + + function GetOptionValue(name, list, defaultValue) + { + var regex = new RegExp('^' + name + '\\[(\\w+)\\]$', 'gi'); + var matches = null; + + for(var i = 0; i < list.length; i++) + if((matches = regex.exec(list[i])) != null) + return matches[1]; + + return defaultValue; + } + + var elements = document.getElementsByName(name); + var highlighter = null; + var registered = new Object(); + var propertyName = 'value'; + + // if no code blocks found, leave + if(elements == null) + return; + + // register all brushes + for(var brush in dp.sh.Brushes) + { + var aliases = dp.sh.Brushes[brush].Aliases; + + if(aliases == null) + continue; + + for(var i = 0; i < aliases.length; i++) + registered[aliases[i]] = brush; + } + + for(var i = 0; i < elements.length; i++) + { + var element = elements[i]; + var options = FindValue( + element.attributes['class'], element.className, + element.attributes['language'], element.language + ); + var language = ''; + + if(options == null) + continue; + + options = options.split(':'); + + language = options[0].toLowerCase(); + + if(registered[language] == null) + continue; + + // instantiate a brush + highlighter = new dp.sh.Brushes[registered[language]](); + + // hide the original element + element.style.display = 'none'; + + highlighter.addGutter = (showGutter == null) ? !IsOptionSet('nogutter', options) : showGutter; + highlighter.addControls = (showControls == null) ? !IsOptionSet('nocontrols', options) : showControls; + highlighter.collapse = (collapseAll == null) ? IsOptionSet('collapse', options) : collapseAll; + + // first line idea comes from Andrew Collington, thanks! + highlighter.firstLine = (firstLine == null) ? parseInt(GetOptionValue('firstline', options, 1)) : firstLine; + + highlighter.Highlight(element[propertyName]); + + // place the result table inside a div + var div = document.createElement('DIV'); + + div.className = 'dp-highlighter'; + div.appendChild(highlighter.table); + + element.parentNode.insertBefore(div, element); + } +} diff --git a/mochikit_v14/examples/view-source/view-source.css b/mochikit_v14/examples/view-source/view-source.css new file mode 100755 index 0000000..2a8b8cf --- /dev/null +++ b/mochikit_v14/examples/view-source/view-source.css @@ -0,0 +1 @@ +.invisible {display: none;} diff --git a/mochikit_v14/examples/view-source/view-source.html b/mochikit_v14/examples/view-source/view-source.html new file mode 100644 index 0000000..951e937 --- /dev/null +++ b/mochikit_v14/examples/view-source/view-source.html @@ -0,0 +1,19 @@ + + + + MochiKit Example Source Viewer + + + + + + + + + +

    + + + diff --git a/mochikit_v14/examples/view-source/view-source.js b/mochikit_v14/examples/view-source/view-source.js new file mode 100644 index 0000000..259eda1 --- /dev/null +++ b/mochikit_v14/examples/view-source/view-source.js @@ -0,0 +1,70 @@ +/* + +Do syntax highlighting on every textarea inside of a "codeview" element + +The content of textareas are URLs, not code! + +*/ +var viewSource = function () { + var filename = location.hash; + if (!filename) { + filename = location.hash = "view-source/view-source.js"; + } + filename = lstrip(filename, "#"); + var href = "../" + filename; + replaceChildNodes("filename", "loading ", A({"href": href}, filename)); + replaceChildNodes("code", href); + ext = filename.split(".").pop(); + var classes = { + "html": "xml", + "js": "javascript", + "json": "javascript", + "xml": "xml" + }; + updateNodeAttributes("code", {"class": classes[ext]}); + syntaxHighlight(filename); +}; + +var syntaxHighlight = function (filename) { + var swapContents = function (dest, req) { + replaceChildNodes(dest, req.responseText); + }; + + var showParsing = function () { + replaceChildNodes("filename", + "parsing ", + A({"href": "../" + filename}, filename) + ); + return wait(0); + }; + + var finishSyntaxHighlight = function () { + dp.sh.HighlightAll("code", true, true, false); + replaceChildNodes("filename", A({"href": "../" + filename}, filename)); + removeElementClass("codeview", "invisible"); + }; + + var elems = getElementsByTagAndClassName("textarea", null, "codeview"); + var dl = new Deferred(); + var deferredCount = 0; + var checkDeferredList = function () { + deferredCount -= 1; + if (!deferredCount) { + dl.callback(); + } + }; + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (elem.name != "code") { + continue; + } + var url = strip(scrapeText(elem)) + var d = doXHR(url).addCallback( + partial(swapContents, elem) + ); + deferredCount += 1; + d.addCallback(checkDeferredList); + } + dl.addCallback(showParsing); + dl.addCallback(finishSyntaxHighlight); +}; diff --git a/mochikit_v14/include/_img/bg_docheader.gif b/mochikit_v14/include/_img/bg_docheader.gif new file mode 100755 index 0000000000000000000000000000000000000000..7857a47725730250aed2c1c8679ade6ca7ce955f GIT binary patch literal 3348 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 literal 0 HcmV?d00001 diff --git a/mochikit_v14/include/_img/g_bullet.gif b/mochikit_v14/include/_img/g_bullet.gif new file mode 100755 index 0000000000000000000000000000000000000000..e300cf27bbe43082f940549eda3eaa464ca9dbdb GIT binary patch literal 102 zcmZ?wbhEHb^nA^u6}lyCA%mgJRKHq)$ literal 0 HcmV?d00001 diff --git a/mochikit_v14/include/_img/g_logo_doc.gif b/mochikit_v14/include/_img/g_logo_doc.gif new file mode 100755 index 0000000000000000000000000000000000000000..b47e6cbe9215e95ee13501de30e54be50ea324a1 GIT binary patch literal 4193 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 .img { letter-spacing : normal; text-indent : -999em; overflow : hidden;} +/* End of hack */ + + +/* ---- GENERAL ELEMENTS ----------------*/ + +hr { + border: none; + border-bottom: 1px solid #aaa; + background: none; + height: 1px; +} +a img { border: none; text-decoration: none; } +.clear { clear: both; } +.invisible { display: none; } diff --git a/mochikit_v14/include/css/general.css b/mochikit_v14/include/css/general.css new file mode 100755 index 0000000..3269f41 --- /dev/null +++ b/mochikit_v14/include/css/general.css @@ -0,0 +1,48 @@ +body { font-size: 76%; color: #5C5D5F; margin: 0; font-family: Verdana, Helvetica, sans-serif; } + +/* ---- TYPOGRAPHY ----------------------*/ + +h1, h2, h3, h4, h5, h6 { margin: 0; color: #4B81BC; font-family: Trebuchet MS, verdana, sans-serif; } +h1 { font-size: 2em; margin-bottom: .5em; } +h1 em { color: #00C5E8; font-style: normal; background: none; } + +h2 { font-size: 1.4em; margin-bottom: .3em; font-weight: normal; } +h3 { font-size: 1.2em; } +h4 { font-size: 1.1em; font-family: Verdana, Helvetica, sans-serif; } + +a { color: #4b81bc; } +a:hover { color: #abd038; } +a.email { background: url(../../images/icon_email.gif) no-repeat left center; padding-left: 15px; } +p a { font-weight: bold; } +p { line-height: 1.5em; margin: 0em 0em 1em; color: #5C5D5F; } +em { font-style: normal; background-color: #FFFDD4; } + +ul, ol { line-height: 1.5em; } +ul { list-style: none; margin: 0em 0em 1em 1.8em; padding: 0; } + +dl { } +dt { font-weight: bold; margin-bottom: .2em; color: #4B4545; } +dd { margin-left: 2em; margin-bottom: 2em; } +tt { font-size: 120%; } + +strong { color: #4b81bc; font-weight: bold; } +.weak { font-size: .9em; font-weight: normal; } +.contextual { font-size: .9em; color: #888; } + + +.img { + letter-spacing: -1000em; text-indent : -999em; overflow: hidden; display: block; + background-repeat: repeat; background-color: transparent; /* IE FLICKER FIX - no background position! */ +} +/* Just for Opera, but hide from MacIE */ +/*\*/html>body .img { letter-spacing : normal; text-indent : -999em; overflow : hidden;} +/* End of hack */ + + +/* ---- GENERAL ELEMENTS ----------------*/ + +hr { border: none; border-bottom: 1px solid #aaa; background: none; height: 1px; } +a img { border: none; } +.clear { clear: both; } + +.invisible { display: none; } diff --git a/mochikit_v14/packed/MochiKit/MochiKit.js b/mochikit_v14/packed/MochiKit/MochiKit.js new file mode 100644 index 0000000..960b728 --- /dev/null +++ b/mochikit_v14/packed/MochiKit/MochiKit.js @@ -0,0 +1,6905 @@ +/*** + + MochiKit.MochiKit 1.4 : PACKED VERSION + + THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please + diff against the source tree, not this file. + + See for documentation, downloads, license, etc. + + (c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Base"); +} +if(typeof (MochiKit)=="undefined"){ +MochiKit={}; +} +if(typeof (MochiKit.Base)=="undefined"){ +MochiKit.Base={}; +} +if(typeof (MochiKit.__export__)=="undefined"){ +MochiKit.__export__=(MochiKit.__compat__||(typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")); +} +MochiKit.Base.VERSION="1.4"; +MochiKit.Base.NAME="MochiKit.Base"; +MochiKit.Base.update=function(_1,_2){ +if(_1===null){ +_1={}; +} +for(var i=1;i=0;i--){ +_15.unshift(o[i]); +} +}else{ +res.push(o); +} +} +return res; +},extend:function(_18,obj,_1a){ +if(!_1a){ +_1a=0; +} +if(obj){ +var l=obj.length; +if(typeof (l)!="number"){ +if(typeof (MochiKit.Iter)!="undefined"){ +obj=MochiKit.Iter.list(obj); +l=obj.length; +}else{ +throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); +} +} +if(!_18){ +_18=[]; +} +for(var i=_1a;i>b; +},zrshift:function(a,b){ +return a>>>b; +},eq:function(a,b){ +return a==b; +},ne:function(a,b){ +return a!=b; +},gt:function(a,b){ +return a>b; +},ge:function(a,b){ +return a>=b; +},lt:function(a,b){ +return al){ +_90=l; +} +} +_8e=[]; +for(i=0;i<_90;i++){ +var _92=[]; +for(var j=1;j=0;i--){ +_af=[_ab[i].apply(this,_af)]; +} +return _af[0]; +}; +},bind:function(_b1,_b2){ +if(typeof (_b1)=="string"){ +_b1=_b2[_b1]; +} +var _b3=_b1.im_func; +var _b4=_b1.im_preargs; +var _b5=_b1.im_self; +var m=MochiKit.Base; +if(typeof (_b1)=="function"&&typeof (_b1.apply)=="undefined"){ +_b1=m._wrapDumbFunction(_b1); +} +if(typeof (_b3)!="function"){ +_b3=_b1; +} +if(typeof (_b2)!="undefined"){ +_b5=_b2; +} +if(typeof (_b4)=="undefined"){ +_b4=[]; +}else{ +_b4=_b4.slice(); +} +m.extend(_b4,arguments,2); +var _b7=function(){ +var _b8=arguments; +var me=arguments.callee; +if(me.im_preargs.length>0){ +_b8=m.concat(me.im_preargs,_b8); +} +var _ba=me.im_self; +if(!_ba){ +_ba=this; +} +return me.im_func.apply(_ba,_b8); +}; +_b7.im_self=_b5; +_b7.im_func=_b3; +_b7.im_preargs=_b4; +return _b7; +},bindMethods:function(_bb){ +var _bc=MochiKit.Base.bind; +for(var k in _bb){ +var _be=_bb[k]; +if(typeof (_be)=="function"){ +_bb[k]=_bc(_be,_bb); +} +} +},registerComparator:function(_bf,_c0,_c1,_c2){ +MochiKit.Base.comparatorRegistry.register(_bf,_c0,_c1,_c2); +},_primitives:{"boolean":true,"string":true,"number":true},compare:function(a,b){ +if(a==b){ +return 0; +} +var _c5=(typeof (a)=="undefined"||a===null); +var _c6=(typeof (b)=="undefined"||b===null); +if(_c5&&_c6){ +return 0; +}else{ +if(_c5){ +return -1; +}else{ +if(_c6){ +return 1; +} +} +} +var m=MochiKit.Base; +var _c8=m._primitives; +if(!(typeof (a) in _c8&&typeof (b) in _c8)){ +try{ +return m.comparatorRegistry.match(a,b); +} +catch(e){ +if(e!=m.NotFound){ +throw e; +} +} +} +if(ab){ +return 1; +} +} +var _c9=m.repr; +throw new TypeError(_c9(a)+" and "+_c9(b)+" can not be compared"); +},compareDateLike:function(a,b){ +return MochiKit.Base.compare(a.getTime(),b.getTime()); +},compareArrayLike:function(a,b){ +var _ce=MochiKit.Base.compare; +var _cf=a.length; +var _d0=0; +if(_cf>b.length){ +_d0=1; +_cf=b.length; +}else{ +if(_cf=0;i--){ +sum+=o[i]; +} +}else{ +sum+=o; +} +} +if(_113<=0){ +throw new TypeError("mean() requires at least one argument"); +} +return sum/_113; +},median:function(){ +var data=MochiKit.Base.flattenArguments(arguments); +if(data.length===0){ +throw new TypeError("median() requires at least one argument"); +} +data.sort(compare); +if(data.length%2==0){ +var _117=data.length/2; +return (data[_117]+data[_117-1])/2; +}else{ +return data[(data.length-1)/2]; +} +},findValue:function(lst,_119,_11a,end){ +if(typeof (end)=="undefined"||end===null){ +end=lst.length; +} +if(typeof (_11a)=="undefined"||_11a===null){ +_11a=0; +} +var cmp=MochiKit.Base.compare; +for(var i=_11a;i0))){ +var kv=MochiKit.DOM.formContents(_127); +_127=kv[0]; +_128=kv[1]; +}else{ +if(arguments.length==1){ +if(typeof (_127.length)=="number"&&_127.length==2){ +return arguments.callee(_127[0],_127[1]); +} +var o=_127; +_127=[]; +_128=[]; +for(var k in o){ +var v=o[k]; +if(typeof (v)=="function"){ +continue; +}else{ +if(typeof (v)!="string"&&typeof (v.length)=="number"){ +for(var i=0;i=stop){ +throw self.StopIteration; +} +_174+=step; +return rval; +}}; +},imap:function(fun,p,q){ +var m=MochiKit.Base; +var self=MochiKit.Iter; +var _17e=m.map(self.iter,m.extend(null,arguments,1)); +var map=m.map; +var next=self.next; +return {repr:function(){ +return "imap(...)"; +},toString:m.forwardCall("repr"),next:function(){ +return fun.apply(this,map(next,_17e)); +}}; +},applymap:function(fun,seq,self){ +seq=MochiKit.Iter.iter(seq); +var m=MochiKit.Base; +return {repr:function(){ +return "applymap(...)"; +},toString:m.forwardCall("repr"),next:function(){ +return fun.apply(self,seq.next()); +}}; +},chain:function(p,q){ +var self=MochiKit.Iter; +var m=MochiKit.Base; +if(arguments.length==1){ +return self.iter(arguments[0]); +} +var _189=m.map(self.iter,arguments); +return {repr:function(){ +return "chain(...)"; +},toString:m.forwardCall("repr"),next:function(){ +while(_189.length>1){ +try{ +return _189[0].next(); +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +_189.shift(); +} +} +if(_189.length==1){ +var arg=_189.shift(); +this.next=m.bind("next",arg); +return this.next(); +} +throw self.StopIteration; +}}; +},takewhile:function(pred,seq){ +var self=MochiKit.Iter; +seq=self.iter(seq); +return {repr:function(){ +return "takewhile(...)"; +},toString:MochiKit.Base.forwardCall("repr"),next:function(){ +var rval=seq.next(); +if(!pred(rval)){ +this.next=function(){ +throw self.StopIteration; +}; +this.next(); +} +return rval; +}}; +},dropwhile:function(pred,seq){ +seq=MochiKit.Iter.iter(seq); +var m=MochiKit.Base; +var bind=m.bind; +return {"repr":function(){ +return "dropwhile(...)"; +},"toString":m.forwardCall("repr"),"next":function(){ +while(true){ +var rval=seq.next(); +if(!pred(rval)){ +break; +} +} +this.next=bind("next",seq); +return rval; +}}; +},_tee:function(_194,sync,_196){ +sync.pos[_194]=-1; +var m=MochiKit.Base; +var _198=m.listMin; +return {repr:function(){ +return "tee("+_194+", ...)"; +},toString:m.forwardCall("repr"),next:function(){ +var rval; +var i=sync.pos[_194]; +if(i==sync.max){ +rval=_196.next(); +sync.deque.push(rval); +sync.max+=1; +sync.pos[_194]+=1; +}else{ +rval=sync.deque[i-sync.min]; +sync.pos[_194]+=1; +if(i==sync.min&&_198(sync.pos)!=sync.min){ +sync.min+=1; +sync.deque.shift(); +} +} +return rval; +}}; +},tee:function(_19b,n){ +var rval=[]; +var sync={"pos":[],"deque":[],"max":-1,"min":-1}; +if(arguments.length==1||typeof (n)=="undefined"||n===null){ +n=2; +} +var self=MochiKit.Iter; +_19b=self.iter(_19b); +var _tee=self._tee; +for(var i=0;i0&&_1ac>=stop)||(step<0&&_1ac<=stop)){ +throw MochiKit.Iter.StopIteration; +} +var rval=_1ac; +_1ac+=step; +return rval; +},repr:function(){ +return "range("+[_1ac,stop,step].join(", ")+")"; +},toString:MochiKit.Base.forwardCall("repr")}; +},sum:function(_1b0,_1b1){ +if(typeof (_1b1)=="undefined"||_1b1===null){ +_1b1=0; +} +var x=_1b1; +var self=MochiKit.Iter; +_1b0=self.iter(_1b0); +try{ +while(true){ +x+=_1b0.next(); +} +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +} +return x; +},exhaust:function(_1b4){ +var self=MochiKit.Iter; +_1b4=self.iter(_1b4); +try{ +while(true){ +_1b4.next(); +} +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +} +},forEach:function(_1b6,func,self){ +var m=MochiKit.Base; +if(arguments.length>2){ +func=m.bind(func,self); +} +if(m.isArrayLike(_1b6)){ +try{ +for(var i=0;i<_1b6.length;i++){ +func(_1b6[i]); +} +} +catch(e){ +if(e!=MochiKit.Iter.StopIteration){ +throw e; +} +} +}else{ +self=MochiKit.Iter; +self.exhaust(self.imap(func,_1b6)); +} +},every:function(_1bb,func){ +var self=MochiKit.Iter; +try{ +self.ifilterfalse(func,_1bb).next(); +return false; +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +return true; +} +},sorted:function(_1be,cmp){ +var rval=MochiKit.Iter.list(_1be); +if(arguments.length==1){ +cmp=MochiKit.Base.compare; +} +rval.sort(cmp); +return rval; +},reversed:function(_1c1){ +var rval=MochiKit.Iter.list(_1c1); +rval.reverse(); +return rval; +},some:function(_1c3,func){ +var self=MochiKit.Iter; +try{ +self.ifilter(func,_1c3).next(); +return true; +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +return false; +} +},iextend:function(lst,_1c7){ +if(MochiKit.Base.isArrayLike(_1c7)){ +for(var i=0;i<_1c7.length;i++){ +lst.push(_1c7[i]); +} +}else{ +var self=MochiKit.Iter; +_1c7=self.iter(_1c7); +try{ +while(true){ +lst.push(_1c7.next()); +} +} +catch(e){ +if(e!=self.StopIteration){ +throw e; +} +} +} +return lst; +},groupby:function(_1ca,_1cb){ +var m=MochiKit.Base; +var self=MochiKit.Iter; +if(arguments.length<2){ +_1cb=m.operator.identity; +} +_1ca=self.iter(_1ca); +var pk=undefined; +var k=undefined; +var v; +function fetch(){ +v=_1ca.next(); +k=_1cb(v); +} +function eat(){ +var ret=v; +v=undefined; +return ret; +} +var _1d2=true; +var _1d3=m.compare; +return {repr:function(){ +return "groupby(...)"; +},next:function(){ +while(_1d3(k,pk)===0){ +fetch(); +if(_1d2){ +_1d2=false; +break; +} +} +pk=k; +return [k,{next:function(){ +if(v==undefined){ +fetch(); +} +if(_1d3(k,pk)!==0){ +throw self.StopIteration; +} +return eat(); +}}]; +}}; +},groupby_as_array:function(_1d4,_1d5){ +var m=MochiKit.Base; +var self=MochiKit.Iter; +if(arguments.length<2){ +_1d5=m.operator.identity; +} +_1d4=self.iter(_1d4); +var _1d8=[]; +var _1d9=true; +var _1da; +var _1db=m.compare; +while(true){ +try{ +var _1dc=_1d4.next(); +var key=_1d5(_1dc); +} +catch(e){ +if(e==self.StopIteration){ +break; +} +throw e; +} +if(_1d9||_1db(key,_1da)!==0){ +var _1de=[]; +_1d8.push([key,_1de]); +} +_1de.push(_1dc); +_1d9=false; +_1da=key; +} +return _1d8; +},arrayLikeIter:function(_1df){ +var i=0; +return {repr:function(){ +return "arrayLikeIter(...)"; +},toString:MochiKit.Base.forwardCall("repr"),next:function(){ +if(i>=_1df.length){ +throw MochiKit.Iter.StopIteration; +} +return _1df[i++]; +}}; +},hasIterateNext:function(_1e1){ +return (_1e1&&typeof (_1e1.iterateNext)=="function"); +},iterateNextIter:function(_1e2){ +return {repr:function(){ +return "iterateNextIter(...)"; +},toString:MochiKit.Base.forwardCall("repr"),next:function(){ +var rval=_1e2.iterateNext(); +if(rval===null||rval===undefined){ +throw MochiKit.Iter.StopIteration; +} +return rval; +}}; +}}); +MochiKit.Iter.EXPORT_OK=["iteratorRegistry","arrayLikeIter","hasIterateNext","iterateNextIter",]; +MochiKit.Iter.EXPORT=["StopIteration","registerIteratorFactory","iter","count","cycle","repeat","next","izip","ifilter","ifilterfalse","islice","imap","applymap","chain","takewhile","dropwhile","tee","list","reduce","range","sum","exhaust","forEach","every","sorted","reversed","some","iextend","groupby","groupby_as_array"]; +MochiKit.Iter.__new__=function(){ +var m=MochiKit.Base; +if(typeof (StopIteration)!="undefined"){ +this.StopIteration=StopIteration; +}else{ +this.StopIteration=new m.NamedError("StopIteration"); +} +this.iteratorRegistry=new m.AdapterRegistry(); +this.registerIteratorFactory("arrayLike",m.isArrayLike,this.arrayLikeIter); +this.registerIteratorFactory("iterateNext",this.hasIterateNext,this.iterateNextIter); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}; +MochiKit.Iter.__new__(); +if(MochiKit.__export__){ +reduce=MochiKit.Iter.reduce; +} +MochiKit.Base._exportSymbols(this,MochiKit.Iter); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Logging"); +dojo.require("MochiKit.Base"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Base",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Logging depends on MochiKit.Base!"; +} +if(typeof (MochiKit.Logging)=="undefined"){ +MochiKit.Logging={}; +} +MochiKit.Logging.NAME="MochiKit.Logging"; +MochiKit.Logging.VERSION="1.4"; +MochiKit.Logging.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.Logging.toString=function(){ +return this.__repr__(); +}; +MochiKit.Logging.EXPORT=["LogLevel","LogMessage","Logger","alertListener","logger","log","logError","logDebug","logFatal","logWarning"]; +MochiKit.Logging.EXPORT_OK=["logLevelAtLeast","isLogMessage","compareLogMessage"]; +MochiKit.Logging.LogMessage=function(num,_1e6,info){ +this.num=num; +this.level=_1e6; +this.info=info; +this.timestamp=new Date(); +}; +MochiKit.Logging.LogMessage.prototype={repr:function(){ +var m=MochiKit.Base; +return "LogMessage("+m.map(m.repr,[this.num,this.level,this.info]).join(", ")+")"; +},toString:MochiKit.Base.forwardCall("repr")}; +MochiKit.Base.update(MochiKit.Logging,{logLevelAtLeast:function(_1e9){ +var self=MochiKit.Logging; +if(typeof (_1e9)=="string"){ +_1e9=self.LogLevel[_1e9]; +} +return function(msg){ +var _1ec=msg.level; +if(typeof (_1ec)=="string"){ +_1ec=self.LogLevel[_1ec]; +} +return _1ec>=_1e9; +}; +},isLogMessage:function(){ +var _1ed=MochiKit.Logging.LogMessage; +for(var i=0;i=0&&this._messages.length>this.maxSize){ +this._messages.shift(); +} +},getMessages:function(_1ff){ +var _200=0; +if(!(typeof (_1ff)=="undefined"||_1ff===null)){ +_200=Math.max(0,this._messages.length-_1ff); +} +return this._messages.slice(_200); +},getMessageText:function(_201){ +if(typeof (_201)=="undefined"||_201===null){ +_201=30; +} +var _202=this.getMessages(_201); +if(_202.length){ +var lst=map(function(m){ +return "\n ["+m.num+"] "+m.level+": "+m.info.join(" "); +},_202); +lst.unshift("LAST "+_202.length+" MESSAGES:"); +return lst.join(""); +} +return ""; +},debuggingBookmarklet:function(_205){ +if(typeof (MochiKit.LoggingPane)=="undefined"){ +alert(this.getMessageText()); +}else{ +MochiKit.LoggingPane.createLoggingPane(_205||false); +} +}}; +MochiKit.Logging.__new__=function(){ +this.LogLevel={ERROR:40,FATAL:50,WARNING:30,INFO:20,DEBUG:10}; +var m=MochiKit.Base; +m.registerComparator("LogMessage",this.isLogMessage,this.compareLogMessage); +var _207=m.partial; +var _208=this.Logger; +var _209=_208.prototype.baseLog; +m.update(this.Logger.prototype,{debug:_207(_209,"DEBUG"),log:_207(_209,"INFO"),error:_207(_209,"ERROR"),fatal:_207(_209,"FATAL"),warning:_207(_209,"WARNING")}); +var self=this; +var _20b=function(name){ +return function(){ +self.logger[name].apply(self.logger,arguments); +}; +}; +this.log=_20b("log"); +this.logError=_20b("error"); +this.logDebug=_20b("debug"); +this.logFatal=_20b("fatal"); +this.logWarning=_20b("warning"); +this.logger=new _208(); +this.logger.useNativeConsole=true; +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}; +if(typeof (printfire)=="undefined"&&typeof (document)!="undefined"&&document.createEvent&&typeof (dispatchEvent)!="undefined"){ +printfire=function(){ +printfire.args=arguments; +var ev=document.createEvent("Events"); +ev.initEvent("printfire",false,true); +dispatchEvent(ev); +}; +} +MochiKit.Logging.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.Logging); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.DateTime"); +} +if(typeof (MochiKit)=="undefined"){ +MochiKit={}; +} +if(typeof (MochiKit.DateTime)=="undefined"){ +MochiKit.DateTime={}; +} +MochiKit.DateTime.NAME="MochiKit.DateTime"; +MochiKit.DateTime.VERSION="1.4"; +MochiKit.DateTime.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.DateTime.toString=function(){ +return this.__repr__(); +}; +MochiKit.DateTime.isoDate=function(str){ +str=str+""; +if(typeof (str)!="string"||str.length===0){ +return null; +} +var iso=str.split("-"); +if(iso.length===0){ +return null; +} +return new Date(iso[0],iso[1]-1,iso[2]); +}; +MochiKit.DateTime._isoRegexp=/(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/; +MochiKit.DateTime.isoTimestamp=function(str){ +str=str+""; +if(typeof (str)!="string"||str.length===0){ +return null; +} +var res=str.match(MochiKit.DateTime._isoRegexp); +if(typeof (res)=="undefined"||res===null){ +return null; +} +var year,_213,day,hour,min,sec,msec; +year=parseInt(res[1],10); +if(typeof (res[2])=="undefined"||res[2]===""){ +return new Date(year); +} +_213=parseInt(res[2],10)-1; +day=parseInt(res[3],10); +if(typeof (res[4])=="undefined"||res[4]===""){ +return new Date(year,_213,day); +} +hour=parseInt(res[4],10); +min=parseInt(res[5],10); +sec=(typeof (res[6])!="undefined"&&res[6]!=="")?parseInt(res[6],10):0; +if(typeof (res[7])!="undefined"&&res[7]!==""){ +msec=Math.round(1000*parseFloat("0."+res[7])); +}else{ +msec=0; +} +if((typeof (res[8])=="undefined"||res[8]==="")&&(typeof (res[9])=="undefined"||res[9]==="")){ +return new Date(year,_213,day,hour,min,sec,msec); +} +var ofs; +if(typeof (res[9])!="undefined"&&res[9]!==""){ +ofs=parseInt(res[10],10)*3600000; +if(typeof (res[11])!="undefined"&&res[11]!==""){ +ofs+=parseInt(res[11],10)*60000; +} +if(res[9]=="-"){ +ofs=-ofs; +} +}else{ +ofs=0; +} +return new Date(Date.UTC(year,_213,day,hour,min,sec,msec)-ofs); +}; +MochiKit.DateTime.toISOTime=function(date,_21b){ +if(typeof (date)=="undefined"||date===null){ +return null; +} +var hh=date.getHours(); +var mm=date.getMinutes(); +var ss=date.getSeconds(); +var lst=[((_21b&&(hh<10))?"0"+hh:hh),((mm<10)?"0"+mm:mm),((ss<10)?"0"+ss:ss)]; +return lst.join(":"); +}; +MochiKit.DateTime.toISOTimestamp=function(date,_221){ +if(typeof (date)=="undefined"||date===null){ +return null; +} +var sep=_221?"T":" "; +var foot=_221?"Z":""; +if(_221){ +date=new Date(date.getTime()+(date.getTimezoneOffset()*60000)); +} +return MochiKit.DateTime.toISODate(date)+sep+MochiKit.DateTime.toISOTime(date,_221)+foot; +}; +MochiKit.DateTime.toISODate=function(date){ +if(typeof (date)=="undefined"||date===null){ +return null; +} +var _225=MochiKit.DateTime._padTwo; +return [date.getFullYear(),_225(date.getMonth()+1),_225(date.getDate())].join("-"); +}; +MochiKit.DateTime.americanDate=function(d){ +d=d+""; +if(typeof (d)!="string"||d.length===0){ +return null; +} +var a=d.split("/"); +return new Date(a[2],a[0]-1,a[1]); +}; +MochiKit.DateTime._padTwo=function(n){ +return (n>9)?n:"0"+n; +}; +MochiKit.DateTime.toPaddedAmericanDate=function(d){ +if(typeof (d)=="undefined"||d===null){ +return null; +} +var _22a=MochiKit.DateTime._padTwo; +return [_22a(d.getMonth()+1),_22a(d.getDate()),d.getFullYear()].join("/"); +}; +MochiKit.DateTime.toAmericanDate=function(d){ +if(typeof (d)=="undefined"||d===null){ +return null; +} +return [d.getMonth()+1,d.getDate(),d.getFullYear()].join("/"); +}; +MochiKit.DateTime.EXPORT=["isoDate","isoTimestamp","toISOTime","toISOTimestamp","toISODate","americanDate","toPaddedAmericanDate","toAmericanDate"]; +MochiKit.DateTime.EXPORT_OK=[]; +MochiKit.DateTime.EXPORT_TAGS={":common":MochiKit.DateTime.EXPORT,":all":MochiKit.DateTime.EXPORT}; +MochiKit.DateTime.__new__=function(){ +var base=this.NAME+"."; +for(var k in this){ +var o=this[k]; +if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){ +try{ +o.NAME=base+k; +} +catch(e){ +} +} +} +}; +MochiKit.DateTime.__new__(); +if(typeof (MochiKit.Base)!="undefined"){ +MochiKit.Base._exportSymbols(this,MochiKit.DateTime); +}else{ +(function(_22f,_230){ +if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){ +var all=_230.EXPORT_TAGS[":all"]; +for(var i=0;i_23a){ +var i=_242.length-_23a; +res=fmt.separator+_242.substring(i,_242.length)+res; +_242=_242.substring(0,i); +} +} +res=_242+res; +if(_238>0){ +while(frac.length<_23b){ +frac=frac+"0"; +} +res=res+fmt.decimal+frac; +} +return _23d+res+_23e; +}; +}; +MochiKit.Format.numberFormatter=function(_246,_247,_248){ +if(typeof (_247)=="undefined"){ +_247=""; +} +var _249=_246.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/); +if(!_249){ +throw TypeError("Invalid pattern"); +} +var _24a=_246.substr(0,_249.index); +var _24b=_246.substr(_249.index+_249[0].length); +if(_24a.search(/-/)==-1){ +_24a=_24a+"-"; +} +var _24c=_249[1]; +var frac=(typeof (_249[2])=="string"&&_249[2]!="")?_249[2]:""; +var _24e=(typeof (_249[3])=="string"&&_249[3]!=""); +var tmp=_24c.split(/,/); +var _250; +if(typeof (_248)=="undefined"){ +_248="default"; +} +if(tmp.length==1){ +_250=null; +}else{ +_250=tmp[1].length; +} +var _251=_24c.length-_24c.replace(/0/g,"").length; +var _252=frac.length-frac.replace(/0/g,"").length; +var _253=frac.length; +var rval=MochiKit.Format._numberFormatter(_247,_24a,_24b,_248,_24e,_253,_251,_250,_252); +var m=MochiKit.Base; +if(m){ +var fn=arguments.callee; +var args=m.concat(arguments); +rval.repr=function(){ +return [self.NAME,"(",map(m.repr,args).join(", "),")"].join(""); +}; +} +return rval; +}; +MochiKit.Format.formatLocale=function(_258){ +if(typeof (_258)=="undefined"||_258===null){ +_258="default"; +} +if(typeof (_258)=="string"){ +var rval=MochiKit.Format.LOCALE[_258]; +if(typeof (rval)=="string"){ +rval=arguments.callee(rval); +MochiKit.Format.LOCALE[_258]=rval; +} +return rval; +}else{ +return _258; +} +}; +MochiKit.Format.twoDigitAverage=function(_25a,_25b){ +if(_25b){ +var res=_25a/_25b; +if(!isNaN(res)){ +return MochiKit.Format.twoDigitFloat(_25a/_25b); +} +} +return "0"; +}; +MochiKit.Format.twoDigitFloat=function(_25d){ +var sign=(_25d<0?"-":""); +var s=Math.floor(Math.abs(_25d)*100).toString(); +if(s=="0"){ +return s; +} +if(s.length<3){ +while(s.charAt(s.length-1)=="0"){ +s=s.substring(0,s.length-1); +} +return sign+"0."+s; +} +var head=sign+s.substring(0,s.length-2); +var tail=s.substring(s.length-2,s.length); +if(tail=="00"){ +return head; +}else{ +if(tail.charAt(1)=="0"){ +return head+"."+tail.charAt(0); +}else{ +return head+"."+tail; +} +} +}; +MochiKit.Format.lstrip=function(str,_263){ +str=str+""; +if(typeof (str)!="string"){ +return null; +} +if(!_263){ +return str.replace(/^\s+/,""); +}else{ +return str.replace(new RegExp("^["+_263+"]+"),""); +} +}; +MochiKit.Format.rstrip=function(str,_265){ +str=str+""; +if(typeof (str)!="string"){ +return null; +} +if(!_265){ +return str.replace(/\s+$/,""); +}else{ +return str.replace(new RegExp("["+_265+"]+$"),""); +} +}; +MochiKit.Format.strip=function(str,_267){ +var self=MochiKit.Format; +return self.rstrip(self.lstrip(str,_267),_267); +}; +MochiKit.Format.truncToFixed=function(_269,_26a){ +_269=Math.floor(_269*Math.pow(10,_26a)); +var res=(_269*Math.pow(10,-_26a)).toFixed(_26a); +if(res.charAt(0)=="."){ +res="0"+res; +} +return res; +}; +MochiKit.Format.roundToFixed=function(_26c,_26d){ +return MochiKit.Format.truncToFixed(_26c+0.5*Math.pow(10,-_26d),_26d); +}; +MochiKit.Format.percentFormat=function(_26e){ +return MochiKit.Format.twoDigitFloat(100*_26e)+"%"; +}; +MochiKit.Format.EXPORT=["truncToFixed","roundToFixed","numberFormatter","formatLocale","twoDigitAverage","twoDigitFloat","percentFormat","lstrip","rstrip","strip"]; +MochiKit.Format.LOCALE={en_US:{separator:",",decimal:".",percent:"%"},de_DE:{separator:".",decimal:",",percent:"%"},fr_FR:{separator:" ",decimal:",",percent:"%"},"default":"en_US"}; +MochiKit.Format.EXPORT_OK=[]; +MochiKit.Format.EXPORT_TAGS={":all":MochiKit.Format.EXPORT,":common":MochiKit.Format.EXPORT}; +MochiKit.Format.__new__=function(){ +var base=this.NAME+"."; +var k,v,o; +for(k in this.LOCALE){ +o=this.LOCALE[k]; +if(typeof (o)=="object"){ +o.repr=function(){ +return this.NAME; +}; +o.NAME=base+"LOCALE."+k; +} +} +for(k in this){ +o=this[k]; +if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){ +try{ +o.NAME=base+k; +} +catch(e){ +} +} +} +}; +MochiKit.Format.__new__(); +if(typeof (MochiKit.Base)!="undefined"){ +MochiKit.Base._exportSymbols(this,MochiKit.Format); +}else{ +(function(_273,_274){ +if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){ +var all=_274.EXPORT_TAGS[":all"]; +for(var i=0;i1){ +fn=MochiKit.Base.partial.apply(null,arguments); +} +return this.addCallbacks(fn,fn); +},addCallback:function(fn){ +if(arguments.length>1){ +fn=MochiKit.Base.partial.apply(null,arguments); +} +return this.addCallbacks(fn,null); +},addErrback:function(fn){ +if(arguments.length>1){ +fn=MochiKit.Base.partial.apply(null,arguments); +} +return this.addCallbacks(null,fn); +},addCallbacks:function(cb,eb){ +if(this.chained){ +throw new Error("Chained Deferreds can not be re-used"); +} +this.chain.push([cb,eb]); +if(this.fired>=0){ +this._fire(); +} +return this; +},_fire:function(){ +var _283=this.chain; +var _284=this.fired; +var res=this.results[_284]; +var self=this; +var cb=null; +while(_283.length>0&&this.paused===0){ +var pair=_283.shift(); +var f=pair[_284]; +if(f===null){ +continue; +} +try{ +res=f(res); +_284=((res instanceof Error)?1:0); +if(res instanceof MochiKit.Async.Deferred){ +cb=function(res){ +self._resback(res); +self.paused--; +if((self.paused===0)&&(self.fired>=0)){ +self._fire(); +} +}; +this.paused++; +} +} +catch(err){ +_284=1; +if(!(err instanceof Error)){ +err=new MochiKit.Async.GenericError(err); +} +res=err; +} +} +this.fired=_284; +this.results[_284]=res; +if(cb&&this.paused){ +res.addBoth(cb); +res.chained=true; +} +}}; +MochiKit.Base.update(MochiKit.Async,{evalJSONRequest:function(){ +return eval("("+arguments[0].responseText+")"); +},succeed:function(_28b){ +var d=new MochiKit.Async.Deferred(); +d.callback.apply(d,arguments); +return d; +},fail:function(_28d){ +var d=new MochiKit.Async.Deferred(); +d.errback.apply(d,arguments); +return d; +},getXMLHttpRequest:function(){ +var self=arguments.callee; +if(!self.XMLHttpRequest){ +var _290=[function(){ +return new XMLHttpRequest(); +},function(){ +return new ActiveXObject("Msxml2.XMLHTTP"); +},function(){ +return new ActiveXObject("Microsoft.XMLHTTP"); +},function(){ +return new ActiveXObject("Msxml2.XMLHTTP.4.0"); +},function(){ +throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest"); +}]; +for(var i=0;i<_290.length;i++){ +var func=_290[i]; +try{ +self.XMLHttpRequest=func; +return func(); +} +catch(e){ +} +} +} +return self.XMLHttpRequest(); +},_xhr_onreadystatechange:function(d){ +var m=MochiKit.Base; +if(this.readyState==4){ +try{ +this.onreadystatechange=null; +} +catch(e){ +try{ +this.onreadystatechange=m.noop; +} +catch(e){ +} +} +var _295=null; +try{ +_295=this.status; +if(!_295&&m.isNotEmpty(this.responseText)){ +_295=304; +} +} +catch(e){ +} +if(_295==200||_295==201||_295==204||_295==304||_295==1223){ +d.callback(this); +}else{ +var err=new MochiKit.Async.XMLHttpRequestError(this,"Request failed"); +if(err.number){ +d.errback(err); +}else{ +d.errback(err); +} +} +} +},_xhr_canceller:function(req){ +try{ +req.onreadystatechange=null; +} +catch(e){ +try{ +req.onreadystatechange=MochiKit.Base.noop; +} +catch(e){ +} +} +req.abort(); +},sendXMLHttpRequest:function(req,_299){ +if(typeof (_299)=="undefined"||_299===null){ +_299=""; +} +var m=MochiKit.Base; +var self=MochiKit.Async; +var d=new self.Deferred(m.partial(self._xhr_canceller,req)); +try{ +req.onreadystatechange=m.bind(self._xhr_onreadystatechange,req,d); +req.send(_299); +} +catch(e){ +try{ +req.onreadystatechange=null; +} +catch(ignore){ +} +d.errback(e); +} +return d; +},doXHR:function(url,opts){ +var self=MochiKit.Async; +return self.callLater(0,self._doXHR,url,opts); +},_doXHR:function(url,opts){ +var m=MochiKit.Base; +opts=m.update({method:"GET",sendContent:""},opts); +var self=MochiKit.Async; +var req=self.getXMLHttpRequest(); +if(opts.queryString){ +var qs=m.queryString(opts.queryString); +if(qs){ +url+="?"+qs; +} +} +if("username" in opts){ +req.open(opts.method,url,true,opts.username,opts.password); +}else{ +req.open(opts.method,url,true); +} +if(req.overrideMimeType&&opts.mimeType){ +req.overrideMimeType(opts.mimeType); +} +if(opts.headers){ +var _2a6=opts.headers; +if(!m.isArrayLike(_2a6)){ +_2a6=m.items(_2a6); +} +for(var i=0;i<_2a6.length;i++){ +var _2a8=_2a6[i]; +var name=_2a8[0]; +var _2aa=_2a8[1]; +req.setRequestHeader(name,_2aa); +} +} +return self.sendXMLHttpRequest(req,opts.sendContent); +},_buildURL:function(url){ +if(arguments.length>1){ +var m=MochiKit.Base; +var qs=m.queryString.apply(null,m.extend(null,arguments,1)); +if(qs){ +return url+"?"+qs; +} +} +return url; +},doSimpleXMLHttpRequest:function(url){ +var self=MochiKit.Async; +url=self._buildURL.apply(self,arguments); +return self.doXHR(url); +},loadJSONDoc:function(url){ +var self=MochiKit.Async; +url=self._buildURL.apply(self,arguments); +var d=self.doXHR(url,{"mimeType":"text/plain","headers":[["Accept","application/json"]]}); +d=d.addCallback(self.evalJSONRequest); +return d; +},wait:function(_2b3,_2b4){ +var d=new MochiKit.Async.Deferred(); +var m=MochiKit.Base; +if(typeof (_2b4)!="undefined"){ +d.addCallback(function(){ +return _2b4; +}); +} +var _2b7=setTimeout(m.bind("callback",d),Math.floor(_2b3*1000)); +d.canceller=function(){ +try{ +clearTimeout(_2b7); +} +catch(e){ +} +}; +return d; +},callLater:function(_2b8,func){ +var m=MochiKit.Base; +var _2bb=m.partial.apply(m,m.extend(null,arguments,1)); +return MochiKit.Async.wait(_2b8).addCallback(function(res){ +return _2bb(); +}); +}}); +MochiKit.Async.DeferredLock=function(){ +this.waiting=[]; +this.locked=false; +this.id=this._nextId(); +}; +MochiKit.Async.DeferredLock.prototype={__class__:MochiKit.Async.DeferredLock,acquire:function(){ +var d=new MochiKit.Async.Deferred(); +if(this.locked){ +this.waiting.push(d); +}else{ +this.locked=true; +d.callback(this); +} +return d; +},release:function(){ +if(!this.locked){ +throw TypeError("Tried to release an unlocked DeferredLock"); +} +this.locked=false; +if(this.waiting.length>0){ +this.locked=true; +this.waiting.shift().callback(this); +} +},_nextId:MochiKit.Base.counter(),repr:function(){ +var _2be; +if(this.locked){ +_2be="locked, "+this.waiting.length+" waiting"; +}else{ +_2be="unlocked"; +} +return "DeferredLock("+this.id+", "+_2be+")"; +},toString:MochiKit.Base.forwardCall("repr")}; +MochiKit.Async.DeferredList=function(list,_2c0,_2c1,_2c2,_2c3){ +MochiKit.Async.Deferred.apply(this,[_2c3]); +this.list=list; +var _2c4=[]; +this.resultList=_2c4; +this.finishedCount=0; +this.fireOnOneCallback=_2c0; +this.fireOnOneErrback=_2c1; +this.consumeErrors=_2c2; +var cb=MochiKit.Base.bind(this._cbDeferred,this); +for(var i=0;i=0){ +var opt=elem.options[elem.selectedIndex]; +var v=opt.value; +if(!v){ +var h=opt.outerHTML; +if(h&&!h.match(/^[^>]+\svalue\s*=/i)){ +v=opt.text; +} +} +_2e3.push(name); +_2e4.push(v); +return null; +} +_2e3.push(name); +_2e4.push(""); +return null; +}else{ +var opts=elem.options; +if(!opts.length){ +_2e3.push(name); +_2e4.push(""); +return null; +} +for(var i=0;i]+\svalue\s*=/i)){ +v=opt.text; +} +} +_2e3.push(name); +_2e4.push(v); +} +return null; +} +} +if(_2e9==="FORM"||_2e9==="P"||_2e9==="SPAN"||_2e9==="DIV"){ +return elem.childNodes; +} +_2e3.push(name); +_2e4.push(elem.value||""); +return null; +} +return elem.childNodes; +}); +return [_2e3,_2e4]; +},withDocument:function(doc,func){ +var self=MochiKit.DOM; +var _2f2=self._document; +var rval; +try{ +self._document=doc; +rval=func(); +} +catch(e){ +self._document=_2f2; +throw e; +} +self._document=_2f2; +return rval; +},registerDOMConverter:function(name,_2f5,wrap,_2f7){ +MochiKit.DOM.domConverters.register(name,_2f5,wrap,_2f7); +},coerceToDOM:function(node,ctx){ +var m=MochiKit.Base; +var im=MochiKit.Iter; +var self=MochiKit.DOM; +if(im){ +var iter=im.iter; +var _2fe=im.repeat; +var map=m.map; +} +var _300=self.domConverters; +var _301=arguments.callee; +var _302=m.NotFound; +while(true){ +if(typeof (node)=="undefined"||node===null){ +return null; +} +if(typeof (node)=="function"&&typeof (node.length)=="number"&&!(node instanceof Function)){ +node=im.list(node); +} +if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){ +return node; +} +if(typeof (node)=="number"||typeof (node)=="boolean"){ +node=node.toString(); +} +if(typeof (node)=="string"){ +return self._document.createTextNode(node); +} +if(typeof (node.__dom__)=="function"){ +node=node.__dom__(ctx); +continue; +} +if(typeof (node.dom)=="function"){ +node=node.dom(ctx); +continue; +} +if(typeof (node)=="function"){ +node=node.apply(ctx,[ctx]); +continue; +} +if(im){ +var _303=null; +try{ +_303=iter(node); +} +catch(e){ +} +if(_303){ +return map(_301,_303,_2fe(ctx)); +} +} +try{ +node=_300.match(node,ctx); +continue; +} +catch(e){ +if(e!=_302){ +throw e; +} +} +return self._document.createTextNode(node.toString()); +} +return undefined; +},isChildNode:function(node,_305){ +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +node=self.getElement(node); +} +if(typeof (_305)=="string"){ +_305=self.getElement(_305); +} +if(node===_305){ +return true; +} +while(node&&node.tagName.toUpperCase()!="BODY"){ +node=node.parentNode; +if(node===_305){ +return true; +} +} +return false; +},setNodeAttribute:function(node,attr,_309){ +var o={}; +o[attr]=_309; +try{ +return MochiKit.DOM.updateNodeAttributes(node,o); +} +catch(e){ +} +return null; +},getNodeAttribute:function(node,attr){ +var self=MochiKit.DOM; +var _30e=self.attributeArray.renames[attr]; +node=self.getElement(node); +try{ +if(_30e){ +return node[_30e]; +} +return node.getAttribute(attr); +} +catch(e){ +} +return null; +},removeNodeAttribute:function(node,attr){ +var self=MochiKit.DOM; +var _312=self.attributeArray.renames[attr]; +node=self.getElement(node); +try{ +if(_312){ +return node[_312]; +} +return node.removeAttribute(attr); +} +catch(e){ +} +return null; +},updateNodeAttributes:function(node,_314){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +} +if(_314){ +var _317=MochiKit.Base.updatetree; +if(self.attributeArray.compliant){ +for(var k in _314){ +var v=_314[k]; +if(typeof (v)=="object"&&typeof (elem[k])=="object"){ +if(k=="style"&&MochiKit.Style){ +MochiKit.Style.setStyle(elem,v); +}else{ +_317(elem[k],v); +} +}else{ +if(k.substring(0,2)=="on"){ +if(typeof (v)=="string"){ +v=new Function(v); +} +elem[k]=v; +}else{ +elem.setAttribute(k,v); +} +} +} +}else{ +var _31a=self.attributeArray.renames; +for(var k in _314){ +v=_314[k]; +var _31b=_31a[k]; +if(k=="style"&&typeof (v)=="string"){ +elem.style.cssText=v; +}else{ +if(typeof (_31b)=="string"){ +elem[_31b]=v; +}else{ +if(typeof (elem[k])=="object"&&typeof (v)=="object"){ +if(k=="style"&&MochiKit.Style){ +MochiKit.Style.setStyle(elem,v); +}else{ +_317(elem[k],v); +} +}else{ +if(k.substring(0,2)=="on"){ +if(typeof (v)=="string"){ +v=new Function(v); +} +elem[k]=v; +}else{ +elem.setAttribute(k,v); +} +} +} +} +} +} +} +return elem; +},appendChildNodes:function(node){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +} +var _31f=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)]; +var _320=MochiKit.Base.concat; +while(_31f.length){ +var n=_31f.shift(); +if(typeof (n)=="undefined"||n===null){ +}else{ +if(typeof (n.nodeType)=="number"){ +elem.appendChild(n); +}else{ +_31f=_320(n,_31f); +} +} +} +return elem; +},insertSiblingNodesBefore:function(node){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +} +var _325=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)]; +var _326=elem.parentNode; +var _327=MochiKit.Base.concat; +while(_325.length){ +var n=_325.shift(); +if(typeof (n)=="undefined"||n===null){ +}else{ +if(typeof (n.nodeType)=="number"){ +_326.insertBefore(n,elem); +}else{ +_325=_327(n,_325); +} +} +} +return _326; +},insertSiblingNodesAfter:function(node){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +} +var _32c=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)]; +if(elem.nextSibling){ +return self.insertSiblingNodesBefore(elem.nextSibling,_32c); +}else{ +return self.appendChildNodes(elem.parentNode,_32c); +} +},replaceChildNodes:function(node){ +var elem=node; +var self=MochiKit.DOM; +if(typeof (node)=="string"){ +elem=self.getElement(node); +arguments[0]=elem; +} +var _330; +while((_330=elem.firstChild)){ +elem.removeChild(_330); +} +if(arguments.length<2){ +return elem; +}else{ +return self.appendChildNodes.apply(this,arguments); +} +},createDOM:function(name,_332){ +var elem; +var self=MochiKit.DOM; +var m=MochiKit.Base; +if(typeof (_332)=="string"||typeof (_332)=="number"){ +var args=m.extend([name,null],arguments,1); +return arguments.callee.apply(this,args); +} +if(typeof (name)=="string"){ +var _337=self._xhtml; +if(_332&&!self.attributeArray.compliant){ +var _338=""; +if("name" in _332){ +_338+=" name=\""+self.escapeHTML(_332.name)+"\""; +} +if(name=="input"&&"type" in _332){ +_338+=" type=\""+self.escapeHTML(_332.type)+"\""; +} +if(_338){ +name="<"+name+_338+">"; +_337=false; +} +} +var d=self._document; +if(_337&&d===document){ +elem=d.createElementNS("http://www.w3.org/1999/xhtml",name); +}else{ +elem=d.createElement(name); +} +}else{ +elem=name; +} +if(_332){ +self.updateNodeAttributes(elem,_332); +} +if(arguments.length<=2){ +return elem; +}else{ +var args=m.extend([elem],arguments,2); +return self.appendChildNodes.apply(this,args); +} +},createDOMFunc:function(){ +var m=MochiKit.Base; +return m.partial.apply(this,m.extend([MochiKit.DOM.createDOM],arguments)); +},removeElement:function(elem){ +var e=MochiKit.DOM.getElement(elem); +e.parentNode.removeChild(e); +return e; +},swapDOM:function(dest,src){ +var self=MochiKit.DOM; +dest=self.getElement(dest); +var _340=dest.parentNode; +if(src){ +src=self.getElement(src); +_340.replaceChild(src,dest); +}else{ +_340.removeChild(dest); +} +return src; +},getElement:function(id){ +var self=MochiKit.DOM; +if(arguments.length==1){ +return ((typeof (id)=="string")?self._document.getElementById(id):id); +}else{ +return MochiKit.Base.map(self.getElement,arguments); +} +},getElementsByTagAndClassName:function(_343,_344,_345){ +var self=MochiKit.DOM; +if(typeof (_343)=="undefined"||_343===null){ +_343="*"; +} +if(typeof (_345)=="undefined"||_345===null){ +_345=self._document; +} +_345=self.getElement(_345); +var _347=(_345.getElementsByTagName(_343)||self._document.all); +if(typeof (_344)=="undefined"||_344===null){ +return MochiKit.Base.extend(null,_347); +} +var _348=[]; +for(var i=0;i<_347.length;i++){ +var _34a=_347[i]; +var cls=_34a.className; +if(!cls){ +continue; +} +var _34c=cls.split(" "); +for(var j=0;j<_34c.length;j++){ +if(_34c[j]==_344){ +_348.push(_34a); +break; +} +} +} +return _348; +},_newCallStack:function(path,once){ +var rval=function(){ +var _351=arguments.callee.callStack; +for(var i=0;i<_351.length;i++){ +if(_351[i].apply(this,arguments)===false){ +break; +} +} +if(once){ +try{ +this[path]=null; +} +catch(e){ +} +} +}; +rval.callStack=[]; +return rval; +},addToCallStack:function(_353,path,func,once){ +var self=MochiKit.DOM; +var _358=_353[path]; +var _359=_358; +if(!(typeof (_358)=="function"&&typeof (_358.callStack)=="object"&&_358.callStack!==null)){ +_359=self._newCallStack(path,once); +if(typeof (_358)=="function"){ +_359.callStack.push(_358); +} +_353[path]=_359; +} +_359.callStack.push(func); +},addLoadEvent:function(func){ +var self=MochiKit.DOM; +self.addToCallStack(self._window,"onload",func,true); +},focusOnLoad:function(_35c){ +var self=MochiKit.DOM; +self.addLoadEvent(function(){ +_35c=self.getElement(_35c); +if(_35c){ +_35c.focus(); +} +}); +},setElementClass:function(_35e,_35f){ +var self=MochiKit.DOM; +var obj=self.getElement(_35e); +if(self.attributeArray.compliant){ +obj.setAttribute("class",_35f); +}else{ +obj.setAttribute("className",_35f); +} +},toggleElementClass:function(_362){ +var self=MochiKit.DOM; +for(var i=1;i/g,">"); +},toHTML:function(dom){ +return MochiKit.DOM.emitHTML(dom).join(""); +},emitHTML:function(dom,lst){ +if(typeof (lst)=="undefined"||lst===null){ +lst=[]; +} +var _385=[dom]; +var self=MochiKit.DOM; +var _387=self.escapeHTML; +var _388=self.attributeArray; +while(_385.length){ +dom=_385.pop(); +if(typeof (dom)=="string"){ +lst.push(dom); +}else{ +if(dom.nodeType==1){ +lst.push("<"+dom.tagName.toLowerCase()); +var _389=[]; +var _38a=_388(dom); +for(var i=0;i<_38a.length;i++){ +var a=_38a[i]; +_389.push([" ",a.name,"=\"",_387(a.value),"\""]); +} +_389.sort(); +for(i=0;i<_389.length;i++){ +var _38d=_389[i]; +for(var j=0;j<_38d.length;j++){ +lst.push(_38d[j]); +} +} +if(dom.hasChildNodes()){ +lst.push(">"); +_385.push(""); +var _38f=dom.childNodes; +for(i=_38f.length-1;i>=0;i--){ +_385.push(_38f[i]); +} +}else{ +lst.push("/>"); +} +}else{ +if(dom.nodeType==3){ +lst.push(_387(dom.nodeValue)); +} +} +} +} +return lst; +},scrapeText:function(node,_391){ +var rval=[]; +(function(node){ +var cn=node.childNodes; +if(cn){ +for(var i=0;i0){ +var _3b8=m.filter; +_3b7=function(node){ +return _3b8(_3b7.ignoreAttrFilter,node.attributes); +}; +_3b7.ignoreAttr={}; +var _3ba=_3b6.attributes; +var _3bb=_3b7.ignoreAttr; +for(var i=0;i<_3ba.length;i++){ +var a=_3ba[i]; +_3bb[a.name]=a.value; +} +_3b7.ignoreAttrFilter=function(a){ +return (_3b7.ignoreAttr[a.name]!=a.value); +}; +_3b7.compliant=false; +_3b7.renames={"class":"className","checked":"defaultChecked","usemap":"useMap","for":"htmlFor","readonly":"readOnly","colspan":"colSpan","bgcolor":"bgColor","cellspacing":"cellSpacing","cellpadding":"cellPadding"}; +}else{ +_3b7=function(node){ +return node.attributes; +}; +_3b7.compliant=true; +_3b7.renames={}; +} +this.attributeArray=_3b7; +var _3c0=function(_3c1,arr){ +var _3c3=arr[1].split("."); +var str=""; +var obj={}; +str+="if (!MochiKit."+_3c3[1]+") { throw new Error(\""; +str+="This function has been deprecated and depends on MochiKit."; +str+=_3c3[1]+".\");}"; +str+="return MochiKit."+_3c3[1]+"."+arr[0]; +str+=".apply(this, arguments);"; +obj[_3c3[2]]=new Function(str); +MochiKit.Base.update(MochiKit[_3c1],obj); +}; +for(var i;i0){ +abort(repr(expr)); +} +},buildMatchExpression:function(){ +var repr=MochiKit.Base.repr; +var _3d1=this.params; +var _3d2=[]; +var _3d3,i; +function childElements(_3d5){ +return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, "+_3d5+".childNodes)"; +} +if(_3d1.wildcard){ +_3d2.push("true"); +} +if(_3d3=_3d1.id){ +_3d2.push("element.id == "+repr(_3d3)); +} +if(_3d3=_3d1.tagName){ +_3d2.push("element.tagName.toUpperCase() == "+repr(_3d3)); +} +if((_3d3=_3d1.classNames).length>0){ +for(i=0;i<_3d3.length;i++){ +_3d2.push("MochiKit.DOM.hasElementClass(element, "+repr(_3d3[i])+")"); +} +} +if((_3d3=_3d1.pseudoClassNames).length>0){ +for(i=0;i<_3d3.length;i++){ +var _3d6=_3d3[i].match(/^([^(]+)(?:\((.*)\))?$/); +var _3d7=_3d6[1]; +var _3d8=_3d6[2]; +switch(_3d7){ +case "root": +_3d2.push("element.nodeType == 9 || element === element.ownerDocument.documentElement"); +break; +case "nth-child": +case "nth-last-child": +case "nth-of-type": +case "nth-last-of-type": +_3d6=_3d8.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/); +if(!_3d6){ +throw "Invalid argument to pseudo element nth-child: "+_3d8; +} +var a,b; +if(_3d6[0]=="odd"){ +a=2; +b=1; +}else{ +if(_3d6[0]=="even"){ +a=2; +b=0; +}else{ +a=_3d6[2]&&parseInt(_3d6)||null; +b=parseInt(_3d6[3]); +} +} +_3d2.push("this.nthChild(element,"+a+","+b+","+!!_3d7.match("^nth-last")+","+!!_3d7.match("of-type$")+")"); +break; +case "first-child": +_3d2.push("this.nthChild(element, null, 1)"); +break; +case "last-child": +_3d2.push("this.nthChild(element, null, 1, true)"); +break; +case "first-of-type": +_3d2.push("this.nthChild(element, null, 1, false, true)"); +break; +case "last-of-type": +_3d2.push("this.nthChild(element, null, 1, true, true)"); +break; +case "only-child": +_3d2.push(childElements("element.parentNode")+".length == 1"); +break; +case "only-of-type": +_3d2.push("MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, "+childElements("element.parentNode")+").length == 1"); +break; +case "empty": +_3d2.push("element.childNodes.length == 0"); +break; +case "enabled": +_3d2.push("(this.isUIElement(element) && element.disabled === false)"); +break; +case "disabled": +_3d2.push("(this.isUIElement(element) && element.disabled === true)"); +break; +case "checked": +_3d2.push("(this.isUIElement(element) && element.checked === true)"); +break; +case "not": +var _3db=new MochiKit.Selector.Selector(_3d8); +_3d2.push("!( "+_3db.buildMatchExpression()+")"); +break; +} +} +} +if(_3d3=_3d1.attributes){ +MochiKit.Base.map(function(_3dc){ +var _3dd="MochiKit.DOM.getNodeAttribute(element, "+repr(_3dc.name)+")"; +var _3de=function(_3df){ +return _3dd+".split("+repr(_3df)+")"; +}; +switch(_3dc.operator){ +case "=": +_3d2.push(_3dd+" == "+repr(_3dc.value)); +break; +case "~=": +_3d2.push(_3dd+" && MochiKit.Base.findValue("+_3de(" ")+", "+repr(_3dc.value)+") > -1"); +break; +case "^=": +_3d2.push(_3dd+".substring(0, "+_3dc.value.length+") == "+repr(_3dc.value)); +break; +case "$=": +_3d2.push(_3dd+".substring("+_3dd+".length - "+_3dc.value.length+") == "+repr(_3dc.value)); +break; +case "*=": +_3d2.push(_3dd+".match("+repr(_3dc.value)+")"); +break; +case "|=": +_3d2.push(_3dd+" && "+_3de("-")+"[0].toUpperCase() == "+repr(_3dc.value.toUpperCase())); +break; +case "!=": +_3d2.push(_3dd+" != "+repr(_3dc.value)); +break; +case "": +case undefined: +_3d2.push(_3dd+" != null"); +break; +default: +throw "Unknown operator "+_3dc.operator+" in selector"; +} +},_3d3); +} +return _3d2.join(" && "); +},compileMatcher:function(){ +this.match=new Function("element","if (!element.tagName) return false; return "+this.buildMatchExpression()); +},nthChild:function(_3e0,a,b,_3e3,_3e4){ +var _3e5=MochiKit.Base.filter(function(node){ +return node.nodeType==1; +},_3e0.parentNode.childNodes); +if(_3e4){ +_3e5=MochiKit.Base.filter(function(node){ +return node.tagName==_3e0.tagName; +},_3e5); +} +if(_3e3){ +_3e5=MochiKit.Iter.reversed(_3e5); +} +if(a){ +var _3e8=MochiKit.Base.findIdentical(_3e5,_3e0); +return ((_3e8+1-b)/a)%1==0; +}else{ +return b==MochiKit.Base.findIdentical(_3e5,_3e0)+1; +} +},isUIElement:function(_3e9){ +return MochiKit.Base.findValue(["input","button","select","option","textarea","object"],_3e9.tagName.toLowerCase())>-1; +},findElements:function(_3ea,axis){ +var _3ec; +if(axis==undefined){ +axis=""; +} +function inScope(_3ed,_3ee){ +if(axis==""){ +return MochiKit.DOM.isChildNode(_3ed,_3ee); +}else{ +if(axis==">"){ +return _3ed.parentNode==_3ee; +}else{ +if(axis=="+"){ +return _3ed==nextSiblingElement(_3ee); +}else{ +if(axis=="~"){ +var _3ef=_3ee; +while(_3ef=nextSiblingElement(_3ef)){ +if(_3ed==_3ef){ +return true; +} +} +return false; +}else{ +throw "Invalid axis: "+axis; +} +} +} +} +} +if(_3ec=MochiKit.DOM.getElement(this.params.id)){ +if(this.match(_3ec)){ +if(!_3ea||inScope(_3ec,_3ea)){ +return [_3ec]; +} +} +} +function nextSiblingElement(node){ +node=node.nextSibling; +while(node&&node.nodeType!=1){ +node=node.nextSibling; +} +return node; +} +if(axis==""){ +_3ea=(_3ea||MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName||"*"); +}else{ +if(axis==">"){ +if(!_3ea){ +throw "> combinator not allowed without preceeding expression"; +} +_3ea=MochiKit.Base.filter(function(node){ +return node.nodeType==1; +},_3ea.childNodes); +}else{ +if(axis=="+"){ +if(!_3ea){ +throw "+ combinator not allowed without preceeding expression"; +} +_3ea=nextSiblingElement(_3ea)&&[nextSiblingElement(_3ea)]; +}else{ +if(axis=="~"){ +if(!_3ea){ +throw "~ combinator not allowed without preceeding expression"; +} +var _3f2=[]; +while(nextSiblingElement(_3ea)){ +_3ea=nextSiblingElement(_3ea); +_3f2.push(_3ea); +} +_3ea=_3f2; +} +} +} +} +if(!_3ea){ +return []; +} +var _3f3=MochiKit.Base.filter(MochiKit.Base.bind(function(_3f4){ +return this.match(_3f4); +},this),_3ea); +return _3f3; +},repr:function(){ +return "Selector("+this.expression+")"; +},toString:MochiKit.Base.forwardCall("repr")}; +MochiKit.Base.update(MochiKit.Selector,{findChildElements:function(_3f5,_3f6){ +return MochiKit.Base.flattenArray(MochiKit.Base.map(function(_3f7){ +var _3f8=""; +return MochiKit.Iter.reduce(function(_3f9,expr){ +if(match=expr.match(/^[>+~]$/)){ +_3f8=match[0]; +return _3f9; +}else{ +var _3fb=new MochiKit.Selector.Selector(expr); +var _3fc=MochiKit.Iter.reduce(function(_3fd,_3fe){ +return MochiKit.Base.extend(_3fd,_3fb.findElements(_3fe||_3f5,_3f8)); +},_3f9,[]); +_3f8=""; +return _3fc; +} +},_3f7.replace(/(^\s+|\s+$)/g,"").split(/\s+/),[null]); +},_3f6)); +},findDocElements:function(){ +return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(),arguments); +},__new__:function(){ +var m=MochiKit.Base; +this.$$=this.findDocElements; +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}}); +MochiKit.Selector.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.Selector); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Style"); +dojo.require("MochiKit.Base"); +dojo.require("MochiKit.DOM"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Base",[]); +JSAN.use("MochiKit.DOM",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Style depends on MochiKit.Base!"; +} +try{ +if(typeof (MochiKit.DOM)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Style depends on MochiKit.DOM!"; +} +if(typeof (MochiKit.Style)=="undefined"){ +MochiKit.Style={}; +} +MochiKit.Style.NAME="MochiKit.Style"; +MochiKit.Style.VERSION="1.4"; +MochiKit.Style.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.Style.toString=function(){ +return this.__repr__(); +}; +MochiKit.Style.EXPORT_OK=[]; +MochiKit.Style.EXPORT=["setStyle","setOpacity","getStyle","getElementDimensions","elementDimensions","setElementDimensions","getElementPosition","elementPosition","setElementPosition","setDisplayForElement","hideElement","showElement","getViewportDimensions","getViewportPosition","Dimensions","Coordinates"]; +MochiKit.Style.Dimensions=function(w,h){ +this.w=w; +this.h=h; +}; +MochiKit.Style.Dimensions.prototype.__repr__=function(){ +var repr=MochiKit.Base.repr; +return "{w: "+repr(this.w)+", h: "+repr(this.h)+"}"; +}; +MochiKit.Style.Dimensions.prototype.toString=function(){ +return this.__repr__(); +}; +MochiKit.Style.Coordinates=function(x,y){ +this.x=x; +this.y=y; +}; +MochiKit.Style.Coordinates.prototype.__repr__=function(){ +var repr=MochiKit.Base.repr; +return "{x: "+repr(this.x)+", y: "+repr(this.y)+"}"; +}; +MochiKit.Style.Coordinates.prototype.toString=function(){ +return this.__repr__(); +}; +MochiKit.Base.update(MochiKit.Style,{getStyle:function(elem,_407){ +var dom=MochiKit.DOM; +var d=dom._document; +elem=dom.getElement(elem); +_407=MochiKit.Base.camelize(_407); +if(!elem||elem==d){ +return undefined; +} +if(_407=="opacity"&&elem.filters){ +var _40a=(MochiKit.Style.getStyle(elem,"filter")||"").match(/alpha\(opacity=(.*)\)/); +if(_40a&&_40a[1]){ +return parseFloat(_40a[1])/100; +} +return 1; +} +var _40b=elem.style?elem.style[_407]:null; +if(!_40b){ +if(d.defaultView&&d.defaultView.getComputedStyle){ +var css=d.defaultView.getComputedStyle(elem,null); +_407=_407.replace(/([A-Z])/g,"-$1").toLowerCase(); +_40b=css?css.getPropertyValue(_407):null; +}else{ +if(elem.currentStyle){ +_40b=elem.currentStyle[_407]; +} +} +} +if(_407=="opacity"){ +_40b=parseFloat(_40b); +} +if(/Opera/.test(navigator.userAgent)&&(MochiKit.Base.find(["left","top","right","bottom"],_407)!=-1)){ +if(MochiKit.Style.getStyle(elem,"position")=="static"){ +_40b="auto"; +} +} +return _40b=="auto"?null:_40b; +},setStyle:function(elem,_40e){ +elem=MochiKit.DOM.getElement(elem); +for(var name in _40e){ +if(name=="opacity"){ +MochiKit.Style.setOpacity(elem,_40e[name]); +}else{ +elem.style[MochiKit.Base.camelize(name)]=_40e[name]; +} +} +},setOpacity:function(elem,o){ +elem=MochiKit.DOM.getElement(elem); +var self=MochiKit.Style; +if(o==1){ +var _413=/Gecko/.test(navigator.userAgent)&&!(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)); +elem.style["opacity"]=_413?0.999999:1; +if(/MSIE/.test(navigator.userAgent)){ +elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,""); +} +}else{ +if(o<0.00001){ +o=0; +} +elem.style["opacity"]=o; +if(/MSIE/.test(navigator.userAgent)){ +elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"")+"alpha(opacity="+o*100+")"; +} +} +},getElementPosition:function(elem,_415){ +var self=MochiKit.Style; +var dom=MochiKit.DOM; +elem=dom.getElement(elem); +if(!elem||(!(elem.x&&elem.y)&&(!elem.parentNode===null||self.getStyle(elem,"display")=="none"))){ +return undefined; +} +var c=new self.Coordinates(0,0); +var box=null; +var _41a=null; +var d=MochiKit.DOM._document; +var de=d.documentElement; +var b=d.body; +if(!elem.parentNode&&elem.x&&elem.y){ +c.x+=elem.x||0; +c.y+=elem.y||0; +}else{ +if(elem.getBoundingClientRect){ +box=elem.getBoundingClientRect(); +c.x+=box.left+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0); +c.y+=box.top+(de.scrollTop||b.scrollTop)-(de.clientTop||0); +}else{ +if(elem.offsetParent){ +c.x+=elem.offsetLeft; +c.y+=elem.offsetTop; +_41a=elem.offsetParent; +if(_41a!=elem){ +while(_41a){ +c.x+=_41a.offsetLeft; +c.y+=_41a.offsetTop; +_41a=_41a.offsetParent; +} +} +var ua=navigator.userAgent.toLowerCase(); +if((typeof (opera)!="undefined"&&parseFloat(opera.version())<9)||(ua.indexOf("AppleWebKit")!=-1&&self.getStyle(elem,"position")=="absolute")){ +c.x-=b.offsetLeft; +c.y-=b.offsetTop; +} +} +} +} +if(typeof (_415)!="undefined"){ +_415=arguments.callee(_415); +if(_415){ +c.x-=(_415.x||0); +c.y-=(_415.y||0); +} +} +if(elem.parentNode){ +_41a=elem.parentNode; +}else{ +_41a=null; +} +while(_41a){ +var _41f=_41a.tagName.toUpperCase(); +if(_41f==="BODY"||_41f==="HTML"){ +break; +} +var disp=self.getStyle(_41a,"display"); +if(disp!="inline"&&disp!="table-row"){ +c.x-=_41a.scrollLeft; +c.y-=_41a.scrollTop; +} +if(_41a.parentNode){ +_41a=_41a.parentNode; +}else{ +_41a=null; +} +} +return c; +},setElementPosition:function(elem,_422,_423){ +elem=MochiKit.DOM.getElement(elem); +if(typeof (_423)=="undefined"){ +_423="px"; +} +var _424={}; +var _425=MochiKit.Base.isUndefinedOrNull; +if(!_425(_422.x)){ +_424["left"]=_422.x+_423; +} +if(!_425(_422.y)){ +_424["top"]=_422.y+_423; +} +MochiKit.DOM.updateNodeAttributes(elem,{"style":_424}); +},getElementDimensions:function(elem){ +var self=MochiKit.Style; +var dom=MochiKit.DOM; +if(typeof (elem.w)=="number"||typeof (elem.h)=="number"){ +return new self.Dimensions(elem.w||0,elem.h||0); +} +elem=dom.getElement(elem); +if(!elem){ +return undefined; +} +var disp=self.getStyle(elem,"display"); +if(disp!="none"&&disp!==""&&typeof (disp)!="undefined"){ +return new self.Dimensions(elem.offsetWidth||0,elem.offsetHeight||0); +} +var s=elem.style; +var _42b=s.visibility; +var _42c=s.position; +s.visibility="hidden"; +s.position="absolute"; +s.display=""; +var _42d=elem.offsetWidth; +var _42e=elem.offsetHeight; +s.display="none"; +s.position=_42c; +s.visibility=_42b; +return new self.Dimensions(_42d,_42e); +},setElementDimensions:function(elem,_430,_431){ +elem=MochiKit.DOM.getElement(elem); +if(typeof (_431)=="undefined"){ +_431="px"; +} +var _432={}; +var _433=MochiKit.Base.isUndefinedOrNull; +if(!_433(_430.w)){ +_432["width"]=_430.w+_431; +} +if(!_433(_430.h)){ +_432["height"]=_430.h+_431; +} +MochiKit.DOM.updateNodeAttributes(elem,{"style":_432}); +},setDisplayForElement:function(_434,_435){ +var _436=MochiKit.Base.extend(null,arguments,1); +var _437=MochiKit.DOM.getElement; +for(var i=0;i<_436.length;i++){ +_435=_437(_436[i]); +if(_435){ +_435.style.display=_434; +} +} +},getViewportDimensions:function(){ +var d=new MochiKit.Style.Dimensions(); +var w=MochiKit.DOM._window; +var b=MochiKit.DOM._document.body; +if(w.innerWidth){ +d.w=w.innerWidth; +d.h=w.innerHeight; +}else{ +if(b.parentElement.clientWidth){ +d.w=b.parentElement.clientWidth; +d.h=b.parentElement.clientHeight; +}else{ +if(b&&b.clientWidth){ +d.w=b.clientWidth; +d.h=b.clientHeight; +} +} +} +return d; +},getViewportPosition:function(){ +var c=new MochiKit.Style.Coordinates(0,0); +var d=MochiKit.DOM._document; +var de=d.documentElement; +var db=d.body; +if(de&&(de.scrollTop||de.scrollLeft)){ +c.x=de.scrollLeft; +c.y=de.scrollTop; +}else{ +if(db){ +c.x=db.scrollLeft; +c.y=db.scrollTop; +} +} +return c; +},__new__:function(){ +var m=MochiKit.Base; +this.elementPosition=this.getElementPosition; +this.elementDimensions=this.getElementDimensions; +this.hideElement=m.partial(this.setDisplayForElement,"none"); +this.showElement=m.partial(this.setDisplayForElement,"block"); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}}); +MochiKit.Style.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.Style); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.LoggingPane"); +dojo.require("MochiKit.Logging"); +dojo.require("MochiKit.Base"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Logging",[]); +JSAN.use("MochiKit.Base",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.Logging)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.LoggingPane depends on MochiKit.Base and MochiKit.Logging!"; +} +if(typeof (MochiKit.LoggingPane)=="undefined"){ +MochiKit.LoggingPane={}; +} +MochiKit.LoggingPane.NAME="MochiKit.LoggingPane"; +MochiKit.LoggingPane.VERSION="1.4"; +MochiKit.LoggingPane.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.LoggingPane.toString=function(){ +return this.__repr__(); +}; +MochiKit.LoggingPane.createLoggingPane=function(_441){ +var m=MochiKit.LoggingPane; +_441=!(!_441); +if(m._loggingPane&&m._loggingPane.inline!=_441){ +m._loggingPane.closePane(); +m._loggingPane=null; +} +if(!m._loggingPane||m._loggingPane.closed){ +m._loggingPane=new m.LoggingPane(_441,MochiKit.Logging.logger); +} +return m._loggingPane; +}; +MochiKit.LoggingPane.LoggingPane=function(_443,_444){ +if(typeof (_444)=="undefined"||_444===null){ +_444=MochiKit.Logging.logger; +} +this.logger=_444; +var _445=MochiKit.Base.update; +var _446=MochiKit.Base.updatetree; +var bind=MochiKit.Base.bind; +var _448=MochiKit.Base.clone; +var win=window; +var uid="_MochiKit_LoggingPane"; +if(typeof (MochiKit.DOM)!="undefined"){ +win=MochiKit.DOM.currentWindow(); +} +if(!_443){ +var url=win.location.href.split("?")[0].replace(/[#:\/.><&-]/g,"_"); +var name=uid+"_"+url; +var nwin=win.open("",name,"dependent,resizable,height=200"); +if(!nwin){ +alert("Not able to open debugging window due to pop-up blocking."); +return undefined; +} +nwin.document.write(""+"[MochiKit.LoggingPane]"+""); +nwin.document.close(); +nwin.document.title+=" "+win.document.title; +win=nwin; +} +var doc=win.document; +this.doc=doc; +var _44f=doc.getElementById(uid); +var _450=!!_44f; +if(_44f&&typeof (_44f.loggingPane)!="undefined"){ +_44f.loggingPane.logger=this.logger; +_44f.loggingPane.buildAndApplyFilter(); +return _44f.loggingPane; +} +if(_450){ +var _451; +while((_451=_44f.firstChild)){ +_44f.removeChild(_451); +} +}else{ +_44f=doc.createElement("div"); +_44f.id=uid; +} +_44f.loggingPane=this; +var _452=doc.createElement("input"); +var _453=doc.createElement("input"); +var _454=doc.createElement("button"); +var _455=doc.createElement("button"); +var _456=doc.createElement("button"); +var _457=doc.createElement("button"); +var _458=doc.createElement("div"); +var _459=doc.createElement("div"); +var _45a=uid+"_Listener"; +this.colorTable=_448(this.colorTable); +var _45b=[]; +var _45c=null; +var _45d=function(msg){ +var _45f=msg.level; +if(typeof (_45f)=="number"){ +_45f=MochiKit.Logging.LogLevel[_45f]; +} +return _45f; +}; +var _460=function(msg){ +return msg.info.join(" "); +}; +var _462=bind(function(msg){ +var _464=_45d(msg); +var text=_460(msg); +var c=this.colorTable[_464]; +var p=doc.createElement("span"); +p.className="MochiKit-LogMessage MochiKit-LogLevel-"+_464; +p.style.cssText="margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: "+c; +p.appendChild(doc.createTextNode(_464+": "+text)); +_459.appendChild(p); +_459.appendChild(doc.createElement("br")); +if(_458.offsetHeight>_458.scrollHeight){ +_458.scrollTop=0; +}else{ +_458.scrollTop=_458.scrollHeight; +} +},this); +var _468=function(msg){ +_45b[_45b.length]=msg; +_462(msg); +}; +var _46a=function(){ +var _46b,_46c; +try{ +_46b=new RegExp(_452.value); +_46c=new RegExp(_453.value); +} +catch(e){ +logDebug("Error in filter regex: "+e.message); +return null; +} +return function(msg){ +return (_46b.test(_45d(msg))&&_46c.test(_460(msg))); +}; +}; +var _46e=function(){ +while(_459.firstChild){ +_459.removeChild(_459.firstChild); +} +}; +var _46f=function(){ +_45b=[]; +_46e(); +}; +var _470=bind(function(){ +if(this.closed){ +return; +} +this.closed=true; +if(MochiKit.LoggingPane._loggingPane==this){ +MochiKit.LoggingPane._loggingPane=null; +} +this.logger.removeListener(_45a); +try{ +try{ +_44f.loggingPane=null; +} +catch(e){ +logFatal("Bookmarklet was closed incorrectly."); +} +if(_443){ +_44f.parentNode.removeChild(_44f); +}else{ +this.win.close(); +} +} +catch(e){ +} +},this); +var _471=function(){ +_46e(); +for(var i=0;i<_45b.length;i++){ +var msg=_45b[i]; +if(_45c===null||_45c(msg)){ +_462(msg); +} +} +}; +this.buildAndApplyFilter=function(){ +_45c=_46a(); +_471(); +this.logger.removeListener(_45a); +this.logger.addListener(_45a,_45c,_468); +}; +var _474=bind(function(){ +_45b=this.logger.getMessages(); +_471(); +},this); +var _475=bind(function(_476){ +_476=_476||window.event; +key=_476.which||_476.keyCode; +if(key==13){ +this.buildAndApplyFilter(); +} +},this); +var _477="display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: "+this.logFont; +if(_443){ +_477+="; height: 10em; border-top: 2px solid black"; +}else{ +_477+="; height: 100%;"; +} +_44f.style.cssText=_477; +if(!_450){ +doc.body.appendChild(_44f); +} +_477={"cssText":"width: 33%; display: inline; font: "+this.logFont}; +_446(_452,{"value":"FATAL|ERROR|WARNING|INFO|DEBUG","onkeypress":_475,"style":_477}); +_44f.appendChild(_452); +_446(_453,{"value":".*","onkeypress":_475,"style":_477}); +_44f.appendChild(_453); +_477="width: 8%; display:inline; font: "+this.logFont; +_454.appendChild(doc.createTextNode("Filter")); +_454.onclick=bind("buildAndApplyFilter",this); +_454.style.cssText=_477; +_44f.appendChild(_454); +_455.appendChild(doc.createTextNode("Load")); +_455.onclick=_474; +_455.style.cssText=_477; +_44f.appendChild(_455); +_456.appendChild(doc.createTextNode("Clear")); +_456.onclick=_46f; +_456.style.cssText=_477; +_44f.appendChild(_456); +_457.appendChild(doc.createTextNode("Close")); +_457.onclick=_470; +_457.style.cssText=_477; +_44f.appendChild(_457); +_458.style.cssText="overflow: auto; width: 100%"; +_459.style.cssText="width: 100%; height: "+(_443?"8em":"100%"); +_458.appendChild(_459); +_44f.appendChild(_458); +this.buildAndApplyFilter(); +_474(); +if(_443){ +this.win=undefined; +}else{ +this.win=win; +} +this.inline=_443; +this.closePane=_470; +this.closed=false; +return this; +}; +MochiKit.LoggingPane.LoggingPane.prototype={"logFont":"8pt Verdana,sans-serif","colorTable":{"ERROR":"red","FATAL":"darkred","WARNING":"blue","INFO":"black","DEBUG":"green"}}; +MochiKit.LoggingPane.EXPORT_OK=["LoggingPane"]; +MochiKit.LoggingPane.EXPORT=["createLoggingPane"]; +MochiKit.LoggingPane.__new__=function(){ +this.EXPORT_TAGS={":common":this.EXPORT,":all":MochiKit.Base.concat(this.EXPORT,this.EXPORT_OK)}; +MochiKit.Base.nameFunctions(this); +MochiKit.LoggingPane._loggingPane=null; +}; +MochiKit.LoggingPane.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.LoggingPane); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Color"); +dojo.require("MochiKit.Base"); +dojo.require("MochiKit.DOM"); +dojo.require("MochiKit.Style"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Base",[]); +JSAN.use("MochiKit.DOM",[]); +JSAN.use("MochiKit.Style",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Color depends on MochiKit.Base"; +} +try{ +if(typeof (MochiKit.DOM)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Color depends on MochiKit.DOM"; +} +try{ +if(typeof (MochiKit.Style)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Color depends on MochiKit.Style"; +} +if(typeof (MochiKit.Color)=="undefined"){ +MochiKit.Color={}; +} +MochiKit.Color.NAME="MochiKit.Color"; +MochiKit.Color.VERSION="1.4"; +MochiKit.Color.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.Color.toString=function(){ +return this.__repr__(); +}; +MochiKit.Color.Color=function(red,_479,blue,_47b){ +if(typeof (_47b)=="undefined"||_47b===null){ +_47b=1; +} +this.rgb={r:red,g:_479,b:blue,a:_47b}; +}; +MochiKit.Color.Color.prototype={__class__:MochiKit.Color.Color,colorWithAlpha:function(_47c){ +var rgb=this.rgb; +var m=MochiKit.Color; +return m.Color.fromRGB(rgb.r,rgb.g,rgb.b,_47c); +},colorWithHue:function(hue){ +var hsl=this.asHSL(); +hsl.h=hue; +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},colorWithSaturation:function(_482){ +var hsl=this.asHSL(); +hsl.s=_482; +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},colorWithLightness:function(_485){ +var hsl=this.asHSL(); +hsl.l=_485; +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},darkerColorWithLevel:function(_488){ +var hsl=this.asHSL(); +hsl.l=Math.max(hsl.l-_488,0); +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},lighterColorWithLevel:function(_48b){ +var hsl=this.asHSL(); +hsl.l=Math.min(hsl.l+_48b,1); +var m=MochiKit.Color; +return m.Color.fromHSL(hsl); +},blendedColor:function(_48e,_48f){ +if(typeof (_48f)=="undefined"||_48f===null){ +_48f=0.5; +} +var sf=1-_48f; +var s=this.rgb; +var d=_48e.rgb; +var df=_48f; +return MochiKit.Color.Color.fromRGB((s.r*sf)+(d.r*df),(s.g*sf)+(d.g*df),(s.b*sf)+(d.b*df),(s.a*sf)+(d.a*df)); +},compareRGB:function(_494){ +var a=this.asRGB(); +var b=_494.asRGB(); +return MochiKit.Base.compare([a.r,a.g,a.b,a.a],[b.r,b.g,b.b,b.a]); +},isLight:function(){ +return this.asHSL().b>0.5; +},isDark:function(){ +return (!this.isLight()); +},toHSLString:function(){ +var c=this.asHSL(); +var ccc=MochiKit.Color.clampColorComponent; +var rval=this._hslString; +if(!rval){ +var mid=(ccc(c.h,360).toFixed(0)+","+ccc(c.s,100).toPrecision(4)+"%"+","+ccc(c.l,100).toPrecision(4)+"%"); +var a=c.a; +if(a>=1){ +a=1; +rval="hsl("+mid+")"; +}else{ +if(a<=0){ +a=0; +} +rval="hsla("+mid+","+a+")"; +} +this._hslString=rval; +} +return rval; +},toRGBString:function(){ +var c=this.rgb; +var ccc=MochiKit.Color.clampColorComponent; +var rval=this._rgbString; +if(!rval){ +var mid=(ccc(c.r,255).toFixed(0)+","+ccc(c.g,255).toFixed(0)+","+ccc(c.b,255).toFixed(0)); +if(c.a!=1){ +rval="rgba("+mid+","+c.a+")"; +}else{ +rval="rgb("+mid+")"; +} +this._rgbString=rval; +} +return rval; +},asRGB:function(){ +return MochiKit.Base.clone(this.rgb); +},toHexString:function(){ +var m=MochiKit.Color; +var c=this.rgb; +var ccc=MochiKit.Color.clampColorComponent; +var rval=this._hexString; +if(!rval){ +rval=("#"+m.toColorPart(ccc(c.r,255))+m.toColorPart(ccc(c.g,255))+m.toColorPart(ccc(c.b,255))); +this._hexString=rval; +} +return rval; +},asHSV:function(){ +var hsv=this.hsv; +var c=this.rgb; +if(typeof (hsv)=="undefined"||hsv===null){ +hsv=MochiKit.Color.rgbToHSV(this.rgb); +this.hsv=hsv; +} +return MochiKit.Base.clone(hsv); +},asHSL:function(){ +var hsl=this.hsl; +var c=this.rgb; +if(typeof (hsl)=="undefined"||hsl===null){ +hsl=MochiKit.Color.rgbToHSL(this.rgb); +this.hsl=hsl; +} +return MochiKit.Base.clone(hsl); +},toString:function(){ +return this.toRGBString(); +},repr:function(){ +var c=this.rgb; +var col=[c.r,c.g,c.b,c.a]; +return this.__class__.NAME+"("+col.join(", ")+")"; +}}; +MochiKit.Base.update(MochiKit.Color.Color,{fromRGB:function(red,_4ab,blue,_4ad){ +var _4ae=MochiKit.Color.Color; +if(arguments.length==1){ +var rgb=red; +red=rgb.r; +_4ab=rgb.g; +blue=rgb.b; +if(typeof (rgb.a)=="undefined"){ +_4ad=undefined; +}else{ +_4ad=rgb.a; +} +} +return new _4ae(red,_4ab,blue,_4ad); +},fromHSL:function(hue,_4b1,_4b2,_4b3){ +var m=MochiKit.Color; +return m.Color.fromRGB(m.hslToRGB.apply(m,arguments)); +},fromHSV:function(hue,_4b6,_4b7,_4b8){ +var m=MochiKit.Color; +return m.Color.fromRGB(m.hsvToRGB.apply(m,arguments)); +},fromName:function(name){ +var _4bb=MochiKit.Color.Color; +if(name.charAt(0)=="\""){ +name=name.substr(1,name.length-2); +} +var _4bc=_4bb._namedColors[name.toLowerCase()]; +if(typeof (_4bc)=="string"){ +return _4bb.fromHexString(_4bc); +}else{ +if(name=="transparent"){ +return _4bb.transparentColor(); +} +} +return null; +},fromString:function(_4bd){ +var self=MochiKit.Color.Color; +var _4bf=_4bd.substr(0,3); +if(_4bf=="rgb"){ +return self.fromRGBString(_4bd); +}else{ +if(_4bf=="hsl"){ +return self.fromHSLString(_4bd); +}else{ +if(_4bd.charAt(0)=="#"){ +return self.fromHexString(_4bd); +} +} +} +return self.fromName(_4bd); +},fromHexString:function(_4c0){ +if(_4c0.charAt(0)=="#"){ +_4c0=_4c0.substring(1); +} +var _4c1=[]; +var i,hex; +if(_4c0.length==3){ +for(i=0;i<3;i++){ +hex=_4c0.substr(i,1); +_4c1.push(parseInt(hex+hex,16)/255); +} +}else{ +for(i=0;i<6;i+=2){ +hex=_4c0.substr(i,2); +_4c1.push(parseInt(hex,16)/255); +} +} +var _4c4=MochiKit.Color.Color; +return _4c4.fromRGB.apply(_4c4,_4c1); +},_fromColorString:function(pre,_4c6,_4c7,_4c8){ +if(_4c8.indexOf(pre)===0){ +_4c8=_4c8.substring(_4c8.indexOf("(",3)+1,_4c8.length-1); +} +var _4c9=_4c8.split(/\s*,\s*/); +var _4ca=[]; +for(var i=0;i<_4c9.length;i++){ +var c=_4c9[i]; +var val; +var _4ce=c.substring(c.length-3); +if(c.charAt(c.length-1)=="%"){ +val=0.01*parseFloat(c.substring(0,c.length-1)); +}else{ +if(_4ce=="deg"){ +val=parseFloat(c)/360; +}else{ +if(_4ce=="rad"){ +val=parseFloat(c)/(Math.PI*2); +}else{ +val=_4c7[i]*parseFloat(c); +} +} +} +_4ca.push(val); +} +return this[_4c6].apply(this,_4ca); +},fromComputedStyle:function(elem,_4d0){ +var d=MochiKit.DOM; +var cls=MochiKit.Color.Color; +for(elem=d.getElement(elem);elem;elem=elem.parentNode){ +var _4d3=MochiKit.Style.getStyle.apply(d,arguments); +if(!_4d3){ +continue; +} +var _4d4=cls.fromString(_4d3); +if(!_4d4){ +break; +} +if(_4d4.asRGB().a>0){ +return _4d4; +} +} +return null; +},fromBackground:function(elem){ +var cls=MochiKit.Color.Color; +return cls.fromComputedStyle(elem,"backgroundColor","background-color")||cls.whiteColor(); +},fromText:function(elem){ +var cls=MochiKit.Color.Color; +return cls.fromComputedStyle(elem,"color","color")||cls.blackColor(); +},namedColors:function(){ +return MochiKit.Base.clone(MochiKit.Color.Color._namedColors); +}}); +MochiKit.Base.update(MochiKit.Color,{clampColorComponent:function(v,_4da){ +v*=_4da; +if(v<0){ +return 0; +}else{ +if(v>_4da){ +return _4da; +}else{ +return v; +} +} +},_hslValue:function(n1,n2,hue){ +if(hue>6){ +hue-=6; +}else{ +if(hue<0){ +hue+=6; +} +} +var val; +if(hue<1){ +val=n1+(n2-n1)*hue; +}else{ +if(hue<3){ +val=n2; +}else{ +if(hue<4){ +val=n1+(n2-n1)*(4-hue); +}else{ +val=n1; +} +} +} +return val; +},hsvToRGB:function(hue,_4e0,_4e1,_4e2){ +if(arguments.length==1){ +var hsv=hue; +hue=hsv.h; +_4e0=hsv.s; +_4e1=hsv.v; +_4e2=hsv.a; +} +var red; +var _4e5; +var blue; +if(_4e0===0){ +red=_4e1; +_4e5=_4e1; +blue=_4e1; +}else{ +var i=Math.floor(hue*6); +var f=(hue*6)-i; +var p=_4e1*(1-_4e0); +var q=_4e1*(1-(_4e0*f)); +var t=_4e1*(1-(_4e0*(1-f))); +switch(i){ +case 1: +red=q; +_4e5=_4e1; +blue=p; +break; +case 2: +red=p; +_4e5=_4e1; +blue=t; +break; +case 3: +red=p; +_4e5=q; +blue=_4e1; +break; +case 4: +red=t; +_4e5=p; +blue=_4e1; +break; +case 5: +red=_4e1; +_4e5=p; +blue=q; +break; +case 6: +case 0: +red=_4e1; +_4e5=t; +blue=p; +break; +} +} +return {r:red,g:_4e5,b:blue,a:_4e2}; +},hslToRGB:function(hue,_4ed,_4ee,_4ef){ +if(arguments.length==1){ +var hsl=hue; +hue=hsl.h; +_4ed=hsl.s; +_4ee=hsl.l; +_4ef=hsl.a; +} +var red; +var _4f2; +var blue; +if(_4ed===0){ +red=_4ee; +_4f2=_4ee; +blue=_4ee; +}else{ +var m2; +if(_4ee<=0.5){ +m2=_4ee*(1+_4ed); +}else{ +m2=_4ee+_4ed-(_4ee*_4ed); +} +var m1=(2*_4ee)-m2; +var f=MochiKit.Color._hslValue; +var h6=hue*6; +red=f(m1,m2,h6+2); +_4f2=f(m1,m2,h6); +blue=f(m1,m2,h6-2); +} +return {r:red,g:_4f2,b:blue,a:_4ef}; +},rgbToHSV:function(red,_4f9,blue,_4fb){ +if(arguments.length==1){ +var rgb=red; +red=rgb.r; +_4f9=rgb.g; +blue=rgb.b; +_4fb=rgb.a; +} +var max=Math.max(Math.max(red,_4f9),blue); +var min=Math.min(Math.min(red,_4f9),blue); +var hue; +var _500; +var _501=max; +if(min==max){ +hue=0; +_500=0; +}else{ +var _502=(max-min); +_500=_502/max; +if(red==max){ +hue=(_4f9-blue)/_502; +}else{ +if(_4f9==max){ +hue=2+((blue-red)/_502); +}else{ +hue=4+((red-_4f9)/_502); +} +} +hue/=6; +if(hue<0){ +hue+=1; +} +if(hue>1){ +hue-=1; +} +} +return {h:hue,s:_500,v:_501,a:_4fb}; +},rgbToHSL:function(red,_504,blue,_506){ +if(arguments.length==1){ +var rgb=red; +red=rgb.r; +_504=rgb.g; +blue=rgb.b; +_506=rgb.a; +} +var max=Math.max(red,Math.max(_504,blue)); +var min=Math.min(red,Math.min(_504,blue)); +var hue; +var _50b; +var _50c=(max+min)/2; +var _50d=max-min; +if(_50d===0){ +hue=0; +_50b=0; +}else{ +if(_50c<=0.5){ +_50b=_50d/(max+min); +}else{ +_50b=_50d/(2-max-min); +} +if(red==max){ +hue=(_504-blue)/_50d; +}else{ +if(_504==max){ +hue=2+((blue-red)/_50d); +}else{ +hue=4+((red-_504)/_50d); +} +} +hue/=6; +if(hue<0){ +hue+=1; +} +if(hue>1){ +hue-=1; +} +} +return {h:hue,s:_50b,l:_50c,a:_506}; +},toColorPart:function(num){ +num=Math.round(num); +var _50f=num.toString(16); +if(num<16){ +return "0"+_50f; +} +return _50f; +},__new__:function(){ +var m=MochiKit.Base; +this.Color.fromRGBString=m.bind(this.Color._fromColorString,this.Color,"rgb","fromRGB",[1/255,1/255,1/255,1]); +this.Color.fromHSLString=m.bind(this.Color._fromColorString,this.Color,"hsl","fromHSL",[1/360,0.01,0.01,1]); +var _511=1/3; +var _512={black:[0,0,0],blue:[0,0,1],brown:[0.6,0.4,0.2],cyan:[0,1,1],darkGray:[_511,_511,_511],gray:[0.5,0.5,0.5],green:[0,1,0],lightGray:[2*_511,2*_511,2*_511],magenta:[1,0,1],orange:[1,0.5,0],purple:[0.5,0,0.5],red:[1,0,0],transparent:[0,0,0,0],white:[1,1,1],yellow:[1,1,0]}; +var _513=function(name,r,g,b,a){ +var rval=this.fromRGB(r,g,b,a); +this[name]=function(){ +return rval; +}; +return rval; +}; +for(var k in _512){ +var name=k+"Color"; +var _51c=m.concat([_513,this.Color,name],_512[k]); +this.Color[name]=m.bind.apply(null,_51c); +} +var _51d=function(){ +for(var i=0;i1){ +var src=MochiKit.DOM.getElement(arguments[0]); +var sig=arguments[1]; +var obj=arguments[2]; +var func=arguments[3]; +for(var i=_55f.length-1;i>=0;i--){ +var o=_55f[i]; +if(o.source===src&&o.signal===sig&&o.objOrFunc===obj&&o.funcOrStr===func){ +self._disconnect(o); +if(!self._lock){ +_55f.splice(i,1); +}else{ +self._dirty=true; +} +return true; +} +} +}else{ +var idx=m.findIdentical(_55f,_55d); +if(idx>=0){ +self._disconnect(_55d); +if(!self._lock){ +_55f.splice(idx,1); +}else{ +self._dirty=true; +} +return true; +} +} +return false; +},disconnectAllTo:function(_568,_569){ +var self=MochiKit.Signal; +var _56b=self._observers; +var _56c=self._disconnect; +var _56d=self._lock; +var _56e=self._dirty; +if(typeof (_569)==="undefined"){ +_569=null; +} +for(var i=_56b.length-1;i>=0;i--){ +var _570=_56b[i]; +if(_570.objOrFunc===_568&&(_569===null||_570.funcOrStr===_569)){ +_56c(_570); +if(_56d){ +_56e=true; +}else{ +_56b.splice(i,1); +} +} +} +self._dirty=_56e; +},disconnectAll:function(src,sig){ +src=MochiKit.DOM.getElement(src); +var m=MochiKit.Base; +var _574=m.flattenArguments(m.extend(null,arguments,1)); +var self=MochiKit.Signal; +var _576=self._disconnect; +var _577=self._observers; +var i,_579; +var _57a=self._lock; +var _57b=self._dirty; +if(_574.length===0){ +for(i=_577.length-1;i>=0;i--){ +_579=_577[i]; +if(_579.source===src){ +_576(_579); +if(!_57a){ +_577.splice(i,1); +}else{ +_57b=true; +} +} +} +}else{ +var sigs={}; +for(i=0;i<_574.length;i++){ +sigs[_574[i]]=true; +} +for(i=_577.length-1;i>=0;i--){ +_579=_577[i]; +if(_579.source===src&&_579.signal in sigs){ +_576(_579); +if(!_57a){ +_577.splice(i,1); +}else{ +_57b=true; +} +} +} +} +self._dirty=_57b; +},signal:function(src,sig){ +var self=MochiKit.Signal; +var _580=self._observers; +src=MochiKit.DOM.getElement(src); +var args=MochiKit.Base.extend(null,arguments,2); +var _582=[]; +self._lock=true; +for(var i=0;i<_580.length;i++){ +var _584=_580[i]; +if(_584.source===src&&_584.signal===sig){ +try{ +_584.listener.apply(src,args); +} +catch(e){ +_582.push(e); +} +} +} +self._lock=false; +if(self._dirty){ +self._dirty=false; +for(var i=_580.length-1;i>=0;i--){ +if(!_580[i].connected){ +_580.splice(i,1); +} +} +} +if(_582.length==1){ +throw _582[0]; +}else{ +if(_582.length>1){ +var e=new Error("Multiple errors thrown in handling 'sig', see errors property"); +e.errors=_582; +throw e; +} +} +}}); +MochiKit.Signal.EXPORT_OK=[]; +MochiKit.Signal.EXPORT=["connect","disconnect","signal","disconnectAll","disconnectAllTo"]; +MochiKit.Signal.__new__=function(win){ +var m=MochiKit.Base; +this._document=document; +this._window=win; +this._lock=false; +this._dirty=false; +try{ +this.connect(window,"onunload",this._unloadCache); +} +catch(e){ +} +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +m.nameFunctions(this); +}; +MochiKit.Signal.__new__(this); +if(MochiKit.__export__){ +connect=MochiKit.Signal.connect; +disconnect=MochiKit.Signal.disconnect; +disconnectAll=MochiKit.Signal.disconnectAll; +signal=MochiKit.Signal.signal; +} +MochiKit.Base._exportSymbols(this,MochiKit.Signal); +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.Position"); +dojo.require("MochiKit.Base"); +dojo.require("MochiKit.DOM"); +dojo.require("MochiKit.Style"); +} +if(typeof (JSAN)!="undefined"){ +JSAN.use("MochiKit.Base",[]); +JSAN.use("MochiKit.DOM",[]); +JSAN.use("MochiKit.Style",[]); +} +try{ +if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.Style)=="undefined"||typeof (MochiKit.DOM)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "MochiKit.Style depends on MochiKit.Base, MochiKit.DOM, and MochiKit.Style!"; +} +if(typeof (MochiKit.Position)=="undefined"){ +MochiKit.Position={}; +} +MochiKit.Position.NAME="MochiKit.Position"; +MochiKit.Position.VERSION="1.4"; +MochiKit.Position.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.Position.toString=function(){ +return this.__repr__(); +}; +MochiKit.Position.EXPORT_OK=[]; +MochiKit.Position.EXPORT=[]; +MochiKit.Base.update(MochiKit.Position,{includeScrollOffsets:false,prepare:function(){ +var _588=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0; +var _589=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0; +this.windowOffset=new MochiKit.Style.Coordinates(_588,_589); +},cumulativeOffset:function(_58a){ +var _58b=0; +var _58c=0; +do{ +_58b+=_58a.offsetTop||0; +_58c+=_58a.offsetLeft||0; +_58a=_58a.offsetParent; +}while(_58a); +return new MochiKit.Style.Coordinates(_58c,_58b); +},realOffset:function(_58d){ +var _58e=0; +var _58f=0; +do{ +_58e+=_58d.scrollTop||0; +_58f+=_58d.scrollLeft||0; +_58d=_58d.parentNode; +}while(_58d); +return new MochiKit.Style.Coordinates(_58f,_58e); +},within:function(_590,x,y){ +if(this.includeScrollOffsets){ +return this.withinIncludingScrolloffsets(_590,x,y); +} +this.xcomp=x; +this.ycomp=y; +this.offset=this.cumulativeOffset(_590); +if(_590.style.position=="fixed"){ +this.offset.x+=this.windowOffset.x; +this.offset.y+=this.windowOffset.y; +} +return (y>=this.offset.y&&y=this.offset.x&&x=this.offset.y&&this.ycomp=this.offset.x&&this.xcomp"+el.innerHTML+"
    "; +},_roundTopCorners:function(el,_5c2,_5c3){ +var _5c4=this._createCorner(_5c3); +for(var i=0;i=0;i--){ +_5c9.appendChild(this._createCornerSlice(_5c7,_5c8,i,"bottom")); +} +el.style.paddingBottom=0; +el.appendChild(_5c9); +},_createCorner:function(_5cb){ +var dom=MochiKit.DOM; +return dom.DIV({style:{backgroundColor:_5cb.toString()}}); +},_createCornerSlice:function(_5cd,_5ce,n,_5d0){ +var _5d1=MochiKit.DOM.SPAN(); +var _5d2=_5d1.style; +_5d2.backgroundColor=_5cd.toString(); +_5d2.display="block"; +_5d2.height="1px"; +_5d2.overflow="hidden"; +_5d2.fontSize="1px"; +var _5d3=this._borderColor(_5cd,_5ce); +if(this.options.border&&n===0){ +_5d2.borderTopStyle="solid"; +_5d2.borderTopWidth="1px"; +_5d2.borderLeftWidth="0px"; +_5d2.borderRightWidth="0px"; +_5d2.borderBottomWidth="0px"; +_5d2.height="0px"; +_5d2.borderColor=_5d3.toString(); +}else{ +if(_5d3){ +_5d2.borderColor=_5d3.toString(); +_5d2.borderStyle="solid"; +_5d2.borderWidth="0px 1px"; +} +} +if(!this.options.compact&&(n==(this.options.numSlices-1))){ +_5d2.height="2px"; +} +this._setMargin(_5d1,n,_5d0); +this._setBorder(_5d1,n,_5d0); +return _5d1; +},_setOptions:function(_5d4){ +this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false,__unstable__wrapElement:false}; +MochiKit.Base.update(this.options,_5d4); +this.options.numSlices=(this.options.compact?2:4); +},_whichSideTop:function(){ +var _5d5=this.options.corners; +if(this._hasString(_5d5,"all","top")){ +return ""; +} +var _5d6=(_5d5.indexOf("tl")!=-1); +var _5d7=(_5d5.indexOf("tr")!=-1); +if(_5d6&&_5d7){ +return ""; +} +if(_5d6){ +return "left"; +} +if(_5d7){ +return "right"; +} +return ""; +},_whichSideBottom:function(){ +var _5d8=this.options.corners; +if(this._hasString(_5d8,"all","bottom")){ +return ""; +} +var _5d9=(_5d8.indexOf("bl")!=-1); +var _5da=(_5d8.indexOf("br")!=-1); +if(_5d9&&_5da){ +return ""; +} +if(_5d9){ +return "left"; +} +if(_5da){ +return "right"; +} +return ""; +},_borderColor:function(_5db,_5dc){ +if(_5db=="transparent"){ +return _5dc; +}else{ +if(this.options.border){ +return this.options.border; +}else{ +if(this.options.blend){ +return _5dc.blendedColor(_5db); +} +} +} +return ""; +},_setMargin:function(el,n,_5df){ +var _5e0=this._marginSize(n)+"px"; +var _5e1=(_5df=="top"?this._whichSideTop():this._whichSideBottom()); +var _5e2=el.style; +if(_5e1=="left"){ +_5e2.marginLeft=_5e0; +_5e2.marginRight="0px"; +}else{ +if(_5e1=="right"){ +_5e2.marginRight=_5e0; +_5e2.marginLeft="0px"; +}else{ +_5e2.marginLeft=_5e0; +_5e2.marginRight=_5e0; +} +} +},_setBorder:function(el,n,_5e5){ +var _5e6=this._borderSize(n)+"px"; +var _5e7=(_5e5=="top"?this._whichSideTop():this._whichSideBottom()); +var _5e8=el.style; +if(_5e7=="left"){ +_5e8.borderLeftWidth=_5e6; +_5e8.borderRightWidth="0px"; +}else{ +if(_5e7=="right"){ +_5e8.borderRightWidth=_5e6; +_5e8.borderLeftWidth="0px"; +}else{ +_5e8.borderLeftWidth=_5e6; +_5e8.borderRightWidth=_5e6; +} +} +},_marginSize:function(n){ +if(this.isTransparent){ +return 0; +} +var o=this.options; +if(o.compact&&o.blend){ +var _5eb=[1,0]; +return _5eb[n]; +}else{ +if(o.compact){ +var _5ec=[2,1]; +return _5ec[n]; +}else{ +if(o.blend){ +var _5ed=[3,2,1,0]; +return _5ed[n]; +}else{ +var _5ee=[5,3,2,1]; +return _5ee[n]; +} +} +} +},_borderSize:function(n){ +var o=this.options; +var _5f1; +if(o.compact&&(o.blend||this.isTransparent)){ +return 1; +}else{ +if(o.compact){ +_5f1=[1,0]; +}else{ +if(o.blend){ +_5f1=[2,1,1,1]; +}else{ +if(o.border){ +_5f1=[0,2,0,0]; +}else{ +if(this.isTransparent){ +_5f1=[5,3,2,1]; +}else{ +return 0; +} +} +} +} +} +return _5f1[n]; +},_hasString:function(str){ +for(var i=1;i=(_61c||i)){ +_61c=i; +} +},this.effects); +_618=_61c||_618; +break; +case "break": +ma(function(e){ +e.finalize(); +},this.effects); +break; +} +_617.startOn+=_618; +_617.finishOn+=_618; +if(!_617.options.queue.limit||this.effects.length<_617.options.queue.limit){ +this.effects.push(_617); +} +if(!this.interval){ +this.interval=this.startLoop(MochiKit.Base.bind(this.loop,this),40); +} +},startLoop:function(func,_621){ +return setInterval(func,_621); +},remove:function(_622){ +this.effects=MochiKit.Base.filter(function(e){ +return e!=_622; +},this.effects); +if(!this.effects.length){ +this.stopLoop(this.interval); +this.interval=null; +} +},stopLoop:function(_624){ +clearInterval(_624); +},loop:function(){ +var _625=new Date().getTime(); +MochiKit.Base.map(function(_626){ +_626.loop(_625); +},this.effects); +}}); +MochiKit.Visual.Queues={instances:{},get:function(_627){ +if(typeof (_627)!="string"){ +return _627; +} +if(!this.instances[_627]){ +this.instances[_627]=new MochiKit.Visual.ScopedQueue(); +} +return this.instances[_627]; +}}; +MochiKit.Visual.Queue=MochiKit.Visual.Queues.get("global"); +MochiKit.Visual.DefaultOptions={transition:MochiKit.Visual.Transitions.sinoidal,duration:1,fps:25,sync:false,from:0,to:1,delay:0,queue:"parallel"}; +MochiKit.Visual.Base=function(){ +}; +MochiKit.Visual.Base.prototype={__class__:MochiKit.Visual.Base,start:function(_628){ +var v=MochiKit.Visual; +this.options=MochiKit.Base.setdefault(_628||{},v.DefaultOptions); +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){ +v.Queues.get(typeof (this.options.queue)=="string"?"global":this.options.queue.scope).add(this); +} +},loop:function(_62a){ +if(_62a>=this.startOn){ +if(_62a>=this.finishOn){ +return this.finalize(); +} +var pos=(_62a-this.startOn)/(this.finishOn-this.startOn); +var _62c=Math.round(pos*this.options.fps*this.options.duration); +if(_62c>this.currentFrame){ +this.render(pos); +this.currentFrame=_62c; +} +} +},render:function(pos){ +if(this.state=="idle"){ +this.state="running"; +this.event("beforeSetup"); +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.event("beforeUpdate"); +this.update(pos); +this.event("afterUpdate"); +} +},cancel:function(){ +if(!this.options.sync){ +MochiKit.Visual.Queues.get(typeof (this.options.queue)=="string"?"global":this.options.queue.scope).remove(this); +} +this.state="finished"; +},finalize:function(){ +this.render(1); +this.cancel(); +this.event("beforeFinish"); +this.finish(); +this.event("afterFinish"); +},setup:function(){ +},finish:function(){ +},update:function(_62e){ +},event:function(_62f){ +if(this.options[_62f+"Internal"]){ +this.options[_62f+"Internal"](this); +} +if(this.options[_62f]){ +this.options[_62f](this); +} +},repr:function(){ +return "["+this.__class__.NAME+", options:"+MochiKit.Base.repr(this.options)+"]"; +}}; +MochiKit.Visual.Parallel=function(_630,_631){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_630,_631); +} +this.__init__(_630,_631); +}; +MochiKit.Visual.Parallel.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Parallel.prototype,{__class__:MochiKit.Visual.Parallel,__init__:function(_633,_634){ +this.effects=_633||[]; +this.start(_634); +},update:function(_635){ +MochiKit.Base.map(function(_636){ +_636.render(_635); +},this.effects); +},finish:function(){ +MochiKit.Base.map(function(_637){ +_637.finalize(); +},this.effects); +}}); +MochiKit.Visual.Opacity=function(_638,_639){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_638,_639); +} +this.__init__(_638,_639); +}; +MochiKit.Visual.Opacity.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Opacity.prototype,{__class__:MochiKit.Visual.Opacity,__init__:function(_63b,_63c){ +var b=MochiKit.Base; +var s=MochiKit.Style; +this.element=MochiKit.DOM.getElement(_63b); +if(this.element.currentStyle&&(!this.element.currentStyle.hasLayout)){ +s.setStyle(this.element,{zoom:1}); +} +_63c=b.update({from:s.getStyle(this.element,"opacity")||0,to:1},_63c||{}); +this.start(_63c); +},update:function(_63f){ +MochiKit.Style.setStyle(this.element,{"opacity":_63f}); +}}); +MochiKit.Visual.Move=function(_640,_641){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_640,_641); +} +this.__init__(_640,_641); +}; +MochiKit.Visual.Move.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Move.prototype,{__class__:MochiKit.Visual.Move,__init__:function(_643,_644){ +this.element=MochiKit.DOM.getElement(_643); +_644=MochiKit.Base.update({x:0,y:0,mode:"relative"},_644||{}); +this.start(_644); +},setup:function(){ +MochiKit.DOM.makePositioned(this.element); +var s=this.element.style; +var _646=s.visibility; +var _647=s.display; +if(_647=="none"){ +s.visibility="hidden"; +s.display=""; +} +this.originalLeft=parseFloat(MochiKit.Style.getStyle(this.element,"left")||"0"); +this.originalTop=parseFloat(MochiKit.Style.getStyle(this.element,"top")||"0"); +if(this.options.mode=="absolute"){ +this.options.x-=this.originalLeft; +this.options.y-=this.originalTop; +} +if(_647=="none"){ +s.visibility=_646; +s.display=_647; +} +},update:function(_648){ +MochiKit.Style.setStyle(this.element,{left:Math.round(this.options.x*_648+this.originalLeft)+"px",top:Math.round(this.options.y*_648+this.originalTop)+"px"}); +}}); +MochiKit.Visual.Scale=function(_649,_64a,_64b){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_649,_64a,_64b); +} +this.__init__(_649,_64a,_64b); +}; +MochiKit.Visual.Scale.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Scale.prototype,{__class__:MochiKit.Visual.Scale,__init__:function(_64d,_64e,_64f){ +this.element=MochiKit.DOM.getElement(_64d); +_64f=MochiKit.Base.update({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:_64e},_64f||{}); +this.start(_64f); +},setup:function(){ +this.restoreAfterFinish=this.options.restoreAfterFinish||false; +this.elementPositioning=MochiKit.Style.getStyle(this.element,"position"); +var ma=MochiKit.Base.map; +var b=MochiKit.Base.bind; +this.originalStyle={}; +ma(b(function(k){ +this.originalStyle[k]=this.element.style[k]; +},this),["top","left","width","height","fontSize"]); +this.originalTop=this.element.offsetTop; +this.originalLeft=this.element.offsetLeft; +var _653=MochiKit.Style.getStyle(this.element,"font-size")||"100%"; +ma(b(function(_654){ +if(_653.indexOf(_654)>0){ +this.fontSize=parseFloat(_653); +this.fontSizeType=_654; +} +},this),["em","px","%"]); +this.factor=(this.options.scaleTo-this.options.scaleFrom)/100; +if(/^content/.test(this.options.scaleMode)){ +this.dims=[this.element.scrollHeight,this.element.scrollWidth]; +}else{ +if(this.options.scaleMode=="box"){ +this.dims=[this.element.offsetHeight,this.element.offsetWidth]; +}else{ +this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth]; +} +} +},update:function(_655){ +var _656=(this.options.scaleFrom/100)+(this.factor*_655); +if(this.options.scaleContent&&this.fontSize){ +MochiKit.Style.setStyle(this.element,{fontSize:this.fontSize*_656+this.fontSizeType}); +} +this.setDimensions(this.dims[0]*_656,this.dims[1]*_656); +},finish:function(){ +if(this.restoreAfterFinish){ +MochiKit.Style.setStyle(this.element,this.originalStyle); +} +},setDimensions:function(_657,_658){ +var d={}; +var r=Math.round; +if(/MSIE/.test(navigator.userAgent)){ +r=Math.ceil; +} +if(this.options.scaleX){ +d.width=r(_658)+"px"; +} +if(this.options.scaleY){ +d.height=r(_657)+"px"; +} +if(this.options.scaleFromCenter){ +var topd=(_657-this.dims[0])/2; +var _65c=(_658-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-_65c+"px"; +} +}else{ +if(this.options.scaleY){ +d.top=-topd+"px"; +} +if(this.options.scaleX){ +d.left=-_65c+"px"; +} +} +} +MochiKit.Style.setStyle(this.element,d); +}}); +MochiKit.Visual.Highlight=function(_65d,_65e){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_65d,_65e); +} +this.__init__(_65d,_65e); +}; +MochiKit.Visual.Highlight.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Highlight.prototype,{__class__:MochiKit.Visual.Highlight,__init__:function(_660,_661){ +this.element=MochiKit.DOM.getElement(_660); +_661=MochiKit.Base.update({startcolor:"#ffff99"},_661||{}); +this.start(_661); +},setup:function(){ +var b=MochiKit.Base; +var s=MochiKit.Style; +if(s.getStyle(this.element,"display")=="none"){ +this.cancel(); +return; +} +this.oldStyle={backgroundImage:s.getStyle(this.element,"background-image")}; +s.setStyle(this.element,{backgroundImage:"none"}); +if(!this.options.endcolor){ +this.options.endcolor=MochiKit.Color.Color.fromBackground(this.element).toHexString(); +} +if(b.isUndefinedOrNull(this.options.restorecolor)){ +this.options.restorecolor=s.getStyle(this.element,"background-color"); +} +this._base=b.map(b.bind(function(i){ +return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16); +},this),[0,1,2]); +this._delta=b.map(b.bind(function(i){ +return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]; +},this),[0,1,2]); +},update:function(_666){ +var m="#"; +MochiKit.Base.map(MochiKit.Base.bind(function(i){ +m+=MochiKit.Color.toColorPart(Math.round(this._base[i]+this._delta[i]*_666)); +},this),[0,1,2]); +MochiKit.Style.setStyle(this.element,{backgroundColor:m}); +},finish:function(){ +MochiKit.Style.setStyle(this.element,MochiKit.Base.update(this.oldStyle,{backgroundColor:this.options.restorecolor})); +}}); +MochiKit.Visual.ScrollTo=function(_669,_66a){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_669,_66a); +} +this.__init__(_669,_66a); +}; +MochiKit.Visual.ScrollTo.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.ScrollTo.prototype,{__class__:MochiKit.Visual.ScrollTo,__init__:function(_66c,_66d){ +this.element=MochiKit.DOM.getElement(_66c); +this.start(_66d||{}); +},setup:function(){ +var p=MochiKit.Position; +p.prepare(); +var _66f=p.cumulativeOffset(this.element); +if(this.options.offset){ +_66f.y+=this.options.offset; +} +var max; +if(window.innerHeight){ +max=window.innerHeight-window.height; +}else{ +if(document.documentElement&&document.documentElement.clientHeight){ +max=document.documentElement.clientHeight-document.body.scrollHeight; +}else{ +if(document.body){ +max=document.body.clientHeight-document.body.scrollHeight; +} +} +} +this.scrollStart=p.windowOffset.y; +this.delta=(_66f.y>max?max:_66f.y)-this.scrollStart; +},update:function(_671){ +var p=MochiKit.Position; +p.prepare(); +window.scrollTo(p.windowOffset.x,this.scrollStart+(_671*this.delta)); +}}); +MochiKit.Visual.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; +MochiKit.Visual.Morph=function(_673,_674){ +var cls=arguments.callee; +if(!(this instanceof cls)){ +return new cls(_673,_674); +} +this.__init__(_673,_674); +}; +MochiKit.Visual.Morph.prototype=new MochiKit.Visual.Base(); +MochiKit.Base.update(MochiKit.Visual.Morph.prototype,{__class__:MochiKit.Visual.Morph,__init__:function(_676,_677){ +this.element=MochiKit.DOM.getElement(_676); +this.start(_677||{}); +},setup:function(){ +var b=MochiKit.Base; +var _679=this.options.style; +this.styleStart={}; +this.styleEnd={}; +this.units={}; +var _67a,unit; +for(var s in _679){ +_67a=_679[s]; +s=b.camelize(s); +if(MochiKit.Visual.CSS_LENGTH.test(_67a)){ +var _67d=_67a.match(/^([\+\-]?[0-9\.]+)(.*)$/); +_67a=parseFloat(_67d[1]); +unit=(_67d.length==3)?_67d[2]:null; +this.styleEnd[s]=_67a; +this.units[s]=unit; +_67a=MochiKit.Style.getStyle(this.element,s); +_67d=_67a.match(/^([\+\-]?[0-9\.]+)(.*)$/); +_67a=parseFloat(_67d[1]); +this.styleStart[s]=_67a; +}else{ +var c=MochiKit.Color.Color; +_67a=c.fromString(_67a); +if(_67a){ +this.units[s]="color"; +this.styleEnd[s]=_67a.toHexString(); +_67a=MochiKit.Style.getStyle(this.element,s); +this.styleStart[s]=c.fromString(_67a).toHexString(); +this.styleStart[s]=b.map(b.bind(function(i){ +return parseInt(this.styleStart[s].slice(i*2+1,i*2+3),16); +},this),[0,1,2]); +this.styleEnd[s]=b.map(b.bind(function(i){ +return parseInt(this.styleEnd[s].slice(i*2+1,i*2+3),16); +},this),[0,1,2]); +} +} +} +},update:function(_681){ +var _682; +for(var s in this.styleStart){ +if(this.units[s]=="color"){ +var m="#"; +var _685=this.styleStart[s]; +var end=this.styleEnd[s]; +MochiKit.Base.map(MochiKit.Base.bind(function(i){ +m+=MochiKit.Color.toColorPart(Math.round(_685[i]+(end[i]-_685[i])*_681)); +},this),[0,1,2]); +this.element.style[s]=m; +}else{ +_682=this.styleStart[s]+Math.round((this.styleEnd[s]-this.styleStart[s])*_681*1000)/1000+this.units[s]; +this.element.style[s]=_682; +} +} +}}); +MochiKit.Visual.fade=function(_688,_689){ +var s=MochiKit.Style; +var _68b=s.getStyle(_688,"opacity"); +_689=MochiKit.Base.update({from:s.getStyle(_688,"opacity")||1,to:0,afterFinishInternal:function(_68c){ +if(_68c.options.to!==0){ +return; +} +s.hideElement(_68c.element); +s.setStyle(_68c.element,{"opacity":_68b}); +}},_689||{}); +return new MochiKit.Visual.Opacity(_688,_689); +}; +MochiKit.Visual.appear=function(_68d,_68e){ +var s=MochiKit.Style; +var v=MochiKit.Visual; +_68e=MochiKit.Base.update({from:(s.getStyle(_68d,"display")=="none"?0:s.getStyle(_68d,"opacity")||0),to:1,afterFinishInternal:function(_691){ +v.forceRerendering(_691.element); +},beforeSetupInternal:function(_692){ +s.setStyle(_692.element,{"opacity":_692.options.from}); +s.showElement(_692.element); +}},_68e||{}); +return new v.Opacity(_68d,_68e); +}; +MochiKit.Visual.puff=function(_693,_694){ +var s=MochiKit.Style; +var v=MochiKit.Visual; +_693=MochiKit.DOM.getElement(_693); +var _697={position:s.getStyle(_693,"position"),top:_693.style.top,left:_693.style.left,width:_693.style.width,height:_693.style.height,opacity:s.getStyle(_693,"opacity")}; +_694=MochiKit.Base.update({beforeSetupInternal:function(_698){ +MochiKit.Position.absolutize(_698.effects[0].element); +},afterFinishInternal:function(_699){ +s.hideElement(_699.effects[0].element); +s.setStyle(_699.effects[0].element,_697); +},scaleContent:true,scaleFromCenter:true},_694||{}); +return new v.Parallel([new v.Scale(_693,200,{sync:true,scaleFromCenter:_694.scaleFromCenter,scaleContent:_694.scaleContent,restoreAfterFinish:true}),new v.Opacity(_693,{sync:true,to:0})],_694); +}; +MochiKit.Visual.blindUp=function(_69a,_69b){ +var d=MochiKit.DOM; +_69a=d.getElement(_69a); +var _69d=d.makeClipping(_69a); +_69b=MochiKit.Base.update({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(_69e){ +MochiKit.Style.hideElement(_69e.element); +d.undoClipping(_69e.element,_69d); +}},_69b||{}); +return new MochiKit.Visual.Scale(_69a,0,_69b); +}; +MochiKit.Visual.blindDown=function(_69f,_6a0){ +var d=MochiKit.DOM; +var s=MochiKit.Style; +_69f=d.getElement(_69f); +var _6a3=s.getElementDimensions(_69f); +var _6a4; +_6a0=MochiKit.Base.update({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_6a3.h,originalWidth:_6a3.w},restoreAfterFinish:true,afterSetupInternal:function(_6a5){ +_6a4=d.makeClipping(_6a5.element); +s.setStyle(_6a5.element,{height:"0px"}); +s.showElement(_6a5.element); +},afterFinishInternal:function(_6a6){ +d.undoClipping(_6a6.element,_6a4); +}},_6a0||{}); +return new MochiKit.Visual.Scale(_69f,100,_6a0); +}; +MochiKit.Visual.switchOff=function(_6a7,_6a8){ +var d=MochiKit.DOM; +_6a7=d.getElement(_6a7); +var _6aa=MochiKit.Style.getStyle(_6a7,"opacity"); +var _6ab; +_6a8=MochiKit.Base.update({duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetupInternal:function(_6ac){ +d.makePositioned(_6ac.element); +_6ab=d.makeClipping(_6ac.element); +},afterFinishInternal:function(_6ad){ +MochiKit.Style.hideElement(_6ad.element); +d.undoClipping(_6ad.element,_6ab); +d.undoPositioned(_6ad.element); +MochiKit.Style.setStyle(_6ad.element,{"opacity":_6aa}); +}},_6a8||{}); +var v=MochiKit.Visual; +return new v.appear(_6a7,{duration:0.4,from:0,transition:v.Transitions.flicker,afterFinishInternal:function(_6af){ +new v.Scale(_6af.element,1,_6a8); +}}); +}; +MochiKit.Visual.dropOut=function(_6b0,_6b1){ +var d=MochiKit.DOM; +var s=MochiKit.Style; +_6b0=d.getElement(_6b0); +var _6b4={top:s.getStyle(_6b0,"top"),left:s.getStyle(_6b0,"left"),opacity:s.getStyle(_6b0,"opacity")}; +_6b1=MochiKit.Base.update({duration:0.5,distance:100,beforeSetupInternal:function(_6b5){ +d.makePositioned(_6b5.effects[0].element); +},afterFinishInternal:function(_6b6){ +s.hideElement(_6b6.effects[0].element); +d.undoPositioned(_6b6.effects[0].element); +s.setStyle(_6b6.effects[0].element,_6b4); +}},_6b1||{}); +var v=MochiKit.Visual; +return new v.Parallel([new v.Move(_6b0,{x:0,y:_6b1.distance,sync:true}),new v.Opacity(_6b0,{sync:true,to:0})],_6b1); +}; +MochiKit.Visual.shake=function(_6b8,_6b9){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var s=MochiKit.Style; +_6b8=d.getElement(_6b8); +_6b9=MochiKit.Base.update({x:-20,y:0,duration:0.05,afterFinishInternal:function(_6bd){ +d.undoPositioned(_6bd.element); +s.setStyle(_6bd.element,_6be); +}},_6b9||{}); +var _6be={top:s.getStyle(_6b8,"top"),left:s.getStyle(_6b8,"left")}; +return new v.Move(_6b8,{x:20,y:0,duration:0.05,afterFinishInternal:function(_6bf){ +new v.Move(_6bf.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(_6c0){ +new v.Move(_6c0.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(_6c1){ +new v.Move(_6c1.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(_6c2){ +new v.Move(_6c2.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(_6c3){ +new v.Move(_6c3.element,_6b9); +}}); +}}); +}}); +}}); +}}); +}; +MochiKit.Visual.slideDown=function(_6c4,_6c5){ +var d=MochiKit.DOM; +var b=MochiKit.Base; +var s=MochiKit.Style; +_6c4=d.getElement(_6c4); +if(!_6c4.firstChild){ +throw "MochiKit.Visual.slideDown must be used on a element with a child"; +} +d.removeEmptyTextNodes(_6c4); +var _6c9=s.getStyle(_6c4.firstChild,"bottom")||0; +var _6ca=s.getElementDimensions(_6c4); +var _6cb; +_6c5=b.update({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_6ca.h,originalWidth:_6ca.w},restoreAfterFinish:true,afterSetupInternal:function(_6cc){ +d.makePositioned(_6cc.element); +d.makePositioned(_6cc.element.firstChild); +if(/Opera/.test(navigator.userAgent)){ +s.setStyle(_6cc.element,{top:""}); +} +_6cb=d.makeClipping(_6cc.element); +s.setStyle(_6cc.element,{height:"0px"}); +s.showElement(_6cc.element); +},afterUpdateInternal:function(_6cd){ +s.setStyle(_6cd.element.firstChild,{bottom:(_6cd.dims[0]-_6cd.element.clientHeight)+"px"}); +},afterFinishInternal:function(_6ce){ +d.undoClipping(_6ce.element,_6cb); +if(/MSIE/.test(navigator.userAgent)){ +d.undoPositioned(_6ce.element); +d.undoPositioned(_6ce.element.firstChild); +}else{ +d.undoPositioned(_6ce.element.firstChild); +d.undoPositioned(_6ce.element); +} +s.setStyle(_6ce.element.firstChild,{bottom:_6c9}); +}},_6c5||{}); +return new MochiKit.Visual.Scale(_6c4,100,_6c5); +}; +MochiKit.Visual.slideUp=function(_6cf,_6d0){ +var d=MochiKit.DOM; +var b=MochiKit.Base; +var s=MochiKit.Style; +_6cf=d.getElement(_6cf); +if(!_6cf.firstChild){ +throw "MochiKit.Visual.slideUp must be used on a element with a child"; +} +d.removeEmptyTextNodes(_6cf); +var _6d4=s.getStyle(_6cf.firstChild,"bottom"); +var _6d5; +_6d0=b.update({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,restoreAfterFinish:true,beforeStartInternal:function(_6d6){ +d.makePositioned(_6d6.element); +d.makePositioned(_6d6.element.firstChild); +if(/Opera/.test(navigator.userAgent)){ +s.setStyle(_6d6.element,{top:""}); +} +_6d5=d.makeClipping(_6d6.element); +s.showElement(_6d6.element); +},afterUpdateInternal:function(_6d7){ +s.setStyle(_6d7.element.firstChild,{bottom:(_6d7.dims[0]-_6d7.element.clientHeight)+"px"}); +},afterFinishInternal:function(_6d8){ +s.hideElement(_6d8.element); +d.undoClipping(_6d8.element,_6d5); +d.undoPositioned(_6d8.element.firstChild); +d.undoPositioned(_6d8.element); +s.setStyle(_6d8.element.firstChild,{bottom:_6d4}); +}},_6d0||{}); +return new MochiKit.Visual.Scale(_6cf,0,_6d0); +}; +MochiKit.Visual.squish=function(_6d9,_6da){ +var d=MochiKit.DOM; +var b=MochiKit.Base; +var _6dd; +_6da=b.update({restoreAfterFinish:true,beforeSetupInternal:function(_6de){ +_6dd=d.makeClipping(_6de.element); +},afterFinishInternal:function(_6df){ +MochiKit.Style.hideElement(_6df.element); +d.undoClipping(_6df.element,_6dd); +}},_6da||{}); +return new MochiKit.Visual.Scale(_6d9,/Opera/.test(navigator.userAgent)?1:0,_6da); +}; +MochiKit.Visual.grow=function(_6e0,_6e1){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var s=MochiKit.Style; +_6e0=d.getElement(_6e0); +_6e1=MochiKit.Base.update({direction:"center",moveTransition:v.Transitions.sinoidal,scaleTransition:v.Transitions.sinoidal,opacityTransition:v.Transitions.full,scaleContent:true,scaleFromCenter:false},_6e1||{}); +var _6e5={top:_6e0.style.top,left:_6e0.style.left,height:_6e0.style.height,width:_6e0.style.width,opacity:s.getStyle(_6e0,"opacity")}; +var dims=s.getElementDimensions(_6e0); +var _6e7,_6e8; +var _6e9,_6ea; +switch(_6e1.direction){ +case "top-left": +_6e7=_6e8=_6e9=_6ea=0; +break; +case "top-right": +_6e7=dims.w; +_6e8=_6ea=0; +_6e9=-dims.w; +break; +case "bottom-left": +_6e7=_6e9=0; +_6e8=dims.h; +_6ea=-dims.h; +break; +case "bottom-right": +_6e7=dims.w; +_6e8=dims.h; +_6e9=-dims.w; +_6ea=-dims.h; +break; +case "center": +_6e7=dims.w/2; +_6e8=dims.h/2; +_6e9=-dims.w/2; +_6ea=-dims.h/2; +break; +} +var _6eb=MochiKit.Base.update({beforeSetupInternal:function(_6ec){ +s.setStyle(_6ec.effects[0].element,{height:"0px"}); +s.showElement(_6ec.effects[0].element); +},afterFinishInternal:function(_6ed){ +d.undoClipping(_6ed.effects[0].element); +d.undoPositioned(_6ed.effects[0].element); +s.setStyle(_6ed.effects[0].element,_6e5); +}},_6e1||{}); +return new v.Move(_6e0,{x:_6e7,y:_6e8,duration:0.01,beforeSetupInternal:function(_6ee){ +s.hideElement(_6ee.element); +d.makeClipping(_6ee.element); +d.makePositioned(_6ee.element); +},afterFinishInternal:function(_6ef){ +new v.Parallel([new v.Opacity(_6ef.element,{sync:true,to:1,from:0,transition:_6e1.opacityTransition}),new v.Move(_6ef.element,{x:_6e9,y:_6ea,sync:true,transition:_6e1.moveTransition}),new v.Scale(_6ef.element,100,{scaleMode:{originalHeight:dims.h,originalWidth:dims.w},sync:true,scaleFrom:/Opera/.test(navigator.userAgent)?1:0,transition:_6e1.scaleTransition,scaleContent:_6e1.scaleContent,scaleFromCenter:_6e1.scaleFromCenter,restoreAfterFinish:true})],_6eb); +}}); +}; +MochiKit.Visual.shrink=function(_6f0,_6f1){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var s=MochiKit.Style; +_6f0=d.getElement(_6f0); +_6f1=MochiKit.Base.update({direction:"center",moveTransition:v.Transitions.sinoidal,scaleTransition:v.Transitions.sinoidal,opacityTransition:v.Transitions.none,scaleContent:true,scaleFromCenter:false},_6f1||{}); +var _6f5={top:_6f0.style.top,left:_6f0.style.left,height:_6f0.style.height,width:_6f0.style.width,opacity:s.getStyle(_6f0,"opacity")}; +var dims=s.getElementDimensions(_6f0); +var _6f7,_6f8; +switch(_6f1.direction){ +case "top-left": +_6f7=_6f8=0; +break; +case "top-right": +_6f7=dims.w; +_6f8=0; +break; +case "bottom-left": +_6f7=0; +_6f8=dims.h; +break; +case "bottom-right": +_6f7=dims.w; +_6f8=dims.h; +break; +case "center": +_6f7=dims.w/2; +_6f8=dims.h/2; +break; +} +var _6f9; +var _6fa=MochiKit.Base.update({beforeStartInternal:function(_6fb){ +_6f9=d.makePositioned(_6fb.effects[0].element); +d.makeClipping(_6fb.effects[0].element); +},afterFinishInternal:function(_6fc){ +s.hideElement(_6fc.effects[0].element); +d.undoClipping(_6fc.effects[0].element,_6f9); +d.undoPositioned(_6fc.effects[0].element); +s.setStyle(_6fc.effects[0].element,_6f5); +}},_6f1||{}); +return new v.Parallel([new v.Opacity(_6f0,{sync:true,to:0,from:1,transition:_6f1.opacityTransition}),new v.Scale(_6f0,/Opera/.test(navigator.userAgent)?1:0,{sync:true,transition:_6f1.scaleTransition,scaleContent:_6f1.scaleContent,scaleFromCenter:_6f1.scaleFromCenter,restoreAfterFinish:true}),new v.Move(_6f0,{x:_6f7,y:_6f8,sync:true,transition:_6f1.moveTransition})],_6fa); +}; +MochiKit.Visual.pulsate=function(_6fd,_6fe){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var b=MochiKit.Base; +var _702=MochiKit.Style.getStyle(_6fd,"opacity"); +_6fe=b.update({duration:3,from:0,afterFinishInternal:function(_703){ +MochiKit.Style.setStyle(_703.element,{"opacity":_702}); +}},_6fe||{}); +var _704=_6fe.transition||v.Transitions.sinoidal; +var _705=b.bind(function(pos){ +return _704(1-v.Transitions.pulse(pos,_6fe.pulses)); +},_704); +b.bind(_705,_704); +return new v.Opacity(_6fd,b.update({transition:_705},_6fe)); +}; +MochiKit.Visual.fold=function(_707,_708){ +var d=MochiKit.DOM; +var v=MochiKit.Visual; +var s=MochiKit.Style; +_707=d.getElement(_707); +var _70c={top:_707.style.top,left:_707.style.left,width:_707.style.width,height:_707.style.height}; +var _70d=d.makeClipping(_707); +_708=MochiKit.Base.update({scaleContent:false,scaleX:false,afterFinishInternal:function(_70e){ +new v.Scale(_707,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(_70f){ +s.hideElement(_70f.element); +d.undoClipping(_70f.element,_70d); +s.setStyle(_70f.element,_70c); +}}); +}},_708||{}); +return new v.Scale(_707,5,_708); +}; +MochiKit.Visual.Color=MochiKit.Color.Color; +MochiKit.Visual.getElementsComputedStyle=MochiKit.DOM.computedStyle; +MochiKit.Visual.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +MochiKit.Visual.EXPORT=["roundElement","roundClass","tagifyText","multiple","toggle","Parallel","Opacity","Move","Scale","Highlight","ScrollTo","Morph","fade","appear","puff","blindUp","blindDown","switchOff","dropOut","shake","slideDown","slideUp","squish","grow","shrink","pulsate","fold"]; +MochiKit.Visual.EXPORT_OK=["Base","PAIRS"]; +MochiKit.Visual.__new__(); +MochiKit.Base._exportSymbols(this,MochiKit.Visual); +if(typeof (MochiKit)=="undefined"){ +MochiKit={}; +} +if(typeof (MochiKit.MochiKit)=="undefined"){ +MochiKit.MochiKit={}; +} +MochiKit.MochiKit.NAME="MochiKit.MochiKit"; +MochiKit.MochiKit.VERSION="1.4"; +MochiKit.MochiKit.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +MochiKit.MochiKit.toString=function(){ +return this.__repr__(); +}; +MochiKit.MochiKit.SUBMODULES=["Base","Iter","Logging","DateTime","Format","Async","DOM","Selector","Style","LoggingPane","Color","Signal","Position","Visual"]; +if(typeof (JSAN)!="undefined"||typeof (dojo)!="undefined"){ +if(typeof (dojo)!="undefined"){ +dojo.provide("MochiKit.MochiKit"); +dojo.require("MochiKit.*"); +} +if(typeof (JSAN)!="undefined"){ +(function(lst){ +for(var i=0;i"); +} +} +})(); +} + + diff --git a/mochikit_v14/packed/MochiKit/__package__.js b/mochikit_v14/packed/MochiKit/__package__.js new file mode 100644 index 0000000..2f5be0d --- /dev/null +++ b/mochikit_v14/packed/MochiKit/__package__.js @@ -0,0 +1,2 @@ +dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]}); +dojo.hostenv.moduleLoaded("MochiKit.*"); diff --git a/mochikit_v14/scripts/build.py b/mochikit_v14/scripts/build.py new file mode 100755 index 0000000..c9c5c91 --- /dev/null +++ b/mochikit_v14/scripts/build.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python +execfile('scripts/make_docs.py') +execfile('scripts/pack.py') +import os +import sys +import glob +import zipfile +import re +def json_encode(o, indent=0): + if isinstance(o, dict): + if len(o) == 0: + yield '{}' + else: + yield '{\n' + first = True + for key, value in o.iteritems(): + if first: + first = False + else: + yield ',\n' + yield ' ' * (indent + 4) + assert isinstance(key, (basestring, float, int, long)) + for chunk in json_encode(key): + yield chunk + yield ': ' + for chunk in json_encode(value, indent + 4): + yield chunk + yield '\n' + (' ' * indent) + '}' + elif isinstance(o, list): + if len(o) == 0: + yield '[]' + else: + yield '[\n' + first = True + for value in o: + if first: + first = False + else: + yield ',\n' + yield ' ' * (indent + 4) + for chunk in json_encode(value, indent + 4): + yield chunk + yield '\n' + (' ' * indent) + ']' + elif isinstance(o, basestring): + yield '"' + o.replace('\\', '\\\\').replace('"', '\\"') + '"' + elif isinstance(o, (float, int, long)): + yield str(o) + else: + raise NotImplementedError +VERSION = re.search( + r"""(?mxs)MochiKit.MochiKit.VERSION\s*=\s*['"]([^'"]+)""", + file('MochiKit/MochiKit.js').read() +).group(1) +META = dict( + name='MochiKit', + author=['Bob Ippolito '], + abstract='Python-inspired JavaScript kit', + license='mit', + version=VERSION, + build_requires={'Test.Simple': '0.11'}, + recommends={'JSAN': '0.10'}, + provides={}, + generated_by="MochiKit's build script", +) +FILES = glob.glob('lib/MochiKit/*.js') +for fn in FILES: + modname = os.path.splitext(os.path.basename(fn))[0] + META['provides'][modname] = dict(file=fn, version=VERSION) +if not os.path.exists('dist'): + os.makedirs('dist') + +pkg = '%(name)s-%(version)s' % META +z = zipfile.ZipFile( + os.path.join('dist', pkg) + '.zip', + 'w', + zipfile.ZIP_DEFLATED +) +MANIFEST = ['Changes', 'META.json', 'MANIFEST\t\t\tThis list of files'] +z.writestr(os.path.join(pkg, 'META.json'), ''.join(json_encode(META))) +z.write( + os.path.join('doc', 'rst', 'MochiKit', 'VersionHistory.rst'), + os.path.join(pkg, 'Changes') +) + +IGNOREDIRS = ['.svn', 'dist', 'scripts'] +src = os.path.join('.', '') +dst = os.path.join(pkg, '') + +for root, dirs, files in os.walk(src): + for ex in IGNOREDIRS: + if ex in dirs: + dirs.remove(ex) + for fn in files: + if fn.startswith('.'): + continue + fn = os.path.join(root, fn) + mfn = fn[len(src):] + MANIFEST.append(mfn) + if mfn.startswith('MochiKit/'): + mfn = 'lib/' + mfn + dstfn = os.path.join(dst, mfn) + if os.path.splitext(fn)[1] == '.html': + s = file(fn).read() + s = s.replace('/MochiKit/', '/lib/MochiKit/') + s = s.replace( + "JSAN.addRepository('..');", + 'JSAN.addRepository("../lib");', + ) + z.writestr(dstfn, s) + else: + z.write(fn, dstfn) + +z.writestr(os.path.join(pkg, 'MANIFEST'), '\n'.join(MANIFEST + [''])) + +z.close() diff --git a/mochikit_v14/scripts/custom_rhino.jar b/mochikit_v14/scripts/custom_rhino.jar new file mode 100755 index 0000000000000000000000000000000000000000..21777b9f9e82d1e002f4042f9a19f49d798a749b GIT binary patch literal 715901 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

    ;Oqo?aG=Njix=}hv85&?-rKoDB}2ITmXPGk_|!S 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�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�nGW$78O9A-1BB9lcv zM!CpGdxQeJZ<3SBTUyDIMssn?(h?CH)yYeAR?R1F%h!uv$=8}o0whSv2X7p9$o^IT zhF-)77ct-Aev*K~U(>aN3b-MaXjBu@zzg;{O2k@0DW>oj(NH@Pn)aTg&MjN{W`q6B5HDE-Ow+fCuLVU-j;l}TH zNrj;hZ|@!&=9vCOFHFZ{W+k*SKtz`ScKA=EIkn+5YS*SMkXZ(AXm6aa@E%C5mru7F zc6OVn!@alD;Z}p!t912+d@bWJd(E{Z-td9#gq(bOxYT$cOGmZRA$*L|-tbPR&tY8H zZHz>nT~H@!Gq9tt=!Ch>8cq&rA}*o7TvVwNuFqt%^#r{k=pac#M{7$3oGr(?_jWV| z`puTwH^HeX-BieM_T{d&@dv81&j(=^U5U(sMQ6j=9L0v;Sp(kygvY}qZ>x~}19Nh3 zA=9{?E_5V|-*owpr!8^~lGdk(f8-ph%3X{g|VPOP7b-s-Tlw5 zCD1oHA;>o7ZjtCC(j+6qdq7-@;z1p+jmq6bdM=S`!&h<-q2)LA`f228oOR3})^$ZP zv-s!sb&#u^BUy*ETzyuTme?KSLK1mFgk^8UnBcX;sB$`DvO2RZq&i&)>Vz;qtQX

    xU@%jio;^JIB=3u=){oIfvM(CvAs! zat}FgVahlrC+$fqUwJ(C3ZGHI)_VP~kF!@i2pr!K3zO?~s}?{~bcm)uZqfP3tm)36 z!=0o=P&YY;d(){s62FzHZ~1h7y;&*b0(9v!d>q^;ddZuHW7;K41{NA)@5mOpqv2+- zTt6+sj)Qo6a(;i}Iu1w6ArIr_n1o&6Dhn$?c}t-4bBx5b!vl4?`rORYAR3q{|BI3T z9B#?O{3$Ly4UttVU7yn4^kAu4Vl*fX)16wHzAY6WoJz%4%)dMx2-L)ZTR?33ediXb z55WrA-f}g>Xo!4Rj@p-z1K||=FMnru8P5_eC!O{+-w9-iAty04lR4X+dsnda2+%W( z);lX*r;Ah0TZHQ>t~O66A0wic7{wFyIDrvE{r%IOKI zRoSe!k-Vd7;h1zl!D)%53PArSEet)kR@zyLutc=C<1*fw3yy~PVP^nlwW7@r{f(@2 z$COWijg-~m$iFO>c?m0$<94vCV^lM`nRxl<4u|B%qG4D$nxVMscU?K8(x{rSJ=xpU z-=`)vW3_dQ zT;1>GT~AF?v<)uKZ4PWCCK0Mp#0O2&X6Gy^H)C})km~|>^&+#b-?M2x>yQw_Jv%9I z`cE1rChpu`0O=Una9&RjxEwUU9<0?AK21sDD$`(nR-%V?c5v6&Ht6!cK~Cp~($$o# zb8D`rTZNts_5$Wr5>`-QGmYsh4~V~)3YfbSSEq){)jJ0@xq98zsXJb(mzaLd)llR* zcCZ(zxbuGtcD(gf*3K2F0WZwJs~_5XwYT^vq+GO2bp%Vu<;{aIlDc8tb2zWDSN!gL z%`0Kk@*+sD?2L`b@T}>7(KRnNcbm@VB150DfuuMyRlCMXE8ObWnhBKjCT(K1QVC5g z-rxmUceGz~9TWag)EDuP>Gx5xZ*qP&88g8-FZ=6NO|;8JA#2{~l3Isx*@m*NETTg( zjM=PpMt)2IrsJxY)U;;TFib6kDc~z+It^hmU@gh5fO1IUkpNFWCy+jw3_GILA+ie% z(hL2t3DIw|S5QzX!}2AvrK~Kpsv9{wTPck?k0|3vRm;S=FcZ;3Y@<9nP~H$Hv=SNQ zO!SPjuNx-HD@ukUV?Ri77K;a6qXvns-qk3r!1fqrw(WMEo?{%#${c4( zIEE#uRIsc<%PP5<_T;0|LOOUBj9>adetVnPOb6I+sYpY8%F^?FKKot4uB0(P#09)z zqwr+SW=bDj0HWp`(L2^$~yyh(A#5a z3zzDJqqyG6m782xm+TR%PJKgvWm|o7(hGf+X*rThD)#UyeOL(i{S-Emw2aN|Zsle- zVAGF~x&&<1lXjp`#R%Y8Y)D@VGncX>dl-`rihh4+81R8}Gbo{Q3slXv;jaU+*$BS) z7)&*JT*tKvIQGi*;e8$S7}V{;c21dxkhImH;?%I1&OLZs4>|2kHp*0K@f~K1Av{oInGmaQM6tR7WrY1W`n3t^KmgZh-kWC13{HOh7J3)D{J5uJYx?_)m7ZU`@yU8K93CR)c{9DzAVkI3gmX98WXmP=S;xsQlP6RimgY2*bYYGh>v51L*OH1x`hXGsg34_%dWaNDE6}g!$3{2h;$MMy+`@>9NCrA+|q3+>MHG!;J891$YoX7fm0E zqfa@^eT(e)pG$rwolefb;#2BQET6Mve@?a>wF>m9aZ>EaLv}#EBx_vaP8)XMK}e2~ zL3kwp3<&_`7TYXKO|okdOjMIRS~5IEYH$u4p&W4IL>7R8SL``9Dkf>a$4ddi&*74A zunXu#EUYPKv;w3f{+5(F19k-KS?o4P%=#W;~{-Pu) zlq5|?iSUvcdu+7I9We$CwsGSRH-QD59bE%gtu-OVIvY?!lN~up%--m4j^Sm`Sy@9| zoJQK)%d#~c*{|J+B+j(O11=_z?1>}QAw>qbFd^E9XhL1Xlvs%D?}(GhA(gU3M`@L* zH57+f*nKgsSu0Su0mho#u7eIW_T85n>#m|oP!b9#WG zRQ=aeKA;LtFGHG`m@TlQKSF{obT)jx?Agh69{+wxnG6!x(4#CyL-tmyQCL2$IR#|Y zXCU;Yfcjxm%0pu=@Wz8_M}+)IOm9tK-jM5cB+mx!8t-Wyq*;f3I`Cy0@G^wF4r4w* zRH_`?XL1Lw4J->^kRK9rS8MpAqLi*ofGtnhdI5T&ku4-<95%p!Sw@w|iBNi977|&J zb!fC+{7EaSXwNGr%y+AFpp_lVECG`yXjk1Y#m4Ka+JbTljAe)+e9Y0 z-CIrTRnVS^QflH#HvvFJTKZlb1zHN}mEi6XN$!)G{0l`n9u<6G6&Z+ga-eKa_Rl~I z6h_ItiTF0G3DvZ@ObH>BgFJT5xH(qWwu3aYf^Ts-Vo2LiNl@-Jh`|Fr8IGJWrFD>! zq=#~4qpQFgT_(jNQ+sOn7amsD&lse0-Y+oo6M;e z>qkLOye-@Gv=+2(G7=`etgB@;ju>zrS0*^tf>BFa1zP@;-ko}dgH*FLk4|m3Eq4FH z{+c*bH+^YOrLo>U<1H{Cd8Jvp^0LJHU9hO~wRNy4US}2XcM^;gyln^&-cdXb-n{{B zPS+t!Jg8W#RV8!N*0kzHNj$3!Y#zbdL|=)oN9PQ)cG$LFASPZmb|8q6aUDQ?ET#8Q zrS&oK_cU9bC%GgH1(jTEUK7Ult#4*!>&2xVk3Yl-H&jI#h+i%YH zLIbHWAe1yXk``PMUS0==9K|6A3_SUUNy&3!@N z4ahW^6JMNr8Wl=e=6zO2e&~65TTA-v+Gm9^KGBQ*zJ6W!`$#4CFDmC`R)fGLP-n**-WMx1_H?pd!!CN%+43nZIEnfK zDPIk_HatOI^el+sZWfz?R@#QDS#BCq1DrYU^HH&3z8oP$)fEglQ-&yVK|I-TqQ{QX z4se|1mgU183}HG8-aIKR*DQIeu`02wqWpdDq5R%u7jdEFk1!_# zcEL#3^H-t11Ba3;j?DuP>9?<)bdNhZdVWtNV6yL;F&f2LwOk>sl}yj!)zd|Bt_hmD z(ml6sq;=4-n^EJLGOBlJ73fF@(0=?$T~byIoo?!CX_?QPZx77BF5aWw7-|{B%1fdSZ(2AzwwmahSfFfEFf`}JN8xc zOq4m9acal4A|!cA+?lW)11~3r!Bgst-~MN@n&Mc=6asGR!kvL1>FUJe(_CRqdy9g1 z@Bn?0+%Y?L1MTAsrE@236N0^*sX9?S$v(oG?x0;US<3cJ>6U)MylHVDh#`-pEhWAa zlH6QVxO7g$mYV} zR+hUA zV0mLw-T~dyQO;VuB6=67k1TbGroD21zbWX3_z&$Kc)Nkxj%MC~YzO0vz7d@$P@t2@ zlzT;Q~zwkZH8uuy^{VMibVJ7DqN)Dw+teefjI`s`H6eN@8|;lfEXJSA<-$zc z-|y<$Iaw^Bca?yR0fR;q4ZFl_I(s#_ac|}_gL=G55#3@qW5UJ z;eC?fB}oFKIjtS05~au~5AwaYmz8sP4m+ge&xE0K%Xq|pu~GFIg+1*P zov1sv$A6-Hpn}kqt|xs-Aq{Zzqqz2Gcn8~4GI>49yPG)Y7uDZ$|X+NvXv3T}irVa&KLf}leL(<4IsjA|z2hZvyK z0Q@+-!JzgDE{8;YfZ_nB5(RA#pdtF$PI1smgcqSiYl`urR!x*Ydzc3MnW}r1px)IV zsY+LjEcYPj6|rf}C+$;U zfjz+ZDOukJk;i=@7ov=u{$pRsA@R=OFZ9=s>r21rgwwm0Ti5Num6k!1^^VQWE`YJp zL%ur0_~=w^t;e*f4r|A>_9bDtwXGiW)_t92+9cyF*@N=dWZtt>v3`G96Mfp zGz2<-D7VHYWTz#(Tg!_0oWkP(vXEoDxFdYpu}$ap7o5WAa+T_K=C!y(@LB+`B8|bD5Sw zs5(s1i1@uqR)L0Xh{OS%CESaErgf010d^LRdmqOEzZ$J;pQ!=67R75H{NYzM>c_t6 z1A#Rn{LsxIV!Jesf6gIeyFL%x$8b`;J`ad|#v0}l_q9s&L<)2CoJFn$#KKK29J zC&9M_-?fbl(w#x3JNnKc?=|)AnD3$RG$Q_y^8@89a$bSHcdW}HG)x3NBUSHU)5w~8 z>>HeVl;1v<1413z-VxUWh%FNTVGYs)9i@F%^ATOe5ue5W5fi3Ap4->|PSx zr^@SapEUb7jTfZuE1FyerOqPpc4OQ*ebWfShWznl?x6;!!0`m(Aql67OsXEEG8}r@ zq>dtS9Ae8MEn@OmMEyENCLs5bxK42zxiC7t?qrd&6hnydt}R~BVV)%AeR0+vN>8Q* z52fRFU`0h*9M(!@I}Lm4DBengz8j$({D<>xVivR&-`1JQ^{v>C@E z7Kzk7!*;5!Ar9Ik1IgKXegx273qbx!w6{c^f%nzuC#bl20R@zh|eT#4AQ$5OTR zJiB(h0uf18xMS|=$s*@=FBtj64hL=Du{F*u-U)f3#>RIviN}YHxmNeSE5@~>T5=ib zt~f-%ui)}Yhgy}kkg}&rE8``G`?iPx6D;M5)J-IghCkOPV3>_N15qF)6QNf z4#2sUE{Yy3t2=B(6wsP7mMiT_q5-eUzKe>J0Ce)09oG`i-8V`YKBmG|JAP4aqJK$F5>Qxz^<( zqgZVDk8{UjbTzEKV68Sb>nNJnq(|r;BkL8e@?7&xfY}o)eqS=>gW2Zl{X-|$lIs!I zz2oSSXD#jCLH@lK>LQ;w;ms4tH=4u)V3PxS7leM;MX;x#{O02tERhvJORH2rhT7JqpBaf&#W-CywMgG=C7E@Pn<6h3~mDoAmJfwNHv3 zv}-FEgc(za$7mf&Z6m~EwUZ4YRJW{mhU^CRs2SG{gHSnvcO$iF_BP`-Keg88vZT1U zSZ1*0dK`F77{qnzI`rIn1gp&j51zENHh_QkSg(edO~&=h*=kwGMc9eTtzS5>8Qs zVU^T%_dQtUc@1L|;%_t6?v|fxdosCbkZx=Jy*u%+4hdSf4S~sXxY~`%>Fw14ooj72 z{1AuOZ9U{EL(Jpq+oHWhc7Scb(2!DS@{UqGX_jB-olEiwEcqsiL8VVf*#~uWf^A}J zHz@LsrZVYvpz@9fdLn+T@dITxB|pB*N38sjEpr3iuHy@-KGB!Z+((r3ktuVFy-wH{ zqWgGPFYf#M`Qu(MDUH`z|llI0c$0F)#<1$Wb z`OisLH#HFSqVr%RuJGS@Re*y2<;xSHPs(-Q4{lIrUXzGW0{!~^?%2$!I9xV7*)_*6l+;bvq5*GrJO{rH{Q z@uO8V(c74P`-js=v4klyR>x`4eO4GGWk z0w3c#jO%OQ1JTqI$m8b9wf?MaeA;J9XHDbX{tfo?Ugdq3c!Vl@QfGy=GE}H_`MvYH zn#;HSLMg8X7%MHiWa&$m(BXVzPOrSnh=Iuuly*4^P zV#AZXWS61_@zf0YaQtZ!^@mLJQDV_1$fY;io85Hv40z>+iNGgk)Rpwh1C$@+D!22Lp_2BE1{ikw^pe5XW88W5F`QB|2LCw&qqUDWx7SH3)um4mlY!nbF zK7s!F)dltI7wdncRuD0CHWahAa}%;~Rt7lJ8UK%Xq2*uh6|xzMFI$$0a5&O}e`kIL z0X`(zisdGhIhg1|GJ!>b(pIM=nhtg&3yqY+BtvXp0dvn~vYz`=lxt~V4X)Q--$KT0 zv)dPlP2QiGM!^Qx^w=T$-6!9iGmlxX*M54xuQyPtSVH_!ylh(ml&?XUU<+{8Y)E4N zCBkgfBkjR#WK)W0!))|jFj!(j9T;PDItz>yd(8k-PH5pz)qO9&X0{pasZ!vOrhR|a zhHPf2Pu`-QB%IJ2q_)gPwGkZcZ0htCw`idZ>KV;0^JMavO48HY!o3a)#@mN#-5lAu zjVZMb>tZ|1wwMs3l}xwA*KXq(#Hvg_JC0F_jb33QkEM&V6|f0GT?SmHig1n7K;&|C!N)-n=wZMeR6QQ`)W&d><(LR#Yy|>If{H@}p1nb%K;vmpX`$FMOAC$% zmr3r?LApK;+7=mVky|D!&>WXuy&Ztofx>cnHUqV^yw=ns)|wWhj>9GWF4{FjzrLfq zhgrjMS}kEvWUSAW#zxKd+I{|I^uaDeZESniw7;^*Y<^ISn)uc8JeR|| zXw(rZdW}Hrp~|8Df=+!3ef~Rsf1U4uMwQ}fV8_iB>Wu&=gR$Q1bI3h;zAxw zd63OtEUl4Z+05iSz1v=SkNZFPE;h8+JN=xefbbfx^oOwVpYGvkX07ltu889#3D#$V z8%6YqFTGh`o^&K$Yi36s z^5>)J{*LLG1drPuq7D=^ysG*2BKAi0aejTwu#NAI<{Ke%4muX4T6(=aj!Ff@rum8Z+xY1 zIN0UhGGc@?G!|cJCsUL`Y(~vJb(1C(pm&N~X$o|%<*4|Y7HjXSQ3Vx+rl&2#bj>2E zgfRyB*?Z9|CU=tCqheV;*qVbV!{<%qmPw|5qEu{CzKu(Or3GXeZBjOM86Iw7lK__FPgvF!Mk znM*>x1r$>v^wNk@Kv54lPK7siC;ms+DFH>a9vm&XPtJ zb(<9Clh~iNJxQ&y0OT39TAE`tnoZlTGJZal? zkD&<-&ZAaf(jtRlXR4>p8g$sPdb1L}9beQCfLO{NbL*mgnL?A*zl|)@EV$>2>o}Jf>Fy!9iqPp}`+A;fATwKky=~QqSlIP9khGC+Uz#RoT`;thcnjZ z3o(PBZQF}B^mI2(E)L4)FnJbw3e?vAaTo8`)>~R_1=UI|7)s@G7)f9|ljP{QTg{JS z!I!tm7RnMAuV=sy`I)xE_eK?#W--l_D%chU#(DQk2t%r{^u{8>phJY+bq83rR&T$W zYlx~0etu3kgR{Xwtgu=MD+%L#uvSOvQRzbrEZYO%Sy6_i5K}{uCb4V>R~3M?_x8$t zY+t}3(~t;)y4Xl%a*Y}js8FY>H*;5UbqDOdOHozuKKLG&vOC(DH}l%jXra$y42d2Z z%8n@3SHbVHCl-Y?3v((@QHR;w=@mjv7dU*lt&&9*4q;YSycQ=}lQ)(1Uv`V;62MUj z<6@cZ(k7E7d6Ez-p&c9~Bden1YxlLP9sm@FC9++I#j7(yas#pMTcI8?Sk-16X6$f7 z;8HyH3DWI4Hj?(3AMZX`zzD~2L?;*sT8Ydl)Miq!hjzQ4zN$#qf#r%3hS4>hOr$bpl zUH75rfLt#wjz46Dtj@W6%EI^X!M@KALr6ymRh%@8Zk=5X*bWgJQH-m@cNmIbo&tsB zJkLSdsI%HgHSK~OzA8qRw|MwY*)Q$i;ygdO!^EJsgvEURn-BG1$0EoQar)PKY=dBu zo&-6-#VedE$J-a&uo^ilftCrU(8LRc&?iNEfD;%u`;@n;)QnPpL6 zKKh50fQii6nTwYs#ddfukB_MWj< z46YElEFs$d)>#`=-SQJ^B7K+j2!R*U3H*V#!RXpmne&Hd@t3S)7xx*r!ZWFc%ixwH z0)H#~qI{n(48vnP=;AqE=ML)8I|9COt z7I>-HPGT;Cd2{H%g4i9|F_?4M^6tr!c()kesptzNeX)GTg_+9rnaU>m^sRLEu)4~} zn#vh_VB$w~U%z6(fBjOr=Mdjt7HI^D-8LvEZH^F44x;0W8|sn zkqo`0~J+aQS1%Tb(!)w_i zi{f59wFC>W9!<8R7FWtJGHh}}*GQTyu5N+yURbSxTCTnJugLc_rZRp-5qC|0zk<0% z=W3E9?pYZx8}4~hXbDvY1G~X)dM}7gxZYLavT=sE7Glbq)WqG$PQj8)P#-(ZcCld` z;uai{m%W%m5|q#aL^D9y#d#)Rc`aIyvj`sTpmf$sa_T{w8U*LJEqE;uL75;-D+h7!5E^P)O)fp7)y@RLNLoMq6 zd^&A1DM9`Av3z2fd6ZZ3$OxjJOe-k^cNT2MVm@do2k$5luR8oHX3mhpb`w}wvO_2= zC_CD{vU}ZmIdP%O3hDj|^QZN3wL76noCYjr!9nswPOn$SK}0YmL(;KTDqLa?dwPa* z;oCuK$MTdOrVLyZu9yP*^)S+xEO?Ls=9&Ty4k}Fb*-i1npHuHbCvI|V_{da$;IOuS zd2K2qS{P54uFXb9(^Sv>vmhhojq>R-n`&K#ti(Xg(Evhq^A(pTB!h< zGXayqja;@@Njw_mtJ!FBzX51eG}1V2{KdaVYM^B4I&YqFX9>DSvNR__>uLt=Nz%zj zN<{o+9im&tdTAlFJy!7_iv@-&Zl5g4u<*{MH(ck8Gvt6vn!V4#RkP;Y9h`Keva#&k z9j)$sJv_rDchDTm?9Lkg?{u&VI!EaKmITuA-eRbtd!>I`C@(Fi$?v8$Uu^yuBay@eQeq#@p2N$)G`R^4q zVKVKdwn2e172NN`AO1ZU4HF}rEZUM^i$F$*K0c#U%XlL!6P zfl3w^{X(Pa6e=UVywem@$;@nkezw!ZN+bJou-wnw>{(;Ii-WOMVX)I&o2B`JKo&J& zoj4(U29V2&2w5qfw}HdTHg4Tq+DLS?#{BmOTv_ea+Rpkpe`}LAZC!=@1+NVYEOA3- z(SXzHfdepydlF(SKfokD%LeNk)i^NB(@w&JM=HWNGiwSbgY#;O5RT=Q$t|$$FaQp5 zcR?_3{A@DP2d0t>H}PKdrQ0}GJTo27O7n9@bh>?9pK#Ya+$ds|mVYBy_%q1*uTY8` zWs_w`G1YyX07b3NyyfA#DSEaiOEren`t>$X(urI`wvc~pC-co#&stydxH;Pe_uZ)7 zkIxNv0tSVuF={2i7yZDRzXfg2nG)qUq#Hn;Go$^ca&jly;O@1BsFLkJHz&udH&Irc znBIe+ZW!`uw=1eK!5*2+7c*xc7O(b@5r9cCt9Wp@mn~ZgL_c%`0zc$g*wlJtw@!K-v01@&xr4J;e zB;jGM^)TlK0&Z`Bit24Eu>giID;t+dWb8qL2DZhU*Cr@>OAqaCu^b$I)-*$)gyP05 zlixbZzLJ6t6spb+0p(kJnUoU3_j)j1*x(wjAB!~9z{7WXq)0%jW^xn&&tlY6Dt?hQ zRyCnMiS)e4 zyNs6hpwPG+i)(}ez}7uKac2e1!EGq^^wz?mrZ+Y`4CH@cD*6b-ahjs&3%a#$BQ z>yQnItGrPZ$()d5&k7H;R}$DQsh^j`o*r_WJ)j>g&0ivgp>|9i2iRwuUYXUEsxhad zo$@qF+^9^dJXW43^!LTAPx**%#U~T_&_{NE^%(4V*&+g!L(y~$gRsX|uojwa+!#^s zzf6|M0y0g$>6p0Wl}3gmzb+M=P(oDb2{_?Xh`F^p+CFc@%4y z6a{X^4*WC@_RXpiG6~7z4x*A2IJul@?!4sdW3)y8Xkx+)6SVk60%Hb>5<)&`#Xk(l zW2S89pgm;itbe7;v&PRW8pl_4#IP`HQtnvWw$0^Cpe_0hizV@h8sBwK4EXxljlM2Z zD}%xmbaxVKxZXfh@dUrjrCIYpUs#)*eCH%YRb}Ckuw*2)WiJd))y!9uxd5_P2 z-`+@C`kx#`#x!Y+kNtO3zw`>Ih^WcjO*wXBMyf zhRHWS;5_=GusmDg?wlyz{at;=F%OBsC-EoVsAl_y0Dj*$&y3 zRoV^VS)8Qcm;|2?CH-ma-B8;-%r>yu`b47BK8a&}&#)n-!5}s@d)Ci@_oI%w(n=NY zQdw@4*hKA0Eos!Rt##QluSv2HyzEH2C#tL4y9+ZQAWL zN?pf26fzXee3MheOj?dE*CROUcZ9Dn_dy0M+Iwl@_Rl|MWq zU2aLpmB=ql87M|lTf2%ki4hiI=?O<1K6Qp#hpq8W$Q}iIjKK?0AIZ2hUA^$V<(&V+ z*f;QK0tH)kPusR_+qP}nHl}Uc_}ZGbZQDI<+vd*O_jZ$g$!<2eKj0=+w{ok_sdKQleeL_(+1VvKH0V8K%zJF<#h;_URofuQ&ZGYLX_Seb?&_ zlF2+qR^%+U8=}MHmRA^@!aK1JV8U?bzxG*Fr+VBJCMSz?Sxd63w^No|2{IH?>~IcO zT!yA#{k5tMLx@sXbO9FG(%=jnE+Z!3X~wsj59EVyByOZy?2YuT-(pa0N!Ky@DPL*0 z=&mdT`R;c1$6|Y6Cfg<3i3S7I*~Q+HC1X}qwidCZ7{yIp8yAhl@nP;$mJz#fa1>6` zA_N_*U38+bder{S~G$*g(ihb)M4${a>>DNLEL^t6;V)+93BE+!%{mjJ`|fuIvBG` zzDU{g*c%68IK!3|b%#%-k0mhS!+1-Yw6)#@+~n>3u&~Q*x*?~Xoo~7xT4NPUb;*dx ztSyflS(aqIWR#`xJ%hTjbPT4qfK0zh-u#wheR)`ZSZOv`@1(xsR>r8r%U`hT*2KAI zk&slN7-7dxJyYd2G1Xld29Y9a7N$$xqWVkCgd1P_?8%iCseY~6dUg0YQ{?xaP$Ffq zK%_q;G&OG<@?xDkc8%E_s{|&ch7pD=_cQ|t_7C0wTAB}+FJC%MSWqi;;MoRU7TUmT z@HySU)Pab8swt#j=>?ySXD$dfZG`mR zfU#v*-J^f^Ya0A;qf&MMC4{@*WAw!g44cOT>Zc1J?3gD34vGM1{2GD>y}bf&69&?N zGQ5lcax*Sb172gfe_m{y{)S#cG#Ga9LtC=o6`2qO`!;eI>I_sIqIs%Ceg3==7@UBP zd-@3pXb3Z@$0+~X$6>q1LAc+kQJ4sT`^YPj)8^Kgmz3rsOL&fO06`E{9nuiGCBqI| zj_3%yt3y^YD5wvbqo!Y7Dn-+Uq$!NMncKm*mso<%3boYgr<&NUC~zy+ryRhHD>wSZ z)w7i?#)ZFnc9pbLhMINyGYS=h5^i-q1?om7vXwEQwMqOd0@um*Wtc=j z(oLt2`AjCu!)y+h%gON-fk!uZ;IFQ0ArDpazW8zorm4FEnq%*bX6B42p9I0wtSWWl zhoxCx4s_3iNNKWWMWyIX&FT>y-ZnIulqu!r7TK%L>0t9VJtdFwd>%BP^!K;+_ja9W zI*oxB%4dDC8pS2QbBmJqc7v~KWf%m?b0H4@!jbTl{$+dK%Mom0Z7{}B9@$p_?%=)ma1vULN!iqQrk?l z$bCgpWo5J)$q*AIb%97Q6qe~F*_(z8wxT-b7Dn925NM0gN|8Hg8eR$|%N7funNyP8#1E_`!52UQr z(4x`Q%zL#Vz;bCSrdqx<2K&Hxwq52!wc`M7q!#noCyxQ0#_*J*X_hpz z-`@q|VfK7;u8_%wn?f4ncq}5css2LFMSM9P`ckcT_lCbJUh_!sRczVMYZvUvX^>hh zvhXH25Z?uy`Nmp~j`_j5cVh*5No_&KnUtXX0`&7JFBP{w$yIKtIR3Iiy zGtmadjTp03g3VE1Xf2+1y!yAsH2RPGWVR2+omn`6&J5>En@^Yr!|=oUk-7hNZ_D-0 z%YH3(t;K3U^8M^&Uk_JVKiIso5joxs$2%k;Q^teHsoY&vp9^l<+AhWT!bMcnBOGoPs6bu#crP*jPyADPvXSF{@YR`*1b zl>Ku-&Y5uf+IOTdmUpwe%GY%_S9Du2@E2nE=SPUv*lw(&HlHMEyIo*O*HsuE2PgO{#h@-Tir}wH>8TpJS*%eW*GP2ku$KB6-FTikbv9j7_ zp%dWX;4aL|%cW>Cr4CDX+wn)|a(*!4P-5B2$7|u@^`l6C>QcnZZ}z&Kh)>40KoX9@ zY4N*&a}?Ok7XcfL`Obp-GWfS0T4m8>ogb+xE&2*fmpu%oCVD(tR3=F5&!epYZ&VKd zIo@IA!|G%Eyl4hv1OjR9$lukrc<@e>KbR*NTZbpngkVxc9j9G40@(m$xe)I>g?#fh@JM<+y59N+t-(CX zn9=s2>;-VtScOP-vm}C~JJXSn4PF=7tr1m2J*=K1j>SnXwid-o)-(-?+pF5b5($hU zs(7QDNOun|stg_~pDpUQH){KdU?SFI$!cLuHCnS2>6PmMorTX!-LenXICP5(fyGZH zxTQAv{G%k`EKzju#t=tN9P4BFrT<8UF>leBK2_H4ZG5*jrx1Q!<_I@okfA&quoB##i;9zaHDwOnoln5 zWP>Be1Wnqb$Hjgt<)76D1T`QS-ToSq=7Y;x!dfBxUJy8#I_c>+TDRpZ&zg9$1lV;v zDW<(U>9Xw)5pLcXQnMC2BiYnQ+l-`|{cGMaxJS|Y(6ML25%+ST3t!AHI1!p@x0F2c zp8%5I*i*hZrQ#P0d6s-p=WXbCO?l0ZOt=^q-FbFQdG2hO=haP1&+iXiOAmZ(J3=xX zP6^8edd^#A8oY6N4_L+NH9V!9MN|E1IJ_iek&a)+7f#4fD=p|+)^@c1I zvhL8PGR^xl&JPo2StfYv{kH3Zky&=6WjUf<1y(pFFr$-=3gnaNqhr6`WX*2`_2GKQ zQv#tTRw4=*is1G1C06f){7!Rv5xn4P$}Uuvg4oLV5kNC1QJMn{=hRaxTSw?^jl9{u zL)bhC;&%yuOZo-5y;A&^@e3SvLd9{+5eV%WRapXMTY{cdwy`ap@rb z!!f|t_cdc3T@}~CWpj3#It@Ay_wY4&9Dq8Y_O;QCO&%fq{EHcN6SMcajT!udjdB;v z1SWuuCMuo*OCml{PHsh8z-mHOg43Ejswtm2LVb^gpiE-|XNGlA(Oe(7ftg*Adq>>N z;jR>S2YrO?Q=WW>?#BMCqH)02vB@d86{9fjfLmJN6mlP1q-vN`j6dSBBopulG3Y%C zmKvGAL%gY=5CE4Ng^NvoZ`lT^m`PcT1VBiQ{$^Fyl_?r>W7SSs&}7OQiM(Ug&u|Tn zm?K3h$rcT=M~}9O(iA7EkD?yJW**kgqRK0-^9(bOyi%poFDYLWVY;K&+9!#M25Az+ z1%&Q1(jiM&)^m!tMkKpdaf-CFoFiE=z65xK1x= zl9n$HKQz@QDVrl%C~jsJz9<%pp9pQzr!O2ml=fEsQyP1(v_ZFqx;_BlbXR|ahu+%JkHsOE{E(U zrF0Yey=&F01ZTDv3YEuglFfD5ITxLFlLexNum9LJA^VNdaCl9pGv>ozw-81f0 z$LUFTr{$imfU2cGsvO!w1R#Vhf&|3D{6X>GK`X96cxQz7ZP1U!y#RzSIFM5m*gb1S z;czACd@{iB~lPIhR=BTzOOzGlcQ)JMjkx=Etd@eLxro zz+62#Z3yF5aYs122S#V$riZTsmHo$+l@oQfgkuKi=WMF_F6W+b3&C9rbVnM3Pg%O{ zx~`z@k8B-tO0VrvXmd`FrN0Xq{DNuDKtJ4+KadSC^xAH4Yxxv=LNkL(&6$k9QIBUU zp*m2=zvUI(iT^utA7&KZbpQ+m1P}86#3Y@~EX+I|8UB}`wu-Bf>wod9QWJOV7a37U z1X{IZ|531{(;b#WoZj+>gxlkE!GUL%Gy>K^l7i;r$?p-9p4s zqE<+x@!r{!HU1Nq&xh3)f^uWf_~3)OK=3@AN4Pjx+~B}K8^-DbF+7qm={n=Jd{V7b zx};g^s1Oeldog@d>gBxrA?-hpGGX2cGiK$++)jHewxAU;3|MPxDUwu9XpxK-yA@-m zmlTtlENfznsqN}ck~Tu5_g%UNR%sz9SmEzkg=yoySV}EF92A+bN7PR<@}=V?qyo(v z)avhSST6LRcb<$Ub-vohYdPhb^6Am-Q~Z%$qM0+KP@=3Tnaoa^O^?mQy+yxSACtu@ zi8FI;3Zr|x8m4}68$?Ure0GiHP^&cap=obTuwdm?FPNyzjL^r~ZHg?44yZJu>>{ul^g};J`em0vK zAt|@>=ZI1;@D zA!%#2r!IYXSZ05Jf4|3Kb@i)*5b3XS>BrY08L1FX$tgfbvnje=*K?0}$rsyH0SZc8?q)_l7Yxc(aGgB*<$uebDKC-NOhiT!8o}sN5DH#|( zjbQ6u%S<+Or1`DVdpl1}fT&S=j7{EL>eoq(ZWpObpxwKsP%QXYfLG}>jlg5JaxjSi-*yCY-8;<$UDd1s~@G{$ME%39Vx@@ zme{3>S5Fc^K;Loy z&*8^^g<0On)ymyW*~~)B)A2t;J?#hKsV25~Ys+OZ+ukl^k4&EsMhHz5YM(F%OC-n$ z8UhqV7;^Y)K4Az|P*rqjyFQ2#X--oS2})E+XgCbb=jN-q$6f5r;yK611zB*{r{~7Y z|M7BtJ$EZN^WUL+F!7+ z`k%@cGl3}5^-+pnXuQFA?fo6vr}ae7$o}fW2loU|I(2&8c zzfhZnuSKA|;{EUwJ~>Gq$Zg4e6qL`!@dCs7+vnnGns+VHc$7Im% zD6h<5wTjnODbLtowI8oIpK{T?WI)f?WFdbc_w1mziQKnK)_l-^=Wi1zCL+*%Ck_j= zyi$PrS>Mf`esO^rATFe%|3n4UQoY6x_tw9*qW{Dd4C$3CqU^r4-x&A&kp{Zs%I3!;-Q!7jR5-j-7pylIwSU|g{t4rksmHx zmxwY!vy74QM&*|rG-`Kf`RWdxv4L5OvQ#+VXaMkpYN6MCOYvY-GDOsH70sjL8` zc_%T7Oj#TmY+UpPBPCn7{y#1TXA!LmjZAfV7`!utB<)(7l*<_EePO%*W?T7UTbUk7 zpW;)DtXGe;U)3q{SE+?l+ja1cp+kolZZzPuP?XzELj~0p6)PmeY7jnAtUgcr@xC8^ zTU4lMcv}U~ir^l_A2C^5Cu$&kE|J+0`i+V!Qqsso$nJh?wEYV4tX zi5IPBdWS;G1c`$Y?8F>JBn|u2|Cg2J8*z}5Gw#*}%7}CLp3)9<_@0V=!MIiHl3pgJ zVaQSjRns^Ic@)LH5TOU%#K}IISQz&NJ6MV|naU#ynF8SW z)-ElpW{e#yXjfj^Rc!2BUfR-C>8#uj32qA;eA-nxvC)w<(J@Yj_C#bdlx|ha@tMjJ z9q1tZUH*wOI!il)H%!=bo00@Z)=e!p9~!h0}T^(Po>42F#LuRO$84dQ{O)9RfLssKyesP%ZY?CA>4Rz zV%)sQN_H?ZJ4L|L<4H|!sFNl?Mn?-T5gtziEAcRjrkqQxYddj^gi@#31cDk%L!7}F z!#Dz!>>SOCM-HM>CQCb$D+ooM!`S1vASzuqP!oewE3*a*VAbX1_Yn3+B6}N#C*?}Q#1WsQqs?MXQ~rhDBx$URX}ABn z$xC z;4h(yt-%VEt_mw8BKe#Q0U?<(i8gf#s1Fs2vQ~Nc*=pFF_B>Nj_!Cor@En(Pg{f$|_rP zJ2gK!tFg%0n({0?>BE?;{yH95-KV)jGSYy$%&4Sgm3NW;suO%w}s)I!Io`+JL| ziAN$~tL4x0d+4b+;etQb#(HvIN1Kp`EdWGlI_OmH`VK|A+(lSoQ3Xs5 z-anq_o@Ms>!AA=)Ro2JPSq9B*T>wBahSk=_Le~9xhdx_jd!g8JH~HZS*K~Rzcncpb zbG1;KMw$sv(E_|G6!k~P9H2u8Vj{oXfUJ>5IJopFBL?kQEj1ArS_xO|>A@o0I*KY8 zR#=S+I~kdk3bHe@3-#>Ox2{F0eKk#8jl_Rdgb>6|*sdIOeb{)JP0dXWmKlK<07&Y% z2P=dsY=4WctnZ?&sj4)Z`(TtlGJ>-9VjOp&3^qZaR75EG$daV%@9;Wm=IqQ>AMgt& zv9m9yN9e3=DL3Vh0_bTYD0o>&T5ZTsJ7(xV_s$oF2RJYId#>dlX$+wXOBzZ|>zXnc z36ME?rX@KjsTf3=+{gUDp+C#)6vhytWj0EBOXZU1F1I|}5DRk*ZuDDcZW_CP;ezA6 z2odNDSjb0=L`fEHtFKjoJyg}(?g_o|5gzSj{s|{u7Kcrs&(svi?yvZf2%=qcP=L7< zxID@NBSmP;QI%tpe@uo}2ysD|P~<}4?FxF4N(bezv+CCcyb zYx46k-$}9hD9J2bF!Op%IdGv?7AON0%cHPss5q#HP@k+!i-ZPYv3kR~23#aORtGCy z&TMBzhRA!9j97(@s%bPSeL0T6Uy}5Yb)mt7iPVcgG|^^94cgL z=woDQ>It(8m!er-zMm`G`IWokSIm2%E)_*gR-&tOdv&3TVe4q5@-WpF7`j?2754|> zuVDn9CuMESMci+woYTl$%=Jq6dGt9o7}!T3b`}Hdh0D>e2!ib)nnlDcv75Zz>F@=h ztT-m{Yz`4qbd)eEE0&_rGBYu#sa!~nmQzzSIOjo^97~?ogbMeL+#X~qDbg6kH?6`Y zJ`3l)k)`9-4olWp)WNXo>d7RlDwhU^0u5IRxnY*)>uURjNb7#rBiJ~)hSn8gPZ?5b zF&U&&*X9UfX;xNS7vmfG!N;HTE@0NLZAU0tz4^iH5roK>DtU2Pdfdx1Cg@7Y9eH zryQRQNsiDh0EXr<;CLma02NSmVRI5IVF@VeFeivX(+#w#Vh0reF;(pEhr-oY_O^C{ z1Gfj>!gGP*Yy(-Tq|4cF9CSkibZYCe)rTwz)ee#ZmqB-+xE-ZFkrnTnFECo>Du*K9 zYiOwX3^6~|4LK`D=MYq2kB@WGUV5I_K}yhjL8xKYjN$y@3AAA!FGh-FH6Wpa|nePgNTCRBWldCsTXB#Qiwr*E>?(iG%q0T6_d^%IlYupx>? z8ak6{N=X53#BMZI$_Ohks0?TD00c9xawiSO&Qo_pGow?BD3=>CGyV;DD( zo=lN^A=pmgj`=evge;+N@259bRs4ak?sIL)Ql)!Put^jrRV*WAbqXm*+}Tv@U3yWQ z(IiYDL2hp^N2%)Gp*{g)Va;+fGu2)C2Bvaldh1{AG?vrj*4w zieT<||I=VNI1;g$XGMxy%J-DE1y@zv;Hs|%2Sve6>zST*@y&pd^YQ-k;mt^ahHJ>D zEOr4W10&BM=erbX6uwOwAFAvYqAmlm2+~#@Rs8|VO~Oj;D0?Y|Fdn&kpSVzb=f_R~GxPF>F`WdKFcn&t z^q4OLCTiFxB<@bBHA6z+OmW#wJ;IzTm&xfe2$OM2=l+6%DBAWy_Cmu~G;S$^9X zy*BL6WT5)K?q`bCzKvww)$YRRDOS5}>vE@|aPV2#3^SxfG|nsW z$B3cBgVv|?D}^`s6K}eFULriV7|@b%XGzsZNET z#=j1O?F$RUA2a#$gJ10V+kd=)lBcwdG0>ZLeqLh14v}4g^|q<%9%H08rho23!>)a- z6}Kf(wna(m2=y<6>WhGWiMOvRZ@8)cee!n-){I2wWJVr4du+t0DAg#RAu~?R_nYhy z>6YPa(yuMBi^}_Ba&58GNbuPOQD5d$_@}hEOZa33a1u5lAXstQxGUUH_H2k*tcdKc z;#Xp_U$=GN{*UTw+uN2%{eZs6Utmy84!>QrOY&SFe!6%rLw)gisW9<|kQ!?vSNUAD zQJN@$CSrwop`|1t>CYcE{5mYRZ!Yk1N6AVxtfrQ0rLG!+?&i)d70Kp5PiTMlKu^1S zk^_ScX`?iVfA2lTuyQA_YTa$HIl;4seNeXoP`zjGwLFaUf95>P|GR$S?*!q4w~9d5 z==Lk>kFP)FZzZepEY&)LO{u|KdeelHTazzikl4shB-7aiPj5JyJwHza0Uvw_wAn)~ ze}165SE!JCT)-`fmxjQNxDXHiqf7M2AyQXke%Y<6fC9iNOEz_zWaWLh8`S;8%AY?3 z;VC*+l8!mL-w)7eV2k{+*fW7CKrj;j5IwzQ1);R2|Fbw7{mMy}^=TZvc8)P^jJ{!a z#r8G~vM+?oYqyMkwrIEXD&l{~m>>3dX9bZPkMsg7p&%0q#z}qxfHtM^>fUx1eLBR5 zS1kEUwH64RFOR*aw4}PvbjMlw99gEZl1jVqooR51sxWtKdw4j@kcX=9_QtC}vkR#p zf`(SuPKM?^<@tVRRlhJx!$o~(F+`6IJNrKDvhO8OdtCN546`pLP`lSW^A_02MV;Fy zc!mp_wWrcY@?u5PYHt7Kt4r&dr4vMFL{g3rz|^}&r?0+`*6W!{sXvDCHf&QIKYM8L zwr+Q+-s_p`eF%4FUM25{8vvq^6x4wJfjYvs57b6Nl09|hn5)|ZRD$A!Jd&nL(5CTX zM+~kva#!qfPR?x+v;{xBL&T8Ct5TLG`4?84K>19BoB1BajE)Tk*93Ota<=v-A0G~X zY>W#`@2Q^<2?|O^7bPW{KNB4*_yA#y!EQKA1`j$?RB=_L97YY->+RuWRinj~Tf9<) z?Xa;`JI>SdX`aZwcyZG4QNvprFC+E~#%Tvl?GO>>@44b%Yg5l5wrj)=-uz zkezbLAW8ew(RC7JiQvEjbvZ}ywe@il=1&I>1J6nG={nx&cJxBD1#z_neN1Sl=TB|F>oiv& z_PDa-V#<@b`nJk|SB`}okhHis&KC-+e11h|GAm*t?;p|mo^8jD&DDzKlJJ&qWc9hT z9f&x70f1h*qmspg*_x3YEj9zGu|p^MeW`?G6F-*tNBlN{-4WgZlgwo4@BW|LjA7v$ zLm@9UzpFibM9$#@b02vu-Hu%QTDTi`@lHce56PL8(R^0}kgW&q1#R{}!6YY#%@Mc@ z(p~nYDofoytlL_0Yl-B!H5{>qDeC`-(=N>=NAOZt6-S)@liFVHgH@H(!eptgT&@Gf zzBx3ZABS+x&m##n19L%&p%?6HsfD3N5BI$;I_5ic<3DFd$$?f7xDXIeNbr?fT{s#4 z{%p%`Wj?;9z53V9QzR*tMC^J7%p8Z?h$F~NU}u-|&+{Gy@clqH z8VEz8Eoz%s-0yQO5(vYXSwy-%>Pz^24;kXE^c$BM@8~NjsyylId{IL&Lq!c}&2^@SZ?YMd0_mt|>RxQ`c5zX=^W zudWH8ZS&7|;_{f7TOEnzn+?6lY8qwEC!AOp@~Zx7m>~EaJRx$!b^rwn z+`gfVh)BG`JR5#GbWp(m%-I=^Jjxl(h;rsig}@=$5?Axqh1OjK`aw!GQ{6bI@kfd^ zVj}n>N1FwzJLW*7L5}(uQs?gm{w2bF>_Z>8;&X%u;ql%T4N2y8WFDZx=S16+$A5(k z;qlp}ha@-)>?HP0f#Ap9v&V1a8L+}{gBUo&=LFf4MaT(tR6y8-+1ti%Lm2Sma})^q z@Yyv%oO$j8LF8Zg$9>}*1wjz@tb@Q0x>ZErh21;gb)+8{bZM>ME}@lf<%AccYuh06R05Q83d6R;aCrm7jkQgzzepA!gs40Qs%XrjF@*F zXhG=P0Ff7YON*czbZd*C8|9b@0Z+s`3NkC^nFm2H@rsJzOFe*w@5w)qir)skXN};C zJ-~+FhQ7y*pc{Yt3!w{fPt5Lk=ge+*xaQafnWsqZI}<8U8W z6fGUXga+i#*SMmXwwTvfQ7cxF0l%!YNv5elOxW6AFzSLnZP?1Y*h>Se!U%2n?*r7B zpjAW|_F+nMK%;|njPNVMOqL=0)xsnZV-k537riXB4T&obfj&zR&8WhK}*S`#+(Iou%7dr>|eF^2lV zWjl3}=hrKOwj$sH<3h(z`_zlpch}bBF3nrVX{QQ#kqCO3l)EdEuNRl!a&23=M^@^< zTTfj{gT`)4EKJFz+tIk2YK*ER=zAcA`00pBO+>L*>vb59Kj|&$bi!kpTJpBeTU2A% zBmrPL6M!&x!O<2wzT&^q9=F7HZzTWoxWTNUU;W~y+tp0dMCfa%maq>a(gNHRtuf3A zTp+dM?>Cz6$R&8vtlddXCv@StcmPc%o<%ydWGsoGLMb!YO?jK5Y2E>lY=^AFP;sMF z#Ta!%2}m+FA(M_UHRuHH&&5*2Uqa{r;X<|_d5IS?`6Dk9qFXdyf zD6>0>L5}!_$Uooh5~7l;RgA<7R?#_)rMV{zSzP^1$%ZW2?&#*sq)A?x_v1Hz>6JAN z@JQ2ZMREnU=aCLdQNNH{2qSlaZSC6S6yFFtcoL|M zK_oyB3}C)Ok`In@atQ=FtCB6>W}?gcghOeNqEA`itZk7Zb8EV3T^-Fp1()vm*^R8H z=V=+WEx(>}&e3hI(%F`9h_vF(bzgCQji_upyMdK~D0z_P1$JYET3tAflpSHR79^p> zPS25y%ChDM!QY*o=>R=2;}A{YnUrd@U?S|_Mq!n6S7zYYiynnrGhYP7orf(W7KLL@ z*5eq3_>OU?xvHkePtHHAO0uH(2`$C&x!5YWRh&gWCnKg>9-MZ=smhXQM)J=;{Hi9O zw>PpQwI&SsA&wRxx$70={e;Hbo2M1u8xq0oBnU5vloqd>)*J{^AXpg;8*f zVJqq{tnfqe3E+zm;RZo(XFD0NZGoGP8$kDIv(t2~zIFxu0j;;YO!#OC3^Z~XV9Sen z_JpN|6&-wltFb%|^6S|*jC5x=1eL?bZGeB3neW*`PZZRn#f>w~`^UmgWD{}BZ-TF@ zfb`ce7C^$T3QeilV^EvzGmP04vqxm_apUS<{TJXmMMyS|LoL zGu~s?K}M(o_GGS0k)wRD?Q)EpksLz$fJ`!1w`oRV9U`^CAnSJHK$9poX@8WMV$t~< z`7J6(dVV3_j(wF1xzOa5XDV9|A19c`a_M#0B6ZgOQ*lX;U4N%KkI3W&rkDgfGb<@A z%7A$-y1{$-CWrw1wBdcizI~As)C@IGBGz@}#_=7$VqC&=TMQTO;8Tpr^F5-h z!?{iaLp+35L--`|g+2}MnfhQaqNaI;t`zYHo*gue}Sw9CY8$!g{^SM zqJ z=u{j!?wzc|*zakl=L8iCp0GLUD);Gwa7h90V4vorM(Bg^CGT^W)dXI@p4WqOQ-FQi zBs>Z(VOyq$0JMV}H0NPMfqw$aYo8Gn13)?br=l;((gVo;TwO*l)9JzB{UW2>T`TU} zcOy+fu&7x}XadH<;mNpn0RG(|&XUAV+S;@P28DMI@05XWddvEb=22%$lWBn*yIYosO;*ftxia%K|;4mNViHv$3aL(lbEIk zQE;S|p0>JnK~LvqKl&&O{W!w@3eI;-8#2MT;dMqxSKe0Km*a+*ib_cZ^J;FlOXrGP zVKJnQJFf|CAqD&H0tJf((uo&0(4H9iEh97g81p!Vb19b|gwUKuUIy$i_%bQu2Fu3LG;nj@z|M6puSEg@L;eWR9>v+%^bh0WXxAy$uRwp;3`R zC6EX>yXlWDk=6%;Moh5OQFlRpAJmbCQNv$< zp;#Qx!|*o0%e%IX9c*AYR1~cGv=s_?EQ-#@5s+al<|5UIHwAs{2VoQR2gdBW4f2Z(Pv#nCAN#8 z@6_G+eC&9e4%vDl#sp*rhujP#0XT@bO+;3uaWfiR;&n`ztP4Y2ayU(hqWb9oG}Q;z zk$^-$hE`n|hL=)6AlTf)w`Rtp+033n6)Q#jttniHz(L=R(+ zJCZfNE*PH_f^q$QiF%E<`AfL%-0tbcbsyefze$#L2HxneK_BP-4@ZKVNfS>2{81K9 zh`j0KH=ylEghM?qc!iT-PjZ3*pNGN-rXYgJhc`z4q?7x3UsQ&^ANj+BH&y;fg@ck$ zQvPs-lV)FVgCT|ElZVVtV*Y4@QJL3iU-sVA^t-=rx;=rj2QT+3Z(m(O4tvX=NVIpH zwFjM^d^^(^w;FYi7oV=*=mNpNhh`5A?iyb?e4&2w@~3|v%e*=Ga#6oMgbdGO0Q(1? z%I>`EVMN3FN1l!|pnbI;pl$-ymt*Cx{3%w@w8R~!ia-K(jTGqDq%DRS;UC_#92;1( zz-*LSZP!jR&bOhHs%KE-aK%R8);6KVpTYN=Gk(l;yfx8?aj&G;I*9`OVGz3hsLBAdLMR z2Fn-c{oca}=r=;x?Mq?6Zy=PnaK_Bvpek>pjCf9yZzqc5y#XbgOd*Sj(?pJ-AM;vj zeeHk#$}%A%F4q58a|9U+6mp1db*FsA=uy-^8b3$ts|^X~;-iw&zf!N)b~O6AdaWW^ zx#F$F)5kYU@Tg;L#AcPY-v|t0Mn%4@C*{Q2@`T2ec)@sCzT$=|!0}rF-4pq~2(o;Z zv+o%qLttHZQuJKh@lAy)^<#GGs>t|Em}-}u37NH-SXb&lTDQuUWq(L{_!Tub$k;@w zjOj;n@Ev=z^XnjdD`x)oS;OSuf7@+?@TIp05pX^=b9#dQq>e#wH{`$Cx$`QA(~WiT zeZ_k1x^Ck&=Ihy6U{;4n=x%o4?$AWK8=Ql^ih!4bdh7vvFHU%xw7eUdhs1tRZh{jf ziDh@>lM^G*<|}f#85A-ZPIyc)&se9N1!$AXPp3S-THQ5f6_Wmi#0K`^n}SoedAry< zd@Kl6`zC0jf9B?{(TkRc!EUIAGH)%f7r%4wBN+M3v8(IWjjLD2 zm3=h#mu@f+*PzU#s!)c0HbESc^D!OiYjH3&r%SisCs^M`m66(w4z*d5uy*>rBMIbP3S8yqMGR9)yBsMC(1k~zeY?YarElS!&pmuH!zx+*n z?yc1%{5e)~YeEAL*&d$5C@9LfYHc0#ASU{5zLkRCn#ay7%)7Y_l)?L=JIU1&0EVt_ zxySjA1h)u;&`C?&LL$*QJ$tElK0|7;sCBYmlaD zImX(0wEb-#S9)^XGAzD7P!o$(R3w&OBW5f)`;40l!HVYz=Q|dXf)Z_%j`;lL3VZ%#MvWy#wsiw;VaGh( zHLV_GGrTJ{1h#h!YnK6Q&IY!gU~ZtZ&lmKu@D~GCarS~5mSoiqXXrIHG*YYLVvm;Q zAh^A~#$0w$YD!GKI<%N*kG0|Ocgyg&*Rh7GEdpeY>LP0vk9C3<@Y5o51V#fl%t((l zzkYi&YR5AQA-YFeBrMu@0Fk*lp-TSV)EveLj3 z+E98%P7w@m35WuJFuvOI2{V7fqVoiHWqTm#4}T9reMVi3syf>Y?B09cvux+PpDv6N_Rr^+@#)u<}b)Hd-Pa&_Yg zYbA!2h+*RzPL)mS8DyQIb>lKk>O7Q_h%MuGPlFta9<-Ba0>&E+r^HtkUE=2`88Qrw zF-@luSyYX2RHx=kqCbgWL(R-Ox(p9PaL(15RHM;2N3iwUGiV&+Dnr=qimYQULv+sV zniRFj7e}%C>Ryd)dfQ~z2`|w+N9<1NzS_144AGrOHv9f>f7WPsFm#S209yV;_>4(I zA|p!sMkIQ?#<(Qzn1e$_BbIj=OiGum=Kp3iTKiN7s&_H4cbw^cv;(HQ%DWuT>3?&3j%{=YOoAwmScRd^k=1>^1Dw0SyYSb!H5z_q zy1U3sLVmX7Aq(@U*MUp=9@dZO+G(SGfn&|PST22E2YD2M43?pI^VHYnF2zrCeOiBx zTBP3@tI_`o>0PT={Of3!g7bqC)zoN-Q4guygIvWFLW!9_jokwWmfbgD))w}N~FeF}wk z`gq04vU8SOF7JAW(oB4h|+(MQ`M(6rY(+2a8xzD=5 zTG;+cCJd8&RV)1p53c3>AHe!c&ffbJ1pj+`erHpjbhL{v1!-9|#4>F2-^FB=B&R|x zjuNvcToK9!?A7uzp|0w?O;V}dBph$6j6OL(zi{J;b)(Y!mG2!M-uVYyhT0d&a!Iva=FO-7W~WCcXLg_6o~3!4YV?fNi8Z3Gzy$X zZR`acpnKT5!%Rey*&ugksN%84!YbW!qcWf3yKDP{M>Qpn!5shY^CYERdr8p6=b1$oWklXWEOA(;ECg3d`Ehn83MDYOrtxS*5~Y@LjvU|Q`$5lGU!oP(jM_jY zt)^^*(Rr9RNKl*t0kb_8%d}+9HsB7^!V28OfZ#bp_zCCzbr8uN z+y7wfouV{}ng-pjF5AXiwr$(CZJS-TZQHhO+qS!^%XMmI{by#rb1~;%D{t~H*NVu9 zof&&SPc9pOLJ5k0MzTJrG7*M9wXuFaxKzt<17sz-VK%>dTKD$^wcw?OH27Uw10{9R z4s9+f%|R}mS@W;bW?_~`aKj2YXr;L0y;Nl0nb>`lU9fg%SVJgYr@Qo4RN34xUu@Wn zf)SqB;wEcaxxjID)LIawnqRqHSOE`M#+RIB39E(hEl6nND)u2=h$&;s_VHbis$-e^ zn(bh={43Z;H1?s|;FO#h*;vRFC%#lSzheJa^>EByy{xd?nYS2AEAA$-1_C2k4OG8de@HUa7W6 zZqwwNOh16O$n*^5Bz3OazA}1g^$hSP);7=`UtW>Dg1xKs41dMhHS#>*)*N+mOUn$GW4xGR!9B-WeU0dWU^P0mypy4v$j3V?HugC%^Bcj$6H(KVo+2{PtqU z0k4k_WM3^G!G5HE$9!YEFLDoVUzHz1^sl9ND_B^(x*p?IE|vUn9g>{d#*2o~3u1J?W!~Pr~o%V!2p( z*@AEWEtL+l{KcYfcM0>^dfcd`hnV9O7&+<3TYoqzA!p3%)p#vu!h(s31d!R5C?+-^ z;WW)it$?STulR0QO&M>;ked<3OLqTUny4{;BH)BS{um8)1Y_K2G^pq0(_)AmAX~EM z9czWLr3#5KLq58^}D!sy|})vbQ7T_z9m*$KwYZOABZ=p`N|CdfC>lcKQ?RQXZoPhRnT9go>)BjY$J`)y!Ki1 zY=qyxoEK{lG$H%aS35^%c3C)~>U@Iirii)vk;vASh`=2+? zrxrKq1NuRzCpsB9U7$0?)q*u{KoHtB|9WO&CN#<~x2w}kZlcF>GJf#=)MGFiw0`OD z$4}W1mSpHGPP;ds;?Tt8o8rQ|TTGGym?q@$2t!y-3Y3p|kqU4+(MtKL3P8Zouk`(8 zL55LsOqO|5Wx>IsxLGmxjnTpO_4VWh_-}%m!j`F`MXnS+E<#e*iZoOS8^xNczsY8P z=hPIl0(-Wbpk|FSHC5cr|HCC*70EhZq~Xw4fsqi!o7I9>*xdUl*V+%bhR{u8?9P>j zD zBMT+TVP$SPrw$D?A$dGJ3F^8Jk2MRiD&Nxf!y_a>Ywv=QK6JdpRue36Kz%+~p4)B% zYlynE&(eb*#b)D=uZNOlwGDDKVo^Ty@^?ViHm(YfdRKHqOVp-~89O%Ik(&%Q{CpA| z4m$q8*tYXkA86E};rs)@=9oX!9CV#Y<9udV%15sbFz*=gbqKKzh-3uVfmD(|-dA1! zv*?05>q&&pt=Pp2-DyKDa=@Nh6NSKNHQL>V6vJ@yP_{iCBfp#if6&!DJ_#zPKMmA% z90w`dOCX@Y(B-r$%e%}}5FRy2v&VZb$V#>`1(E51^e~XL1Ri_Wrb#TYa}}Oi8d2qK{uawXo{zqC{R~d!?(DK!ENXc;Us% z@jo)P*Z$<5ETwrT)(nsoZ)b-O$#e6Ypl=P}gn9v!d40|i*@d@W>hbS*gNk(tSuNWu zFlxr{fnUoAsRgy(F#Q8)Iu&(G1$llJEycIKR}h*Vt{ulxp}q0(@zM73)qxUe4Enez z@r_oX)gD-OE4~O!xI=}T_?~ud>du{kw=Nk$;7q@}fq^skCq{bZ#u5B=F(x67=E8LI zk;xR2CU#%`VQ{v!N6;>V`=qrSw%geq?$l~NEV_JE0H3@&KOEaozAy&Vol=44%fRY^ zp(0|fN;ZkoTav&$r*#l91+*<>;W5+W<3VHy%)uA}lL08?qo6vJ8;omU)(JkJI9KwiTyaox7wQ$0+)`vWgg znIorLX5Qn4(X}3ZFDYagyZ1!Vw;pzf;Jke=@$js^`yL~;-bwe^0Hcq7GQ%(BLptAv z`q0!g1@D~m(`Hj}|$^!0)*9Q+D~p1vu>$Z3HCY9=*p!;?s=>3G9t4#_Qx7{uul_4;XQ zq}a^E;lvZj15Bp^_i1Xh+swov^b_OzW)6`LeOc7r^u;2B9AX-$jwnX6G4)4dOuLyF zZHsjXc#(nl-zGKNaf`#0r>d+qTKu;k8Xs~gXH8)D3FlNa3TqDtyh|*9xVEWM7jX~G z;_o{%v_taK?AImPBTQ!{#Yqc;zJN8#pq1Vw9x%~pG(fk9z`zNXMIc%P)g^MWN8>L= zaWYWz=8j&cEyI}P0%J^JVdyUn^4bw(nb8NCAEjqm#?BE3IkuC*M*jNf#K`X7Z+sGH zz#Wcq;DEa36VHv`r5lzp)rK64``FFE;3V1*OLmy9&|$lzJ~I94gvs(7-FqaF^kMGl z9ehm@bsM|a2yVRDT!|G9q|6=dQpA}p6&GLf$_&xNLzaQOyDmuYRF^C~Nv*V(jC3txHH;URRHB(?MiFAW*Uef15zh#jgYF>y zM?PJQb&#_EZ0cpyij3+gFeQz^&EGkr=>3VcbQ4U7o_5#l_Q)HTX?(bW!NoX1=tgk+&3mNYJg;nUXqHym2 zrToX3)ucVnpxhH|9^fG0M9!Ivp%h~tXo+eZhp}3_plC^>ZbuXCT^6|-`KIkA0ql(W ztvgaWX?(d_P42rZsg3^f3|9Dp6(ww7jOzUP&viYKIjk^EbRL4dY=zNrw5(TzM8pUc zu}8#Jnx6Db5Bho`aK1lHBa3wA0Ye-4v-G~zPZOkGS}8n9zH`Qasilw^;5Q08Ty$uYn*dIyaQsll@C%N+x{J` z%?Nxe{F|*`htovJ{cU#}#B9#BRp?Jl8_0Gc_*wUoC47CqkdWirzogEy=dyN~HV<0i z^i!cI4}!N`bb+}p7|wL6G!xyyf+;JFC=VXlacuRB_6U~ov!TU47Uc#M_N@QTm7dK(U!5U*lYt^Q>iIZ*O>NX8y0{*e8%P){K?=I znG;tmgWDa*qe6})?+90>+?~Kl;s^U91@DM=Ml4J2aPz#Ach4)go_S9ndS>Tq^U0)l z@+*{{UC#veG@HH7UsAsbZ|GHFyTgn#p0Dm#-kLz(z3(&tl&LSF;*^{S`Xf`kfp3ge zUhVwpXDo)fFOlQ4-7v%>7sJknfHboo5?MN5Wa6~m5YD5THvA{)#Wdd#p;IjT?uQn0 z+IN`NboYVo@G$AmyEB0Tpp^11vA*wqi2SZlzfXk<^Ha{cDmyT#kc`__@k*~jGT}=O zLgv(vRV{xYUX}<^M(2=oNo=kN<(4X*gjNpe5;U1WrIgw!^Bm7q@oU$`CAw8ycTB{> z2PltDTwCUOYr-bXRvaEtQL6RSgiOXN=X_`$Pui*Ye~3iK_f{Ul$_I;9Q8IE?IEa$5 z?3~q*Vw_th%&W<;#waL78CX^@Xiw9RlqE*jTb3|LOfym{m)G+rW0qFNIh16WWmU^E zq?B78N~&0C*Iqz&Mv*PGk3d_t--mF{y6a`z zd6&@A_o$*{@l`}dGR^a4 zRNJx%UBEfzbWC!qY#XUocug-Zi8jjGFrrtGI@NC&<`lPNNG$`Ov|kWBB0bf4v~Sq% zi5(u6RrH*zxA;((B37Wppk}om@hRg?s+! za=I;j%XFD~6>Bqh%h;xJmoiUoFK8a=o>~$va8avy<$<2UCFOG~;4YYwi+U8Zmsc;$ zpSmX$`O0=K#8~)0)nHZl%C(;wu?l?^jFxXJgg?tCmh>)^o5hyPdR4mL#Ap<}mO0Rr z)YP?g>>!u*C0r^^$~I|~wyh|dhZ~lFQ>yVAy)PgqYj>IqmpfJYee{RRXRFNb%s`56BnpTy+s$r~Zk}a|g zO*B~2wCtW5W?DS8&=21wD{GqNbXG<*IwE_*EgU%&PWOSIxKVQq}>lU~u(w?#Q-4UCXYhcV?;>|En8W|E#)ymiLaW zBV9A94u5v9T+1<(X^?9n-6XJz@QH9K;MvWvq^m1gH`7|YHc<`l-lA-zYm#lIYoxrY ztbTolRW0_3RI%B$SYFSp^7JZg9`oJNwC=Udw(!%Zsqbw{+1S-MUF%h!yxOgPyyB~d z_8I61TN%AFI-_YI2tQru@gECT_gOkbCKFjW5nh-H#q(ybNw=y0`QoeZ#a|2`_nljf z&IZkP$4gE|=jW2$HFy{YCm1Q0s|hXq>yaHk4_X6!fKd8Vbr`$pgDRrOf$B?8?C zjhSh1BndGWe>)ahFeknctAmLtB`TU6A72#9q%G9@M<<1Lu8&jp{mhyv8I4|`9gY?% zgKa=Rf^7~@##H{PlqWu~9jwEHm2MN1M)P+%)nBZ!BJ4+~&j6isfnZS$c|<}ZnxSHF zno+wt`tQuY(i?#7G@Ir*lqU0i6yFO_~f9RN8o9sc|%jSbIidTe>OmWJ!_5Rl`eta zJo}VaTrpkSf|2>V8K#1O%^c10_c}@@u8lzy1reRtozA3WxIAmQ`o9Nh#bx1YGJ!bg*{d5&3-WVh?*v~%9tTvmwJ!NYYXq#Xg z4#;o^LIzrfeIR#n!HzG|$uSj#++dzB`xR36BFGlDfo5tl-pOfi3|IY>FWgbvNQ~I z>A1$Ys65g_L{2an?WB-I1sF~rkKb_ZQVmFl@#KQya#4|f+=!SP94yoc)ptX{cSRsm z9#EHwSbe6szECj}gqAG>Ofq-QQqF2pe>DcAnlkq|BIb&3PF;vgAa(o3XtR^+L3LrM zE&mux=I3H@*EW_p2wMda{|?T?DVZqWTeshy1vA18GMnFw9X|gnXo&B48~CcvK2wOU z@b5ZA{nEtTuKV}+N~L|#6P9!1PJqA)mp#r!%lwL$yt&UWh$qCUI^GZ^`9&4Y zT*2-q66%(o;Ku4({q!fEEVECrRQ29N?KfcChOYqF6+H8n=K-U#xSR&eE`6sp8)$b_ z*n!a&NWKlIuO^1UXNJufLtGoaOGB|nJXe@Yo6!aX*FUhWhwJ2A{xbD4tb?|*lGnnl zvo}L2>tc0OS48VBu4=B4J}8^|fa#Wv?R7Y=Xda_~`gEI^SGZh>K9;9-cGm(|@Lu$r zM)0Q#Gl!7R;yH$~2V$Fr9ssYXmP8=&kjDO@*Gc?elXGw~hH64M+P^j4-WBibfIhq# zJAskXVAs8&3h5I6hPe9@mVoZdrRCFTbGf6|>?yr6Q{Q7!&%5cIv&DW6=Dzl)y{7}B z+H+s`KVK!T1Qvd$x%PfJq7I)S3xve5SkdS|!cAF6h+JkpcOieS124Ufb1PUO z0PtJALv{vp$9NY~mf@A|x`lSvd4jJG$P!rsC7TqO7|@_s>oav`>8~YnGGXSs zre3*WMg-p;=}F0X!HsZ;bFm3%7fE8YY{sEH#tvvT621-st*B>L&A$IASwK(~&;ibK z7t&$lQV7l-#Td!YAH@{zYf;jLunb@VnqlM6zb)ha_we7=b*Q$W27Ic;4Nb{FP7g1B zOd^EP{pv$cEPqhHMdPs&o`@@YqO=GydS3pKe#V%IPf*q^GPMk7VJmLk!acdl9h^Up zE9`xgkv@P-U2e7AMOKZ-838getldw+yjAEM;8)$C1p_R<8fpv zEp}GK$4_V=Oia2@?HloBQ4NpwptSA9)Jdq3wGF1mZ=m7!*ydg{xZ_1Ju$_&1eh zYlnNbyPlPP9Z^^>7N_H4kl<8IB)w@J?R#V7MU8Eww}Ig+I{LoWPFijU>b7~yW^vb5 z0RD>n9n1J#Q@ph{kow*8%x3r3r}b^C4w&c|PFc8-xFQSRG|4%KJ*^mxiv(vkti)fg zQXHNMpb7gBkj(whXyaem>kA%K-gOM!$3n(4cn(b77_!XIsb!jEgl2%|V{2GPS7_sn zOZ_+>s;E|M0^?nvNSoW_gkr>*6jAod{bpLT;u|%r!11%a*F^_a-z|{-_k~2J)&Vjb zTikW*{<_;hb1!7h{LK99?W6R{esLy&R!qrv6~97-2TonUt9bO|>ma3Cl9IN<0`=96 zZ7$reQ!=AM@ghg_k5VISgFhHp-dmX1tc zW>sHIz1~P)SUH$npuJZIBsq21T3ZD&J`rL9L-*C+5!q*U;0mvC$@|6jh2I&-8{H0^ z-3Od{)KLv;Crs#|LoR`)5s7l?<_6Q|b4?voCLxT&pCj0e@e#H5yf~32$EFHqiEV=c ztOrBi3=h*uPTYcd``f!dApwo8+J$_duX@xr*8aJyoO5VnYikKLd>ZS&p+KBaIxNC1 zp+CBi>SkM*1KJ^d@9{B}Lyl0Hb^Jw&mJ)k5&29yU@2Q(wb3;+yL6yiHtbLzwE`HowqFuviff4^Z=`8PF6ji=3UX*hd&paVGW&& zp6O*tMIA{Iy5d7Rm^0SGZ33x*=fcjwW6`LABWverfTpb!JPQ>)_wo<#KolZYS^e31 zp=;g%V0^16{E-&BeUWR{5TB$UEUqY9I^C!n;wmmU;9Cq4xtir~GI#xCka-7Ry5c)H z`lhRB$klKAWXjV2hFZMZmCyW!JAMY#jeQ~0)_sSl@P>JJDG#{Rq}+fz=}gP$Awsz= zUxcOT9$Q*O=Hk9)7^~4p;b%T#Z)EM>hT2(}GR(3OK-;5HlPJD&e8c}IDeB=@`t<)$ z;5MNB`o;YJON#nG5kf-Fc8>q0JW{iAR$fN^n#tx$A3qYLWrIXQMj#lD3ylve(^nKi zy3$Y67mO3LVoZk_pBtCX0vA1-wDdXDLO>BI7meEhN-i=-ZH_2-(rDgLtzOZ5o&Tz{ zS|6>b+-+yt+6odjsIFONvC8%8@tIvW%e}p7{Fg1HcjJcyr+iQc?o_uP&85AT5MAB2 z7`SMk8hXn*X_^V{c8CYxa;UrBIU9`YI3UN97V>WL_y-%&>!+?UYvVB zmN?~oa6FF*HJi0Xi?(XRNXrZ zB`vCu+rN>Iv48U$W}wW6K$(hhpUq> zO#4%+!9rV8kL39u+3mk4f0dU5vGNxN|E^!_z&m>LTGh6E(<33v{wR88*SP76xl)@Rs@G z7oYR~Kdi4m|2!s0Od2dwr>WPICQF1^OX=A~!K04Ofnn7SC}A(_1qNxo%l2bm#0P)T zF5cnuuGA^9!jGG_T7Lz}fmq>uRqZR;JFOZOhV+Wd@eZ3|+4fieF2&QMG&RLC8xZv4 zb|)5MT8?I_pjkjYx=wVshBG+`@BfM0bGm@yL$XE@38qBQQ8uUlep*axalJXACi*!e zd{7r#Z02qVvI41MEP>Iue$MmqE2Gc(WgQ`jB`p&P3jUP)>J$3$*mSfbV%S=m^5bPl?PQ}>8M`nx>jPg>Pb>i=BW*ZiOn5e zETqrh6U^A~Geo2H@Ur9ks`@Za&Rio-zOvK1N((5zWp>=(PRHofGkxLg$YvTZKUgi+ zu0Jn0*fj(-&HHvpxmJTNL(n#DIc@zR*x~5wcOFB#4F+`ghSF(#` z-u|$y2(24;j0ddPy0YH+u(kNQ7K4>xYMXbh;k`zK=!mVG_TcrqAzb0WM0KHZXsDJe zb!2jaW4$0Ife2nx1lteq*>Z92$wB|d;Gh2D2i2*5!S}l%&R~>HVc26xPGsbmR9sjq z;jS#{3NtFz=6jIkssvvox*3_~UzGV`#n6xwtKRkp393}@KtBPs9ak!Ac!=b8z|ZWP zkP7;S<%TAD7&p30JGQr5B&Hu5(?#$u22*NBrM1^m4y`+-b%P{03yl$`J6tYAX^F%R z);l6-JT411cNI7Sw9(NjP=yvU4bWlWz~s0y$!zY5O7DU~x5*o}{_A2yceAhY_jS^U zrPjq{J24Ae4vF*eT}R*sk7Mexefy*8I71m}f@SmcN{g9=$h=# z0dHSm!S6j{idG!>V0Vz!G?PRqnGU;Y!fV1{f*Q;^>^ae#RE?sE_CA{a?>j{($!!vM zt5>%{C#%|Q8752wEvMRQ=#g6cjF@{k0B>8ydjK)Y?;JTy2aUH%t_rgc9nDv6mgH+` zAk;bg1sD2ul?)NkbVs|5kJogk$`k9}H?Vr~I+RJ%rAvq3GcjPL6ZDCuUF{X-1vY1R z^wy?8P3v~Q%-zhtoN6r=lmFfZm?F{cz|CM7FO>o&8Opy-v&7&{uIn3nJYT;u7wwUo zH5gTR<&K(ocxT8@h*z&el@*h@S2a#ehBth;F=VPU&Cmcl>CQ4mSG)d|b+b|afQRA+ zvmdmdX-}dg&I!<&v~Z3V8^hM{5+#Jem)A5dy zIdHO8#c2~7A4D?&YoT0jOJwj%{lWN40^g`=I>aLNxsrsuC&8}eYx}<^Pp_44MQ%?3 zT`A=B>mGA(SKtiAc_3SP(5W1&en6!53qV)DFg&(W+U><#59}O!PsSP?vuO9XLRFu= zKzhN&9I4sA-9#{XIGNyWs1mbns}!Q$_Q4K&_QPr0BplD$lib?F9&1bTm>>>ISrjlU zX_DI{p(ZUSMZyr7NK0V0QxwvhoKYMOB{5K#pcF@SB`IVvJ}8YWDc9GylQW_Esj7r)8}hnlir&B$&$Xm;?Tm=N3#~^wRS9?g82&tJV|@4{ z7G48PjE$<}j%mUeyp8pMOM-0AX|F#_cx6~4yJcW{7>mEHNW%gg8Ys=Do?$ zK$NpFF>&#O!W72O&^MRlaT#dJ>=e6!DKuN7L1|)!qQMD?tGI!QWBQ8Q%*5XbU@Dbd zD9;1Ys=$h0xyYN8Ii(82v>D*ta_bZdh+Btezy#FG`v{8i5oLyspXiMr?T#It8sFbm z1%K-Uy^;mq@xheRIYisjf2dd^%5ITtt$B1SQ@OU;V3q1MefYP?~Xo{Kt5c|#I-Ohixv z%dozZ()%mG;-ORL6eu6$X&xLp(gLs)!ZcMgz!a=)i>bTYj;)PGG}b$#wG_@=tIt~k zH#TM7Gryq!b1|%0FrZEQgG}A}0qy=@6uJM!(^M1@G%&LIu_qZ>{cn0|veKmOB0maG zq8nH$D@jok^RdQQVfp)?2Z)Q`=7o7>$}-Ea(98^~_6|0a4h8afzrP^-1q}Vw>-P!~ z{%Hz`ZzpNyc-`PkZ+Xo`eO~@+y$vf2=@5oHrlu@2W$*`uV}XmDI?p=KqPg!lW-dwB zFf1lM( z!=!Wdfr3}byZC(=atV^MsOEpnDW@aH&m7y3LlD=jLbs;ca}H6&EozDG^$->ykU8S% z4>jf5x7;rNq)xEevuX24iWJ{r#-UnATc^$GsyFD$H4(GKmU+zMKLq?QT_Qm%#mM#v zp0lL4l9QDok!Dr?Ip={UCw5HuZj11EoK_7%on3!DI z#JE`yQy~XtF}XPkgP6O2gIpMaz*?DiaG5e65gMUxI&6FyiV$(SM6furu`l85;uN~E zAO8aO0SdBa7{kaS!3dvXIYv0hClykh5b=?e`2zySD-`G}meT|5$+1?|xSM+FZ9N6w zo?;Vkg8w9u60COrvbZ(yqcJ|3$trmyvKP;V(%b(B=ejSZBh~do?REJ{L7M;HZ!tv? zA#(#qB@^fWh3&Ol{K58SvP;-35Zee+*g!QUwbX;$;12oA6Bm|=!yf$tZ*owbQN7{R zv@0n44q)mH5DFT~rv#Asq8N6;x^+EtwKCb6=DPZQzq$q!;vLQjVgA!ey2FR>^jNFh zGXQ-@|?37Rpk*a`kYI9r7*+g30RCS%?iQ%Y96I(#plKBEb7AX2g#DF(yf zNi;z&i%(&0O`Z9Put_dUn-hr=d(X;G1WkYhG9{53k$bxfB<4tvOgj;Z8DO}ADPNZm zAuW3;hA*BE%b&G+r^%akr-~lMCn{~wCB|S%Wh|c;bHdRsNTm~Vv!62Mh-k`6=ZR3C zB<@`mah-I~O({KW%9U~=)f(^gx=uuAg)<@MPLatyj8L-L%MVjpsw_Ru@kj69@trQ} zoGjz-Q^M`Q%!&w?r^t*mpKV&Dq_XWqie&@EoKsBbm(6VqL1`c0{rPRHK#V@t`-X&# zR$Cw95;;xMVxJi|-|Np6lsSZyv5(O5QLF#;{2R2ln}2>+qwm#FuFdL+q^~pN&?ofr zlYja>yyPFWmhz+BTYYp3Pq)b@{iLH9=%k~Z$i&TB`oFK=|5=45u@%w^e$v3|Ck<%- zJ858NV{c(?V*LN+!K5rU0}2luaH8}e5rU>U#Vx3CfJU8w<#2%#rGkhuAv5-m)QmI+ z$IDm_;Q)P4YRyGKq5cfqc^F-#`_Ob(6D!wi76-8F^;3Qp<)roDHxYkVEtBiQ*CQG- z4WSKYA*(trqpnC4_U3pS>*r#YAQ$TNyUZV35|aXaxwrWM)VmDQ983-6`eoY0FbXr( zbK#ih0W;b3(z+Bm93k|rq>bL{7rb$_DqHRKH7AKJ&L}@HlM&PVxh=_JckaE_tzy*^ z5o-}r+lQAc_H(CA#9^)w%2kWqwIVr_u2fAlF&Jd7PMr{ZhE(N6Yb{F$PORr3o>Lx? zDeujqCEQXx3P7U3e5$h1<*r($0c~Vk#8v=z)(K&_1L5v@Uht^7zi)YI(WOP2?wJ?|IM~?7LvJ9N*hpTpzY5DiQYg3yYU9GyVs)y=T$H#WDXD!Ar%gzJfP{pE z&ixA>bZVm}a*wd;D0_YTwKpAilh4=pJ%-sf-(sMznY*Da2Q*rb*|F?&PJaxZtR|rb z2NLW#sUISUsDxLj@ftLS<*%;z>hTIM-;ohlTu(#6FDoynLF~5$)Ics_hgWqMcYIM{ z3x=Z+@P&WFe+W#FC-0u-(^O~in5JS;)e0)xeCiJ8&!f}RIsH$ao5K{7-!;+aoCWJl zk!}Eyc=p5LhEz-Svwq1EGcbOE?KZWg5r&(=3L5BwJ{UFiy5 z3A9d5rYmAKtEaYE4Hzu>WMaS!B;wu6d9n-=u;Fsr430~9fgETRZd;6nJC@DP(d+8w z#0ENcNNWfAODxH)Z3&@EC)3LK5KWv;dBk#IK$@RLj5T z7=QPt<`bdK@Zp)7Kv9Ia0Gmqn#a;O{g-9EeXcjYbLMHzEFdk?cqO6-AP|xXEC^HMz zXEKj8Gx2&+zwPlR2~0sN>)o>plsd{z(2G*4*#KV)z0glm3ep9+gTZO-DRDRRdIg10 zh~>&&ukcr&fI7k7RK#^yv?FzRF5@^r4JMWimN?D2^OQGUaq8AHRqzxbf8 zhZs9a<3C@r4*$L2yzk$C(N(+zy67#rY&SKwNb1JW>=<@kKszG%yhX! zMI{s$C|TyC89rwc^HC%mYoDqr76!%Rt4zl-c@SZ!7RjJZu|SHV6u=trnwe{heDvOl zQ>FuyBnA^dDGY>N7@I~E!^at)gL{sAg>#x6knYSUnyGCrogdn#%6^V7D}o|0s&)_YsM&N$-U!m?F$Ta1}I-}|?TR5B@_m14nt z{lRsj8OO=MFk~GCW~D|(1`-*Hw{f{$`Hj1FhBP%kp>jhBvlU)D>H{y z;+A7hg(1CreFB0Z@H>StrznqoP)iH55wq0{%-h&pz23qIG7L%aE7tiTo)Df8pOAML zcnmy7?gj__L;1Y;B2Sxx<>Eefq|*G(D8BSz!FF`ZYTCdh;`Gc5c{?OG&kx$@!9{74 zw{(6N3qqj%dPQvijPR3;Hrycv(}Ls)X`JrZ#9lH9{JFm>clXpJ2=?FSZx6HktCUJd z+J3f#iQNcyp=#n+9y_Sn+;+^!b-Ke&G9;v=3uKkWwTn#0bmj}0L;jjm%9bzPIGXG2 z`Fa#`hbmZSY$0ab$d)}TO1OA-38hz?f`C}9wh+~yY2UJ7X8z!u$r*$7VMyOuFEo_1 z`>swIx%2KDI_KD#Wk@0B^LY=+uS_(J0DvP+n~r1Yk?nYQ0tHBZ-twr-fmTsZegN2g z{3GZ9=4lx_7e~d6E!^a}7Kf$m?u>%l+Y?R;Q`xb(cgZ8_7AbcTa~xF4-}xkb1EGJrt2S8?dghNI(QNlp*u4W< z1Rt8{pQ0pQTA90=FWJ!+YuG1~w=RcnNrQl-OMuM>g+f}t%r$%I8yOjP|4D#!tDc}-NF@jl7C$~84v{^o%pT>vTB#PrJq2ir ze+4zqC+eOOO&o}eOr%-`;l=aL+PhBKUsDrpIcM|%G%?N7x3bHvrASHCD7RBR&?U*R zt#$L<&WY=bdfMvIkR|#NldCps+ie#|* zL9+ui5q>m>^G4dWSgWkIFG9E}8mf^_PD}~-x2}Ub5WL@w&@eU{&F!LUUL#3*fpLD; ziso+YNq-?&Ax*k_f_}#raQyR~QVM`l5+DR2JWVFDXw1@I^$TG_~ zqJLtwdI6f{D{cNO@z?l9#`66SHXkgcIRIe(lo5M_6 zzA*mF;e~a5Obg6oQZr@B4Rim%E@p3lBC3;KVk8(7%C(;AckB_%B3}YF-oXx=ap5bP>pXtkF@yQ;vQYOL#6>UDRdWjp(PXC zX!XqW=w>j+ed{WlC89SjIu-uo<`NV`4HJ;fh4D#PZcSCuMW;?xh!}Pd$tzt%sl}bb z18yZw5%yUrMb(F{=iKKJf`e58gc7e$BKyB48&BRe6onzOJeJDXqGaVpdREQ^&C3~G z>^umoonObMcv!K#MmStNYm=#>N-@-7R*-C#-yfDHCwt!1MiOifXIEqDn4>0+AXFXk z+4G3-YMhKYur&j{9E?EIDLCii6d2{CxTI=YjPvmljOzkmI&hrzKZiXXlZXI{zMFO1 z{iR8q@KQMG5sfq)8}Sy7QA8$;+x^X1vBjLKHI1z1jhI?E<#Cc?6-Aoqvvo)6Vlj#7 zDL6ly&W=HVZs8EU7veP>3y4@0C)-*8qEAgSTGZ8+Y1d;Cj*OU2c&z)j;L+-a;}kJj z6+EZ<^?7Idzc|~F-8dYvQs#_KiWcXWW2WNUQiS+0Fab z;bwk7?ZOwh96~eBb-=sI$B5NNq0b^>GYiNnkjc+9-kb4Y9Gme@L80uXL0^KoX%!I` z&h|AGKH*tZ?3QW68ve7gWSweEB``}5%KS3x;)>^UsH5RT?dC8Ff|tQ%+uC6PReWiD zm}7;OI8K0cZkSmo4b8fkxhu>FH)qoVT&!OuUpkOzOhqG`MkS({a~n+!`4w*j4Yei_ z>0qMDe2o<=z}4+}m`gZ?Cf7jn*_qO$h6>X&QfRqS!!f$y%a@1P7YI=TULxBRm((7@fn0!$sGfM?imiasI2rb(%$Q-DvY1#2Hq*9C?9>1pnecpL;DEuq>( z(%_asK^t9{Ph9{H2(=NpzW$-8d0$1@7SeVTHSMAZ%@#JwsO4ud8BB=?jb;p9T6`zm z4H&F2P``)YD@31~31rXxlB0UzA0cIK5k?M&pD_GhigppN0-LyyL7+a0E~dh*j4Uaj zxu3G^cKrCfmN3spsCqsk{hMO6WU1$L{m#2Hflt6j7*LwSif2iSi#8zd)Yf( ztf+dh39bEyFUka4_;8gZAc|(FZZJaAq=4uVqA4*ky2DO8&Y(Bt(y_1;-er=kvbo2X z_8ks>*9!i+8TetNEgAm^lg!__zw2+D;^A8{7>}FneK8NY@=Id-?Ry`5PP27vYts zj=R^-w3?)upd8j~#mIgozpoK5SPA>a|5{^HL0(EVDWn?xMu-5A&l|Ncil^?uNu|u( z3=r`le-2m(MY>rGod@=MQ(^A(rW#o~sgx%1k}s5V;}P|Gwqzp4yI7Im81A_jcVi{GHyK{z1tz_JC$8m0(8~%T zo)jQKhXpRas>-?NioDPkxM0<1ymck;_eS9NhWzTynbVz|&$L+FG@q1dIzc0RW-xSx z&;JKP^UCf24@#{!oE1@<63q@C^ej$7e4JW)#Ij=&|G*Q)v3Fj4{she|X^-*d#D11X z+zR0K1>Y@(KlBM$v;sZ$$!XIVR><_yj+$&I)SGAcL#4=}9Y3)jq0B~+o3DBZB|=yp z8}IkaAU!%(2_WEjR7@7hxhs03F{DAKY-)oe--xGBkE>)ksM5Jo*mP8uP`H$C347CB zXNLUR9JKPP(v$vo#f6;sp8TQ74o~9P$jiSPLgjiR%t3{B*0zfA)-=o>8j3;R>(y5N zm6M|t6<+q}CQAmY4cZzvmoo3$A14=u!Dk#K!MyY+Q=JP!L+J zbu5e#rOKL_kTT9_Ci}13f^JC%+UO4YJY+CoO#-ddCzrv?UnL;A~cg`?Ex`Ph zMMmOrVCkhI+s9^wO*4XP857(jgKd$aANX1b)M^KS69|~@96ibGuhlOe`zCJLX|}~nwn>MjZpI*_1ilXsf9^_372;=Uq$lte+Po(B1t`ufl9u7PS}XBr}!@$yHgh;5nls-vPT z?kTgod%@m4B(`5E)U8|mW2btGHDNR-IJIdQOXJIz42#PY%h>eW&D$Ta>Yib6Re&GUu*NoNKI>@c@{r*9>hi6z!3OA?=%kWww7sBDM(KmPC_MIz>Ly z`h5m_(rx3_wqlL2S5e}ZD{C5isoNmM8b5(tUO}oKP@e9E+}$(czc6DyKt>Na2wy#> z`k{p%BH5Ao3RCn-g7xy@^h}t2qFp~YoNh0pntDrocJi0M`Mba4)xVJ$zG&}1%?#h^ zhW_e>pZ*Iw<~~>!%L2QjF?@TEdX|%dphE)KCHQJRfGfP3818unrfGqdOB{8n-V2}e z%Gz0)Ek!Fd&?#0JPMq!i=oAx**Hbxa#cjCNg|2X`2%h0q5WLDmMM|*NB5UIwurEww zz+jqV$f2+-c_=33Tj$h-Lf$Cl&`w^o+Oj*>x4vCIQAC=yBVRevrOFz)#8KrtXECSH z7XHN)uU>NGb?(d1lkS8O`pBkvs2=}6oV^2&sA1Ek+qP}nwr$(C z?cQzMwrzLswr$(CyJt`4%gMZxoS8W%dGh>%O5K%JtFC1SLgkG=VF+uYyg_0i5q@^vBAzkSVcZYC)VCOJ>l6au6jWmWgsSLdh^# zTLu>Gu8+Lz9LpyLBCr6gT7}u71PhtlCv;*Ym@-;G|Fj>7qNwM#;FyKj-pn;&daTVk zcq4^RN~0ayUPUoPW~!k2v3_R*6|!sJU~!Nmz;orrv0LbS2z}iBar;h;LACvzS(A&i zOOs+=@mn^xh}lbHDMKC2H^%zmT#f(8du_KEvcZZ$oXyHSKVlPqUSn8_ppi0b*v$y- zasipO$iYb#ADV;I>Qg~`|JZ)irpQBlxc08S%l!7QBp|~rs>MMYRV7Cl(-Ioi1htQd z^VbuEvX+b$Z7sH`o+Qd{;IPbV3l>!*@qQ!~uFIgF1-IOa@a>2Q``LPOT7P9{3nkK$ zpuVee@UxYJtcHushtJ3Tor7Z zwXODoa7)OfEGy?IEbFszE&5Dl+0t_tAT3){E2YW$0P#}JYLG(*p4AR8%Lg!w_OQ{M#zdhVu2!Yuo`TEs&x14hzchp^O4EY7$t|S+^|n-^eF=;T|!5D_;(Exew8WU z%2>u55b_BZCp5MxVv-1O(lMt@Y}9=_%K>F+a+xV*?(rijpMJ_CM)J(4c4KtFIZ!wC zWP>~%N}rF4O@{_g#Ds`tDwSnIc(YW@&=HAcl9wiB6iL74HO~2-wh|X9Y1J`Phtk3W z=Xs*GY04I5+N9Ze>L*8|Djyrhn_Lm_wzbq|##i5VaFQ(y-s?Oj&cFQYh2YYe$G{Hb zP=)}&TfZ4-W2#=`g|g|tu58LTqB@^sxTk=zU={Pk_XN7bNO6D?ul2)m%y+P%t?_H= zVKt%9+hD$$?j)=V1h24YW4 zwt3!bAIn^))n2fMb{4pZ$W$Yzx53(8*pbxI-!)v<1F#Sh z_9cb9Iv4g%gYN0>i8wJJTYueXG{SDrKb)N|FSiBe8_Y83k!WJpWa_8-pI)%3b+f8c zMH{1P=^D59q;h2H>UAbz?Uphb_qCpyeEG}Q@eE$bq^}d6lUP&{7 z_9J{f!0mwdPx!pgeUie{C8gOMO1Neca~lKklpvcNY!tyuh&p2A+G;y@*e#gk6@2wl z;vfIsC2WhY?eZz|G5Vm*Nh6gs_7kkH&FF5t_TgRI2Anc>Kp_#n!9Cyt2UmKf@ zLetWMls3QRBcC5@3Fsy%8O#`K&L&fW_ynwS>Q)8`JrPadYCaZ>_x6u}z*l}-|EvZA zTajv;=>n7LhJ@keu4&5GFWCQ-B2nSJjRXH}Ab3IkZ`R$)u13l(PL_7&|Fz~+-n2tf zM9~EY!#G>x*07%6sKm`@pzZOjAWInn5q>JzD7G}hIRgoWfx#>-eg5ZC>3v!jvqrY| zVZB%Wf^fZEMC|63U^1_3GQVwESvP-sxE>@AP8ih!I?W$V5Fi6Y)fD3tdyIadf?~wz z)(6}pWoae>-u#9`KD2l63Q2%QWx$+Kq)M*4cahz9jhqqO$w#dFROcNRQ>(a{}^%oRxUkJ3RvC9Yo=f7D}Ro zCB|54h)InV%2;TKQ`H>}DPZs>?{?Ec!tk00yvh(>uxo**nxz&q!?f2`@*_*(6?z+3 zsyo8+wh4eDK^W!&qBXl{7g4xp^8#`ZE)WhOU_z+nS~$4}M0i~d zk(8JTNe2cZUy*1{ouP&yMn?9@Hmtyjsx0gj_?_%B9YSo0u@~v zpL$~97O+BnVIFFvPb~|y{v^JjI8Y^}B-tlM^$8d3q%3*7{*aUw$?^5ma%&j+gXd!d zN_}LQ651jL#V&D3=7fUoDE*;HRst!MW@!Os{gRDpxkl`SC#qA>Mi^lR5kkowRTZ!a z?zHrm&Yb=6CqjT$u|K$)afp5YE{ zBcVH)Z#3PYj40pfUxuQqDXuvg>f@XGIHwBAn3`LOpb+C7fhcCBQxtzs`#wbstO zIs;Ve*~Lof>ST6ZrD{{#UYTfKh*7ld`&d58xxgWd_A>5dTjegI`&6}b{?pgkQK4P* zW0|?qsl_{s<8Gy7>@_ zCt2$EM6p%5s8QA66{c@(AhANZU17U=J%i7`bNi}!?AK;m!MtjN*Vp0moDTmrQ`5zp zQ&Vrdx~96DA@uBOn2AWHkWTk^-lZlsuMaph%6-(TM0+#00-tWj|Mz9k`+4xOs_N8! z=eK;PS7mnhtNh3D{v?ap)Bz@+wXF**TD=yqzC<{aNclDz)3)7BNT7?kLw8drrE}-0 zowmi1y|lu%2hhWqU0Wx)7Fu;X_jwt>M{#oo=mp!^SgLIhkA?_ZBgg{aE~Kimx3#0}I>g$ob{{`O zDXlhPznd|Wql*j1D8$YY#bv7VQAbPRiyCI9>OM&T~<)D&C}7+KDn<1mQs5-j3iBA$V~QMl0}vl5o)<7OJX zj^aL1l(o0Z$JNJ6jHz#T!>7t=T1pVYEvBo17N6Rn!)Lg%+#MlXr>?%MW^?9DNR0#O z6IFzScwVQe@!GbFG-uiL{H59{mK@9V@Y%%$OZ{IiJiHJK9~dHlC-HR*2d<=>bRQ&l z0a&2u5wKc00d8l06f%aYzzU{`CyE0*RTcf9j?R$k1zM+;_3Va@LUvpMv z1;d{Dfh!Bgogi@{c`0Ct8&}KL@OP7arv0-S{Grb`r!WKd1gnO*9)e#5H37mik34daiOoU+z^{Kfu?VE_5^IyhmX2 z47<-*-l?DAE>^sTMBafe02{9TJnwx2vBU11tuUUPmdM&&a*Z=cpKn`ZF4>7bJRvpL zEh&H|aRBzO3J*U~aV#^4F?kR`*vPkzKw=0##UC|y*O|H=7X87o_(0`dPg*B=JPlk+ z`qznH3Q`E|`trB^^R2%G+M2>b$E^ED-JLwG5eEuW zOl_JREAZ7;;cHqork}Y{qOz>*5=*GMxDUlu;gTu^u5hWFuq&6qf0rM$)%yLG{2X_P2_qnp_m7{PB?QhYra( zawnh}-c6O5Jge*e^e>vbEHsb~j-M{KQRPexcQ9-wMHb5t6ce-%W85CIb!3xc>MaaD z8qo!&46D+@HNJP0@CMh`#DF;>-WBC6WlxH@E!@glwQ9f#s3sulPZrVMN`GF1Aec$< z7_sKZc5UoM$r0xS#0buYf+G;L2rihlfyP{x4FdLZp*08~^#Bw?w>SZ!4*vFiwp3O($@HcN|)D zwih>qh#1HDuBOZ@%=Zh4F+?RF!9O9kqG)33p-3I}J^aJ}ap+8Mu@;w-##Z+2alO~V z&-cv&B8p=(kPw`Mpd_$4oqmYDct2kN{3eQX67GK`Nr)OvgUY0rLN8`fC^O&D6owIE zOL;ilR6HZD4#Dib+E&4Hs%`H4g52HkTD?X`%tjD8qv@Q4V$DH1R6eZA`|Tq2iagK% z$TJ**-kP6Q*%a>m5H>_=0UYA8NlBlSuGWpc37HsT zkPn6~@rtNJpct_Uj(FcI+j0q~nS2bg`^^D%9(MrQw2$e{(!}`N4>tdI%FT*a6MIs+ zB7S`&>gXF(+i=w;ty55UgYlKl)h{O5MuJL$o}!#-nnnit;l@ylZ3?GhI19D_+Zrwf zw+S71!0?p1DZohV@lG55k_i^rW3INw5-e*15uc42V6x88#W-998GP6|@+6h!0YG=% z3lZtC^`c4?!M6*h(0-JlFKZ-5{)rz$lLyX#8N?fswGP}Sym3SAtASklj~7yaRreq` zUK8soM5^0^fCPX{55y3&!{JzT{GiQZ+Vz=$olb&fj&^@EY zSUa|@bngyY(WZryMf%maJU^n1F`EukrYKkp;Ixg;-fhPdH=j$kO4;i{K(7(pAmE)< zYa(nS$rd|7EYKrKV-5txw-3vh2?hL;Z%d*QhmH%mX_o_PjU}>=kSrQeoTU{4>)dLR z?{(e)b45?B?V=koJ;p4ks*F)wJus#jKR3q+_=OTXtxCq&#$UZ=aE-jp=tB^Ra451M z2Z;*U^r+m*M3TiuoqJ*NlN2e19Hk+o({1zkL~nv1Hy^R+o;rp;kfR_-ik!x| zLIazUZ_+IWrBe=YHU(G%LX{d0Vn;dSnFlH&1@~*0jw8fL2t@~&q7StRT*1er*`^2u zSsSb>R?s|!MtgkBbVk0SB~kg8NHR^$-ff*s+dCMLKbUH|S%W*QpyX;y2SsC`*G821 zX;f5EtSAORti^^&oE54mNLxew zJQ<2Imt^^kpGbl7hL55a1v!hMT^OQCK3!4ZdO)zJIl`@_jbqqVc2EyAS7^hG0}ggH zS*UhkVPLFjG>W`WzjRB!St+$ ztK;Khr-BHUc2Xw$UJsRlXqtV^gdk;qlc=I2@gau8yCBx>EA$H-l$kuXl9bxTZOYM` z9j?t1?;YxKjB&LzK5aCpwKY6Z+xoIN?+SNj7`942qVugMykT@j=2&a9|2QK#rfDo3 z6^&`*sJ4w$%DB}=F2&&E{Vg6wMziXd48DefWMk?(`nbj&w# zM~iAOK^CQ8Zl9nS>fqIB#o0|-j|`~hO#*&B4^VE~f@MzY%ESWdTW;E!wV?s{zx)x? z^F!wF)3OK!Aj@XpquMlbs&si)*-gtoVoS^ClPwS%#T0!52Djmrvla^7vdT(k=RcJ;k;2!BT4 zUT|g#G5cE6C7uu^(vX59n558^ypvg*u|{L1yazph2YXy&1@Cpq)KR9F#}v*^LYB$R zu5ToE8L`(3LDU#cLhk!G5B3P12G9eWC8d-frC>z|@Vv#F9i0Oz2s8xCRoQiFvIET6|#QQG#r zE%&leSOJ=6e zznMg0iub%bj>Mxq_^cc~Hj^~_h431)M^`us!_jmi!-2Wu85x@JNbC=ZvV124J}8L= z;%6sH5zS}x($YUJuqZ2mo2lcJRHPiZ#pdQ=^8lf3{DS1cxP{Ii#n1EO$}LDJt%Ahk zZx5#$-lM)dZ}Q&bf-SjShn}+xKI}hwK1nx=?HIx#c;loX^VEm0!)|aSmdRB#U43|r zH212;o8=ZWQQuNvtVA~-FCDWY3rw-orkAMd)34X7520bAsdx+8FxSUq+7z{C^C4;52z6~+Py;4d{^b3z_Ne^YLyA9!ZPmO*i(_s4a7*0ODbO4wU(p@W4MbH^H%FjCtGr zsrXixj?(YbJtH!Zw02wBkqzyO2x1;tTiI-x)>+#ALzBB1kJM`LA54hRn7+d^xcVs; z-#hLg1`bQ44Ll1mG(!tH{KGV2$^-Q9PByt+Gb5_& z2t83^2TGc~eg`r(&_9F}jd4;33bs2L?Li^irL}V3<=!9aewqSqU8XhNS*ij<9+EU( z-h}1LG1Fh7Vb?pmY;V|EzYKeNsxU8cE?g{mDZc><^gU;FRY*r-1O7IE<#cZMZ2qGd zcldR1g=%TsDm=p96GlqLDMnI5@Vl!II@;^yCyKa+hDuNSbXfcB!!2izFPx-PZCA1- z-*Q@C6J#t;tw(M7`FVpWVs4Er7vA^ z)D>AOj{P3XM#0&C@u6U69fB08&I2D^Zi6^O6`UlXgj|{ARBj8Spy zi6>vgKSS3e-43qPCTLvl9yxgxbH-Nnp+eE!fhmL zT4;@L$Y^DS^I-f%Qa5kV@e^W$aAQY&ZX|cCmkhMwX$>eJ=H^I>J$x*Gl`PC^eQoHd zIZI^kMM4Rl`y{m%O1I`DVT1c@6!7*Khg%N()60s?)OQNq`kH-vdrq$;CsST!A7F!L zGZy1#gg=?Y&P?HGfh>uYr;IOx4c(osM{2MMcO-w~)6?EK$-~ih zi94MX8>;Mgy0)o5OcZoHhw+W?RH_4pZ&)z-UrCfX#Ql}5&hqmuQfZ-zZ>=-gV5H6U z^FJ~QJCz_f+P{+gk`mY^Waga7mvF~0Z|s(O#~7Ko`Lyn)5GW-162}7gRThmtJ6d&> zO8q3DxZuyEa?!n3-%p@ve`7V(vUYOxF?xfo&zUtp0IIQB3rJuPy$8Q}zt#Z49(i~q zN#2hM98Py~r_K(*jII(1p-B9pWEwt2*KV}+N!SzXo?N6{OM72Q1rwpyL;04AceEOY zw#>9My%uf9<6z0eZ^KJq+eW1L>-1gWfqt(Qk{3auBOrJMgjN380Su$y@1qFca;u`w zR6j?+OzK?EtyeV=fPpN_4N0Z+YzD#-8uYNh!XYZh2mKwC)!d%?{!@)d1<04PS_2S;$*mdsA!=ou}8B_KHsz8b2%e4)?f>FDX9wfdCA zCWhX$%j@?1{D5Ts+Og}@KB!r!wSMlrRU!Q-Rk8(xL@5RTn`tw&zU(c~?&nXovS8^> z`Q!I}sPF%FSM>I|+~uxr@Ar>HeAmq^cou|0i`pYjP@dnSf; zzo0g?vMh*S+-^4kBvidrVv(Y_5HQ|1j`s2}Dt-TTzQ`YqP>a273GgO|o7~_{V8qP{ ziKV`~v4X7LDwPPc`buf1)Gtkuz=?E9Pmf^@cQAo*KjZu*$GMD0z(ICNN|UN;yy@(I z5478T(N?K=0F`)?Y~#h}X38Z2#{{(hnkMtuSd(N~gNkWx1Z|>SS)*(6N^j2x^3NB2 zBKu8mub-!@lL)(e!$P7V#pVR`-w|KjXu`n{FRYJruMELTwE?>9BF@M18cc_*Dsn*W zJN1uSR&B)i$s=ppZiJKk%?AiybcZ8sCwOV%MPus(KnDN%IctteAo(0XJ%mp% zR2oq!wZr^7cVXc5LkcURLVrEi8f~5&N&giiY|RF?W@G)u{G}k~5j22HFr~D8+eMpR z+fFVJe@J*@CC%e-x+(;m@>CiGJ}tzyH3m=>-viGv1^`lS5I6XW=$*RI@0sFttLXA= zR1b;d?<9TPko7?k7%9;1_($5$`J%f2MgCjUtbAWKAq7Dv0mS|5uHTV=E*eZ(Q>(_M z?R`VtE6jzhbsK=9uw2ddr$EKc((l)+e@{4olqH1uN;{gvI!N*#+JMU+#DZ8utLZ|^zZ3bi@?$)TQxckZL zB&cJB&h2@p9`Y$(pvv09ad;`OvIk;1FGW1TH!a(IrxB09XJUTeFH7Ef?WH1J1IPZZ zrWx7N23i6C?38b+O8}so8_nV!L~NdkwJFDnv}ncb3G%crl4KGcx&~QGSO5IJJ&*#8 z5;OUp9FWuz0Po`MM?GkAxJOf-NV1!_AxVkjaP_C4>~sIZi^`jR{Tc=(DicHo#Z?Ba zzH0&bh|^eWn&zI9@r}D=KpKJXLloAD)&rbRktrk7wB&c&R9DN*_mInceN$^RoaclV zB1+MsVu<|fNTE3wSC35qU1}i47vfP6WO7G_vGL)~DroV}hHi8NfU-GahJ>F^Wk9#q zn`xnw@jzw3TYtYOL;)xTXl%|nXwJNw`e|!rQvsHH&J#JF09OuF?8O%Mq!Syv+%gi) zT|V-IFx3Ah@~ErTPI#VroNRfx_PkuvF7JuvV-ZK#qbNdkn! zC4Pvv_95(WTKBueEN5fwOB zcfkbzXT(tu;ZN!Gj=plNABs82gied6_(^#$L@HTpZl%L=0Uxj^z_n3rrL9CG`Wt`w=g2C2 zS-OB`HMQ^ZJbR-n&@zn6@>;^ z?I3UxNu&nB-U%6_+f*jT_;03ZZhjve|Hm(*tx3-jf=%6sGRJItUYQ zeTs3c2t2fTg_k{Tg|oftYhrpx(CqVxGye0(ya{H%Vpmy`@xQ7S#lvA{J&hm6qBSAc zEXuy3L=t`DuDVT~igN^%7gRFr@8p$912UQmXQ!gJB?otnFWuo+k46hbXVCU z&IPA;=5s`5t`(<;>~hc({XGid4+kW3j1Kb?)F?jKmHlc0Jy4$Gym#IJKA#0&5LPlq zK3I``mvG@NW_kHH#UT<#Sc%voFs-bbh^Vxcn=TSmc~DPcXQJeQIv-6Xi(tr=+ZeKx zQs~7JfaiVIkYj>^dvNK{?!6EVr7<37|ea)W77a4#5!$kWI(k6XwTgBt1tv*St#hjkb;GCe)zuYsUJdh#ZV*1o-g7=#In+IA&I64&-qWxemI z%P}ma-#fq>4uA#IiWjPWRzMj~^}S-H#j-#=Tmv;r78lj@Dm-Nx-hOChyHv`FL<;}p zTd}1AKNfvmye}K9?!1J^V)bO*ZwtRRz_D~9Ou?_-dKoft5@so+bYB)iq#^!||)b-;S z8tHORR;vgng#0Q}{&E_nX4$?cUxyJNopmj>qsXkimlWEqJV-OdP=ywHZB^I$HNW{9 za#pN5wx+nCiklZcRH>zLsNUN59%OQ&T9r|Y)Uj950viwMi8=!EHZ|mI17BIc0Uerq zRhN_dgpad8F%Dw{2{I-=ASdf!UEpPn1?B;wa<)(bM(H?B)#S% zQL*L_2V5*PYe-;W1gbQ~xXED}aVq*jeZ%pz(H9Kx63x{ejO$tD2;iPVSh^%GQ{CzL zm!O<2RdD4w2?q|{n3@+{d!9wzwx4W1d#{(Y z*!H487s%Nv@}F*%AP4bqo(VhQ6cM7r10dV5Ctu9(rHgLA3~DokMSyb=hQMAtu|(|+ zqBVN)4Bg-}CSID0KdzdzEb=}rG4vyyT1csR_z_qYEGQ-}Jf~zR&<`$FlSn;#i*f6# zBlpO@?CB8IXt;`=@!rDM1t9DhWeuV41Eb78VK+m;mFo5V-G4Oy& z<;GjSiy@MN7{m)*u>R+qf@NUe_dor2OAJGCK{6l;V8j?el$nYZ+X_#`@>qj=I3NYa z1RG~tYal2G7sMNc&z5K^N#*GMe{n3*5fQui)NFgtj~EHYyG4xRd6oq~$DJ|k99#U= zkO&mgx`zD5%TDAaMuA26juv4bqH3Y=p60gmd^#mdwH;wZV9$nZ!q|g>3{!h+4vtdn zgY($Ojr$p1c;Ms6Szex3*07abQq4;4O~IDMexj3RyGM>B+$B@8)spN!+ykWXl*qi) zIIkXhSvp0~n7TGXYo6_k8rJFO)kjBre90QGkyF}!|hQf?N5!VT`-OH zaiEmKfw&}RoiOj$QQWIKZ@&ui&R}E<)|q|AiJF8=C` zIpA-D->E!OQ3t&-d0}w}F_lXF-#CuJtCk(28z*HnF@g9wtDbbD&#kGh@YQY$^Mg|6 zf(%t?Wi6Ee={YIk`OZ}>Fdpf%9%4f)ZC{pPf;yjW10%(0_}m{TCP5!($p(_{`^ylD zuI}=yUe6@MWA77q^A;YHs}9o;GbecwzRzg`cY`IGK8iD<>n=D4Oy>A+N@0p)g=0lC zOg~{3VUe_`F!77dbOlOHWWc^6T(Vri4VZZEZ+qNPK%v>`j77}x@_c$ri0As-8}{3n zDg(y=y^ z6@NAAe>li}u$q{xLRB%iVIE|%aYnDW6|zAJ>WIkW2RJ6eEETtPoUGWyK}f+HGh!nl zohECY6AG*ur^2j2QJW)iQEn3&8k9}=tI5s4iR zL&f*OAzp^mim&ER?Q2h>&KD2sx#SC<&F0A*5Jt`S}<(an*nM(9#F_)Im=;hLfN5_OL5N0hR5B9 z08)6XF$F^7x^13VSG8R;^KA$^?snW@ByETR{EdtA{_uRAjFO4K*2KE%>oAAbn-{_S zU77B^U3e!Q>p%}6n2YVC?6gFKZ)UWjmK8)zr0KdN$nEoSn$JUZ!Ze@w6&0ZX8iY)j zE7$x!HIY6MF0#D-Sqsb&O|q0gj}*ag=~&EyrP#-}a*uS@= z;>wMiV$p}=I6zLTEg3(hV88fTX&q!34(njZxEwCMC0N^Vi<{&?%$`=2OB)rjsF10{ zPy4W@kSpWNhfb~DwAiqGWm#EmdbyUk_qO>v3=Qu`h$XdQVVVf`o)QOYsPDC=f%S@D z+=qh&tzR=d4kQytb%ig+8i8<996U)xm*-Z zOZR2so%aZvH&+t6zEE#?b}Bt(qSAcoBv>5(K{#WDb|je)1jO?z3O-qjldG{wqTauK z;hP^O@WCu!-UZ!Hwzd!?Ou>q@zUJTFyOopZi~~;lY}H#Fx9z)-1#^vL&W|2h=HqYJ z$%-PRpHzNI*pt1LpGy~AtJVw*CpU0%)(nh?J`Du=tTp}e1FoH^A%5Y&GY<1nILynx zmc8OTh+rV^?>D%4Mf^P8`uG!i;KVM0QnB{gv}^Vd>;cScqFt~4Be@lFbbUO@tsSDz zise?l!2tXOt?To?yT%rz?h46C0w2$!&3s2N7`Z%Na*&@E5Ws+aShuM9M5hm$X>f2| zUDwZSqfB?WA7O;0i7qV_r#!r@Wfc>r>g#yTd1>~B>)i;^bXAHoh<|TnLwy@#)w&&< zXn_*cFx`6kQ61-9qxrI4#u7u>Ztof#U-k%pTf6wF@*oO0!js#xI)Bpe>s)SlhLThj z#Y%PC8}^KGdr1f<&t8r9P5+;g5vq3b`JaDQ%pFJo0G|JM$;jE%$Xco$p(tl%q1)QX~U?o|ad3lZtm-SUF@-~VY7!gc+oanf{Uip1m zzT*6T-`e*T0UoX;IKr)FGXAL>y6B9?Zl?^TB+N=p7>SP7oRWOg!tf#9*Tz&N%pScq zGf7Bt5FgO}=Kw?R4@^fV)`&FFq`9567JY?8{}_Zex7 zs-V5hu*0yjQr=dZ%&bYvUJ7KdxCF~H3AYN>qBEyqowW_kjjor*tkje#fk!b}b&+Lv zJ>?oS>9#7;uJCL+;)0HyUalE;hhXcRLXgw;99YSmm(6u;Tj}VbaDlnTlva*0U0xa9 zK@ZJ=?U`~o<~TK#I|==X#)opoKoOQ;$LzcyA}eVfMBtwB++f1(J&e!c=_(nICje>9SirqK*idR+D0G>x@WYM_HYT*M;={D$S9XWNm_x-qB;3JHs z#29&n0=q8=9Mwn?NOZM;df0<9!bnt5P#6jY(d{S8olE10K?X&ZkYvCx`xO^F(jouD z<`kCYNknd}DZhop=webgl||OpbJksL09^_qEeNTO$rVU60UD0c8TY_^bG+PU*@Qm}Y}vx8E9wW4Og(Z|&_#o*~U#+X6tNOH5y%910% zj*ZLRsq}Sms8nHcnKowjeRH~u>RXQMe_nC7iJKQE$=|jElT#>p>HVC9~F-w^m3X7gqV-BBeoY^g`bAa zFC6gPh?~11&m3fdCr$h`h-gTIARRzu+42u@aQlKSjJSuw(l0y@IXwW135vJq4iMW4 zj;8d=D4Umz^QJeW7{Z}TWK(pFj6(qLUZxmNZ$okraw!CrjQ0G+5mrpSLJt3E_++%C*+K7VVobaMgZ|m$hdAU zQSv8{nVG~Sg1>r3AMUK&BUP17c&+Eq{7SU<3D~kE3v@NiA%DFkI z*dJXn@k#v*QRW7;n>^gsAY@ISR0lr%Hf-pK*vL1ANwq`_tVUN8i8WK@Kq|(*8^Y;mVllSN42biVL zUn@Y&?(w9)J;V9I#4vZ5#fESacy6M|5;gEHe9SfUP$l82H3w5J9vP9BpV9Gi-TJq` z@rvE_7!%XPKRKU->H)iK2`c?$!gkVBmaUj(RsLz#xL9^)!dSUhQlu}5e(EBh-Pl~& zHwh4ON)&kH%qLmVk`w9$a1nD$9~_trDDEjpio{2bH09lkONx81&kCW0uh$KZ^ohWS zacD`x`)#@dLfR3SB%vsfJNn)Or0;qJQ@NY9N;SM~`UN#f<>Y+QRd)NH7o9oOg~7)} zdiiIDA^VH|iW0jQipo{qBwnG(oykjn-cwk*x}8>a-iP?J!%W{Km<%Qf1J*}-3H*Qx z$z@?HPJ9-Vl9e(EZL$s1C>Lo4&#&kbIUTu{jhq*NwReeETjkKEQ$RCKEGJZTBQ$wC zY)LhF#LtiLQ!RthVvWYpsFv3}RB)1?hqPu4_t^jW*u7`C7`uZ1L!iL_yFd8r@)%(w-BT!(HJTiS>igxdujj01{Laiw z)$qUHdaoh~!1F2IQJ7^mAg97;7qsx?;TSu-75^Qs6`~fEi)BB|N>6bV8j-}@RjLQt zHG6}@muKXu*~9cv?|;3c(dVoo2xf+vbrjw`JpyOSHGd-K?iy4#j8w3f?b+ z;Wzfk*gu8oGk7B%ti$k|c1YdF8MMdno4kV>yyb}8W&R4-R}FoH@jrsD8~4cBmxsa| z0+suj8W#oi@5g33LAm;iiD^IKAuVLFRNq+2no)mUG~5m1I@SndE-y!q5*-*kA~Z6C zjl@P~W8P>#!e@En88tu1$79Fe#Sv#-pGOe>~>}6O~-_! zCf((DykBIuJCSsF%Vx>e`qf_*sM=7ZX1UNtzE$>-_oYwM{< zAg^ArgnYWGyYM`B`#sm)<**PDeSvYy3pSLCt*+|&874+k92S~x`=IjzBh)ZXMF_D+hsQs%kvIip`0QGjS zj%sHZ6;=MAKGM;|Bw1zZurl~L50ecN8?6EE*lDCVck@^V%^YU3rkMKpX<_e%PEG~` zF3d?oD9n9qEcjaFYidmFtw&tt3-(r01Dg>Vang<0%Vge_$EedscO)>f@6Z=>RmJDe zC6%26Q@AgZ)=({EmxZaf>ef(mr2n4m za~ZfPr6^c$8Cn@c9yn!&WhU1++m2GzrEln}T)K-2j352B2G6*4Vbp;FI*qn5c7 z=VfgCQ*7?k8pO(KJwHqQ$~TBM6`$x!rk{!f{V@rQw`^Y5#l+c})>+FiF13G`@JHpS zt!W{`#HyUT4O6S)EC*)@_&}aJclecyKsWW2&Ddz8opr5cAVpywmoYTX8{es()e?EM z6RRit2@S+S#GhfWN`&;QB-9_>ap&(m!zx1EdVPJi+@6o0@z#J4pamO?B|;whf{gdRsNUT6ZJtbo0Y zwjbk-?x`)pX$j)tcA4Y$P+3NHM2&TdoWqiU2N52i_%3&eaI!e{wI~WMDEOpGHu*vW zJGjk1cD;(;{o@743k^|%UQfgur$(zIq|N@#5+l(a{DP#0q&`sTS^Xn`Q=FA&jOa_A z8IC8$+#8$X0j0|!L^y$z8$oqcgnCpYVHiEfs{HnH2%wqZ5%+M|{)g=*w0p}H+UX7`FrXu{ ziOdnZEckvo*J;=z%U)-oU_#RUlMHp&L>$#YRAL4p{j~Cm64hI37>^f_$9q97QYYSo zeXwdr+?*@lwPZoi)|P6!yhgettGP?rQnQOZ#Y~GN1&-bFGGbx_tWaiCqFHlOL}k8L zpjmWNMrHYi6l_o&JMN0`gGjtNg!ltVyqPrx=1K=0edFG>`1|iUz^Y#Kpjjlq9g^rXjpzZ6 zqxn6PUO$dr3HqET&722tT?B@0$)q3Hb#jRO{7surtp0;6zg=0mN8BDZN*!lpxttC# z>c7nIFYFG9`$NbkTR`~It`^%z4+>1|QX-Ex8n*d*U+?-;uBF&L)hGDZEunVtVzWii zkKgk?Z#volUqsrcG*t+D1}Hcpa0YO)l398>;1JlJkP%v z6B6|Q?fI39y}gYyy~@A8sFRbulai@}y_1XSf5n*OsDJvSETjI)HLkDI5C_0Q+91GC zw6D`>;%PBbpd#2X0Lma>6}JwWA)&n_%*+5OX;-z-+g7PY^*zSH;{0i{f_Px$*ugk8LROI+c4)J>U!0*$zMj2VA-o>+67+`FMeVQyweyDqdkC=XF5T1O!e4k$ zgnJd77~cDeu*88O4j6Ow;)-Czf!=fE&fVt#ga&#b$wO|-UwV-J2@>R?4kmu9W%%Nq z=Po{UK!Co_j=hb#e=OuAVuOn^6JaST^fZK0gE%iTa-a!EcjWn#2802N3|=kUx}3LFM!3{5xn(?}Y-UEVbGSA>^%n}NX57pvHp8(s zy`sCsa72!I)fU#wcJxBqdQ;O|cLHZF-*%B$$TV znWd4V`3hcmS<`1yMKUIOs1qbN=h;w>4O>c-y&1J4)fn4#DDmb55fVlqaO&c*nCRfZ z*gBvkC3=w->R2ov?Bt|PW^v{pOZcNjwUGk%tA(x)Y^fu*n>ABXoQWF#Hb_$U7a7f> zfrZ3-^IJ?LYiU*;y%9Z31Jh;oGF!0+B6rGL66O0^6S~nBJLV z(VyxZHe5Vp`SI-ojnC|Mt^`-76em?kGi&FPB=dntU7|rHB1f88ZcBZ#B+}+JZWfl5 zY7~N+8S{_g;Qa%~oPA3MPM&tX)aq~*poJdhjB&K@Dug^7R&`C6vjfSC`TSc~X&J0M zkyh8_45aniGH5vv-C6c@OGPb8H3I3*pvS^Z;?*SsV}Jh{qtF$N!fFg+?mWjtOY0i$ z<{kcgshhfO;S;EN=y-2cYeHwIZ2t;u$Emu=g&ZQHIoWpvr@ zvTfV8yKLLGZN0j4XJQcXCfPT*sG&I*guCod0E7@I;E1p zW@gk;Wm9SY=zw?Lk1zcjC9TIuFd3~TP>}x{#Y_U#Qq@>hCCZ88jJkH=<^NW-}P60ux zxvXs0!0_b{yawr71!QaMpZr!nDMUj{4=I0V=jpo4baX$LYlmN5-E<=Qn+x>yKj%)L z6Mgme*rZ1wUmCMEa93!6IO7u*lctEr-@9c^y`r1*_L@Px$ts);h+f(iIf!SA%8r8+ zWi~sawy>U&tr@Nb?85x@ZyTi3xB{lurysv~u%OQe$e@X*P4$~?ci>#7_(ktOL!O2= z;;H$6`SfNxy$^Kj-C!hz+fH{HB}HP<;IL`tiH1Eoy-##+-BkIm1t3;NezD!gWkPpF zNIhqz+ealPjgL@%yT`vN_c?C*Sl%{GpoOuq@hQf7hCN+3gf>^dO}DL{vfWWorXrYA zxCksM7UA=i&$3*Ep}eZ85Z5U#&>Xeh2e$P_UZE8y@08QBmKNuTDFBga$?v?dX5C

    `c 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 <#LfCUh40}kkZw0Jqb$)7SnQpWq6T$E91&Hy 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�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 l+;2hEw0JHoWL_|J?Jh7 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

    DxaDYf1xPSwf&ys6;x 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

    0{3TztkJ@-Z@KkD%*_LrV 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 z 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

    0b%ep(3wy3!KwOlgSOA$7HGG7vpKsu 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 z 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%0Ab}_-&7u(Yg#%)i(E0I=c3q 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®8>sI?IreWE=&BqPm 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

    QqvVG3S0iL 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

    @+Rj8Wl3* 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⁡3_lq`xCDlMnk^ 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

    #Z}Xcl(`rh0Dl?sueN zZJVGH2)UAPa^;q9fPbQrnweo!Ja6c4{e3mw%{+@zw?=+rmPGuFX7<^=`Ct=(IHUlF z<@mL}i#szTQP5bF*AL6+@&I=R&D`qOu|#flECZKNUGl&d)MNO{71@*YseI~`)I<7x z%oB>7l9<^D`?QtVB$$!Vu@$?Fj%yZ!`lIHhl1k}n2|s+6A%nF<16*bdP9-o}RJq&j zFK>@Q^m@cDSlt_EPojNAIT>FeKeBG$ttIL50hWJnRhf8UmujHq4;x1i%I_WGHKb2GuQw&ZZ)zEO*oFQMY-WO%CD1kO~b zstnYB@^Q#DHgV`SKh&KoBJA1V0EVv@zG0gG3-lGva?Z4^7yZs+ z)A)L+RND1$%YO-TI81zH2MO|Sd;~xuG&5gd0ao-AHR%%SJS5PN1@mT5UMCe$gXipD zWchr`Z^hV70NYWm8!=WKs=GptxM+)qLf5N@x2QLxZL{f+MfzR_R{gyppSiU>Zp9UQ zl~OnA+bIR}6Mp>-b$3rG`-$1`eUXZ9qZj^(nUlnp_U1D%`^hSkytD84hJ!Z2)w%WK z$L@xXK7n^9@`g;C@?zWc8IOl@O4B(}fp&7QE2N(Kq&IG=37taY z1sJKM3tAV{XNPeFQ#(D2e|T`d5oPt&_%Su?-Ux43&k_{E5QMAFq{+zCIsaedem*eEp({#C&ktPj- z2tDSl7n&JhpMnI#z+e;?Kdr$tbU!YMS|D3^vfL?tLO9(lAa?TnWi+X2Fu7@3UNd>U zzZxJ5j2qDaI>{Z0<0l0~RTt$DeTclLgkt#9sT-=#AV8t68L2O>H*4TC-0sFrWYmj#-wCi_Vm+vP9{NkI$absE}X~sFHmrhJX(f01Mw?*-15T%_j zw_7`&2Rclru49mI!>?G?q3*6tHh!r4E+n{M=jzi~Y+L8%V)lY*N>q1gT&klLf5+eyBwlNLb= zrkI&RSv+T=nynJqw8$*nv*k*ug>H#Mpt>*51a}*xu31*r7_($_AS){<~UNU=+_t|48Pt zV}gLupQ{F$ti8!tpqVXW0|c-ngK40&gX0W6iZuA=gGX7UevMASvlV)GRj59E$e^p? zeQu8EsY?B#`*P9eO!JG@=CWEb$xO40p-N+8-bgH__WWzPbaN@ItV5-(>AYE`ILSKF z{A0<6^hW7~UVpLZH?7=6wx6pOO#yzd9~WCky?2;tT$n#Gdz9lY%p3AKc)n}lXw^`9 z$u(Ul#SGcOYP zw{ZRJM|^qbC||>CCUZJW9Y;)5tmxkQ?X)?ylr*3=UtxBfb19Z~(@HV*gFr2SvZq%s z-9@NHYH~98E^l68 z((AN=^(Moag-dlY{cGG?hXlNuK6JKnP(F8GIA~rR-bycSegfN#+Oo8hZ>Lo`kdIe_ub&ZceFQYYX-7i4@IpG+H(QtEph+6 zPlR}XAroGzz08BvNhFceg3hRxwn*2s&47PIGMIijOCPy9;}E6QUhsYHX&36F(n-W& zhm~T#+KYs5uf!q_rxNPV9EBUpH!EkoJ^h$~*OA{Ri7@x{d3t|+j5PA@X?jyRN>B1f zxWsg^(BxI=wSP)imcPMgZ`09t(QL_@3#zmwex?fjE1KW-&v;|QS(3A2V*X0~2wRr< zeEH(+l)0J~9soDc)Dwmf;9hhc%Z@YtGT9s1Sr8T^VidemPJq)<0G*7!+_#cxG#r8) zKMLnCQx;u-|GejdBnu(3GxEEs+KPt{VVJchwD^g52|pGofEP8K`{`JRAJzN^kX-Jb+~ zQ9`dAEHLgI=Ez!{Gj)^k?=Bm|Pgsawoq?5?%qV`waK5(Ab9Y~0(T$UFFt`vv8OYZ5 z{=>0f1#gu%mTB4_XFWi$IsPS_4lBml+_mlVyO)R`v*QRYy7Sk3^DN%@Wc{qo^jL~` z%2%XR@7iDjek54Q-vK-dNt?PH*&CvmB zFn^cJCZiJQ`!=&4;Hi~5XRB7K&Pd7iEGD-C*e$2PdX(xD{Sg%#&ntX>7o1e_AESXY z^)@*=#lVUtmfnjSAtF;;$<;yIN`g@4g^4W*bbhII_CLvn z^uxB$-7Fc-fk#n($mFA)#1P!q(BY9>&dZBl*i?*p0&0*%%tC#^ED;7&-O8%n>) zwS2(|z^caxsJ0JGgXERz$9&St7F;9XVgz>wa6BRL@;#`JzUB{?=9hZ(kb%dU5(rQT z;&%ca%xjEP8_+#)aDCr8@M>Sp{b-K0M|1U-G6eJl(YAvv&7nhmNu-QX^g$Y+<=1m7U_aSazUX)v(SRNipolQHlmyzs z@}R;9u((wwv&U{mlx+ISg-Tu#MU3v(7v?a3yeeHrRKwR|{&D2>T}ZUM#=M7MmkE^y zm{Y8V8ba5i3DOBE)zc)BWOSO7;O{Ki4eFP<=R!!{=S%)Oaaz;);Zrbsk*_Bi7&}#J zsmzfaYOCK!f-IUQASz%g%CI$RWydPR*qtAExV!~G5mKRnV|Zux*8^Nr{SV9`(T)g5 zF#zkMmQ#HTANM;bjp5?4S$bkjV!YKOvP3}e#}@>WNpKtp-hzY$UyCP~&d{iMql@jYBb zZM0Q?Jf&p*QDdpjFZ+gH11u_}q0$4OGnJ z(HKK*t(YLbJj#Yi&VoUmH7n|nGE}*;H6s&4_wmEh#$FS(^5-M9z!UC!Wtgwv)RRv@ zc8A!(%;OCq{~KU>HvMP#jgBP@%(PL~WMoB6S0wlki!S~J-7-kKLHiuc$!uh^WBv_R zp`M@&zw7tjin)QFX0#*3Y>nPw5Y2`)(7KXC$$3%-4k9G0W(q7EV`|`rr*eWBW>=u2 zxfsKeQp|I85`enLZ!U@eNgDfC);L|WeiYcz_(J4w28NckNcp6leY7LnTe7%%}K{SzU=Om7qslOP;d z5VB?uNQw{e|D(Jgi&Y0+{cG8{DeGi zxtApgi9Or7ti-E+<;G&^TSyl5Q10R~fkl2@+2M9&eDQ*4t30-U|k!c zNZ()4;<`dIXS%?xrH>QZRJK!$KGbTWj6e*u)mf^vV&J3yGwzVGcmKP9WO*&2`tXCx zZ|D7u4|n-PM$9cWpsn0}+I~y`^25=-ip4~+0urk`+81bUE9W}~8Wz^}qVx6GwJUhf z7;ii9a)3~$6)a=4PWQ(sK62;}C21xjCptp+Vx%q^8CDj!Kw%q2T+qc>1(b%-*L*NS zCXj47J*7833eh!@QBRR~P`~upuAQvJUUqGs&TM~EhWPM7pM9j0ss7c2ewC&Ek@DuZ z{&8=FJJ*11&N-8RH3c5MBci}ct3A-P_@I}8c!DgUjhACBdAg)25GcG}oG)1wDmY}q zT$wzrwl@=7c{g&P1uU|7F081ZP;X8kdgHOm%r!ll{uptj%0I^p#Xvi^PII1ini>pf zRWDlb+ZE^%#~ut*))xj2FwY{Zj||u<-R%3vqh~RC+)zdJaAajZ&l8XZ4i^IC zsHEeA5bm&aXM{2_9V+1Ml+w~Y)LV%n3BK=+om>;c<_LlG8uSS{PRLQv-lo9tY4L+P zY5C{-!8q!wNW<`U8#~d^hi^4mh#~StZREtAPPz)t>(^B6jTPX|_X2l8xS*Waw_f9b6l=&E3yyq`rl|67-dfJa>Kx?;C*tJH^J_kO1$Ieq4l zDbv*%Kz0=k;vIgL`PdRc65lO2eb9>t&Du?%}?k@=X~E86UJaQKqR23*$H<)>I>sim87oE^a)3hhAOo)b#&{*j|sJV;fbv-_zUK&(C`#*yMe4 z(YShI21?|s6I$hu-|r_6jNN&KR4CpJpE2Z|iwp=_Q~&$$!6U`%70;q0>P(BWVB#1bJV{f#Jo{TiVT0{k!UxGH%S+gf&;8f>#TQqg3u3dOAe`h|~Yr`XM zbiM7sei^c6$r3_5Ovr=&w=FdI1H(gfAQ5NMese0m)1jsC`Fz8O3M#49QL=AI{VIZx z|BG9nEZ01a-hOOwHsz6642F)XHyGBje}GUw!{K|z9m2w44z-47*H6TDve(!Hp;49KX;O>eM z>OWuewn*Uy0%a`mn+fo=KJmPMwx(^k5<)+H6K&_msUdPLo)e0Zvy)}pVu@X1&EfRjQyT$&3nf=AMqw@=8 zjdtW@&QAOcl&9@IsV+y_7wz@71}tZIxn}nn#k#?*htE|@;Z)%f{GKvYFi16&=!e@~ zd(zfeuQ-#(H8fOy*rvzYW*=!gxqamzooP9jD*cetd>aMlD zcl!-gEOs(x%T->BH4%j}Q`811b+Wls&$IZcErz-*P07C3WmYdR!*iZ(t%?^H9e@)( z?0GG|ZLz4Q2~VR(aX&jtT3>uiDF!mWrcD`c60)|EWh>W4?HERvb34$5IY= z7dqTx=!afbY^u6bkAIC6FZTLWZXv^aHS5pv-A zWHEamXa{XwP%i@NStJ zaKx4wqxZFVv2FBs;o_`-z#O$E%HN$8W~)ER)7|_}4kAuP2)4FwWM8C2R*7l3Co-iT zu}qs^rCxD{M$Vp%yJ-Y+@t(wSz&@qLL(dLY9feX~u_%tXb4i`#kJS%T=o;TR4VA22 zTs`!jkSp^h^^bsRZ03UEe+Zw0KRjOR0O3wVT;u=VPYCQzck!gn4Z#ksk_e&v{YFVO zc!{XpYU%!KO{{x%mUu4pwJYgQj9w4xRW9DuWDwRi)y({RMH-KXB^AAmD2ZhqmE^6{ za}Egdy^%*=0{I6S(cL$=6m46301a;+UFeo)1%0mKISO`k`*eP#x(*)a^HoO08J5u+b{r}dHEYiG) z-(+?Et|{S<@_Ce63T-z^(6FFNN*}$yCJwKRr?zP`SV2n{b`b(bvhu%7i<7w7519l$ z(fW$Xqoo2p8MgosHol zk=Sr7Kg+Den!9TJQ6E)-T&dwJuSd=rf|ux&&!Rfg32XUUKSf&6y-;A03CmHsXtWw^ z*iU0GDKObfX^7|v_1K8e*p3)>&L7zW1P3VXQ1D~i@(p*lX|$9ev36=P3Uw}V z)^9tqYiR=qg(O4bkM@O(b8LIY0w3iIxYk@0^L|lPYE?x5?_ayEM9@IBGRZm0f;g2|nHM6WN?^vq0OeQyJi1m-F1nEnvirG4a{f_vPm7)_Uc5qt3Pck$RtkvrbexaNcs6hqvpY)xYylLv~#- z*qRw$TDdVrroj*aJ_u~E^)%|0#Bv}x{lI)hc8Qc)Q5dxSBBpl`Q7uzyD#LuCf|vTN z-y8`c|HYV@E^Uv-2Pwzsz>nkW0^|}&sk?V5_dK;fJ)^u*2q!8Tr_l{p3fiU`bPKak}v4Qbd!#CUa?$k}LifQDk)n_q2%OE{Hy z`yke&%**8h(2{*j=LqKd0go3?=m~0{Ujyd;Yci;c*N^{!QMxV)$c=o=3%UE6$nox} zi_8n8LyPsQt3yyl0o;TYXr$vBT1HHBLAmp5;fn>n^=g-(e51W=5 zIFINjV@o3PI{hPLr-?LhEe3m7nW+84iRpkY$r{-$|2)XL2?<*0zgGj%>j<;XP%Rs7bveL{R@topn&m z8|(F|{Zao}X@~4wq)he3hcwQ}fHKDd;xTdCWdq-*<900BA;5eHJLnt8R9YR3I-eEl zr^Tl^$>}_SCh5hGahzcai@;=b5<*Uep{?CV)zmS!a$Zjz)R(M&A)cEs` z1|=@eLb4JH$5=xFN_;UwhZDX&tfjs)Z*)eRSz<~`#$=a$Y)Qg6eD4s(>AHE_D_&W+ zm&hWD1n0XNM;Ie-?ZnuNMa^5bx*vILuBHX)TMSO~5 z&U<9dxI6~OVI7YEby#_+oB;{x7MH25NLP_P&(1uX!;_vT6t9(X?a!dEpzc(cvV{@k zd~=FigKLGTT#j|@VM~d>P!vRz9vylW$ifGvDTJ%N=%3I@yJ(f;tJ@qN)y49Nb;W@~ z=L8uztt=b$*GSrJ2pq&f;YhIx-0yE}qSys2XPThYh0|iKkPE&NI(zAxap>M7FyVx{ zrHbb@1pY(A=vY;P3aCJrF#SBxf{JCgopjqh43~PBMmf8b)th!Tl|s<#tj8|-h4K-E zFsUBRgl91N@&I6i&e-Vy_oFJOAWFY*iJ8q zQu|^xs%pA*FVWx);%a=7!$4`+%#T%q0;+HAl8`E(HO(hAiyWzD>Y~fdM$|D8kM?A+ zs&4sFUc~9U(WF~PZD)yaGB3Y*wR(@=q`4Brii_pA-YxD=wXDBfN0=_49Aa z%nDd+_x+d9O1X)RI+zt2w99x&oZB=kJ%Onw1~MKot~`j}oa)Dv!2P}WX+;rB*(kvZ0Z3hb)7Wbjz$Cwo3*XSvI2^>nkVUb;oAUIMC5bVTS&TVP;@9iEq;i{Q1)@q|mA#7s40qQaB+_aC)LxBx5O55!RT z`o!6uz{O|r%LIK+Z2mK2x#W9NQx3 z@dhesY|XkdSzK6YqwqY5ua=}x6K{>dQ3TE)yD%?mL~c!J+(B|P%;UI<85T*qJaQ!O zFMUn;Ds+JD{#$Kza`54?WWFRR;vqJ{bQ^5Z7ujv4o}KCW-uSV}@vrzcB4wIH?ZI=r z$lbIBm~wXtU-PTUN*HP47L9j9{i zMJY|KyW=tYBC309M$!K!Y27LWAnk@cIX_b@+*N@o)*B+ZFXoR?j_tnfVyK7$487MJ z0C*|Rl!*N9v}NXJLb%x{Mh8#qg8>RhXsTOrCGwxL4KdS0i=1GEaq@CCgN3xdhM7tG zrhi`~Ka*f)hQ>7&AFPh$$gt<}1e0cEio+(KcA4?H#Q@^zUF5_=!Ymvz)&XwIUK(a^ zz~W+`T!P;7D*}i4U7o0N?BYi?@gY>+cv#kVH*l(nGyJ>2ZCS` zy}LLbhcL2=Xe@oAMXKV2HV@EiSa|02RVhjq3se4y?Zgi!glB6Yb#yXCGsc1Bh2+)x zCH{psa-S~Vg)%UCe$7{=wZl5y>7R!G$k~S28y~#&ep!LhA6mhZ3dG3wSDaJRll0;2 z*(|^0`+Y*iD|To8hybV`sYJn%P5ULsKcwY0keQXtAF-gQmbZd5HGuc48!ForbS)`~ zEIRA}OgzouQ+(;O;=nKX%c`ac?46#Z_5CvMNFRF*UF@Jf`9*OrjjbWamag6_r#NP; zU(eSyf*Q;rWvH>3A=uzo0Ps!ITMQScvl1xef`n!*t2QF!`b$yFfPn?me0`$g>y&uC6spG43N)nH_1|CxFhkbK+7yZ2!%;ada_)&zPB}1I13qqKcLQ}9gLzPkK zh94j#V}A7GA(l5J3@VY6iV@gC=9pVU9d)jh%yb1*kRg^R5;ad<|zCk_ZH_?Kcwb9eyFT^}ty__HgkZTv% zVxQ{nXLENbUYfJl;h89|ndB3~{Lj9)fxII)DoPvJNp9`e53|v_%kvB#=zF6}@`u_a z`OKp_Nw0+P;i_=qLED1OrY4xMqPS~e{%31(QT!ETww3(08h%!n3VY3Qm$KGh@0Nm; z4DO&_M1a=72GMaI^umkj+&y**jaS%jj&jRQ<(fr z;*5b$3AzjR#n%6z3@I8Oq5689FC<(H$ttj8x2r!GN2*=G@fMLq*!0s1>d!7&4VLfZ zgJu>bHJ&76XA^-KS_Vw-HumW;5pvH{9k>c#h4CVmRs_k}D)F~k*M_SO7dKd^O9^6_ z#saGd#dL{pwoz-cYRbOk<6j=v$2Hk{x8|mLLut3aKTu?Q9Uy?{w3?qht5GjA7CLo8 z&8p_JM!0h!q_a}Cm-lAhWS^zhB*=1N{DBFQy&EI2gY;iq!kMI9g>Nx#3Jd+?r$0XO%hYvrEB8W@ZVL@ zz&H9Y71yqGTf;|Upvm{(PnW`lO`&(zsXCkF8Al@(cHIguj5-iUj?J`l_cA)~0<#t_ zC)|fkcv_UzqaGs+2CL8@&!l`h1_yQH9l);kU~Jd2NueG?uWAe03MN)NVLuJTnkKG_@L;qs4fre`G6^u*8oyUa9Mx7<0*!-In zUibeC53>%a;OhUy!Q6rc1LObS_llfNoh%J)EWJ#b)Qp`h9b62JY)obB99&(#Xql#l zw*N`X%+l0VTbIQ6w}fqCf(qkKErUo>RtNr+E+>=VACNdym*5~nB7?4NfQL%LQ!kz- z4|rvJ{x(T>!A?0paeo^hs`y*2#N0HxcThO}X5#WJvtj$?ah`|n^W)0CrvMgxCD{>5 zOP3|MX7DUM>b#W%Xla-c7xxvicqZgpX&}0jucM<%nHhK7=;}vgTFG{+qmVWtf2mB! zq0&p$k|sZyHty@fRqwwc=XG2rzIIbI9MBQw_{v^3KSIKr)4?sC z-rcOg)xwG)kA$kCj1&@IeKMPUn;FT7c-$^TjRgV`eu96Xyz6{|J<%Tsmj>}}&KxUS zqJfa-fYS83n0$L9i~3u&ECUiFmdqm+kD4rHxncKI%m2#?KjPq^ee#PFkyA?7nmr2O=U+OMF9A~G`_#Y$=< zOy}`r95VDSlbl9c6e>*apIGbqss~}lj2W+NDd~lUzu>otu(Wn0&Ke;GKu^{rz<}4Y zin|A{Zg}wmcSkkh&5D{{2OnFT=-t0J48vbYNmirv`i2X{y0p*V15JY5==sC?JnQWA z)1Z`f;rA*(gzA<6GVdq@QbV&Y#`9`1nAge@5?Zke5qP2lpZANb=;~0pEA7?7)?LgS z{gnO)UZw?Vroru9Gr??~nYRHd(%H0zwxZ#?w!^>l`ecqOunbmh^7=!}eu0qCZ=v-P z_!VX(0eBbWC)8P;J1Hx>E&B~a%)U<3U@)_>c4YPv%gB=ox%vG(UW7#@M3zYN{F&01 z0Te?3(nJ`oS(i`D{?%}9D%Sq_UsVxeOLBbl6i=wld&jF``l8g~ z@3)jzxz8|;y}HqH(Vlc7RN{PJTd3BjX>be$fE4a&@m=`G4mzH!CdsDadqgsq1^T=P zX540FF5T4}W5^$`nKS2e3e8>yT(*PJcq*x8kiQz!B+)+lnCu962Z>L_G)x7K?=wCC zC3$B-)R~VY)DbnsNAq(gVWlJP9e$ReFyS|;P6+99$PgfpA>sXdiJ#~@$C?(Pz}OYJ zgpaS{gmg|nYt!f?FE3(C;Qr$Vq5yKfCrAx)9sm+P`p!Gb+8RWy4OMZEDt`&pP9<&o zD`^2hW`Hbx6ekVwubR|BGx&t}g#?Xd_oPwKMr*p3B?YTf2Tm z3L8Ub=c;&xFWElq;m`RNhN7aTAK;#-Frm$ok0am%Mbv%liG^!#jq*!0>uF~0OJY4h zy(lc9Kynl`WIr%_gRU2esA>5Ol*BLT>1n~5o)@8pw~OVJ8tHwUX84hv8~m3F!X*J4 z508H3a0znH6?7H)CNJkNAuR)zL>(OvkZyk8khES%u&d{pu=3Mngjx^{Ve#=#&%WP? z#*VuJxkl~uA8*Dac4&miho13hLd2GP9K@7$)$jz91*}=?Eo1^kWNAn$8jR_9oIA}S z@L8T!Cka3at0-Ps4JS|a^E5} zoJ1lp*6q?krW*^!d9S%*5%1|j>*S0aH!NkYT(>Ky-TF9!+OQ$a6GOm;rSq8y?o@Zv z>g+z$=$CYvoXmy0dFAP1(fMQh)4v-%n>nR;aIqgW^kmSn@BG5E_yUc|cOtrs%0=>9 z;2=&li!FbS90M}fQ!iQ*=Y?-Rz2E9%i}g#5P#v<1ShTd$>wLV{<(oZ27LJ9Oi3rSi z%oDbryRRvLq-QJtVw!2ogr+-IV+Z(GwpC2#$5GVbyaGJkb3Ehpvhe}1A zf!Ke4t0*PP##FxUFGmRzdYz{C!rz_?x=mA=maKmddzR+p7t4iqendBEGKTxXHU)42GsF0K=8KzRrxv4w>cIrn>C&Yo~Ea*ggY3F}w6VU=i}cFwn)k;3{?a zqS4H54qq$^K0(BNA-7<|lVhJJD>-9`uxmo$J1s0Y-<7OI6_QTi99Q;IL$#qU4^9pW zGebfi4O`AE+qbpUFzMaiVzcN$3nGaPq42}9mn5BC7YnH(D+i0vY&V%j_VUB(fj-T( z%M;^A#xAEDn@u80{mC&4#i15D7mO0&pI`|HuMcXn48NOAbveQqils6hJR`PiRoJ(Q zx?}h?19UG6(O&F)I_LZpV&Z2FhFG?HCA~}RRB#FU*rlcq6?B$PPPEnJ&bvimxk791 zRTt~x8}Af#0M;;YO5MF!Jb`78Kn!%yqh?+P}M_fzTym12M(#Sl-m#oW5w1;CIC~#?+Y&71ABr;aNBI!>(o@5!;;o6(q~f=Ke|m#z^IM8FPoE zb6FZ?dV~PpeO$L=xj#vd8tlAWu>Yy+n5$KdZ5uFY84ibub#iJ6Hsv}1Ij|O8MX?=Q z7_04OFVxxf0m7BeClc-(o2gO&I6AO}86pj)8Yztk9UQb-D~@Py%X`wm`!om_30^7^ ziF|Vv^fXao%yho+9qk24KT+GnWd-3ad{{+)+Zg%Wf8Ns@xba-^Jh?>U<9Pp|qHvAU<{im;ie1O?5uv5MVjK>46ulF>*f%nR#-Mn)VpvStU z$INJGd|FrmPni@rieuV~sbq|nTF2@wJDROpFQuf|wlVKH1F%h^TF1z+5$9wjPrv(Vt$1#!fL~o1N zhi}WX4r0aG92v%EZj083NJ%RmXOWv2l9SIpfWEoxpQ8lr z9WY#nKixOThP+6|oCYA#P9V0yur2pqpRVMkneh+8yhO;5{r*k#t_y>7+!G!Ch~W`C zGSZnaeQ+I~V3%FNGxi^4)=c&1T#c0Zzm-2HFp^916I%Dt=r4I*q6GN`sZ?`vZ$?=~ zTT-~^E@xA-+1Nd8XnGtuMm!!}D(_dsV3=or$kKZIjjw_EsaU_dDj!O@$!^JIDW{Wb!?{l1 zNQ{y@M^#L2Dst* zG5RU|vBl?3mEqDNDfn_Q<(ug}_4FUdmhZ*(beF#s{eY0QBOelO*d9C-f)7hD)1s3@ zsKq75qzFNm(aSh*x6w{T>v-?-wd?GgB#b*Acd)nkodUu3oMTPQ8v;8F$5Z6hw|vhT zVQl2n=jH$yLe^_$!r7ZF6iI}y&mMd^?CQf6OohNt6I}3|&HU~=%U8Ki^G)uiF@`AY zhAp3mlrtv6OrCu|-_z{}Bj((6c%RC*>HVKDOu@{k{WmCz*v}*e7~TN5T`7{z%Kbth z8>^e3J>qHxfj4uLl31&EOVhAyVbx#d{ApL!)jTuP#hD`dWBM$ZTn1Z}nwTv+ePPG!b$>yZIqaD*Sn=$<| z5|quY=A@i2U<?7AB%xK?zi0m0pyU25|=z zyPlreJi=lyy?N=Mx(3EB-5&s5qek0_zF%tz|CxR7um$Wy@2?aEfyVElifk9c6l&!HetT zYWsPfx_aI@8OqR&2Gy$7w4(>MRf#YYfI2yHJ)MKN3qHDw@s0YBALb>%qxdA!!o`rk z{)ra9oSvWG>D$%pjEqjW+eS9lF_}4CA zLO4FjQ$$jlqbP=8+89l~@JIDdop)4RVQ@pkE^lg|9?%4w#GH1fjhnb%Xo=XT=qzGW zt03Xr4@N70y8T59w97C?L}nAF2!N*x4N(yaW%AxGp-j_F(cYUI)$V|Q+56rLZ)i@E zM0hfWR2aYa?tv-ZF{T-iY~*^RZl-al9d@ULs;iHUpLoO4>7$o}R3$(~c2Bxo91q;%v>17>gd(0i~nJL<%apW{yjLRs08w?Z4`=D`UJm+$Q z44FOG%q9r>&FxN}KeG`jANTet{4sKst zCPzBVbR25R<1pl~@&ckUF3z7j!hi4Rqqo3O=s{s!k`=!NS`*I!W^O2<`Xmp<3 zW0eAVIzN{%@I#p}e%r}3lD^0rbUw`2=w9VDEfF@tS<663NLIwW}`ef3l_B=SWs-ZNjG2jx<0;8_YeE z_l(WHoOPXwx>6#$zXu}>=k zS>Ge;JNo`Ul{caDRg+~GXuNl6f$VK74=pW>OTAN|$t6^@lhe4%$H~b@*`)BH@ z73^$<4A-mxX=2WZ*Qs>WMmMNf(v9C3h#$tOcy{;_=qc%vEcOU@RBKA4*kwFE7;*ok zC$ZD{g5rL?QR^VhYr;?M)m-tw`9hnOaX+GMbLeeOJ)BcJGR!+e$Nu#i)8?Nd*Mcq# zZE`?gB-C05xP^TLItaam0aetw`|vARk` z{FH4lsSs(0xJbeUy$=1S1I)v2h>O!K_tam)K8UHNh&E7yGl^S@ON$brVgsb}w}7Iw z0vy~4v}@+%z8hp~q<|Gx_^BIj_HYq|n~tdTP9DULKdQZgBGDq+w9~{M$Ph}PwS9Q9 zfT8qW?5TA6q}quPUySa!q}Ci1yLdA#uMD{{lNQ!>>Dm;z96VT_f-#!$Hvhke+*)Fz zhD2k8-zo5ozbxtoRRq2d+ms#uxa>^2B&6;`d1MLpMKB~1TN(b(OCn&Y{BYqTxf*@`2kBn=L5o&pAl}_ zhPEgr$5kv zEw(2LBqFoq81E{6bzWn6b&e3CB|i8d3bc4E)vJU&82b)N8rmb6D+^_cIx(te@qm$h z{&o?l7d$P|jQGcLU7(o&B%woo4a1nzO$hr8F`r_TPs;e1LiMc)_rXT$bO{^XJk#`z z9soN{5_9|_%Pm84=0{@_$sW(GPAJnXrE=Gx{Tm zOfAns%X^D{J*MC7QAv(PG~T&J!CL2zW;qoOFnVZ^ru+`y%1G99na zTClWfQ8eaL2ux^AKIgQgsVr*h3a3w798;Vu+R)LdW>D5CQ64KY0aEGI>i(ik=>CI4 z=(!gj0Bx4K3tP5PVm{OzxDQ%0Q5&&97V+&* z<+_n+IofO((P1>UoZJ0*T0t`CPsk^%K}8=;q<^N%y2$@7$~Hy#!>7NW)=yVF2SzZJ zKgauTpAt?{GNsdiJ7%wDqv6`e2(;4$T!M-=S%E4qvc-#@&m3w9cbRZt!1y|at_HrdEq(QhA zXb$lwYOU#qGNG8H3?XE2m;1kvqRMB?E0!gRHgmA)9yQ~X!M|j(S*|UxAGWJIg_!Ht z2mAKR7EMI;W?{yp*}SYhRFi!t8hzj7nk}%S4$7HgtYvsG?Q2bINdDPaoRB)nIQJn! zmd5V9fUUoPo5rBQNl|VaDR9^(-U5Zb+L^^3tE(r*Q3Q8sf`J(77z-rxkQL+OWp^R1 z&WkLwySLyT`AcGUC0PU1Y_tr^R{+i9c1M|)DsmlV7VDJRIn!n@USs-bfR@>P2)1Xg z75GbbJ$>XrEgU}3OfY{4pVLf(uH+l zosdI!-*62KAwOXhx;uCOuuW#P)BuTgG%$r0uF2ki4zM8D-WcHSJyfe%1~GE;x%SDc zl3cZ^uq5kYUN<|P0=b$oDSi#P$SN#utZA-#;SATp`L26qtgDTuDTd4}du7Kq|8ZH#sr_P#8 zGe1^Xcc`=hawygh^)ZO+{{qB^ng>6Snfx3?bS`Yqgv6!waVcTwDS@N<{%DUD(5!&8 zkkrMbU#;RNn=0nzyQ0&_VL(53$DpqUtMiJL ziUe?~7Z)`aZd8Bce0ldUEd>;Eta$Q!l z*m$YEYBDPA%z;fpMiQm0cIiH@+hbWJu5p&v94x!hGVPu^8ZaYn7{c-~N1>J%iewHr@(VAz5=2WxSe2=_h-dZ6l(Y9> z57XrHTcD9WQ>z#>h8bfQ**zMDVh>v8WBf(?#x0hJfh#br+Eni1g@F8n@5)bfXAN0= zU8~L>Gp=a|%2O<+pGm0$$ccq9&VbR&jRq-Ze7m$eg|@MxutV7H+Ugi6w*hJQb&HU+ zbrd<|Zr_k!)EfcIeYXs(OcgXet{fl2?uRW&N3E=iQ_TFz&wW)LyI0EhLx4RQUa0H( zS?GUG$6Y8@4t!sb*U=ZK|9_i~S^sM~R#UK_7e?_tFXVL0k}SNZv$gaGlX=}OEZPGT z4TM3VCN5N$2us+njF+h9s^_xZ1&}oP5TKa*VHhnj9;$MC6g^B;ns0eGG`!s{w_J@F zqIYoGsKZn5r2o@vQR$C{uxhp3|6!+Fsx%-vAUfaAJFt+4wEzJeTfgMHnsKI*g}mGs zBP_2D!$kIUiOrkwCMrkO>NjUzlpbtq4nc%s=AIUfIE6I8zf0Y<(~=Z>681w8*=fUN zc_d@etd3_5+XTN-0*Vo~5#Z4JRT@M(5XV~C?lE6QDwjedct1p8e^%$#P5-$X0XL_1 zl^6jiBE9mj-MxZeBzDX_1^P0ftqHA9oYOWWHz*up#G-YekNgZ412%b;Pw}ZTF7Iuy zbEBrin22}W_7FpLP*KHA=fE)3t&m0R&WEqe@gSMio&JI{g`Ri7x9Mw|ahe%w4k3Vc zuN|%RB6-hoc2e$R9k44-mw6A_L5AM?c|%QRlR=`jTw?6qJ-y$$WYvV-U#V3XM-hwU zM|`ul^$>wFH0b+?br6)0ci;!kms*GU6)_aeQj6N<1M!|3_aztS+nwvfKr# zl0m`Zj{?^|!YkrSx=oWO#6J8jRq88bLZ+VG8+7GEO{>Wc(`*zJSBf$_-A|Sj^!^u& zolFNzI(D231BKfq2cEKNV(>4C(DDBPb^DJJG2$vf)#1x#0_>|y{J&k3Z2xslCh6Ma zNni|r?vGdQS0*eJk`%MUk}ynBPH`eCz|$z=m1w1L{-KuE3trkPV>9f+bK_Fn&EgXL zE;`AErihA+Iqd^y;IYR?JXJ{mP{&fHznI{WGM{>%`aR6o^Z9WOKd90>z&>T@31i$^ z4#ec>tN>bD{nQwEV7J>5K)foc17`SqAdB~~1FyjWpU!6~vHxD}bi`B!+JU+VX~4q? zfw=0!zkf&l4LdvSIVwxc9LP7*UmV7rLcT}^t|fG> zw+n2s)m=eocnMo>j1g61rzT{m51Z~O*nr7Eow)yfz*2~LnS7Yw?zNJCKX;m(n1G-Y zYE(IJQ&;MZC=tK)i1bn3N~dw2W=pZ%CDv9rc9Pm}OJKj3AG6F{Z46O!o~kaU*k->I z2t*{Hu$e0(sO$mq@m}s_$Gmw6Q(el#p?NGM8>?IlC;6%r8JHPR$ZJF8<))EjYq6RE zl7s*GaiC^LaK`0aB~|GIO*)=y*4PS5r7e|sALTgO=ghyM+KmAlVWW_AsRdGEe)>84 zeet7Rd8CHv;T4f-3Rc3xSeKqQ9Y?+A=f1e||7lrLDV6Fq})HNT?QS9X;0lcScF zvXW&}OR&3iU)Pv^#g&`Z%5s6e2b%mm6aJh5GIm4oZbSPTIL5f}#KzG^A?<9E8OU_L z4ZdOCEY%I_Z|nf(_0b=%fADpJkglvk-P|0R#IQE(Ei8GH0^2_p-FHF=VnbbTf4RFXS+$|I=RYKY!yc9d8fy#iq}ygw^AT zOneB~>7ZL`C`1x$6cik4IM}?tU@c-6^@@ZE8CLEzST-v1=Tc-J&GU6y(kd8r+a^po z$^{I7G(+=G+pZ>wwKdJR+SrQaEvc)f3;nlDwgeMar*FUYx?{VZw7oBymJFu5pbS2S z8>UH+8!T#Ke)lP{cNXoI@cIFbd4sl>P^VAXj5FnqVx1nS5PvVR%!a&64EOAP`ZpOH zd+@G>_*rd?8)N;9OaMY_!T!YQ{k?1N^sw#pOcZ`yr}v?c^f_~_lx5#fx-O1O!)vBS zs79G1DN3d>%ujQyH%ATx6!^#7NvDW)D?&wI8+VW^6Sqj6u}8pts1FueHsTMB7*B-Xk!@?{?fUW7aqn7C-G|*&B8?sieV=; zqQxmUZpo69-K+r5WFe}^qe{bu0r z+O)gtNw>Bz06(tG@O${X1?S?(F?gg8v)ssa4D319Zy>MU{wkwir3JxOB6DzP?{eg& zf~ZCFGY2jWTO{H;(VJkLLuqU;mL6coosd|H-Yq(LFcjuzYYt_ z*ZOG@Z}efDfigy(uVDrKj}8jtW{3bVPcH#FU(0?tnL~2EeAMRN;6Av@1ZAb)>6i(m zp{rP&Xj2w3!1z(4aDDu<`p7B<%?U=ku)+SD>U8P3W}_e5MKetr?1O`}2jHH|?Nuxt zll5eikgks8Kk8CyNn{n5?9CP$7U_Qe4vxD$tKePFs0=nw$j7zJdqweP`Ry&7!_IH` zkC{iK)!@`Xrv2xFl_6p@P9;ehzNH8#TMRqp&`;h$TY63EG?fhcQ4kf8Lq=+pRE;bz zs#H=;cRve9EV03AT#KA^*EDYl*IWuMvi^t?an(JL4K-rWrp(kRvr}O-hJ;0BIWtVE zAX@=5Lt;*cl*J9mlcoXHO!-ZBfO%7Uu`LG8L4_b1D!l+FQt3Qp+!0pO*jtK!sG?De zc|9)AECYQUmu?nKsZlN^T{Yg)~J1d8&zM;XC``=Dp%UVN$~nvu|g)k>4t2}G1HG=6-A-AY#bhZnfBRuEz+jy zc9H3}?e&!zRHW5++g7|&r9}nk;8TikCZ!GNf1M-E4n`nkpE9Ew?(Hih)-@^%u5T~R zD#XSPe@zkku*H_E8+5YG+Gt4NgU_e!+Ju+QhCnUuaP%*HMt(PR5*jOS4N|vkYLyNb z=g(8A5~;9g3V5?XMCLZyk<~NZQQQEP+x@{) zmpbQI`=u_tsE8c*<2saGucp{hIi?m^)Dka&zv_6<|dOJ#`KWK2ptLGky}P2bM)t(t?ygYGs^yoegN^ zKBR-_6`5VLAKvHdXg7>kAsbe!O`5DYR)?`H6l_k1w{>l2k{`Vz)BNPAhI94$KyU-o z_*s9hVE76|P^!5ROkV0Fj%+z26UNc7)Tw_E4&!M#2ex!7HIJmu`d=uy80$TPEQ0ZQ zCS$;;_%FD+6^Gfo&Qdb?ys_~nxs(0$j2_M&SWz(z{9zbw?{24l)T`l7fYtABzwQpxb zo2{oi^jrM+=ih|$zbnJ3f9Pz2s76mIv=!uwnW_>q%`5`0X6NS%g3#M2Lo(+TE_WxWsMVmcH&I2& zlC_>O?`3V3K z(O@uH)V+{4B3LyY;M6N)WL!g2HR~JRylgFLQxmqCZ1#6%mwA~ll=eqI2GiOS9L+A} zGSlAR&5sN+q=YVq1SYNwpo?z+cE6wB>5anxth_#b&8M{{GIx8luuLrb=ydJrgK6pR!6T`z?g#HK5o&+54A^@ocI=6k>Ui zFZOW8zBhB8ixA~O(JxjD(jdk2zSCmb02+B&!+O1>;;%VZ2{pB6b)sUHH5`$ui3NNh z=$%L4gzMwYvA74?Jnf%KhyXRq$2-fwg8brriL#Dac{Ku~S1-b~hIu;pY!EBkPWB8r zIva7FJ~$lS&vNZ(E2gPS5uSmuH|CDIKmT;3O}kPP`guBqTI!JRQcvCuGS`E?`*PRB zv0&XB87gxiKjlU&(;d9B36wIL2A6;QTn&O3aMM8In||%{ zVe2UcUI+=JH$|!IHjZ_K=q-ClRlHc>rdH9i^=t=C_=J;ySVPjT!iIgaDxM5o$vP58 z;dJMNnh*fza)w!%!?~AWoXnB}36{V1f5ayz8>wS20l#Y(}}G`rvI22qcq zI~;FtzE$n-0MZSDTcrK2OdXNHUw>cHkd&8hDG+!kO?R~Mp7uL%|Je72z=s@Z&wh{R zU5#I<+#>)E6v?jADQ+GihJnGP7R@amz1Ptw(#Rddn959dFQhd z5UPEikQ7^o4v-{FrXIe*1imPjbOuU!P}FLBLUdeHtKU=qa5F|eZca(^`U}$HIrc5g z3>o&o%$4*)jopVm86$ru02q6{j2YVWE_<3%OV$2Ry0r>+!f5h{puwWH&&A!|S(H9x zP~XYORFI+>b^y;d`hxw~ zqJhQ_3q=w=-AA~qwlFS*l#V|n(IOThJSg`P@bfeiBk^z3<@2<-*ch~cfa22 z$KW*ABYePyFV*U+F^Fb4J7$sSf&!g2QLEJqpgnl0m#^2Vc7bD+a~WoNvEeT2I;45g zwJ)waM0@dFs$KOeJ}~kZZ$+Cgc+Zqg%$4|LA0NECak|NO9Y-&=IQfx`b#3kV@Z2e~`rBD*rh*Xl@ce)u5kC=!}VBRp0{s?%?|C2hh798Sv5UL@J>Q_m~e z5mFjSD6W-aj`#!W#cyJrmphodi0@(MPv8YR!&A?c*@vFEYCOVsH?~Lb5YtSzowFZ3 z5Und&|NaL+_CM%=RLE1SPhTD2xi6mk|Mza2xTP)me+6a#yLEJyhOQF23d%o4-S+i* z7}5p!F$t0NeDyz(Fa}m~sPnnukU`yI;xHtrdl45U4y&DbvHDnmT$MTw;O zw)JcR=4Rb5Qxln+IX&GU{zOmLq*09WvZ-(bp`$3|{3u4eQ8*K_9@NdpAs*z0A}10g zgmNDJC|ivStiSh5Uu=PKm6n+3rp`+9t{inmm!)o7bF_+k8g_J++GoSxfz_Fy#S4w@ za}$mrwpw=tfo5aPctuI!B2N&_>?52Q*Y+;3K{MZ9R8lJv0ad>#YdJaXxOoy@uEX;S zfDFnLqN}HH`F|*TrzlOLE^9X{ZQHg{Z`!tvO53(=Ta~tL+m*I$`_J!mk8%2(tG~yH zxQP3;_nxu#oa7PmZ{ zBgg%F#NZIBPvU{@cie?&$rZ@ZGr{PE|D}MSWU^?tA*gU_OnlrNSZU+fHRR=V==*{j zs+b`Qkm1UtW4@avIMrBL$3kx~n4BWW|6;=G_gbUGzAEui&?ogU{e|}+ zze?o8(|TfY=2!9F>C8t=8u%bj&}WzYMYj+c3#Ih|MEix;9S!pGj1>0%Ge%d72} z|4F)xcu3p*=W2C>H(B0eE(JP49aOlRfL8L~rEI0KiJ*U>ZgLG3Bokv2t)`vv}4#pM?g>0!;&}kIs`Rk7^5H(J5VISq$ zDshLTOXSa?D|Bq{-(T&Il08MF1UB!6v)8|5wwi zO5Ial+Z65Fd!k<_1qKw_d=PrDGeu`KgIvZU%v_N&9$h?$JZZ2zbrZ*7;Ht~*ncn}! z>~i9*`Y~P8+8a$vj|eI*sF1BnCTsE}YQ{dx-1IDJpO3S^a4`dmE9ZW5LeMWbm}&Ae z=lGWEnCl0Pdvun0oGXTpedBzVDJ~=eqJnq^ss=tJyz`b{=`s#+YdtHLr8!-N(|MD zJIrDbjT^i0QjYPSqU{wGkZaOCL-}Hbcz&yn#2Y)}eh35IUAiL$-Cem;0qky1LWOAF zaM5ix&uK%7tocy-yR^ulnQ2EDZ$h&0uYDI_bGc-F&V*!@a>q3U!s*wXT zpt9-e3^e!rOmMiL(Lbk=NXX>HFRI?HEX~sRTQZ7m0A!8IKUP~U2Z-9=B*D_74GYD+ zDU~mow23;K>VVwO*Rr&s&?a&m*VKy@aNd}eIQ~n62+)WatZ5`$Ng$z%>Vz~d+j{4z zxl{FJ+L*MJ2<~Q+sX4PHR>x**DE!PmaUc*SPhgySsCd#jli0X4Ngm2t4wVH__DVOrV zwcu+H0z7?xpUYl;cNgq+xQPx`xs^m{)vEM`MO^FCkOeeiEh8wMg;lJ?OgTZCa0;|J zIHRNC9rOrvNf>7A3EB8m9G-Sj=L|VgH|tkKT<=3rW4k{HeTWaicS`les$>n8MkujY z?LTgqAK6C9s`2G6iZ6XoUJ0%?4M&+IXFHSXQwe zW4f!)o9t7r9CF*7^F?6q@!OHT<)sQwvojnD)7gxtcC?ynj@{GL+QDQk$0u?~efdULW5#o+tNZJhUbx zR`91iA86CP6Vl{E;O}(7E-%TBNu&4g=2GQ|ugB}#qAZIw+^hH~7~4?A+LFj(={r8s zj!Sy)eh_fjDMr6}yhJU^hvS^tHs6`GuJ-|9k+D?uM@4Ur-M|q(%uDkKtK7o!ay=G- zH}+Ma@^XjBF9c{(_1k-o%DbaJnafJ6B=477J_RkZ&QMLz-pW|~e=wpw#BJ~&i*}*H z?2KT$Z)6Ndagw23m9*gb2t{`>e!_RM1;SZ;0WB=*bSv;ikOkT7ui-_8aUWDkP;Dy7(hn!}4svhqPO70qp6w zCko2(V$%h>+WZBrVcC1gF5wvVC2mlgd&aoPsYn=nfh5&?X)hf3s6D+Td#P^H9}zyZ zAJ}q{+dCS!T3P5l17NqF+DN{=D!0(OXf=Cmx7c6wUt!Bbxi=v%jz@(q3bl=UvZvRU z=`0-~9kb*!m3Vl%{H)`NAQ3v>Td4RW>+K~2{`*LK4Dv&IMRtp1Pr}d_L%edc`>5HIS9q!ym)0$ZS}uEN-7BezeGcrzJcwz!rhO)8FdVZL$A%L+ta z;fs5ED}-M%)t(@kgTABzwH0KB|E6*j&;~#8o#G1@DF-%JBXSYAwU z-t-hdiWGe2%965v08fqKU5}y)fVVx=Lmn~!NuzifwD@A z2~Qq`$|Vr#23CGSt-M3~JFdn$&?_(MNa<)n)ZPstAqe(~*Z*GVe?0=h%{pQ>oyEp7 z`!82WdTD0=u7u(S?QbO?EIFoTT%XhIxzmD7nrFKhY)`BcfgMWgZKaX zlI%ZvLDbpC(8=7^M(O{-1pW7gx8i@BFxXuZGFXFbDM^!n>lALlh(IBs(5N*ccI1`A z3-)cMRG-@KAOyp52Y-?Nl_cy#3Mc42_J_gv0yS7FLsoF`!{uh-%6UGTy6|~!RB;MW3QO3XFitB0@(ZK$CHU*+sWCGk<-t+dpnraa#OjtW4~$)vxHOx zlEQ7WyHo!ib#3_^@j)*%pm4n>4QF;uM2KWODDxB>q*2PifqkTlH+lUTui48DuJgte zeCfYuN1_*U<&gu8rC4RJBp$zQfcbD_dHgwLVJkngXq4zdPmT5*;WoMe@x@53Lh4Uo z{Zb}>+*O#vhs`=ManTzydc$Tb(#OAM+}e&iR746UZwZXQ%-<1`nAkmcI#mt7_V z$3U|CFnvjJX2UmD6g|%+Hvf#C5{p7%S)HU@V*K){^Co=eIY|xuX(l@xh_-h(!iOPwYj6?PA4A{c zT$WyJ+0-Z4!$oE`*4h9t%}$9gc8mYNG(|Y{RUP<|rs?oNK%D=pQv0tGldv(d{jV}B zQq{4-RYUulp1zozzPMOx;%QpubI$BpJ8uHiEjSyD$X>G37suckP*kCq)$7Jy%9yxr zt~!ek$PqCS&Y_>c%$6sJppFqf<_D+ABjZwu2nZ7Pf$T+N6qXC_!4VM&>~3_NH|=AF z2PHpkaXsg3Uwa)-f4n8;)(8l2L6hT;1pUHEG+-|y!5^gRB*fQ69Z15IjogijnaOy; z)n(S-tBfgJ$wHqm12T~g+DYqVsW6-tZi-7=jwd&J-T0g80I5=NoQRQV4@l3Bltb-w za;Z+uqxGN{m?>;1IHiS|gCyd< zk2(n2JoB36KcWioBxLT^(tx5GMy8vOWTJ8cPis@3=16*&-)gUsf@?cRiszU*VW}~Z zGa!9jasH%x_<5y|(ABv!Cu>_Z)8y{UG$yS{xiU#e@qshpc!r16Ye2L%-fP(r1y{3D zB|1(grY9u?5U}@qg$F@$QoVw$sZE8Eu}uLx?FR9kq!>q5YZDlfm1XAUn=$q(TI|FE z@|v1pw3t-+fAG{W*^N8DjBb~H=H0)tIhHOx>4P|S!~ZIcWJowM5txfI0FvkFob zrvrMW#fAmZIrNODe4viAYyR)b+`H*Ur_Z&K$u|N93!zPv?xObR=z2l zh?H$s@N;>u3o+lHLiczUY^SNL8r^kK8&z&P9cUukvg-Zz8$h+>op3VN*EhufmREf{ zdU&1M@t@DejAAeC{|>o97QXX^3!!RP)#s__aCcQAn;OUDAe^%R_b3{Z8*m6~*n z`|ha43F7g)qia_FHH%OH5SVLLdHH);A#Y#_wW#X*t7)W$lvS%?(fFU}M>Bdu(=@^k zg*2^s%Y`l>&NC*6nW$jYsfKx`uxcS6Uh+|CX(Z&wR*gt^~OBS{TJSr;|^8ir~c=LVpk*?(v_8b1&S3*2*TH;x_!L;xyNLPtQd>05hmlz|Bud#~=)2}8cxv0etoo*0A~%$!?9!^b zysC<0WYK@WZ7Kx2*>NQM8)f2k8A?oDo^8+&?IkKVZOl1=6@$A|R3O^eL!TMjQd=CnR`clzxUre-d7}f&$V? z81*pFUWirpsChzc716c|Exd9qZs4!=3N$~$&TjBU>;lj1BeCsMGwfnBZnZp+drUoj z3wd5pns#RXMfAv{`W9e*3E&mZ>DHSOs3=e@Dq&paeWDhax+UlNoE_C9gE(cu&qsFp zgwL3`0fa(N?;mJ&@_)U7!_8Z=3iIuBp?Sd5WgU)8K8l*S(tNXN8xM>9peTOfneD4U zGVJ3TbV3t{ntw@J?r2#d>+RjM`+CCd%amEp+JhF_gn_rx1XYXZaKp3_UJmP1nKI*3 z)T&u%?|!Y0;F-(=w@0c9_vE3xizMDkJ`jy9vWVL`50+;>qgIc&+WWC7SC6-}>GIqZ zgw~%VyFbi<;qE1u#s>1n5cYyw&gosq_>k*k_>c!(cRB2`onE*@MX8{wBZT;`%4)2Z zdwFRc4!AWJcD58&LQz+Db%?wlkXu((^7!>7xG+e)58{zE;&8Tb^3g34FhnFRIzv@4 zx`PUl32hrfs^oO6+4QQPTSi5ka>8;vQ+>)rPlSav6j!$puKi%{LX-x(8s{juetd-J z*xCEMQvJoK*yi9JSofGUT;{sqsK#ndxB-7ciL+9K&ifT~ZviOx7HM)KJ0A|TU>us` z&D8>pA8TyN5pDh?^NVPu5yxRw^&@Ykj*?0zp6Y|(KVzt9|% z+bdq``Rkp=mJ(DGuIwLk?DZ@>RD0n#vt0Lm4>-_^wurgR8OL0~;BKb25!Ve#^U7hO~*QKBWM zM{TJ{R%+4%ua-*Fzozl|TJLiM8(I@IZ@cGSp14J9r|)&WHfBX~{Da9lVLN%?bbZ6w z*sm!_fA380RuWy`Vba`_ZbY>P8kx9dok&an8n=F=m<6*o52StJqVW;sORXcAo)F`1Ni~*|5~;Fqe3%2_P55sfPm_M>{|azY2c)9XesKTZ*BbF3RHE~5!D#+ zd+LhZQ-%- zgdm?BjgIiPlR5Lnld`!D+mKmHWJGZ1>?`K_{RY_VdOhxW_azRq*@!aW8Fs^p)d$fv zxlG2)8LX)68lE_3a^er)Bc1P*xmPu&8@O(ytREdROaCJiJHINTOMh#f!$AJpzf*-p z!Vt{31vvmckb*dQl8D?MB14m!!CG_n+L_Q^s;z3ZI1eK`&NS7TJ#KbtKwqL!=Hq=A z7Sw8i9rOF}fhGnyLok^WlSqu=ZU{Ah#!+bN@a`6U ze42x%=f>w>ofC=JGn^Bj_S{|HW%j=ZCJ`03b=il9pMjcsNvmRjiN9@=I8Odl&`5aM zzq6pG<`x|;ba2-VUF45NW90p^FT_NFwT!Heig477xc$+wl+se>B4n7G4LYKTU?)z5 z6^B)_;^%_#n70O-7`GB`e|s2r2D%z+n_lwhZXH7q+$K_7<2F^# z%FQK9i5Fa^1slfLEy>+m2CPv`Wb!tcAy%`|uZ5B~Dy#=pXWxRy4zXk?HA34&tl1tBeK2rjI~VBVFma3LyN3@#Lb*ZBaRu} zxq>EgNkWo!eDUi*J&s)=_m5q12%8|$5e-{(g1+Y5EDD_`1_8H9KdB)W5iJCnR~Dt$ zhZjpwRO@5BJ9ilZo`40{LqAb7*@g)au}R?OPk-S)*m;Y-b0*-8X#_Bbf)Atrkw(rA zGO61`H(E;2aa7kBZbW)))D;U7RRfW!Ho?}WV{K`kUoqhJ)T!akfhUj)-C-bPHDRP| z6k?ag5@!!6z_0f`4RIVN)sh4jtTdj171dUbX2JY3*kE>M-4z^E0oWcET{@~A=Xycf zoy7|Z=&E9Y+}t1Fhnk`dBx6+>v!vK-^pQN_E5UvVpx%|@e1`^k$vAoiJZyipum@f< zhG3PpUOH~ezT^tljFRu0X5ThU@0gcI0G-b4q^0iO8;xA=M-^B?)b+H(l9E%t~8DSf9g zO3U$M7`~f(U#_WdNic^rJerJ-p1AiN`(HZ4@cSZFbhwkg_vnG$Bq}jV6<@W2N`vZ^ zv5_pUXq)4;(R8djo>ISY^IgPs35RGl0YxeFJg_jAiQWHW`F-N>9q7(2^|H6jWQUENY8(oXvsi| zB6VObYwe9qOR62_RW9DD>uVI(-`Sp~%;6}656@N{>paI^?+)E#G3)Uj;L*#vG*(x9#NLv27lXELC`GQ zJMsVkMzap~B(XMob5q=FSNWW`GB!5$;aY7yQ)D*JVR(D+IUD9-9o(#fUXhu$jtvWl zuAXL5ts{uf?StMSt=mFi1`Sf&y`O;_POXDN^tZKA+y-ISZlzIjso`QjmQaLja{T+S zks%cPIw@}Rupdz7L!;D%OSmj=`v}QXgm=^?O9&94IASX5@EP{DGL(AIQTpi@KF>@6 zhMQAdCI*i(UH1&;w_lqbr4TMU1J<7L)+02a279jw_EzYY6ToKx#OD$Yc{sfhuFHQ6Z=r`>L=hmO!VD5n%VdWM)+Jr^t})3iTvI@V$uBy#bN%; z%4AS)|2~-OX?+C%^c?O9Y`#)6YhdjMMSQ_{60{YKW{VWt3x~U|;^9x742@drj(!)8 z2(24|Gi2J_ilv*6R>HOmJne6;&VsBGD39UVIP|HcL)?yeiB=AfK!m~T;*3ra&XRR) zz=GR5Kmvr?u!g7XY-IOLf}~;&e3FR7?yC%2IacZ9;?uDn{J0kb75s@t_FObh5=261 z(GPO4tg13FqODdaM=PO2LFTZCd}-0cpzi*Otrf`lm)l7R%P&Y(C)(7 z`z~Z?DEQJG?SmRmh6U~W!`-HTwGsf90m{>sm0Ic?dU2)5N#Qkht$et8CkRatto^>> zGAd1Q&YgsyZIwze*lzS-W2S&%~XK z%`J_T7*X$1tDkD_M>78QHM^N}BSQ^IW`fYHsa3-YOPRJnn68A9gM_2a`T0&&#`%&l z>Oe~y%EUJVrPb4~;D$kSezMzE$?=4E^3Y9Yl-oJ}3C#N?a6^u5Z5s)Z(Q$hkwcm*s zfSu@o_-x9iv7qr)>_!UxD`#z8g{9qkP@#Yg8Qy@FvLxdC#`l^L_L2){L<; zp>0YlX&#dL8st)Ee7Le{XK+mjXhCnRhF-fZpK5lP6Z()1#WIRO*h21@1{w6xGByO8 zxC}bSc6SXQAw=@{#js-U3ymlwY1M$nhmLT6?_!YKKI_tC>!W>03fojwR*w;f;=`|SnJVpp1Jk}5pcP%HZ`g0+ewiqSO z0(qu}2Mb}buB8V07j6}BAQGXywxmh~6qg^;{CL4LrD{cjZ0 z$ziQP{Qj|_0Pn`&!aZsLN_C_rP?}75h4(jHaE|=ocGjOODlom4{kl_Wt$NOt5Y(t7 z)!_BD{TIxehMlS3zFv!!W`)kOK{9%cz5Zk^)6mq03urWPiBnWOy;|Z z9erg|I<8u<>b+5mYJCa$Omn^Ce_&(sh~`uN{G05ykjBQZ9STY&K|#zzhhhWq>Vyg5 z+NJ4DsWA4{!3qYwTmmQPJ7aEqD@%(lF7_ED`ns7tm?*h#*06yo8hA z0YPuPS}S#g^?e*4+(F2IU_$s>GfuImX2^LOMk?22z71Sxr>ZF^;4ZQ*1BVCheazjl z{*oa{VJ z`*<^Mfp-0aDSwfM|CdOj*8=LID4=)IBnFKGGk9E5oa{j6l|8Kr8j8I#JIH-0SXWLH zD(n2}@ka=UqEx2L%s*(U`Hx^*9Bzp{YuAfYH|W}Bi_EUuy)QY#YnCKw8PtsiQnEIQ zrLv!gunO0`?73&wlEi@hJ!k7;R; zkCPM9ZE$ADE~Z3RRkjh2o8R_s8tn_OdP2qJO>p(P8yJt*IQ=nskHGip7@BS8CtJOX z6oA!RQiC}5wFW&88|3u zc!#$+*mPCx0p7}OZLpTez=lF&8E_>FVMlo`xOztO6c1$*p{HbtxJEsfWdgf*E(P?!{E~!hA}y3A{?ODW-i;I?5K~RDb;&O4JECW47T!vMk2U zy$tHPaRjBjwHPa*ZHhA;LTJT8vfkJZ^ZPwb_ON`CS|IXLQ~GgA;?_9diVAU*Ik{8u$&YFl=8< zR97dugk3+KbbqoC)Y#q=D(zmKh2UWFDqwOS=4J%ScOj~d5Q#+R799=5(Tx;k-9>~W z-3H{90Fy3Kptwh0-;w+!FXBYDg}h7O@mnMulfrB-yzpFlh**g}MM}C&nV#j)!T;3# z&Z{)QidCdJ%Wxcqv4~)nNa#(bO^{ybfOD=Slq%DxfePgA!=~JJY&wpvSQ{!ivBGFJ zsY1hISfkF(k&!$3(I%Qos2;6YuNU6Dl4=0i=e5v~w6ZvjP!>gbzJzrp$=accs({&K zoP9L)(jl8_ndJ)S&yYcpy77Dmqp<>6-V_cP;zkg{ouDePD_4LHjF)u-74?lyU0F3q_yl z&>mru^0`qOtiIP9f;;LQ8)I6G`v(h~>Rq*eqlUveN;Zkh0SUvRXkXYkGVa-(_}y?Y zrkio1AY6+T6HG7lF4<#6V|N@c`^X^y5U|^n>OYhux=)pj-SCGmXm)D8H ztBw-yPfqo4{|-vPXk6!RZ0nH{NmTkZ$!jgC<8UG5g7pwTJkvDN5rur4r#a1mz_JG4 z<`|RnsdcKz)+8$`Up!Wh@)bjQEmUpQ=<$R7wRJo=Ed1-}$b$YQ2t+}MH&8q+jYtvC zbk1ISFHF+=4Z^U&eJ_-bl-Z-o&(R8?IOy)eVdr(tkguD&5i%}&u2~6CMO&^}QyaXH zHslvjQCW)`MA@enwo-_T1TWjNB8dy3WWlU3YR=V*`$}oN2AAh*&-2u$|D-ql1EL;; z+Uy&9c~;O$}Ws4ck!y(W-l+Wh7h&Bqie*P zx~+&m%~!=vV!wxsy>!3cmOJ@_S)FCJytY4^A6aNM1JG1&Cho(ClHV@$>oCaE;q zl&FwA=T9ZkysEWvVC4Kwca2E?L;Z4|-iS{>c`i%ak9LZt3dW`faopV*JoAG7#i%JS z`Miq!#A+y0eucG3g9m+M zFnF_Z`_@JCFm_S+um8BbUm~M+3exc6Q)5XNse3Mzf<~A+m>R@;5;Z+r^_>{aUdnd5 zzqdANY>?&0ZL!LS&~jctdCdgA*zSFlTVa2BKOCj_y_d?JKg`wcAH{Byl8>N7H~wN; zs0=&Q(?{JdSW=Ee47f(oB`}W^2#BB$rl&~xWOYeJ5R)L1+dnXn4qAcGG1>H@V-fa= zZ^bg3J{7n=4{nBNW+qNFl|-*sJV{QA$d8XcE*ex{+aA1*w-fCQOxM*oOVp`3iC|!m ze|Q2Ukh{%;^9JQA(`opPdI@AFWh%&%KfsnUsEfoaIY2DeKl9ZYBy0bb6HV>IGIZC$ z(ek#rMszG1)hGN?``n5Ny=RhJTm@?^*Ts{C4k`$(DAZ`PJjcd1U8E}=va}awXrUKB z*qbfNd)tTj>H->Q)w$%pcS9_fMBtlUL*EX=(3l(-$g3+yUEVj%Kk%V=DuuIA;WrJf z^zr{(TPkOjqJB3Jn|~arbuM@dC&L+2@MJ9V0zsHVHHVkB6+^7P`sk2VQWn01kYeQdvp1Zx3jqd2`CbBtA|EN+Uod`$zC^n-04n(rU& ztIs|QU^|0{N0LegCzU*N32A<5l{_;?J^NvdYUK2UXFsIX*E0)D$jU#B9Lpo;4YQOo ziSg)HFksFXQYS5E+vzYb?&5k%wG(DekMhiB8hN{DZ*Ot12H=xGAVn7nG=@GUGlULDg2#MAj=Uty^31Jioan7?_~es<$85Jq~5@-Jf#k;fVXf;lI8 z`SREE2NLI_k%y48ZRJlVdb#q~^|Q_c;*c|6(d*K$V+&br3WZOGi!YwVV>>vd$LsY^ zh;jnyo-5JkKW{RCc8CSrjyaw*pXKPQzK3@kCxl{z|9taGrhossk5xMIE!;if%a^OW zqlmg9gCqIt9_%TOYSAHqKE7Fq7O`1~aYZqLOnXgkx;(pcO+UGr=INp&x;%Sq}4^zB<+Tq)|saDRk#?olN#8@UZqC-*Cb! z*vHSDI$ss|2Y7`nvrA9I-?_o%Htdg51nZV8&q)McaOH{{aAemr;mXKzgmB*(ji;2% z^1D;RC4)KD(-sN)^c|{3c+R`!&&>=bIpa za*FzfAu3A^Zut#|<_t8=q0I;44AS@UJ^L+)na4a9dH8@POSm#G$VrUJH>P4AN#g)w zV;9JUA}piubRv5vi|0b&9?__u&Dz>dxgMI_aq>rDI!+e5J#cy&t2s49%PL(Rv|sLy z<9Q*B>|^G9MTn$pnuj%_?Vm(}tNiyTt4a9siV(&71AKdiE1Et^uH5TYZ4U(3=&mE` zVOBXm+?E`ed`lfiaJDk&)!z5eBA%0|f~>^z^?tiIL7F8x{P<=>cVPiSsmXfKoAIdNPZFoBH?8U6HKM)kq2ovK7AIEL5GRTn(gixpNsFK0H;xa|0b{EbH>xCP zMGb9rSq*$dMp`fbuMnjd`py7K-hV_YvVwUS-k0jT?=weHbQMP`#C%`-ZKOva_`PY)aAZTyS11&G|qh7MGm@;4;a^e;Kv zqOX#c=e+McJfyeyJrAOtAorIKrXH$4$Uk+r{x%w*bV`SXP!jAGV>$tFknd-aGbrDL z4CpgNn}{L4hWPESOP<}Y1=*`*nkB9n|NIzGx1ZIihaJG;|^EY@;jPP~~$yDuU9PK5ciPNm=~ zB3C8YnpE}PX%|&24?V_sGbqd;;3&tJTTXx%9KrtD>v)gE$3_r|#Lg&u{9U%sJAv|J zHDi_;N>Es^dKI+gh;%P=!?J- zLVI@-zGE^7!z`c8wN6xq8mL4^K?uK>p^>IBJGHZ;r@mxjYNr z)LUzbMlG-s`hxtI{_=zl>)uTmQ-789mI3d<001n`k~&VP0;cMVNF1?#ZaCWai* z{;Orfd8S(v(BN**+emLf)2p8OSEhkCo1=3wRo`xTz{NvB=o3t06X|Kq*p zgzELzWpYn3$Q|IJ{AWlO5uc={72AaqD=H<(>5_^;RQ+Ihqed3&T^Y3dm0kv&Vx#4;*5#`3X@EUHnTOvr~asHO)k#Y*Q$cMbCl>e(m2?cjiJ zENx&8KQ<{(MqG3uDi)J@uW1^LE^LM#PM{N!+{P3 zDt;uhxc4Y^!KH_z8MJ$=QF(-no(63VT$&3h=Fr3#$+D1yi=%d=2ko+79IP-05y)Y> z&P&E%SFi11NWoty5|I$dsrUB~mCMb6S%a#xAroVZw5^%dT1Z3R4J3{ts3E9|`j{yG zQd@nq?W^HcKauX&QyILmjL@a!CI0~KC4hMe_R|A>8KP3A*o_pDmV8 z{+)bezF_9>@|$jf+AR2YV!#?Mw0Sb>l8J(Lrp$R0b-OrMDE)HzDS4G@oh`h&4`+hT zk{LuWQwEs{O-VZs)%>MFOhhjBCgm_qNk%ZEI#|c-&ZHX6)UneWE)(F?-l@n=_mO$H zgQ}w$RC-+=7-a);*!FDKw9(_v4DO$t7Qg$NAa)_0;wYMCDk;(}IWUL&Yb@i+gd(2; ziAD16;v?{uyVcDEkPk<1F2v0-h}S-pUoORTQ(sLj-WDO)7T68j5RfmC*G2JOiMeCy z>k%Vp71V6zFCL&F8;M)rz=Sx6TfK}O7X)J}w~OyH5g|=CQQ$36oGk$U}qtHlB&(huLAxXnb<1{VJXO&RnH+pltvQ9S8dJ!U@+MiIR6*Jmv6UI*VVgtGp}F zw-!{YH5Zy)4eb%8T0#L6J4-+x*H6^zQng*a0}g-J zWvzTOU3y7$kBJ9=(ry-OOhLvWN$T-z>~JuVW?eUuSTV=6#Be=o!(=R1fDxaJFZvo`R}^YQpJ z#QR1@8HQk@vI}Z}bRVVDWshg_kdOkuOSfe47>8>#)i#OSwXfmercIKyCeqaN)TE|j zY0Ea{0B0qmp(sa=%tUP|)v4~=%c!()6Ar=~;m{1B*PmOQq!GUMOP_ifzsP*e)jZ}2 zb7~Pk6f!5z<5EJik_SwzE0do8M5F35-^H52diF^GcV?Ds&8J<{Go^Ytr(nG?P?DC8 zahN#l4;ZV05V;m{2Gib4Gs)N$o`lPF?W&Hf%u~34Q`yv&d80BYqeJg&u9V)NgTgj9 zrk2ty?K{0q4Pt)aA{OJjB!gsy{7u~}{&$(�t>&6Lf(;2|2bG#i~_VLhW^f$GoFf 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

    |Q3~X;;gy~`fc#nSS-~&z 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 literal 0 HcmV?d00001 diff --git a/mochikit_v14/scripts/jscriptmochi.js b/mochikit_v14/scripts/jscriptmochi.js new file mode 100644 index 0000000..a1e3959 --- /dev/null +++ b/mochikit_v14/scripts/jscriptmochi.js @@ -0,0 +1,24 @@ +/** + +run with: +cscript.exe //nologo scripts\jscriptmochi.js + +**/ +if (typeof(print) == "undefined" && typeof(WScript) != "undefined") { + // Make JScript look like SpiderMonkey and Rhino + var print = WScript.Echo; + var load = function (fn) { + var fso = new ActiveXObject("Scripting.FileSystemObject"); + var textStream = fso.OpenTextFile(fn, 1); + var namespace = undefined; + if (typeof(JSAN) != "undefined") { + namespace = JSAN.global; + } + arguments.callee.do_eval.apply(namespace, [textStream.ReadAll()]); + }; + load.do_eval = function () { + eval(arguments[0]); + }; +} + +load('tests/standalone.js'); diff --git a/mochikit_v14/scripts/make_docs.py b/mochikit_v14/scripts/make_docs.py new file mode 100755 index 0000000..dd53eae --- /dev/null +++ b/mochikit_v14/scripts/make_docs.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python +import os +import sys +try: + from pkg_resources import require + require("docutils>0.3.9") +except ImportError: + pass +from docutils import nodes, utils +from docutils.core import publish_parts +from docutils.parsers.rst import roles + +TEMPLATE = u"""%(html_prolog)s + + +%(html_head)s + + + + + +%(html_body)s + + +""" +def mochi_name(text): + name = text.split('(', 1)[0].split()[0] + base = '' + if name.startswith('MochiKit.'): + # cross-reference + parts = name.split('.') + base = parts[1] + '.html' + if parts[-1] in ("call", "apply"): + parts.pop() + name = '.'.join(parts[2:]) + return base, name + +def role_mochiref(role, rawtext, text, lineno, inliner, options=None, content=[]): + if options is None: + options = {} + base, name = mochi_name(text) + ref = base + if name: + ref += '#fn-' + name.lower() + roles.set_classes(options) + options.setdefault('classes', []).append('mochiref') + node = nodes.reference( + text, utils.unescape(text), refuri=ref, **options) + return [node], [] + +roles.register_canonical_role('mochiref', role_mochiref) + +def role_mochidef(role, rawtext, text, lineno, inliner, options=None, content=[]): + if options is None: + options = {} + base, name = mochi_name(text) + assert base == '' + ref = 'fn-' + utils.unescape(name.lower()) + anchor = nodes.raw('', '\n\n' % (ref,), format='html') + roles.set_classes(options) + options.setdefault('classes', []).append('mochidef') + node = nodes.reference( + text, utils.unescape(text), refuri='#' + ref, **options) + return [anchor, node], [] + +roles.register_canonical_role('mochidef', role_mochidef) + + + +def main(): + basepath = os.path.join('doc/rst', '') + destpath = os.path.join('doc/html', '') + for root, dirs, files in os.walk(basepath): + if '.svn' in dirs: + dirs.remove('.svn') + destroot = destpath + root[len(basepath):] + if not os.path.exists(destroot): + os.makedirs(destroot) + for fn in files: + basefn, ext = os.path.splitext(fn) + if ext == '.rst': + srcfn = os.path.join(root, fn) + dest = os.path.join(destroot, basefn + '.html') + if basefn != "index": + try: + if os.path.getmtime(dest) >= os.path.getmtime(srcfn): + print srcfn, "not changed" + continue + except OSError: + pass + print srcfn + parts = publish_parts( + source_path=srcfn, + source=file(srcfn, 'rb').read().decode('utf8'), + destination_path=dest, + writer_name='html', + settings_overrides=dict( + embed_stylesheet=False, + stylesheet_path='include/css/documentation.css', + ), + ) + parts['html_head'] = parts['html_head'] % ('utf-8',) + parts['html_prolog'] = parts['html_prolog'] % ('utf-8',) + doc = (TEMPLATE % parts).encode("utf8") + out = file(dest, 'wb') + out.write(doc) + out.close() + +if __name__ == '__main__': + main() diff --git a/mochikit_v14/scripts/pack.py b/mochikit_v14/scripts/pack.py new file mode 100755 index 0000000..7ef81da --- /dev/null +++ b/mochikit_v14/scripts/pack.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# +# custom_rhino.jar from: +# http://dojotoolkit.org/svn/dojo/buildscripts/lib/custom_rhino.jar +# +import os +import re +import sys +import shutil +import subprocess +mk = file('MochiKit/MochiKit.js').read() +if len(sys.argv) > 1: + outf = sys.stdout +else: + outf = file('packed/MochiKit/MochiKit.js', 'w') +VERSION = re.search( + r"""(?mxs)MochiKit.MochiKit.VERSION\s*=\s*['"]([^'"]+)""", + mk +).group(1) +if len(sys.argv) > 1: + SUBMODULES = sys.argv[1:] +else: + SUBMODULES = map(str.strip, re.search( + r"""(?mxs)MochiKit.MochiKit.SUBMODULES\s*=\s*\[([^\]]+)""", + mk + ).group(1).replace(' ', '').replace('"', '').split(',')) + SUBMODULES.append('MochiKit') +alltext = '\n'.join( + [file('MochiKit/%s.js' % m).read() for m in SUBMODULES]) + +tf = file('packed/_scratch.js', 'w') +tf.write(alltext) +tf.flush() +p = subprocess.Popen( + ['java', '-jar', 'scripts/custom_rhino.jar', '-c', tf.name], + stdout=subprocess.PIPE, +) +print >>outf, """/*** + + MochiKit.MochiKit %(VERSION)s : PACKED VERSION + + THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please + diff against the source tree, not this file. + + See for documentation, downloads, license, etc. + + (c) 2005 Bob Ippolito. All rights Reserved. + +***/ +""" % locals() +shutil.copyfileobj(p.stdout, outf) +outf.write('\n') +outf.flush() +outf.close() +tf.close() +os.remove(tf.name) diff --git a/mochikit_v14/scripts/rhinomochi.js b/mochikit_v14/scripts/rhinomochi.js new file mode 100644 index 0000000..e19f06e --- /dev/null +++ b/mochikit_v14/scripts/rhinomochi.js @@ -0,0 +1,2 @@ +#!/usr/bin/env java -jar scripts/js.jar +load('tests/standalone.js'); diff --git a/mochikit_v14/scripts/spidermochi.js b/mochikit_v14/scripts/spidermochi.js new file mode 100644 index 0000000..35e395c --- /dev/null +++ b/mochikit_v14/scripts/spidermochi.js @@ -0,0 +1,2 @@ +#!/usr/bin/env js -w +load('tests/standalone.js'); diff --git a/mochikit_v14/tests/FakeJSAN.js b/mochikit_v14/tests/FakeJSAN.js new file mode 100644 index 0000000..639519e --- /dev/null +++ b/mochikit_v14/tests/FakeJSAN.js @@ -0,0 +1,40 @@ +var JSAN = { + global: this, + use: function (module, symbols) { + var components = module.split(/\./); + var fn = components.join('/') + '.js'; + var o = JSAN.global; + var i, c; + for (i = 0; i < components.length; i++) { + o = o[components[i]]; + if (typeof(o) == 'undefined') { + break; + } + } + if (typeof(o) != 'undefined') { + return o; + } + + load(fn); + o = JSAN.global; + for (i = 0; i < components.length; i++) { + o = o[components[i]]; + if (typeof(o) == 'undefined') { + return undefined; + } + } + if (!symbols) { + var tags = o.EXPORT_TAGS; + if (tags) { + symbols = tags[':common'] || tags[':all']; + } + } + if (symbols) { + for (i = 0; i < symbols.length; i++) { + c = symbols[i]; + JSAN.global[c] = o[c]; + } + } + return o; + } +}; diff --git a/mochikit_v14/tests/SimpleTest/SimpleTest.js b/mochikit_v14/tests/SimpleTest/SimpleTest.js new file mode 100644 index 0000000..06954a0 --- /dev/null +++ b/mochikit_v14/tests/SimpleTest/SimpleTest.js @@ -0,0 +1,366 @@ +/** + * SimpleTest, a partial Test.Simple/Test.More API compatible test library. + * + * Why? + * + * Test.Simple doesn't work on IE < 6. + * TODO: + * * Support the Test.Simple API used by MochiKit, to be able to test MochiKit + * itself against IE 5.5 + * +**/ + +if (typeof(SimpleTest) == "undefined") { + var SimpleTest = {}; +} + +// Check to see if the TestRunner is present and has logging +if (typeof(parent) != "undefined" && parent.TestRunner) { + SimpleTest._logEnabled = parent.TestRunner.logEnabled; +} + +SimpleTest._tests = []; +SimpleTest._stopOnLoad = true; + +/** + * Something like assert. +**/ +SimpleTest.ok = function (condition, name, diag) { + var test = {'result': !!condition, 'name': name, 'diag': diag || ""}; + if (SimpleTest._logEnabled) { + var msg = test.result ? "PASS" : "FAIL"; + msg += " | " + test.name; + if (test.result) { + parent.TestRunner.logger.log(msg); + } else { + msg += " | " + test.diag; + parent.TestRunner.logger.error(msg); + } + } + SimpleTest._tests.push(test); +}; + +/** + * Roughly equivalent to ok(a==b, name) +**/ +SimpleTest.is = function (a, b, name) { + var repr = MochiKit.Base.repr; + SimpleTest.ok(a == b, name, "got " + repr(a) + ", expected " + repr(b)); +}; + + +/** + * Makes a test report, returns it as a DIV element. +**/ +SimpleTest.report = function () { + var DIV = MochiKit.DOM.DIV; + var passed = 0; + var failed = 0; + var results = MochiKit.Base.map( + function (test) { + var cls, msg; + if (test.result) { + passed++; + cls = "test_ok"; + msg = "ok - " + test.name; + } else { + failed++; + cls = "test_not_ok"; + msg = "not ok - " + test.name + " " + test.diag; + } + return DIV({"class": cls}, msg); + }, + SimpleTest._tests + ); + var summary_class = ((failed == 0) ? 'all_pass' : 'some_fail'); + return DIV({'class': 'tests_report'}, + DIV({'class': 'tests_summary ' + summary_class}, + DIV({'class': 'tests_passed'}, "Passed: " + passed), + DIV({'class': 'tests_failed'}, "Failed: " + failed)), + results + ); +}; + +/** + * Toggle element visibility +**/ +SimpleTest.toggle = function(el) { + if (MochiKit.Style.getStyle(el, 'display') == 'block') { + el.style.display = 'none'; + } else { + el.style.display = 'block'; + } +}; + +/** + * Toggle visibility for divs with a specific class. +**/ +SimpleTest.toggleByClass = function (cls) { + var elems = getElementsByTagAndClassName('div', cls); + MochiKit.Base.map(SimpleTest.toggle, elems); +}; + +/** + * Shows the report in the browser +**/ + +SimpleTest.showReport = function() { + var togglePassed = A({'href': '#'}, "Toggle passed tests"); + var toggleFailed = A({'href': '#'}, "Toggle failed tests"); + togglePassed.onclick = partial(SimpleTest.toggleByClass, 'test_ok'); + toggleFailed.onclick = partial(SimpleTest.toggleByClass, 'test_not_ok'); + var body = document.getElementsByTagName("body")[0]; + var firstChild = body.childNodes[0]; + var addNode; + if (firstChild) { + addNode = function (el) { + body.insertBefore(el, firstChild); + }; + } else { + addNode = function (el) { + body.appendChild(el) + }; + } + addNode(togglePassed); + addNode(SPAN(null, " ")); + addNode(toggleFailed); + addNode(SimpleTest.report()); +}; + +/** + * Tells SimpleTest to don't finish the test when the document is loaded, + * useful for asynchronous tests. + * + * When SimpleTest.waitForExplicitFinish is called, + * explicit SimpleTest.finish() is required. +**/ +SimpleTest.waitForExplicitFinish = function () { + SimpleTest._stopOnLoad = false; +}; + +/** + * Talks to the TestRunner if being ran on a iframe and the parent has a + * TestRunner object. +**/ +SimpleTest.talkToRunner = function () { + if (typeof(parent) != "undefined" && parent.TestRunner) { + parent.TestRunner.testFinished(document); + } +}; + +/** + * Finishes the tests. This is automatically called, except when + * SimpleTest.waitForExplicitFinish() has been invoked. +**/ +SimpleTest.finish = function () { + SimpleTest.showReport(); + SimpleTest.talkToRunner(); +}; + + +addLoadEvent(function() { + if (SimpleTest._stopOnLoad) { + SimpleTest.finish(); + } +}); + +// --------------- Test.Builder/Test.More isDeeply() ----------------- + + +SimpleTest.DNE = {dne: 'Does not exist'}; +SimpleTest.LF = "\r\n"; +SimpleTest._isRef = function (object) { + var type = typeof(object); + return type == 'object' || type == 'function'; +}; + + +SimpleTest._deepCheck = function (e1, e2, stack, seen) { + var ok = false; + // Either they're both references or both not. + var sameRef = !(!SimpleTest._isRef(e1) ^ !SimpleTest._isRef(e2)); + if (e1 == null && e2 == null) { + ok = true; + } else if (e1 != null ^ e2 != null) { + ok = false; + } else if (e1 == SimpleTest.DNE ^ e2 == SimpleTest.DNE) { + ok = false; + } else if (sameRef && e1 == e2) { + // Handles primitives and any variables that reference the same + // object, including functions. + ok = true; + } else if (SimpleTest.isa(e1, 'Array') && SimpleTest.isa(e2, 'Array')) { + ok = SimpleTest._eqArray(e1, e2, stack, seen); + } else if (typeof e1 == "object" && typeof e2 == "object") { + ok = SimpleTest._eqAssoc(e1, e2, stack, seen); + } else { + // If we get here, they're not the same (function references must + // always simply rererence the same function). + stack.push({ vals: [e1, e2] }); + ok = false; + } + return ok; +}; + +SimpleTest._eqArray = function (a1, a2, stack, seen) { + // Return if they're the same object. + if (a1 == a2) return true; + + // JavaScript objects have no unique identifiers, so we have to store + // references to them all in an array, and then compare the references + // directly. It's slow, but probably won't be much of an issue in + // practice. Start by making a local copy of the array to as to avoid + // confusing a reference seen more than once (such as [a, a]) for a + // circular reference. + for (var j = 0; j < seen.length; j++) { + if (seen[j][0] == a1) { + return seen[j][1] == a2; + } + } + + // If we get here, we haven't seen a1 before, so store it with reference + // to a2. + seen.push([ a1, a2 ]); + + var ok = true; + // Only examines enumerable attributes. Only works for numeric arrays! + // Associative arrays return 0. So call _eqAssoc() for them, instead. + var max = a1.length > a2.length ? a1.length : a2.length; + if (max == 0) return SimpleTest._eqAssoc(a1, a2, stack, seen); + for (var i = 0; i < max; i++) { + var e1 = i > a1.length - 1 ? SimpleTest.DNE : a1[i]; + var e2 = i > a2.length - 1 ? SimpleTest.DNE : a2[i]; + stack.push({ type: 'Array', idx: i, vals: [e1, e2] }); + if (ok = SimpleTest._deepCheck(e1, e2, stack, seen)) { + stack.pop(); + } else { + break; + } + } + return ok; +}; + +SimpleTest._eqAssoc = function (o1, o2, stack, seen) { + // Return if they're the same object. + if (o1 == o2) return true; + + // JavaScript objects have no unique identifiers, so we have to store + // references to them all in an array, and then compare the references + // directly. It's slow, but probably won't be much of an issue in + // practice. Start by making a local copy of the array to as to avoid + // confusing a reference seen more than once (such as [a, a]) for a + // circular reference. + seen = seen.slice(0); + for (var j = 0; j < seen.length; j++) { + if (seen[j][0] == o1) { + return seen[j][1] == o2; + } + } + + // If we get here, we haven't seen o1 before, so store it with reference + // to o2. + seen.push([ o1, o2 ]); + + // They should be of the same class. + + var ok = true; + // Only examines enumerable attributes. + var o1Size = 0; for (var i in o1) o1Size++; + var o2Size = 0; for (var i in o2) o2Size++; + var bigger = o1Size > o2Size ? o1 : o2; + for (var i in bigger) { + var e1 = o1[i] == undefined ? SimpleTest.DNE : o1[i]; + var e2 = o2[i] == undefined ? SimpleTest.DNE : o2[i]; + stack.push({ type: 'Object', idx: i, vals: [e1, e2] }); + if (ok = SimpleTest._deepCheck(e1, e2, stack, seen)) { + stack.pop(); + } else { + break; + } + } + return ok; +}; + +SimpleTest._formatStack = function (stack) { + var variable = '$Foo'; + for (var i = 0; i < stack.length; i++) { + var entry = stack[i]; + var type = entry['type']; + var idx = entry['idx']; + if (idx != null) { + if (/^\d+$/.test(idx)) { + // Numeric array index. + variable += '[' + idx + ']'; + } else { + // Associative array index. + idx = idx.replace("'", "\\'"); + variable += "['" + idx + "']"; + } + } + } + + var vals = stack[stack.length-1]['vals'].slice(0, 2); + var vars = [ + variable.replace('$Foo', 'got'), + variable.replace('$Foo', 'expected') + ]; + + var out = "Structures begin differing at:" + SimpleTest.LF; + for (var i = 0; i < vals.length; i++) { + var val = vals[i]; + if (val == null) { + val = 'undefined'; + } else { + val == SimpleTest.DNE ? "Does not exist" : "'" + val + "'"; + } + } + + out += vars[0] + ' = ' + vals[0] + SimpleTest.LF; + out += vars[1] + ' = ' + vals[1] + SimpleTest.LF; + + return ' ' + out; +}; + + +SimpleTest.isDeeply = function (it, as, name) { + var ok; + // ^ is the XOR operator. + if (SimpleTest._isRef(it) ^ SimpleTest._isRef(as)) { + // One's a reference, one isn't. + ok = false; + } else if (!SimpleTest._isRef(it) && !SimpleTest._isRef(as)) { + // Neither is an object. + ok = SimpleTest.is(it, as, name); + } else { + // We have two objects. Do a deep comparison. + var stack = [], seen = []; + if ( SimpleTest._deepCheck(it, as, stack, seen)) { + ok = SimpleTest.ok(true, name); + } else { + ok = SimpleTest.ok(false, name, SimpleTest._formatStack(stack)); + } + } + return ok; +}; + +SimpleTest.typeOf = function (object) { + var c = Object.prototype.toString.apply(object); + var name = c.substring(8, c.length - 1); + if (name != 'Object') return name; + // It may be a non-core class. Try to extract the class name from + // the constructor function. This may not work in all implementations. + if (/function ([^(\s]+)/.test(Function.toString.call(object.constructor))) { + return RegExp.$1; + } + // No idea. :-( + return name; +}; + +SimpleTest.isa = function (object, clas) { + return SimpleTest.typeOf(object) == clas; +}; + +// Global symbols: +var ok = SimpleTest.ok; +var is = SimpleTest.is; +var isDeeply = SimpleTest.isDeeply; diff --git a/mochikit_v14/tests/SimpleTest/TestRunner.js b/mochikit_v14/tests/SimpleTest/TestRunner.js new file mode 100644 index 0000000..a12d891 --- /dev/null +++ b/mochikit_v14/tests/SimpleTest/TestRunner.js @@ -0,0 +1,159 @@ +/** + * TestRunner: A test runner for SimpleTest + * TODO: + * + * * Avoid moving iframes: That causes reloads on mozilla and opera. + * + * +**/ +var TestRunner = {}; +TestRunner.logEnabled = false; +TestRunner._iframes = {}; +TestRunner._iframeDocuments = {}; +TestRunner._iframeRows = {}; +TestRunner._currentTest = 0; +TestRunner._urls = []; +TestRunner._testsDiv = DIV(); +TestRunner._progressDiv = DIV(); +TestRunner._summaryDiv = DIV(null, + H1(null, "Tests Summary"), + TABLE(null, + THEAD(null, + TR(null, + TH(null, "Test"), + TH(null, "Passed"), + TH(null, "Failed") + ) + ), + TBODY() + ) +); + +/** + * This function is called after generating the summary. +**/ +TestRunner.onComplete = null; + +/** + * If logEnabled is true, this is the logger that will be used. +**/ +TestRunner.logger = MochiKit.Logging.logger; + +/** + * Toggle element visibility +**/ +TestRunner._toggle = function(el) { + if (el.className == "noshow") { + el.className = ""; + el.style.cssText = ""; + } else { + el.className = "noshow"; + el.style.cssText = "width:0px; height:0px; border:0px;"; + } +}; + + +/** + * Creates the iframe that contains a test +**/ +TestRunner._makeIframe = function (url) { + var iframe = document.createElement('iframe'); + iframe.src = url; + iframe.name = url; + iframe.width = "500"; + var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0]; + var tr = TR(null, TD({'colspan': '3'}, iframe)); + iframe._row = tr; + tbody.appendChild(tr); + return iframe; +}; + +/** + * TestRunner entry point. + * + * The arguments are the URLs of the test to be ran. + * +**/ +TestRunner.runTests = function (/*url...*/) { + if (TestRunner.logEnabled) + TestRunner.logger.log("SimpleTest START"); + + var body = document.getElementsByTagName("body")[0]; + appendChildNodes(body, + TestRunner._testsDiv, + TestRunner._progressDiv, + TestRunner._summaryDiv + ); + for (var i = 0; i < arguments.length; i++) { + TestRunner._urls.push(arguments[i]); + } + TestRunner.runNextTest(); +}; + +/** + * Run the next test. If no test remains, calls makeSummary +**/ +TestRunner.runNextTest = function() { + if (TestRunner._currentTest < TestRunner._urls.length) { + var url = TestRunner._urls[TestRunner._currentTest]; + var progress = SPAN(null, + "Running ", A({href:url}, url), "..." + ); + + if (TestRunner.logEnabled) + TestRunner.logger.log(scrapeText(progress)); + + TestRunner._progressDiv.appendChild(progress); + TestRunner._iframes[url] = TestRunner._makeIframe(url); + } else { + TestRunner.makeSummary(); + if (TestRunner.onComplete) + TestRunner.onComplete(); + } +}; + +/** + * This stub is called by SimpleTest when a test is finished. +**/ +TestRunner.testFinished = function (doc) { + appendChildNodes(TestRunner._progressDiv, SPAN(null, "Done"), BR()); + var finishedURL = TestRunner._urls[TestRunner._currentTest]; + + if (TestRunner.logEnabled) + TestRunner.logger.debug("SimpleTest finished " + finishedURL); + + TestRunner._iframeDocuments[finishedURL] = doc; + // TestRunner._iframes[finishedURL].style.display = "none"; + TestRunner._toggle(TestRunner._iframes[finishedURL]); + TestRunner._currentTest++; + TestRunner.runNextTest(); +}; + +/** + * Display the summary in the browser +**/ +TestRunner.makeSummary = function() { + if (TestRunner.logEnabled) + TestRunner.logger.log("SimpleTest FINISHED"); + var rows = []; + for (var url in TestRunner._iframeDocuments) { + var doc = TestRunner._iframeDocuments[url]; + var nOK = withDocument(doc, + partial(getElementsByTagAndClassName, 'div', 'test_ok') + ).length; + var nNotOK = withDocument(doc, + partial(getElementsByTagAndClassName, 'div', 'test_not_ok') + ).length; + var toggle = partial(TestRunner._toggle, TestRunner._iframes[url]); + var jsurl = "TestRunner._toggle(TestRunner._iframes['" + url + "'])"; + var row = TR( + {'style': {'backgroundColor': nNotOK > 0 ? "#f00":"#0f0"}}, + TD(null, url), + TD(null, nOK), + TD(null, nNotOK) + ); + row.onclick = toggle; + var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0]; + tbody.insertBefore(row, TestRunner._iframes[url]._row) + } +}; diff --git a/mochikit_v14/tests/SimpleTest/test.css b/mochikit_v14/tests/SimpleTest/test.css new file mode 100755 index 0000000..38a4014 --- /dev/null +++ b/mochikit_v14/tests/SimpleTest/test.css @@ -0,0 +1,28 @@ +.test_ok { + color: green; + display: none; +} +.test_not_ok { + color: red; + display: block; +} + +.test_ok, .test_not_ok { + border-bottom-width: 2px; + border-bottom-style: solid; + border-bottom-color: black; +} + +.all_pass { + background-color: lime; +} + +.some_fail { + background-color: red; +} + +.tests_report { + border-width: 2px; + border-style: solid; + width: 20em; +} diff --git a/mochikit_v14/tests/cli.js b/mochikit_v14/tests/cli.js new file mode 100644 index 0000000..1843460 --- /dev/null +++ b/mochikit_v14/tests/cli.js @@ -0,0 +1,6 @@ +MochiKit = {__export__: true}; +load('tests/FakeJSAN.js') +JSAN.use('MochiKit.MockDOM'); +var window = this; +var document = MochiKit.MockDOM.document; +JSAN.use('MochiKit.MochiKit'); diff --git a/mochikit_v14/tests/index.html b/mochikit_v14/tests/index.html new file mode 100644 index 0000000..f3b4a46 --- /dev/null +++ b/mochikit_v14/tests/index.html @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/mochikit_v14/tests/standalone.js b/mochikit_v14/tests/standalone.js new file mode 100644 index 0000000..d485712 --- /dev/null +++ b/mochikit_v14/tests/standalone.js @@ -0,0 +1,16 @@ +load('tests/cli.js'); + +JSAN.use('MochiKit.Test'); + +print("[[ MochiKit.Base ]]"); +runTests('tests.test_Base'); +print("[[ MochiKit.Color ]]"); +runTests('tests.test_Color'); +print("[[ MochiKit.DateTime ]]"); +runTests('tests.test_DateTime'); +print("[[ MochiKit.Format ]]"); +runTests('tests.test_Format'); +print("[[ MochiKit.Iter ]]"); +runTests('tests.test_Iter'); +print("[[ MochiKit.Logging ]]"); +runTests('tests.test_Logging'); diff --git a/mochikit_v14/tests/test_Base.js b/mochikit_v14/tests/test_Base.js new file mode 100644 index 0000000..8d2cd6e --- /dev/null +++ b/mochikit_v14/tests/test_Base.js @@ -0,0 +1,507 @@ +if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.Base'); } +if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.Base'); } +if (typeof(tests) == 'undefined') { tests = {}; } + +tests.test_Base = function (t) { + // test bind + var not_self = {"toString": function () { return "not self"; } }; + var self = {"toString": function () { return "self"; } }; + var func = function (arg) { return this.toString() + " " + arg; }; + var boundFunc = bind(func, self); + not_self.boundFunc = boundFunc; + + t.is( isEmpty([], [], ""), true, "isEmpty true" ) + t.is( isEmpty([], [1], ""), true, "isEmpty true" ) + t.is( isNotEmpty([], [], ""), false, "isNotEmpty false" ) + t.is( isNotEmpty([], [1], ""), false, "isNotEmpty false" ) + + t.is( isEmpty([1], [1], "1"), false, "isEmpty false" ) + t.is( isEmpty([1], [1], "1"), false, "isEmpty false" ) + t.is( isNotEmpty([1], [1], "1"), true, "isNotEmpty true" ) + t.is( isNotEmpty([1], [1], "1"), true, "isNotEmpty true" ) + + t.is( boundFunc("foo"), "self foo", "boundFunc bound to self properly" ); + t.is( not_self.boundFunc("foo"), "self foo", "boundFunc bound to self on another obj" ); + t.is( bind(boundFunc, not_self)("foo"), "not self foo", "boundFunc successfully rebound!" ); + t.is( bind(boundFunc, undefined, "foo")(), "self foo", "boundFunc partial no self change" ); + t.is( bind(boundFunc, not_self, "foo")(), "not self foo", "boundFunc partial self change" ); + + // test method + not_self = {"toString": function () { return "not self"; } }; + self = {"toString": function () { return "self"; } }; + func = function (arg) { return this.toString() + " " + arg; }; + var boundMethod = method(self, func); + not_self.boundMethod = boundMethod; + + t.is( boundMethod("foo"), "self foo", "boundMethod bound to self properly" ); + t.is( not_self.boundMethod("foo"), "self foo", "boundMethod bound to self on another obj" ); + t.is( method(not_self, boundMethod)("foo"), "not self foo", "boundMethod successfully rebound!" ); + t.is( method(undefined, boundMethod, "foo")(), "self foo", "boundMethod partial no self change" ); + t.is( method(not_self, boundMethod, "foo")(), "not self foo", "boundMethod partial self change" ); + + + + + // test bindMethods + + var O = function (value) { + bindMethods(this); + this.value = value; + }; + O.prototype.func = function () { + return this.value; + }; + + var o = new O("boring"); + var p = {}; + p.func = o.func; + var func = o.func; + t.is( o.func(), "boring", "bindMethods doesn't break shit" ); + t.is( p.func(), "boring", "bindMethods works on other objects" ); + t.is( func(), "boring", "bindMethods works on functions" ); + + var p = clone(o); + t.ok( p instanceof O, "cloned correct inheritance" ); + var q = clone(p); + t.ok( q instanceof O, "clone-cloned correct inheritance" ); + q.foo = "bar"; + t.is( p.foo, undefined, "clone-clone is copy-on-write" ); + p.bar = "foo"; + t.is( o.bar, undefined, "clone is copy-on-write" ); + t.is( q.bar, "foo", "clone-clone has proper delegation" ); + // unbind + p.func = bind(p.func, null); + t.is( p.func(), "boring", "clone function calls correct" ); + q.value = "awesome"; + t.is( q.func(), "awesome", "clone really does work" ); + + // test boring boolean funcs + + t.is( isCallable(isCallable), true, "isCallable returns true on itself" ); + t.is( isCallable(1), false, "isCallable returns false on numbers" ); + + t.is( isUndefined(null), false, "null is not undefined" ); + t.is( isUndefined(""), false, "empty string is not undefined" ); + t.is( isUndefined(undefined), true, "undefined is undefined" ); + t.is( isUndefined({}.foo), true, "missing property is undefined" ); + + t.is( isUndefinedOrNull(null), true, "null is undefined or null" ); + t.is( isUndefinedOrNull(""), false, "empty string is not undefined or null" ); + t.is( isUndefinedOrNull(undefined), true, "undefined is undefined or null" ); + t.is( isUndefinedOrNull({}.foo), true, "missing property is undefined or null" ); + + // test extension of arrays + var a = []; + var b = []; + var three = [1, 2, 3]; + + extend(a, three, 1); + t.ok( objEqual(a, [2, 3]), "extend to an empty array" ); + extend(a, three, 1) + t.ok( objEqual(a, [2, 3, 2, 3]), "extend to a non-empty array" ); + + extend(b, three); + t.ok( objEqual(b, three), "extend of an empty array" ); + + t.is( compare(1, 2), -1, "numbers compare lt" ); + t.is( compare(2, 1), 1, "numbers compare gt" ); + t.is( compare(1, 1), 0, "numbers compare eq" ); + t.is( compare([1], [1]), 0, "arrays compare eq" ); + t.is( compare([1], [1, 2]), -1, "arrays compare lt (length)" ); + t.is( compare([1, 2], [2, 1]), -1, "arrays compare lt (contents)" ); + t.is( compare([1, 2], [1]), 1, "arrays compare gt (length)" ); + t.is( compare([2, 1], [1, 1]), 1, "arrays compare gt (contents)" ); + + // test partial application + var a = []; + var func = function (a, b) { + if (arguments.length != 2) { + return "bad args"; + } else { + return this.value + a + b; + } + }; + var self = {"value": 1, "func": func}; + var self2 = {"value": 2}; + t.is( self.func(2, 3), 6, "setup for test is correct" ); + self.funcTwo = partial(self.func, 2); + t.is( self.funcTwo(3), 6, "partial application works" ); + t.is( self.funcTwo(3), 6, "partial application works still" ); + t.is( bind(self.funcTwo, self2)(3), 7, "rebinding partial works" ); + self.funcTwo = bind(bind(self.funcTwo, self2), null); + t.is( self.funcTwo(3), 6, "re-unbinding partial application works" ); + + + // nodeWalk test + // ... looks a lot like a DOM tree on purpose + var tree = { + "id": "nodeWalkTestTree", + "test:int": "1", + "childNodes": [ + { + "test:int": "2", + "childNodes": [ + {"test:int": "5"}, + "ignored string", + {"ignored": "object"}, + ["ignored", "list"], + { + "test:skipchildren": "1", + "childNodes": [{"test:int": 6}] + } + ] + }, + {"test:int": "3"}, + {"test:int": "4"} + ] + } + + var visitedNodes = []; + nodeWalk(tree, function (node) { + var attr = node["test:int"]; + if (attr) { + visitedNodes.push(attr); + } + if (node["test:skipchildren"]) { + return; + } + return node.childNodes; + }); + + t.ok( objEqual(visitedNodes, ["1", "2", "3", "4", "5"]), "nodeWalk looks like it works"); + + // test map + var minusOne = function (x) { return x - 1; }; + var res = map(minusOne, [1, 2, 3]); + t.ok( objEqual(res, [0, 1, 2]), "map works" ); + + var res2 = xmap(minusOne, 1, 2, 3); + t.ok( objEqual(res2, res), "xmap works" ); + + res = map(operator.add, [1, 2, 3], [2, 4, 6]); + t.ok( objEqual(res, [3, 6, 9]), "map(fn, p, q) works" ); + + res = map(operator.add, [1, 2, 3], [2, 4, 6, 8]); + t.ok( objEqual(res, [3, 6, 9]), "map(fn, p, q) works (q long)" ); + + res = map(operator.add, [1, 2, 3, 4], [2, 4, 6]); + t.ok( objEqual(res, [3, 6, 9]), "map(fn, p, q) works (p long)" ); + + res = map(null, [1, 2, 3], [2, 4, 6]); + t.ok( objEqual(res, [[1, 2], [2, 4], [3, 6]]), "map(null, p, q) works" ); + + res = zip([1, 2, 3], [2, 4, 6]); + t.ok( objEqual(res, [[1, 2], [2, 4], [3, 6]]), "zip(p, q) works" ); + + res = map(null, [1, 2, 3]); + t.ok( objEqual(res, [1, 2, 3]), "map(null, lst) works" ); + + + + + t.is( isNotEmpty("foo"), true, "3 char string is not empty" ); + t.is( isNotEmpty(""), false, "0 char string is empty" ); + t.is( isNotEmpty([1, 2, 3]), true, "3 element list is not empty" ); + t.is( isNotEmpty([]), false, "0 element list is empty" ); + + // test filter + var greaterThanThis = function (x) { return x > this; }; + var greaterThanOne = function (x) { return x > 1; }; + var res = filter(greaterThanOne, [-1, 0, 1, 2, 3]); + t.ok( objEqual(res, [2, 3]), "filter works" ); + var res = filter(greaterThanThis, [-1, 0, 1, 2, 3], 1); + t.ok( objEqual(res, [2, 3]), "filter self works" ); + var res2 = xfilter(greaterThanOne, -1, 0, 1, 2, 3); + t.ok( objEqual(res2, res), "xfilter works" ); + + t.is(objMax(1, 2, 9, 12, 42, -16, 16), 42, "objMax works (with numbers)"); + t.is(objMin(1, 2, 9, 12, 42, -16, 16), -16, "objMin works (with numbers)"); + + // test adapter registry + + var R = new AdapterRegistry(); + R.register("callable", isCallable, function () { return "callable"; }); + R.register("arrayLike", isArrayLike, function () { return "arrayLike"; }); + t.is( R.match(function () {}), "callable", "registry found callable" ); + t.is( R.match([]), "arrayLike", "registry found ArrayLike" ); + try { + R.match(null); + t.ok( false, "non-matching didn't raise!" ); + } catch (e) { + t.is( e, NotFound, "non-matching raised correctly" ); + } + R.register("undefinedOrNull", isUndefinedOrNull, function () { return "undefinedOrNull" }); + R.register("undefined", isUndefined, function () { return "undefined" }); + t.is( R.match(undefined), "undefinedOrNull", "priorities are as documented" ); + t.ok( R.unregister("undefinedOrNull"), "removed adapter" ); + t.is( R.match(undefined), "undefined", "adapter was removed" ); + R.register("undefinedOrNull", isUndefinedOrNull, function () { return "undefinedOrNull" }, true); + t.is( R.match(undefined), "undefinedOrNull", "override works" ); + + var a1 = {"a": 1, "b": 2, "c": 2}; + var a2 = {"a": 2, "b": 1, "c": 2}; + t.is( keyComparator("a")(a1, a2), -1, "keyComparator 1 lt" ); + t.is( keyComparator("c")(a1, a2), 0, "keyComparator 1 eq" ); + t.is( keyComparator("c", "b")(a1, a2), 1, "keyComparator 2 eq gt" ); + t.is( keyComparator("c", "a")(a1, a2), -1, "keyComparator 2 eq lt" ); + t.is( reverseKeyComparator("a")(a1, a2), 1, "reverseKeyComparator" ); + t.is( compare(concat([1], [2], [3]), [1, 2, 3]), 0, "concat" ); + t.is( repr("foo"), '"foo"', "string repr" ); + t.is( repr(1), '1', "number repr" ); + t.is( listMin([1, 3, 5, 3, -1]), -1, "listMin" ); + t.is( objMin(1, 3, 5, 3, -1), -1, "objMin" ); + t.is( listMax([1, 3, 5, 3, -1]), 5, "listMax" ); + t.is( objMax(1, 3, 5, 3, -1), 5, "objMax" ); + + var v = keys(a1); + v.sort(); + t.is( compare(v, ["a", "b", "c"]), 0, "keys" ); + v = items(a1); + v.sort(); + t.is( compare(v, [["a", 1], ["b", 2], ["c", 2]]), 0, "items" ); + + var StringMap = function() {}; + a = new StringMap(); + a.foo = "bar"; + b = new StringMap(); + b.foo = "bar"; + try { + compare(a, b); + t.ok( false, "bad comparison registered!?" ); + } catch (e) { + t.ok( e instanceof TypeError, "bad comparison raised TypeError" ); + } + + t.is( repr(a), "[object Object]", "default repr for StringMap" ); + var isStringMap = function () { + for (var i = 0; i < arguments.length; i++) { + if (!(arguments[i] instanceof StringMap)) { + return false; + } + } + return true; + }; + + registerRepr("stringMap", + isStringMap, + function (obj) { + return "StringMap(" + repr(items(obj)) + ")"; + } + ); + + t.is( repr(a), 'StringMap([["foo", "bar"]])', "repr worked" ); + + // not public API + MochiKit.Base.reprRegistry.unregister("stringMap"); + + t.is( repr(a), "[object Object]", "default repr for StringMap" ); + + registerComparator("stringMap", + isStringMap, + function (a, b) { + // no sorted(...) in base + a = items(a); + b = items(b); + a.sort(compare); + b.sort(compare); + return compare(a, b); + } + ); + + t.is( compare(a, b), 0, "registerComparator" ); + + update(a, {"foo": "bar"}, {"wibble": "baz"}, undefined, null, {"grr": 1}); + t.is( a.foo, "bar", "update worked (first obj)" ); + t.is( a.wibble, "baz", "update worked (second obj)" ); + t.is( a.grr, 1, "update worked (skipped undefined and null)" ); + t.is( compare(a, b), 1, "update worked (comparison)" ); + + + setdefault(a, {"foo": "unf"}, {"bar": "web taco"} ); + t.is( a.foo, "bar", "setdefault worked (skipped existing)" ); + t.is( a.bar, "web taco", "setdefault worked (set non-existing)" ); + + var c = items(merge({"foo": "bar"}, {"wibble": "baz"})); + c.sort(compare); + t.is( compare(c, [["foo", "bar"], ["wibble", "baz"]]), 0, "merge worked" ); + + // not public API + MochiKit.Base.comparatorRegistry.unregister("stringMap"); + + try { + compare(a, b); + t.ok( false, "bad comparison registered!?" ); + } catch (e) { + t.ok( e instanceof TypeError, "bad comparison raised TypeError" ); + } + + var o = {"__repr__": function () { return "__repr__"; }}; + t.is( repr(o), "__repr__", "__repr__ protocol" ); + t.is( repr(MochiKit.Base), MochiKit.Base.__repr__(), "__repr__ protocol when repr is defined" ); + var o = {"NAME": "NAME"}; + t.is( repr(o), "NAME", "NAME protocol (obj)" ); + o = function () { return "TACO" }; + o.NAME = "NAME"; + t.is( repr(o), "NAME", "NAME protocol (func)" ); + + t.is( repr(MochiKit.Base.nameFunctions), "MochiKit.Base.nameFunctions", "test nameFunctions" ); + // Done! + + t.is( urlEncode("1+2=2").toUpperCase(), "1%2B2%3D2", "urlEncode" ); + t.is( queryString(["a", "b"], [1, "two"]), "a=1&b=two", "queryString"); + t.is( queryString({"a": 1}), "a=1", "one item alternate form queryString" ); + var o = {"a": 1, "b": 2, "c": function() {}}; + var res = queryString(o).split("&"); + res.sort(); + t.is( res.join("&"), "a=1&b=2", "two item alternate form queryString, function skip" ); + var res = parseQueryString("1+1=2&b=3%3D2"); + t.is( res["1 1"], "2", "parseQueryString pathological name" ); + t.is( res.b, "3=2", "parseQueryString second name:value pair" ); + var res = parseQueryString("foo=one&foo=two", true); + t.is( res["foo"].join(" "), "one two", "parseQueryString useArrays" ); + var res = parseQueryString("?foo=2&bar=1"); + t.is( res["foo"], "2", "parseQueryString strip leading question mark"); + + t.is( serializeJSON("foo\n\r\b\f\t"), "\"foo\\n\\r\\b\\f\\t\"", "string JSON" ); + t.is( serializeJSON(null), "null", "null JSON"); + try { + serializeJSON(undefined); + t.ok(false, "undefined should not be serializable"); + } catch (e) { + t.ok(e instanceof TypeError, "undefined not serializable"); + } + t.is( serializeJSON(1), "1", "1 JSON"); + t.is( serializeJSON(1.23), "1.23", "1.23 JSON"); + t.is( serializeJSON(serializeJSON), null, "function JSON (null, not string)" ); + t.is( serializeJSON([1, "2", 3.3]), "[1, \"2\", 3.3]", "array JSON" ); + var res = evalJSON(serializeJSON({"a":1, "b":2})); + t.is( res.a, 1, "evalJSON on an object (1)" ); + t.is( res.b, 2, "evalJSON on an object (2)" ); + var res = {"a": 1, "b": 2, "json": function () { return this; }}; + var res = evalJSON(serializeJSON(res)); + t.is( res.a, 1, "evalJSON on an object that jsons self (1)" ); + t.is( res.b, 2, "evalJSON on an object that jsons self (2)" ); + var strJSON = {"a": 1, "b": 2, "json": function () { return "json"; }}; + t.is( serializeJSON(strJSON), "\"json\"", "json serialization calling" ); + t.is( serializeJSON([strJSON]), "[\"json\"]", "json serialization calling in a structure" ); + registerJSON("isDateLike", + isDateLike, + function (d) { + return "this was a date"; + } + ); + t.is( serializeJSON(new Date()), "\"this was a date\"", "json registry" ); + MochiKit.Base.jsonRegistry.unregister("isDateLike"); + + var a = {"foo": {"bar": 12, "wibble": 13}}; + var b = {"foo": {"baz": 4, "bar": 16}, "bar": 4}; + updatetree(a, b); + var expect = [["bar", 16], ["baz", 4], ["wibble", 13]]; + var got = items(a.foo); + got.sort(compare); + t.is( repr(got), repr(expect), "updatetree merge" ); + t.is( a.bar, 4, "updatetree insert" ); + + var c = counter(); + t.is( c(), 1, "counter starts at 1" ); + t.is( c(), 2, "counter increases" ); + c = counter(2); + t.is( c(), 2, "counter starts at 2" ); + t.is( c(), 3, "counter increases" ); + + t.is( findValue([1, 2, 3], 4), -1, "findValue returns -1 on not found"); + t.is( findValue([1, 2, 3], 1), 0, "findValue returns correct index"); + t.is( findValue([1, 2, 3], 1, 1), -1, "findValue honors start"); + t.is( findValue([1, 2, 3], 2, 0, 1), -1, "findValue honors end"); + t.is( findIdentical([1, 2, 3], 4), -1, "findIdentical returns -1"); + t.is( findIdentical([1, 2, 3], 1), 0, "findIdentical returns correct index"); + t.is( findIdentical([1, 2, 3], 1, 1), -1, "findIdentical honors start"); + t.is( findIdentical([1, 2, 3], 2, 0, 1), -1, "findIdentical honors end"); + t.is( isNull(undefined), false, "isNull doesn't match undefined" ); + + var flat = flattenArguments(1, "2", 3, [4, [5, [6, 7], 8, [], 9]]); + var expect = [1, "2", 3, 4, 5, 6, 7, 8, 9]; + t.is( repr(flat), repr(expect), "flattenArguments" ); + + var fn = function () { + return [this, concat(arguments)]; + } + t.is( methodcaller("toLowerCase")("FOO"), "foo", "methodcaller with a method name" ); + t.is( repr(methodcaller(fn, 2, 3)(1)), "[1, [2, 3]]", "methodcaller with a function" ); + + var f1 = function (x) { return [1, x]; }; + var f2 = function (x) { return [2, x]; }; + var f3 = function (x) { return [3, x]; }; + t.is( repr(f1(f2(f3(4)))), "[1, [2, [3, 4]]]", "test the compose test" ); + t.is( repr(compose(f1,f2,f3)(4)), "[1, [2, [3, 4]]]", "three fn composition works" ); + t.is( repr(compose(compose(f1,f2),f3)(4)), "[1, [2, [3, 4]]]", "associative left" ); + t.is( repr(compose(f1,compose(f2,f3))(4)), "[1, [2, [3, 4]]]", "associative right" ); + + try { + compose(f1, "foo"); + t.ok( false, "wrong compose argument not raised!" ); + } catch (e) { + t.is( e.name, 'TypeError', "wrong compose argument raised correctly" ); + } + + t.is(camelize('one'), 'one', 'one word'); + t.is(camelize('one-two'), 'oneTwo', 'two words'); + t.is(camelize('one-two-three'), 'oneTwoThree', 'three words'); + t.is(camelize('1-one'), '1One', 'letter and word'); + t.is(camelize('one-'), 'one', 'trailing hyphen'); + t.is(camelize('-one'), 'One', 'starting hyphen'); + t.is(camelize('o-two'), 'oTwo', 'one character and word'); + + var flat = flattenArray([1, "2", 3, [4, [5, [6, 7], 8, [], 9]]]); + var expect = [1, "2", 3, 4, 5, 6, 7, 8, 9]; + t.is( repr(flat), repr(expect), "flattenArray" ); + + /* mean */ + try { + mean(); + t.ok( false, "no arguments didn't raise!" ); + } catch (e) { + t.is( e.name, 'TypeError', "no arguments raised correctly" ); + } + t.is( mean(1), 1, 'single argument (arg list)'); + t.is( mean([1]), 1, 'single argument (array)'); + t.is( mean(1,2,3), 2, 'three arguments (arg list)'); + t.is( mean([1,2,3]), 2, 'three arguments (array)'); + t.is( average(1), 1, 'test the average alias'); + + /* median */ + try { + median(); + t.ok( false, "no arguments didn't raise!" ); + } catch (e) { + t.is( e.name, 'TypeError', "no arguments raised correctly" ); + } + t.is( median(1), 1, 'single argument (arg list)'); + t.is( median([1]), 1, 'single argument (array)'); + t.is( median(3,1,2), 2, 'three arguments (arg list)'); + t.is( median([3,1,2]), 2, 'three arguments (array)'); + t.is( median(3,1,2,4), 2.5, 'four arguments (arg list)'); + t.is( median([3,1,2,4]), 2.5, 'four arguments (array)'); + + /* #185 */ + t.is( serializeJSON(parseQueryString("")), "{}", "parseQueryString('')" ); + t.is( serializeJSON(parseQueryString("", true)), "{}", "parseQueryString('', true)" ); + + /* #109 */ + t.is( queryString({ids: [1,2,3]}), "ids=1&ids=2&ids=3", "queryString array value" ); + t.is( queryString({ids: "123"}), "ids=123", "queryString string value" ); + + /* test values */ + var o = {a: 1, b: 2, c: 4, d: -1}; + var got = values(o); + got.sort(); + t.is( repr(got), repr([-1, 1, 2, 4]), "values()" ); + + t.is( queryString([["foo", "bar"], ["baz", "wibble"]]), "foo=baz&bar=wibble" ); + o = parseQueryString("foo=1=1=1&bar=2&baz&wibble="); + t.is( o.foo, "1=1=1", "parseQueryString multiple = first" ); + t.is( o.bar, "2", "parseQueryString multiple = second" ); + t.is( o.baz, "", "parseQueryString multiple = third" ); + t.is( o.wibble, "", "parseQueryString multiple = fourth" ); + +}; diff --git a/mochikit_v14/tests/test_Color.js b/mochikit_v14/tests/test_Color.js new file mode 100644 index 0000000..17d418d --- /dev/null +++ b/mochikit_v14/tests/test_Color.js @@ -0,0 +1,137 @@ +if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.Color'); } +if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.Color'); } +if (typeof(tests) == 'undefined') { tests = {}; } + +tests.test_Color = function (t) { + var approx = function (a, b, msg) { + return t.is(a.toPrecision(4), b.toPrecision(4), msg); + }; + + t.is( Color.whiteColor().toHexString(), "#ffffff", "whiteColor has right hex" ); + t.is( Color.blackColor().toHexString(), "#000000", "blackColor has right hex" ); + t.is( Color.blueColor().toHexString(), "#0000ff", "blueColor has right hex" ); + t.is( Color.redColor().toHexString(), "#ff0000", "redColor has right hex" ); + t.is( Color.greenColor().toHexString(), "#00ff00", "greenColor has right hex" ); + t.is( compare(Color.whiteColor(), Color.whiteColor()), 0, "default colors compare right" ); + t.ok( Color.whiteColor() == Color.whiteColor(), "default colors are interned" ); + t.ok( Color.whiteColor().toRGBString(), "rgb(255,255,255)", "toRGBString white" ); + t.ok( Color.blueColor().toRGBString(), "rgb(0,0,255)", "toRGBString blue" ); + t.is( Color.fromRGB(190/255, 222/255, 173/255).toHexString(), "#bedead", "fromRGB works" ); + t.is( Color.fromRGB(226/255, 15.9/255, 182/255).toHexString(), "#e210b6", "fromRGB < 16 works" ); + t.is( Color.fromRGB({r:190/255,g:222/255,b:173/255}).toHexString(), "#bedead", "alt fromRGB works" ); + t.is( Color.fromHexString("#bedead").toHexString(), "#bedead", "round-trip hex" ); + t.is( Color.fromString("#bedead").toHexString(), "#bedead", "round-trip string(hex)" ); + t.is( Color.fromRGBString("rgb(190,222,173)").toHexString(), "#bedead", "round-trip rgb" ); + t.is( Color.fromString("rgb(190,222,173)").toHexString(), "#bedead", "round-trip rgb" ); + + var hsl = Color.redColor().asHSL(); + approx( hsl.h, 0.0, "red hsl.h" ); + approx( hsl.s, 1.0, "red hsl.s" ); + approx( hsl.l, 0.5, "red hsl.l" ); + hsl = Color.fromRGB(0, 0, 0.5).asHSL(); + approx( hsl.h, 2/3, "darkblue hsl.h" ); + approx( hsl.s, 1.0, "darkblue hsl.s" ); + approx( hsl.l, 0.25, "darkblue hsl.l" ); + hsl = Color.fromString("#4169E1").asHSL(); + approx( hsl.h, (5/8), "4169e1 h"); + approx( hsl.s, (8/11), "4169e1 s"); + approx( hsl.l, (29/51), "4169e1 l"); + hsl = Color.fromString("#555544").asHSL(); + approx( hsl.h, (1/6), "555544 h" ); + approx( hsl.s, (1/9), "555544 s" ); + approx( hsl.l, (3/10), "555544 l" ); + hsl = Color.fromRGB(0.5, 1, 0.5).asHSL(); + approx( hsl.h, 1/3, "aqua hsl.h" ); + approx( hsl.s, 1.0, "aqua hsl.s" ); + approx( hsl.l, 0.75, "aqua hsl.l" ); + t.is( + Color.fromHSL(hsl.h, hsl.s, hsl.l).toHexString(), + Color.fromRGB(0.5, 1, 0.5).toHexString(), + "fromHSL works with components" + ); + t.is( + Color.fromHSL(hsl).toHexString(), + Color.fromRGB(0.5, 1, 0.5).toHexString(), + "fromHSL alt form" + ); + t.is( + Color.fromString("hsl(120,100%,75%)").toHexString(), + "#80ff80", + "fromHSLString" + ); + t.is( + Color.fromRGB(0.5, 1, 0.5).toHSLString(), + "hsl(120,100.0%,75.00%)", + "toHSLString" + ); + t.is( Color.fromHSL(0, 0, 0).toHexString(), "#000000", "fromHSL to black" ); + hsl = Color.blackColor().asHSL(); + approx( hsl.h, 0.0, "black hsl.h" ); + approx( hsl.s, 0.0, "black hsl.s" ); + approx( hsl.l, 0.0, "black hsl.l" ); + hsl.h = 1.0; + hsl = Color.blackColor().asHSL(); + approx( hsl.h, 0.0, "asHSL returns copy" ); + var rgb = Color.brownColor().asRGB(); + approx( rgb.r, 153/255, "brown rgb.r" ); + approx( rgb.g, 102/255, "brown rgb.g" ); + approx( rgb.b, 51/255, "brown rgb.b" ); + rgb.r = 0; + rgb = Color.brownColor().asRGB(); + approx( rgb.r, 153/255, "asRGB returns copy" ); + + t.is( Color.fromName("aqua").toHexString(), "#00ffff", "aqua fromName" ); + t.is( Color.fromString("aqua").toHexString(), "#00ffff", "aqua fromString" ); + t.is( Color.fromName("transparent"), Color.transparentColor(), "transparent fromName" ); + t.is( Color.fromString("transparent"), Color.transparentColor(), "transparent fromString" ); + t.is( Color.transparentColor().toRGBString(), "rgba(0,0,0,0)", "transparent toRGBString" ); + t.is( Color.fromRGBString("rgba( 0, 255, 255, 50%)").asRGB().a, 0.5, "rgba parsing alpha correctly" ); + t.is( Color.fromRGBString("rgba( 0, 255, 255, 50%)").toRGBString(), "rgba(0,255,255,0.5)", "rgba output correctly" ); + t.is( Color.fromRGBString("rgba( 0, 255, 255, 1)").toHexString(), "#00ffff", "fromRGBString with spaces and alpha" ); + t.is( Color.fromRGBString("rgb( 0, 255, 255)").toHexString(), "#00ffff", "fromRGBString with spaces" ); + t.is( Color.fromRGBString("rgb( 0, 100%, 255)").toHexString(), "#00ffff", "fromRGBString with percents" ); + + var hsv = Color.redColor().asHSV(); + approx( hsv.h, 0.0, "red hsv.h" ); + approx( hsv.s, 1.0, "red hsv.s" ); + approx( hsv.v, 1.0, "red hsv.v" ); + t.is( Color.fromHSV(hsv).toHexString(), Color.redColor().toHexString(), "red hexstring" ); + hsv = Color.fromRGB(0, 0, 0.5).asHSV(); + approx( hsv.h, 2/3, "darkblue hsv.h" ); + approx( hsv.s, 1.0, "darkblue hsv.s" ); + approx( hsv.v, 0.5, "darkblue hsv.v" ); + t.is( Color.fromHSV(hsv).toHexString(), Color.fromRGB(0, 0, 0.5).toHexString(), "darkblue hexstring" ); + hsv = Color.fromString("#4169E1").asHSV(); + approx( hsv.h, 5/8, "4169e1 h"); + approx( hsv.s, 32/45, "4169e1 s"); + approx( hsv.v, 15/17, "4169e1 l"); + t.is( Color.fromHSV(hsv).toHexString(), "#4169e1", "4169e1 hexstring" ); + hsv = Color.fromString("#555544").asHSV(); + approx( hsv.h, 1/6, "555544 h" ); + approx( hsv.s, 1/5, "555544 s" ); + approx( hsv.v, 1/3, "555544 l" ); + t.is( Color.fromHSV(hsv).toHexString(), "#555544", "555544 hexstring" ); + hsv = Color.fromRGB(0.5, 1, 0.5).asHSV(); + approx( hsv.h, 1/3, "aqua hsv.h" ); + approx( hsv.s, 0.5, "aqua hsv.s" ); + approx( hsv.v, 1, "aqua hsv.v" ); + t.is( + Color.fromHSV(hsv.h, hsv.s, hsv.v).toHexString(), + Color.fromRGB(0.5, 1, 0.5).toHexString(), + "fromHSV works with components" + ); + t.is( + Color.fromHSV(hsv).toHexString(), + Color.fromRGB(0.5, 1, 0.5).toHexString(), + "fromHSV alt form" + ); + hsv = Color.fromRGB(1, 1, 1).asHSV() + approx( hsv.h, 0, 'white hsv.h' ); + approx( hsv.s, 0, 'white hsv.s' ); + approx( hsv.v, 1, 'white hsv.v' ); + t.is( + Color.fromHSV(0, 0, 1).toHexString(), + '#ffffff', + 'HSV saturation' + ); +}; diff --git a/mochikit_v14/tests/test_DateTime.js b/mochikit_v14/tests/test_DateTime.js new file mode 100644 index 0000000..cc2d958 --- /dev/null +++ b/mochikit_v14/tests/test_DateTime.js @@ -0,0 +1,45 @@ +if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.DateTime'); } +if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.DateTime'); } +if (typeof(tests) == 'undefined') { tests = {}; } + +tests.test_DateTime = function (t) { + var testDate = isoDate('2005-2-3'); + t.is(testDate.getFullYear(), 2005, "isoDate year ok"); + t.is(testDate.getDate(), 3, "isoDate day ok"); + t.is(testDate.getMonth(), 1, "isoDate month ok"); + t.ok(objEqual(testDate, new Date("February 3, 2005")), "matches string date"); + t.is(toISODate(testDate), '2005-02-03', 'toISODate ok'); + + var testDate = isoDate('2005-06-08'); + t.is(testDate.getFullYear(), 2005, "isoDate year ok"); + t.is(testDate.getDate(), 8, "isoDate day ok"); + t.is(testDate.getMonth(), 5, "isoDate month ok"); + t.ok(objEqual(testDate, new Date("June 8, 2005")), "matches string date"); + t.is(toISODate(testDate), '2005-06-08', 'toISODate ok'); + + t.is(compare(new Date("February 3, 2005"), new Date(2005, 1, 3)), 0, "dates compare eq"); + t.is(compare(new Date("February 3, 2005"), new Date(2005, 2, 3)), -1, "dates compare lt"); + t.is(compare(new Date("February 3, 2005"), new Date(2005, 0, 3)), 1, "dates compare gt"); + + var testDate = isoDate('2005-2-3'); + t.is(compare(americanDate('2/3/2005'), testDate), 0, "americanDate eq"); + t.is(compare('2/3/2005', toAmericanDate(testDate)), 0, "toAmericanDate eq"); + + var testTimestamp = isoTimestamp('2005-2-3 22:01:03'); + t.is(compare(testTimestamp, new Date(2005,1,3,22,1,3)), 0, "isoTimestamp eq"); + t.is(compare(testTimestamp, isoTimestamp('2005-2-3T22:01:03')), 0, "isoTimestamp (real ISO) eq"); + t.is(compare(toISOTimestamp(testTimestamp), '2005-02-03 22:01:03'), 0, "toISOTimestamp eq"); + testTimestamp = isoTimestamp('2005-2-3T22:01:03Z'); + t.is(toISOTimestamp(testTimestamp, true), '2005-02-03T22:01:03Z', "toISOTimestamp (real ISO) eq"); + + var localTZ = Math.round((new Date(2005,1,3,22,1,3)).getTimezoneOffset()/60) + var direction = (localTZ < 0) ? "+" : "-"; + localTZ = Math.abs(localTZ); + localTZ = direction + ((localTZ < 10) ? "0" : "") + localTZ; + testTimestamp = isoTimestamp("2005-2-3T22:01:03" + localTZ); + var testDateTimestamp = new Date(2005,1,3,22,1,3); + t.is(compare(testTimestamp, testDateTimestamp), 0, "equal with local tz"); + testTimestamp = isoTimestamp("2005-2-3T17:01:03-05"); + var testDateTimestamp = new Date(Date.UTC(2005,1,3,22,1,3)); + t.is(compare(testTimestamp, testDateTimestamp), 0, "equal with specific tz"); +}; diff --git a/mochikit_v14/tests/test_DragAndDrop.js b/mochikit_v14/tests/test_DragAndDrop.js new file mode 100644 index 0000000..d3a3c58 --- /dev/null +++ b/mochikit_v14/tests/test_DragAndDrop.js @@ -0,0 +1,30 @@ +if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.Signal'); } +if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.Signal'); } +if (typeof(tests) == 'undefined') { tests = {}; } + +tests.test_DragAndDrop = function (t) { + + var drag1 = new MochiKit.DragAndDrop.Draggable('drag1', {'revert': true, 'ghosting': true}); + + var drop1 = new MochiKit.DragAndDrop.Droppable('drop1', {'hoverclass': 'drop-hover'}); + drop1.activate(); + t.is(hasElementClass('drop1', 'drop-hover'), true, "hoverclass ok"); + drop1.deactivate(); + t.is(hasElementClass('drop1', 'drop-hover'), false, "remove hoverclass ok"); + drop1.destroy(); + + t.is( isEmpty(MochiKit.DragAndDrop.Droppables.drops), true, "Unregister droppable ok"); + + var onhover = function (element) { + t.is(element, getElement('drag1'), 'onhover ok'); + }; + var drop2 = new MochiKit.DragAndDrop.Droppable('drop1', {'onhover': onhover}); + var pos = getElementPosition('drop1'); + pos = {"x": pos.x + 5, "y": pos.y + 5}; + MochiKit.DragAndDrop.Droppables.show({"page": pos}, getElement('drag1')); + + drag1.destroy(); + t.is( isEmpty(MochiKit.DragAndDrop.Draggables.drops), true, "Unregister draggable ok"); + +}; + diff --git a/mochikit_v14/tests/test_Format.js b/mochikit_v14/tests/test_Format.js new file mode 100644 index 0000000..785cebf --- /dev/null +++ b/mochikit_v14/tests/test_Format.js @@ -0,0 +1,80 @@ +if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.Format'); } +if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.Format'); } +if (typeof(tests) == 'undefined') { tests = {}; } + +tests.test_Format = function (t) { + t.is( truncToFixed(0.1234, 3), "0.123", "truncToFixed truncate" ); + t.is( truncToFixed(0.12, 3), "0.120", "truncToFixed trailing zeros" ); + t.is( truncToFixed(0.15, 1), "0.1", "truncToFixed no round" ); + t.is( truncToFixed(0.15, 0), "0", "truncToFixed zero (edge case)" ); + + t.is( roundToFixed(0.1234, 3), "0.123", "roundToFixed truncate" ); + t.is( roundToFixed(0.12, 3), "0.120", "roundToFixed trailing zeros" ); + t.is( roundToFixed(0.15, 1), "0.2", "roundToFixed round" ); + t.is( roundToFixed(0.15, 0), "0", "roundToFixed zero (edge case)" ); + + t.is( twoDigitFloat(-0.1234), "-0.12", "twoDigitFloat -0.1234 correct"); + t.is( twoDigitFloat(-0.1), "-0.1", "twoDigitFloat -0.1 correct"); + t.is( twoDigitFloat(-0), "0", "twoDigitFloat -0 correct"); + t.is( twoDigitFloat(0), "0", "twoDigitFloat 0 correct"); + t.is( twoDigitFloat(1), "1", "twoDigitFloat 1 correct"); + t.is( twoDigitFloat(1.0), "1", "twoDigitFloat 1.0 correct"); + t.is( twoDigitFloat(1.2), "1.2", "twoDigitFloat 1.2 correct"); + t.is( twoDigitFloat(1.234), "1.23", "twoDigitFloat 1.234 correct"); + t.is( percentFormat(123), "12300%", "percentFormat 123 correct"); + t.is( percentFormat(1.23), "123%", "percentFormat 123 correct"); + t.is( twoDigitAverage(1, 0), "0", "twoDigitAverage dbz correct"); + t.is( twoDigitAverage(1, 1), "1", "twoDigitAverage 1 correct"); + t.is( twoDigitAverage(1, 10), "0.1", "twoDigitAverage .1 correct"); + function reprIs(a, b) { + arguments[0] = repr(a); + arguments[1] = repr(b); + t.is.apply(this, arguments); + } + reprIs( lstrip("\r\t\n foo \n\t\r"), "foo \n\t\r", "lstrip whitespace chars" ); + reprIs( rstrip("\r\t\n foo \n\t\r"), "\r\t\n foo", "rstrip whitespace chars" ); + reprIs( strip("\r\t\n foo \n\t\r"), "foo", "strip whitespace chars" ); + reprIs( lstrip("\r\n\t \r", "\r"), "\n\t \r", "lstrip custom chars" ); + reprIs( rstrip("\r\n\t \r", "\r"), "\r\n\t ", "rstrip custom chars" ); + reprIs( strip("\r\n\t \r", "\r"), "\n\t ", "strip custom chars" ); + + var nf = numberFormatter("$###,###.00 footer"); + t.is( nf(1000.1), "$1,000.10 footer", "trailing zeros" ); + t.is( nf(1000000.1), "$1,000,000.10 footer", "two seps" ); + t.is( nf(100), "$100.00 footer", "shorter than sep" ); + t.is( nf(100.555), "$100.56 footer", "rounding" ); + t.is( nf(-100.555), "$-100.56 footer", "default neg" ); + nf = numberFormatter("-$###,###.00"); + t.is( nf(-100.555), "-$100.56", "custom neg" ); + nf = numberFormatter("0000.0000"); + t.is( nf(0), "0000.0000", "leading and trailing" ); + t.is( nf(1.1), "0001.1000", "leading and trailing" ); + t.is( nf(12345.12345), "12345.1235", "no need for leading/trailing" ); + nf = numberFormatter("0000.0000"); + t.is( nf("taco"), "", "default placeholder" ); + nf = numberFormatter("###,###.00", "foo", "de_DE"); + t.is( nf("taco"), "foo", "custom placeholder" ); + t.is( nf(12345.12345), "12.345,12", "de_DE locale" ); + nf = numberFormatter("#%"); + t.is( nf(1), "100%", "trivial percent" ); + t.is( nf(0.55), "55%", "percent" ); + + var customLocale = { + separator: " apples and ", + decimal: " bagels at ", + percent: "am for breakfast"}; + var customFormatter = numberFormatter("###,###.0%", "No breakfast", customLocale); + t.is( customFormatter(23.458), "2 apples and 345 bagels at 8am for breakfast", "custom locale" ); + + nf = numberFormatter("###,###"); + t.is( nf(123), "123", "large number format" ); + t.is( nf(1234), "1,234", "large number format" ); + t.is( nf(12345), "12,345", "large number format" ); + t.is( nf(123456), "123,456", "large number format" ); + t.is( nf(1234567), "1,234,567", "large number format" ); + t.is( nf(12345678), "12,345,678", "large number format" ); + t.is( nf(123456789), "123,456,789", "large number format" ); + t.is( nf(1234567890), "1,234,567,890", "large number format" ); + t.is( nf(12345678901), "12,345,678,901", "large number format" ); + t.is( nf(123456789012), "123,456,789,012", "large number format" ); +}; diff --git a/mochikit_v14/tests/test_Iter.js b/mochikit_v14/tests/test_Iter.js new file mode 100644 index 0000000..d0ff146 --- /dev/null +++ b/mochikit_v14/tests/test_Iter.js @@ -0,0 +1,176 @@ +if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.Iter'); } +if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.Iter'); } +if (typeof(tests) == 'undefined') { tests = {}; } + +tests.test_Iter = function (t) { + t.is( sum([1, 2, 3, 4, 5]), 15, "sum works on Arrays" ); + t.is( compare(list([1, 2, 3]), [1, 2, 3]), 0, "list([x]) == [x]" ); + t.is( compare(list(range(6, 0, -1)), [6, 5, 4, 3, 2, 1]), 0, "list(range(6, 0, -1)"); + t.is( compare(list(range(6)), [0, 1, 2, 3, 4, 5]), 0, "list(range(6))" ); + var moreThanTwo = partial(operator.lt, 2); + t.is( sum(ifilter(moreThanTwo, range(6))), 12, "sum(ifilter(, range()))" ); + t.is( sum(ifilterfalse(moreThanTwo, range(6))), 3, "sum(ifilterfalse(, range()))" ); + + var c = count(10); + t.is( compare([c.next(), c.next(), c.next()], [10, 11, 12]), 0, "count()" ); + c = cycle([1, 2]); + t.is( compare([c.next(), c.next(), c.next()], [1, 2, 1]), 0, "cycle()" ); + c = repeat("foo", 3); + t.is( compare(list(c), ["foo", "foo", "foo"]), 0, "repeat()" ); + c = izip([1, 2], [3, 4, 5], repeat("foo")); + t.is( compare(list(c), [[1, 3, "foo"], [2, 4, "foo"]]), 0, "izip()" ); + + t.is( compare(list(range(5)), [0, 1, 2, 3, 4]), 0, "range(x)" ); + c = islice(range(10), 0, 10, 2); + t.is( compare(list(c), [0, 2, 4, 6, 8]), 0, "islice(x, y, z)" ); + + c = imap(operator.add, [1, 2, 3], [2, 4, 6]); + t.is( compare(list(c), [3, 6, 9]), 0, "imap(fn, p, q)" ); + + c = filter(partial(operator.lt, 1), iter([1, 2, 3])); + t.is( compare(c, [2, 3]), 0, "filter(fn, iterable)" ); + + c = map(partial(operator.add, -1), iter([1, 2, 3])); + t.is( compare(c, [0, 1, 2]), 0, "map(fn, iterable)" ); + + c = map(operator.add, iter([1, 2, 3]), [2, 4, 6]); + t.is( compare(c, [3, 6, 9]), 0, "map(fn, iterable, q)" ); + + c = map(operator.add, iter([1, 2, 3]), iter([2, 4, 6])); + t.is( compare(c, [3, 6, 9]), 0, "map(fn, iterable, iterable)" ); + + c = applymap(operator.add, [[1, 2], [2, 4], [3, 6]]); + t.is( compare(list(c), [3, 6, 9]), 0, "applymap()" ); + + c = applymap(function (a) { return [this, a]; }, [[1], [2]], 1); + t.is( compare(list(c), [[1, 1], [1, 2]]), 0, "applymap(self)" ); + + c = chain(range(2), range(3)); + t.is( compare(list(c), [0, 1, 0, 1, 2]), 0, "chain(p, q)" ); + + var lessThanFive = partial(operator.gt, 5); + c = takewhile(lessThanFive, count()); + t.is( compare(list(c), [0, 1, 2, 3, 4]), 0, "takewhile()" ); + + c = dropwhile(lessThanFive, range(10)); + t.is( compare(list(c), [5, 6, 7, 8, 9]), 0, "dropwhile()" ); + + c = tee(range(5), 3); + t.is( compare(list(c[0]), list(c[1])), 0, "tee(..., 3) p0 == p1" ); + t.is( compare(list(c[2]), [0, 1, 2, 3, 4]), 0, "tee(..., 3) p2 == fixed" ); + + t.is( compare(reduce(operator.add, range(10)), 45), 0, "reduce(op.add)" ); + + try { + reduce(operator.add, []); + t.ok( false, "reduce didn't raise anything with empty list and no start?!" ); + } catch (e) { + if (e instanceof TypeError) { + t.ok( true, "reduce raised TypeError correctly" ); + } else { + t.ok( false, "reduce raised the wrong exception?" ); + } + } + + t.is( reduce(operator.add, [], 10), 10, "range initial value OK empty" ); + t.is( reduce(operator.add, [1], 10), 11, "range initial value OK populated" ); + + t.is( compare(iextend([1], range(2)), [1, 0, 1]), 0, "iextend(...)" ); + + var x = []; + exhaust(imap(bind(x.push, x), range(5))); + t.is( compare(x, [0, 1, 2, 3, 4]), 0, "exhaust(...)" ); + + t.is( every([1, 2, 3, 4, 5, 4], lessThanFive), false, "every false" ); + t.is( every([1, 2, 3, 4, 4], lessThanFive), true, "every true" ); + t.is( some([1, 2, 3, 4, 4], lessThanFive), true, "some true" ); + t.is( some([5, 6, 7, 8, 9], lessThanFive), false, "some false" ); + t.is( some([5, 6, 7, 8, 4], lessThanFive), true, "some true" ); + + var rval = []; + forEach(range(2), rval.push, rval); + t.is( compare(rval, [0, 1]), 0, "forEach works bound" ); + + function foo(o) { + rval.push(o); + } + forEach(range(2), foo); + t.is( compare(rval, [0, 1, 0, 1]), 0, "forEach works unbound" ); + + t.is( compare(sorted([3, 2, 1]), [1, 2, 3]), 0, "sorted default" ); + rval = sorted(["aaa", "bb", "c"], keyComparator("length")); + t.is(compare(rval, ["c", "bb", "aaa"]), 0, "sorted custom"); + + t.is( compare(reversed(range(4)), [3, 2, 1, 0]), 0, "reversed iterator" ); + t.is( compare(reversed([5, 6, 7]), [7, 6, 5]), 0, "reversed list" ); + + var o = {lst: [1, 2, 3], iterateNext: function () { return this.lst.shift(); }}; + t.is( compare(list(o), [1, 2, 3]), 0, "iterateNext" ); + + + function except(exc, func) { + try { + func(); + t.ok(false, exc.name + " was not raised."); + } catch (e) { + if (e == exc) { + t.ok( true, "raised " + exc.name + " correctly" ); + } else { + t.ok( false, "raised the wrong exception?" ); + } + } + } + + odd = partial(operator.and, 1) + + // empty + grouped = groupby([]); + except(StopIteration, grouped.next); + + // exhaust sub-iterator + grouped = groupby([2,4,6,7], odd); + kv = grouped.next(); k = kv[0], subiter = kv[1]; + t.is(k, 0, "odd(2) = odd(4) = odd(6) == 0"); + t.is(subiter.next(), 2, "sub-iterator.next() == 2"); + t.is(subiter.next(), 4, "sub-iterator.next() == 4"); + t.is(subiter.next(), 6, "sub-iterator.next() == 6"); + except(StopIteration, subiter.next); + kv = grouped.next(); key = kv[0], subiter = kv[1]; + t.is(key, 1, "odd(7) == 1"); + t.is(subiter.next(), 7, "sub-iterator.next() == 7"); + except(StopIteration, subiter.next); + + // not consume sub-iterator + grouped = groupby([2,4,6,7], odd); + kv = grouped.next(); key = kv[0], subiter = kv[1]; + t.is(key, 0, "0 = odd(2) = odd(4) = odd(6)"); + kv = grouped.next(); key = kv[0], subiter = kv[1]; + t.is(key, 1, "1 = odd(7)"); + except(StopIteration, grouped.next); + + // consume sub-iterator partially + grouped = groupby([3,1,1,2], odd); + kv = grouped.next(); key = kv[0], subiter = kv[1]; + t.is(key, 1, "odd(1) == 1"); + t.is(subiter.next(), 3, "sub-iterator.next() == 3"); + kv = grouped.next(); key = kv[0], v = kv[1]; + t.is(key, 0, "skip (1,1), odd(2) == 0"); + except(StopIteration, grouped.next); + + // null + grouped = groupby([null,null]); + kv = grouped.next(); k = kv[0], v = kv[1]; + t.is(k, null, "null ok"); + + // groupby - array version + isEqual = (t.isDeeply || function (a, b, msg) { + return t.ok(compare(a, b) == 0, msg); + }); + isEqual(groupby_as_array([ ] ), [ ], "empty"); + isEqual(groupby_as_array([1,1,1]), [ [1,[1,1,1]] ], "[1,1,1]: [1,1,1]"); + isEqual(groupby_as_array([1,2,2]), [ [1,[1] ], [2,[2,2]] ], "[1,2,2]: [1], [2,2]"); + isEqual(groupby_as_array([1,1,2]), [ [1,[1,1] ], [2,[2 ]] ], "[1,1,2]: [1,1], [2]"); + isEqual(groupby_as_array([null,null] ), [ [null,[null,null]] ], "[null,null]: [null,null]"); + grouped = groupby_as_array([1,1,3,2,4,6,8], odd); + isEqual(grouped, [[1, [1,1,3]], [0,[2,4,6,8]]], "[1,1,3,2,4,6,7] odd: [1,1,3], [2,4,6,8]"); +}; diff --git a/mochikit_v14/tests/test_Logging.js b/mochikit_v14/tests/test_Logging.js new file mode 100644 index 0000000..66f4989 --- /dev/null +++ b/mochikit_v14/tests/test_Logging.js @@ -0,0 +1,75 @@ +if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.Logging'); } +if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.Logging'); } +if (typeof(tests) == 'undefined') { tests = {}; } + +tests.test_Logging = function (t) { + + // just in case + logger.clear(); + + t.is( logLevelAtLeast('DEBUG')('INFO'), false, 'logLevelAtLeast false' ); + t.is( logLevelAtLeast('WARNING')('INFO'), false, 'logLevelAtLeast true' ); + t.ok( logger instanceof Logger, "global logger installed" ); + + var allMessages = []; + logger.addListener("allMessages", null, + bind(allMessages.push, allMessages)); + + var fatalMessages = []; + logger.addListener("fatalMessages", "FATAL", + bind(fatalMessages.push, fatalMessages)); + + var firstTwo = []; + logger.addListener("firstTwo", null, + bind(firstTwo.push, firstTwo)); + + + log("foo"); + var msgs = logger.getMessages(); + t.is( msgs.length, 1, 'global log() put one message in queue' ); + t.is( compare(allMessages, msgs), 0, "allMessages listener" ); + var msg = msgs.pop(); + t.is( compare(msg.info, ["foo"]), 0, "info matches" ); + t.is( msg.level, "INFO", "level matches" ); + + logDebug("debugFoo"); + t.is( msgs.length, 0, 'getMessages() returns copy' ); + msgs = logger.getMessages(); + t.is( compare(allMessages, msgs), 0, "allMessages listener" ); + t.is( msgs.length, 2, 'logDebug()' ); + msg = msgs.pop(); + t.is( compare(msg.info, ["debugFoo"]), 0, "info matches" ); + t.is( msg.level, "DEBUG", "level matches" ); + + logger.removeListener("firstTwo"); + + logError("errorFoo"); + msgs = logger.getMessages(); + t.is( compare(allMessages, msgs), 0, "allMessages listener" ); + t.is( msgs.length, 3, 'logError()' ); + msg = msgs.pop(); + t.is( compare(msg.info, ["errorFoo"]), 0, "info matches" ); + t.is( msg.level, "ERROR", "level matches" ); + + logWarning("warningFoo"); + msgs = logger.getMessages(); + t.is( compare(allMessages, msgs), 0, "allMessages listener" ); + t.is( msgs.length, 4, 'logWarning()' ); + msg = msgs.pop(); + t.is( compare(msg.info, ["warningFoo"]), 0, "info matches" ); + t.is( msg.level, "WARNING", "level matches" ); + + logFatal("fatalFoo"); + msgs = logger.getMessages(); + t.is( compare(allMessages, msgs), 0, "allMessages listener" ); + t.is( msgs.length, 5, 'logFatal()' ); + msg = msgs.pop(); + t.is( compare(fatalMessages, [msg]), 0, "fatalMessages listener" ); + t.is( compare(msg.info, ["fatalFoo"]), 0, "info matches" ); + t.is( msg.level, "FATAL", "level matches" ); + + logger.removeListener("allMessages"); + logger.removeListener("fatalMessages"); + + t.is( compare(firstTwo, logger.getMessages().slice(0, 2)), 0, "firstTwo" ); +}; diff --git a/mochikit_v14/tests/test_MochiKit-Async.html b/mochikit_v14/tests/test_MochiKit-Async.html new file mode 100644 index 0000000..32889ea --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Async.html @@ -0,0 +1,408 @@ + + + + + + + + + + + + +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Async.json b/mochikit_v14/tests/test_MochiKit-Async.json new file mode 100755 index 0000000..037e18c --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Async.json @@ -0,0 +1 @@ +{"passed": true} diff --git a/mochikit_v14/tests/test_MochiKit-Base.html b/mochikit_v14/tests/test_MochiKit-Base.html new file mode 100644 index 0000000..3db71e1 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Base.html @@ -0,0 +1,34 @@ + + + + + + + + + + + +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Color.html b/mochikit_v14/tests/test_MochiKit-Color.html new file mode 100644 index 0000000..bad32df --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Color.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + +
    + + +
    +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-DOM-Safari.html b/mochikit_v14/tests/test_MochiKit-DOM-Safari.html new file mode 100644 index 0000000..6a88f91 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-DOM-Safari.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-DOM.html b/mochikit_v14/tests/test_MochiKit-DOM.html new file mode 100644 index 0000000..45036d9 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-DOM.html @@ -0,0 +1,316 @@ + + + + + + + + + + + + +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    + child +
    +
    +
    +
    + +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-DateTime.html b/mochikit_v14/tests/test_MochiKit-DateTime.html new file mode 100644 index 0000000..43ad9d4 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-DateTime.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-DragAndDrop.html b/mochikit_v14/tests/test_MochiKit-DragAndDrop.html new file mode 100644 index 0000000..a191a53 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-DragAndDrop.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + +
    drag1
    +
    drop1
    +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Format.html b/mochikit_v14/tests/test_MochiKit-Format.html new file mode 100644 index 0000000..58bffa6 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Format.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Iter.html b/mochikit_v14/tests/test_MochiKit-Iter.html new file mode 100644 index 0000000..8086acc --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Iter.html @@ -0,0 +1,38 @@ + + + + + + + + + + + +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-JSAN.html b/mochikit_v14/tests/test_MochiKit-JSAN.html new file mode 100644 index 0000000..53a0e0e --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-JSAN.html @@ -0,0 +1,32 @@ + + + + + + +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Logging.html b/mochikit_v14/tests/test_MochiKit-Logging.html new file mode 100644 index 0000000..d92229a --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Logging.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-MochiKit.html b/mochikit_v14/tests/test_MochiKit-MochiKit.html new file mode 100644 index 0000000..d1a8b60 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-MochiKit.html @@ -0,0 +1,18 @@ + + + + + + + + +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Selector.html b/mochikit_v14/tests/test_MochiKit-Selector.html new file mode 100644 index 0000000..503acef --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Selector.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + +

    Test originally from this blog entry.

    + +

    Here are some links in a normal paragraph: Google, Google Groups. This link has class="blog": diveintomark

    +
    +

    Everything inside the red border is inside a div with id="foo".

    +

    This is a normal link: Yahoo

    + + This a is not inside a p + +

    This link has class="blog": Simon Willison's Weblog

    +

    This link is inside a span, not directly child of p

    +

    Nonninn

    +

    Sniðugt

    +

    + + + +

    +
    + +
    + Link 1 + Link 2 + Link 3 + Link 4 +

    Something else

    + Link 5 + Link 6 + Link 7 + Link 8 +
    + +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Signal.html b/mochikit_v14/tests/test_MochiKit-Signal.html new file mode 100644 index 0000000..9c37416 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Signal.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + +Please ignore this button:
    + +
    +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Style.html b/mochikit_v14/tests/test_MochiKit-Style.html new file mode 100644 index 0000000..b01adc6 --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Style.html @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + +
    TESTSUB
    + +
    +
    +
    + + diff --git a/mochikit_v14/tests/test_MochiKit-Visual.html b/mochikit_v14/tests/test_MochiKit-Visual.html new file mode 100644 index 0000000..3ae510f --- /dev/null +++ b/mochikit_v14/tests/test_MochiKit-Visual.html @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + +
    elt1
    +
    +
    +
    +
    + + + diff --git a/mochikit_v14/tests/test_Signal.js b/mochikit_v14/tests/test_Signal.js new file mode 100644 index 0000000..ca9680e --- /dev/null +++ b/mochikit_v14/tests/test_Signal.js @@ -0,0 +1,430 @@ +if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.Signal'); } +if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.Signal'); } +if (typeof(tests) == 'undefined') { tests = {}; } + +tests.test_Signal = function (t) { + + var submit = MochiKit.DOM.getElement('submit'); + var ident = null; + var i = 0; + var aFunction = function() { + t.ok(this === submit, "aFunction should have 'this' as submit"); + i++; + if (typeof(this.someVar) != 'undefined') { + i += this.someVar; + } + }; + + var aObject = {}; + aObject.aMethod = function() { + t.ok(this === aObject, "aMethod should have 'this' as aObject"); + i++; + }; + + ident = connect('submit', 'onclick', aFunction); + MochiKit.DOM.getElement('submit').click(); + t.is(i, 1, 'HTML onclick event can be connected to a function'); + + disconnect(ident); + MochiKit.DOM.getElement('submit').click(); + t.is(i, 1, 'HTML onclick can be disconnected from a function'); + + var submit = MochiKit.DOM.getElement('submit'); + + ident = connect(submit, 'onclick', aFunction); + submit.click(); + t.is(i, 2, 'Checking that a DOM element can be connected to a function'); + + disconnect(ident); + submit.click(); + t.is(i, 2, '...and then disconnected'); + + if (MochiKit.DOM.getElement('submit').fireEvent || + (document.createEvent && + typeof(document.createEvent('MouseEvents').initMouseEvent) == 'function')) { + + /* + + Adapted from: + http://www.devdaily.com/java/jwarehouse/jforum/tests/selenium/javascript/htmlutils.js.shtml + License: Apache + Copyright: Copyright 2004 ThoughtWorks, Inc + + */ + var triggerMouseEvent = function(element, eventType, canBubble) { + element = MochiKit.DOM.getElement(element); + canBubble = (typeof(canBubble) == 'undefined') ? true : canBubble; + if (element.fireEvent) { + var newEvt = document.createEventObject(); + newEvt.clientX = 1; + newEvt.clientY = 1; + newEvt.button = 1; + element.fireEvent('on' + eventType, newEvt); + } else if (document.createEvent && (typeof(document.createEvent('MouseEvents').initMouseEvent) == 'function')) { + var evt = document.createEvent('MouseEvents'); + evt.initMouseEvent(eventType, canBubble, true, // event, bubbles, cancelable + document.defaultView, 1, // view, # of clicks + 1, 0, 0, 0, // screenX, screenY, clientX, clientY + false, false, false, false, // ctrlKey, altKey, shiftKey, metaKey + 0, null); // buttonCode, relatedTarget + element.dispatchEvent(evt); + } + }; + + var eventTest = function(e) { + i++; + t.ok((typeof(e.event()) === 'object'), 'checking that event() is an object'); + t.ok((typeof(e.type()) === 'string'), 'checking that type() is a string'); + t.ok((e.target() === MochiKit.DOM.getElement('submit')), 'checking that target is "submit"'); + t.ok((typeof(e.modifier()) === 'object'), 'checking that modifier() is an object'); + t.ok(e.modifier().alt === false, 'checking that modifier().alt is defined, but false'); + t.ok(e.modifier().ctrl === false, 'checking that modifier().ctrl is defined, but false'); + t.ok(e.modifier().meta === false, 'checking that modifier().meta is defined, but false'); + t.ok(e.modifier().shift === false, 'checking that modifier().shift is defined, but false'); + t.ok((typeof(e.mouse()) === 'object'), 'checking that mouse() is an object'); + t.ok((typeof(e.mouse().button) === 'object'), 'checking that mouse().button is an object'); + t.ok(e.mouse().button.left === true, 'checking that mouse().button.left is true'); + t.ok(e.mouse().button.middle === false, 'checking that mouse().button.middle is false'); + t.ok(e.mouse().button.right === false, 'checking that mouse().button.right is false'); + t.ok((typeof(e.mouse().page) === 'object'), 'checking that mouse().page is an object'); + t.ok((typeof(e.mouse().page.x) === 'number'), 'checking that mouse().page.x is a number'); + t.ok((typeof(e.mouse().page.y) === 'number'), 'checking that mouse().page.y is a number'); + t.ok((typeof(e.mouse().client) === 'object'), 'checking that mouse().client is an object'); + t.ok((typeof(e.mouse().client.x) === 'number'), 'checking that mouse().client.x is a number'); + t.ok((typeof(e.mouse().client.y) === 'number'), 'checking that mouse().client.y is a number'); + + /* these should not be defined */ + t.ok((typeof(e.relatedTarget()) === 'undefined'), 'checking that relatedTarget() is undefined'); + t.ok((typeof(e.key()) === 'undefined'), 'checking that key() is undefined'); + }; + + + ident = connect('submit', 'onmousedown', eventTest); + triggerMouseEvent('submit', 'mousedown', false); + t.is(i, 3, 'Connecting an event to an HTML object and firing a synthetic event'); + + disconnect(ident); + triggerMouseEvent('submit', 'mousedown', false); + t.is(i, 3, 'Disconnecting an event to an HTML object and firing a synthetic event'); + + + + } + + // non-DOM tests + + var hasNoSignals = {}; + + var hasSignals = {someVar: 1}; + + var i = 0; + + var aFunction = function() { + i++; + if (typeof(this.someVar) != 'undefined') { + i += this.someVar; + } + }; + + var bFunction = function(someArg, someOtherArg) { + i += someArg + someOtherArg; + }; + + + var aObject = {}; + aObject.aMethod = function() { + i++; + }; + + aObject.bMethod = function() { + i++; + }; + + var bObject = {}; + bObject.bMethod = function() { + i++; + }; + + + ident = connect(hasSignals, 'signalOne', aFunction); + signal(hasSignals, 'signalOne'); + t.is(i, 2, 'Connecting function'); + i = 0; + + disconnect(ident); + signal(hasSignals, 'signalOne'); + t.is(i, 0, 'New style disconnecting function'); + i = 0; + + + ident = connect(hasSignals, 'signalOne', bFunction); + signal(hasSignals, 'signalOne', 1, 2); + t.is(i, 3, 'Connecting function'); + i = 0; + + disconnect(ident); + signal(hasSignals, 'signalOne', 1, 2); + t.is(i, 0, 'New style disconnecting function'); + i = 0; + + + connect(hasSignals, 'signalOne', aFunction); + signal(hasSignals, 'signalOne'); + t.is(i, 2, 'Connecting function'); + i = 0; + + disconnect(hasSignals, 'signalOne', aFunction); + signal(hasSignals, 'signalOne'); + t.is(i, 0, 'Old style disconnecting function'); + i = 0; + + + ident = connect(hasSignals, 'signalOne', aObject, aObject.aMethod); + signal(hasSignals, 'signalOne'); + t.is(i, 1, 'Connecting obj-function'); + i = 0; + + disconnect(ident); + signal(hasSignals, 'signalOne'); + t.is(i, 0, 'New style disconnecting obj-function'); + i = 0; + + connect(hasSignals, 'signalOne', aObject, aObject.aMethod); + signal(hasSignals, 'signalOne'); + t.is(i, 1, 'Connecting obj-function'); + i = 0; + + disconnect(hasSignals, 'signalOne', aObject, aObject.aMethod); + signal(hasSignals, 'signalOne'); + t.is(i, 0, 'Disconnecting obj-function'); + i = 0; + + + ident = connect(hasSignals, 'signalTwo', aObject, 'aMethod'); + signal(hasSignals, 'signalTwo'); + t.is(i, 1, 'Connecting obj-string'); + i = 0; + + disconnect(ident); + signal(hasSignals, 'signalTwo'); + t.is(i, 0, 'New style disconnecting obj-string'); + i = 0; + + + connect(hasSignals, 'signalTwo', aObject, 'aMethod'); + signal(hasSignals, 'signalTwo'); + t.is(i, 1, 'Connecting obj-string'); + i = 0; + + disconnect(hasSignals, 'signalTwo', aObject, 'aMethod'); + signal(hasSignals, 'signalTwo'); + t.is(i, 0, 'Old style disconnecting obj-string'); + i = 0; + + + var shouldRaise = function() { return undefined.attr; }; + + try { + connect(hasSignals, 'signalOne', shouldRaise); + signal(hasSignals, 'signalOne'); + t.ok(false, 'An exception was not raised'); + } catch (e) { + t.ok(true, 'An exception was raised'); + } + disconnect(hasSignals, 'signalOne', shouldRaise); + t.is(i, 0, 'Exception raised, signal should not have fired'); + i = 0; + + + connect(hasSignals, 'signalOne', aObject, 'aMethod'); + connect(hasSignals, 'signalOne', aObject, 'bMethod'); + signal(hasSignals, 'signalOne'); + t.is(i, 2, 'Connecting one signal to two slots in one object'); + i = 0; + + disconnect(hasSignals, 'signalOne', aObject, 'aMethod'); + disconnect(hasSignals, 'signalOne', aObject, 'bMethod'); + signal(hasSignals, 'signalOne'); + t.is(i, 0, 'Disconnecting one signal from two slots in one object'); + i = 0; + + + connect(hasSignals, 'signalOne', aObject, 'aMethod'); + connect(hasSignals, 'signalOne', bObject, 'bMethod'); + signal(hasSignals, 'signalOne'); + t.is(i, 2, 'Connecting one signal to two slots in two objects'); + i = 0; + + disconnect(hasSignals, 'signalOne', aObject, 'aMethod'); + disconnect(hasSignals, 'signalOne', bObject, 'bMethod'); + signal(hasSignals, 'signalOne'); + t.is(i, 0, 'Disconnecting one signal from two slots in two objects'); + i = 0; + + + try { + connect(nothing, 'signalOne', aObject, 'aMethod'); + signal(nothing, 'signalOne'); + t.ok(false, 'An exception was not raised when connecting undefined'); + } catch (e) { + t.ok(true, 'An exception was raised when connecting undefined'); + } + + try { + disconnect(nothing, 'signalOne', aObject, 'aMethod'); + t.ok(false, 'An exception was not raised when disconnecting undefined'); + } catch (e) { + t.ok(true, 'An exception was raised when disconnecting undefined'); + } + + + try { + connect(hasSignals, 'signalOne', nothing); + signal(hasSignals, 'signalOne'); + t.ok(false, 'An exception was not raised when connecting an undefined function'); + } catch (e) { + t.ok(true, 'An exception was raised when connecting an undefined function'); + } + + try { + disconnect(hasSignals, 'signalOne', nothing); + t.ok(false, 'An exception was not raised when disconnecting an undefined function'); + } catch (e) { + t.ok(true, 'An exception was raised when disconnecting an undefined function'); + } + + + try { + connect(hasSignals, 'signalOne', aObject, aObject.nothing); + signal(hasSignals, 'signalOne'); + t.ok(false, 'An exception was not raised when connecting an undefined method'); + } catch (e) { + t.ok(true, 'An exception was raised when connecting an undefined method'); + } + + try { + connect(hasSignals, 'signalOne', aObject, 'nothing'); + signal(hasSignals, 'signalOne'); + t.ok(false, 'An exception was not raised when connecting an undefined method (as string)'); + } catch (e) { + t.ok(true, 'An exception was raised when connecting an undefined method (as string)'); + } + + t.is(i, 0, 'Signals should not have fired'); + + connect(hasSignals, 'signalOne', aFunction); + connect(hasSignals, 'signalOne', aObject, 'aMethod'); + disconnectAll(hasSignals, 'signalOne'); + signal(hasSignals, 'signalOne'); + t.is(i, 0, 'disconnectAll works with single explicit signal'); + i = 0; + + connect(hasSignals, 'signalOne', aFunction); + connect(hasSignals, 'signalOne', aObject, 'aMethod'); + connect(hasSignals, 'signalTwo', aFunction); + connect(hasSignals, 'signalTwo', aObject, 'aMethod'); + disconnectAll(hasSignals, 'signalOne'); + signal(hasSignals, 'signalOne'); + t.is(i, 0, 'disconnectAll works with single explicit signal'); + signal(hasSignals, 'signalTwo'); + t.is(i, 3, 'disconnectAll does not disconnect unrelated signals'); + i = 0; + + connect(hasSignals, 'signalOne', aFunction); + connect(hasSignals, 'signalOne', aObject, 'aMethod'); + connect(hasSignals, 'signalTwo', aFunction); + connect(hasSignals, 'signalTwo', aObject, 'aMethod'); + disconnectAll(hasSignals, 'signalOne', 'signalTwo'); + signal(hasSignals, 'signalOne'); + signal(hasSignals, 'signalTwo'); + t.is(i, 0, 'disconnectAll works with two explicit signals'); + i = 0; + + connect(hasSignals, 'signalOne', aFunction); + connect(hasSignals, 'signalOne', aObject, 'aMethod'); + connect(hasSignals, 'signalTwo', aFunction); + connect(hasSignals, 'signalTwo', aObject, 'aMethod'); + disconnectAll(hasSignals, ['signalOne', 'signalTwo']); + signal(hasSignals, 'signalOne'); + signal(hasSignals, 'signalTwo'); + t.is(i, 0, 'disconnectAll works with two explicit signals as a list'); + i = 0; + + connect(hasSignals, 'signalOne', aFunction); + connect(hasSignals, 'signalOne', aObject, 'aMethod'); + connect(hasSignals, 'signalTwo', aFunction); + connect(hasSignals, 'signalTwo', aObject, 'aMethod'); + disconnectAll(hasSignals); + signal(hasSignals, 'signalOne'); + signal(hasSignals, 'signalTwo'); + t.is(i, 0, 'disconnectAll works with implicit signals'); + i = 0; + + var toggle = function() { + disconnectAll(hasSignals, 'signalOne'); + connect(hasSignals, 'signalOne', aFunction); + i++; + }; + + connect(hasSignals, 'signalOne', aFunction); + connect(hasSignals, 'signalTwo', function() { i++; }); + connect(hasSignals, 'signalTwo', toggle); + connect(hasSignals, 'signalTwo', function() { i++; }); // #147 + connect(hasSignals, 'signalTwo', function() { i++; }); + signal(hasSignals, 'signalTwo'); + t.is(i, 4, 'disconnectAll fired in a signal loop works'); + i = 0; + disconnectAll('signalOne'); + disconnectAll('signalTwo'); + + var testfunc = function () { arguments.callee.count++; }; + testfunc.count = 0; + var testObj = { + methOne: function () { this.countOne++; }, countOne: 0, + methTwo: function () { this.countTwo++; }, countTwo: 0 + }; + connect(hasSignals, 'signalOne', testfunc); + connect(hasSignals, 'signalTwo', testfunc); + signal(hasSignals, 'signalOne'); + signal(hasSignals, 'signalTwo'); + t.is(testfunc.count, 2, 'disconnectAllTo func precondition'); + disconnectAllTo(testfunc); + signal(hasSignals, 'signalOne'); + signal(hasSignals, 'signalTwo'); + t.is(testfunc.count, 2, 'disconnectAllTo func'); + + connect(hasSignals, 'signalOne', testObj, 'methOne'); + connect(hasSignals, 'signalTwo', testObj, 'methTwo'); + signal(hasSignals, 'signalOne'); + signal(hasSignals, 'signalTwo'); + t.is(testObj.countOne, 1, 'disconnectAllTo obj precondition'); + t.is(testObj.countTwo, 1, 'disconnectAllTo obj precondition'); + disconnectAllTo(testObj); + signal(hasSignals, 'signalOne'); + signal(hasSignals, 'signalTwo'); + t.is(testObj.countOne, 1, 'disconnectAllTo obj'); + t.is(testObj.countTwo, 1, 'disconnectAllTo obj'); + + testObj.countOne = testObj.countTwo = 0; + connect(hasSignals, 'signalOne', testObj, 'methOne'); + connect(hasSignals, 'signalTwo', testObj, 'methTwo'); + disconnectAllTo(testObj, 'methOne'); + signal(hasSignals, 'signalOne'); + signal(hasSignals, 'signalTwo'); + t.is(testObj.countOne, 0, 'disconnectAllTo obj+str'); + t.is(testObj.countTwo, 1, 'disconnectAllTo obj+str'); + + has__Connect = { + count: 0, + __connect__: function (ident) { + this.count += arguments.length; + disconnect(ident); + } + }; + + connect(has__Connect, 'signalOne', aFunction); + t.is(has__Connect.count, 3, '__connect__ is called when it exists'); + signal(has__Connect, 'signalOne'); + t.is(has__Connect.count, 3, '__connect__ can disconnect the signal'); + +}; diff --git a/plotkit_v091/COPYING b/plotkit_v091/COPYING new file mode 100644 index 0000000..b6153f2 --- /dev/null +++ b/plotkit_v091/COPYING @@ -0,0 +1,28 @@ +Copyright (c) 2006, Alastair Tse +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the Alastair Tse nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/plotkit_v091/PlotKit/Base.js b/plotkit_v091/PlotKit/Base.js new file mode 100644 index 0000000..49988c9 --- /dev/null +++ b/plotkit_v091/PlotKit/Base.js @@ -0,0 +1,406 @@ +/* + PlotKit + ======= + PlotKit is a collection of Javascript classes that allows + you to quickly visualise data using different types of charts. + + For license/info/documentation: http://www.liquidx.net/plotkit/ + + Copyright + --------- + Copyright 2005,2006 (c) Alastair Tse + For use under the BSD license. +*/ + +// -------------------------------------------------------------------- +// Check required components +// -------------------------------------------------------------------- + +try { + if (typeof(MochiKit.Base) == 'undefined' || + typeof(MochiKit.DOM) == 'undefined' || + typeof(MochiKit.Color) == 'undefined' || + typeof(MochiKit.Format) == 'undefined') + { + throw ""; + } +} +catch (e) { + throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format}" +} + +// ------------------------------------------------------------------- +// Inject Common Shortcuts we use into MochiKit.Color.Color +// ------------------------------------------------------------------- + +MochiKit.Base.update(MochiKit.Color.Color.prototype, { + asFillColor: function() { + return this.lighterColorWithLevel(0.3); + }, + + asStrokeColor: function() { + return this.darkerColorWithLevel(0.1); + }, + + asPointColor: function() { + return this.lighterColorWithLevel(0.1); + } +}); + + +// ------------------------------------------------------------------- +// Define our own PlotKit namespace +// ------------------------------------------------------------------- + +if (typeof(PlotKit) == 'undefined') { + PlotKit = {}; +} + +PlotKit.NAME = "PlotKit"; +PlotKit.VERSION = "0.8"; +PlotKit.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.toString = function() { + return this.__repr__(); +} + +// ------------------------------------------------------------------- +// Encapsulate all our utility function into it's own namespace. +// ------------------------------------------------------------------- + +if (typeof(PlotKit.Base) == 'undefined') { + PlotKit.Base = {}; +} + +PlotKit.Base.NAME = 'PlotKit.Base'; +PlotKit.Base.VERSION = PlotKit.VERSION; + +PlotKit.Base.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.Base.toString = function() { + return this.__repr__(); +} + + +// Detect whether we are using prototype.js +PlotKit.Base.usingPrototype = function() { + try { + return (typeof(Object.extend) == 'function'); + } + catch (e) { + return false; + } +} + + +MochiKit.Base.update(PlotKit.Base, { + roundInterval: function(range, intervals, precision) { + // We want to make the interval look regular, + var trunc = MochiKit.Format.roundToFixed; + var sep = range/intervals; + return parseFloat(trunc(sep, precision)); + }, + + collapse: function(lst) { + var m = MochiKit.Base; + var biggerList = new Array(); + for (var i = 0; i < lst.length; i++) { + biggerList = m.concat(biggerList, lst[i]); + } + if (PlotKit.Base.usingPrototype()) { + delete biggerList.extend; + delete biggerList.from; + delete biggerList.inspect; + } + + return biggerList; + }, + + uniq: function(sortedList) { + // get unique elements in list, exactly the same as unix shell's uniq. + var m = MochiKit.Base; + + if (!m.isArrayLike(sortedList) || (sortedList.length < 1)) + return new Array(); + + var uniq = new Array(); + var lastElem = sortedList[0]; + uniq.push(sortedList[0]); + for (var i = 1; i < sortedList.length; i++) { + if (m.compare(sortedList[i], lastElem) != 0) { + lastElem = sortedList[i]; + uniq.push(sortedList[i]); + } + } + return uniq; + }, + + colorScheme: function() { + var mb = MochiKit.Base; + var mc = MochiKit.Color + var scheme = ["red", "orange", "yellow", "green", "cyan", "blue", "purple", "magenta"]; + + var makeColor = function(name) { + return mc.Color[name + "Color"]() + }; + + return mb.map(makeColor, scheme); + }, + + baseDarkPrimaryColors: function () { + var hexColor = MochiKit.Color.Color.fromHexString; + return [hexColor("#ad3f40"), + hexColor("#ddac2c"), + hexColor("#dfdd0c"), + hexColor("#5276c4"), + hexColor("#739c5a")]; + }, + + basePrimaryColors: function () { + var hexColor = MochiKit.Color.Color.fromHexString; + return [hexColor("#d24c4d"), + hexColor("#f2b32f"), + hexColor("#ece90e"), + hexColor("#5d83da"), + hexColor("#78a15d")]; + }, + + baseBlueColors: function () { + var hexColor = MochiKit.Color.Color.fromHexString; + return [hexColor("#4b6b94"), hexColor("#5d81b4"), hexColor("#acbad2")]; + }, + + palette: function(baseColor, fromLevel, toLevel, increment) { + var isNil = MochiKit.Base.isUndefinedOrNull; + var fractions = new Array(); + if (isNil(increment)) + increment = 0.1; + if (isNil(toLevel)) + toLevel = 0.4; + if (isNil(fromLevel)) + fromLevel = -0.2; + + var level = fromLevel; + while (level <= toLevel) { + fractions.push(level); + level += increment; + } + + var makeColor = function(color, fraction) { + return color.lighterColorWithLevel(fraction); + }; + return MochiKit.Base.map(partial(makeColor, baseColor), fractions); + }, + + excanvasSupported: function() { + if (/MSIE/.test(navigator.userAgent) && !window.opera) { + return true; + } + return false; + }, + + // The following functions are from quirksmode.org + // http://www.quirksmode.org/js/findpos.html + + findPosX: function(obj) { + var curleft = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curleft += obj.offsetLeft + obj = obj.offsetParent; + } + } + else if (obj.x) + curleft += obj.x; + return curleft; + }, + + findPosY: function(obj) { + var curtop = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curtop += obj.offsetTop + obj = obj.offsetParent; + } + } + else if (obj.y) + curtop += obj.y; + return curtop; + }, + + isFuncLike: function(obj) { + return (typeof(obj) == 'function'); + } +}); + +// +// Prototype.js aware (crippled) versions of map and items. +// + +PlotKit.Base.map = function(fn, lst) { + if (PlotKit.Base.usingPrototype()) { + var rval = []; + for (var x in lst) { + if (typeof(lst[x]) == 'function') continue; + rval.push(fn(lst[x])); + } + return rval; + } + else { + return MochiKit.Base.map(fn, lst); + } +}; + +PlotKit.Base.items = function(lst) { + if (PlotKit.Base.usingPrototype()) { + var rval = []; + for (var x in lst) { + if (typeof(lst[x]) == 'function') continue; + rval.push([x, lst[x]]); + } + return rval; + } + else { + return MochiKit.Base.items(lst); + } +}; + +PlotKit.Base.keys = function(lst) { + if (PlotKit.Base.usingPrototype()) { + var rval = []; + for (var x in lst) { + if (typeof(lst[x]) == 'function') continue; + rval.push(x); + } + return rval; + } + else { + return MochiKit.Base.keys(lst); + } +}; + +// +// colour schemes +// + +PlotKit.Base.baseColors = function () { + var hexColor = MochiKit.Color.Color.fromHexString; + return [hexColor("#476fb2"), + hexColor("#be2c2b"), + hexColor("#85b730"), + hexColor("#734a99"), + hexColor("#26a1c5"), + hexColor("#fb8707"), + hexColor("#000000")]; +}; + +PlotKit.Base.officeBaseStyle = { + "axisLineWidth": 2.0, + "axisLabelColor": Color.grayColor(), + "axisLineColor": Color.whiteColor(), + "padding": {top: 5, bottom: 10, left: 30, right: 30} +}; + +MochiKit.Base.update(PlotKit.Base,{ + officeBlue: function() { + var r = { + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[0]), + "backgroundColor": PlotKit.Base.baseColors()[0].lighterColorWithLevel(0.45) + }; + MochiKit.Base.update(r, PlotKit.Base.officeBaseStyle); + return r; + }, + officeRed: function() { + var r = { + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[1]), + "backgroundColor": PlotKit.Base.baseColors()[1].lighterColorWithLevel(0.5) + }; + MochiKit.Base.update(r, PlotKit.Base.officeBaseStyle); + return r; + }, + officeGreen: function() { + var r = { + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[2]), + "backgroundColor": PlotKit.Base.baseColors()[2].lighterColorWithLevel(0.5) + }; + MochiKit.Base.update(r, PlotKit.Base.officeBaseStyle); + return r; + }, + officePurple: function() { + var r = { + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[3]), + "backgroundColor": PlotKit.Base.baseColors()[3].lighterColorWithLevel(0.5) + }; + MochiKit.Base.update(r, PlotKit.Base.officeBaseStyle); + return r; + }, + + officeCyan: function() { + var r = { + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[4]), + "backgroundColor": PlotKit.Base.baseColors()[4].lighterColorWithLevel(0.5) + }; + MochiKit.Base.update(r, PlotKit.Base.officeBaseStyle); + return r; + }, + + officeOrange: function() { + var r = { + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[5]), + "backgroundColor": PlotKit.Base.baseColors()[5].lighterColorWithLevel(0.4) + }; + MochiKit.Base.update(r, PlotKit.Base.officeBaseStyle); + return r; + }, + + officeBlack: function() { + var r = { + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[6], 0.0, 0.6), + "backgroundColor": PlotKit.Base.baseColors()[6].lighterColorWithLevel(0.9) + }; + MochiKit.Base.update(r, PlotKit.Base.officeBaseStyle); + return r; + } +}); + + +PlotKit.Base.EXPORT = [ + "baseColors", + "collapse", + "colorScheme", + "findPosX", + "findPosY", + "officeBaseStyle", + "officeBlue", + "officeRed", + "officeGreen", + "officePurple", + "officeCyan", + "officeOrange", + "officeBlack", + "roundInterval", + "uniq", + "isFuncLike", + "excanvasSupported" +]; + +PlotKit.Base.EXPORT_OK = []; + +PlotKit.Base.__new__ = function() { + var m = MochiKit.Base; + + m.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; +}; + +PlotKit.Base.__new__(); +MochiKit.Base._exportSymbols(this, PlotKit.Base); + diff --git a/plotkit_v091/PlotKit/Canvas.js b/plotkit_v091/PlotKit/Canvas.js new file mode 100644 index 0000000..1e88e3c --- /dev/null +++ b/plotkit_v091/PlotKit/Canvas.js @@ -0,0 +1,683 @@ +/* + PlotKit Canvas + ============== + + Provides HTML Canvas Renderer. This is supported under: + + - Safari 2.0 + - Mozilla Firefox 1.5 + - Opera 9.0 preview 2 + - IE 6 (via VML Emulation) + + It uses DIVs for labels. + + Copyright + --------- + Copyright 2005,2006 (c) Alastair Tse + For use under the BSD license. + +*/ +// -------------------------------------------------------------------- +// Check required components +// -------------------------------------------------------------------- + +try { + if ((typeof(PlotKit.Base) == 'undefined') || + (typeof(PlotKit.Layout) == 'undefined')) + { + throw ""; + } +} +catch (e) { + throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Base,Layout}" +} + + +// ------------------------------------------------------------------------ +// Defines the renderer class +// ------------------------------------------------------------------------ + +if (typeof(PlotKit.CanvasRenderer) == 'undefined') { + PlotKit.CanvasRenderer = {}; +} + +PlotKit.CanvasRenderer.NAME = "PlotKit.CanvasRenderer"; +PlotKit.CanvasRenderer.VERSION = PlotKit.VERSION; + +PlotKit.CanvasRenderer.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.CanvasRenderer.toString = function() { + return this.__repr__(); +} + +PlotKit.CanvasRenderer = function(element, layout, options) { + if (arguments.length > 0) + this.__init__(element, layout, options); +}; + +PlotKit.CanvasRenderer.prototype.__init__ = function(element, layout, options) { + var isNil = MochiKit.Base.isUndefinedOrNull; + var Color = MochiKit.Color.Color; + + // default options + this.options = { + "drawBackground": true, + "backgroundColor": Color.whiteColor(), + "padding": {left: 30, right: 30, top: 5, bottom: 10}, + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[0]), + "strokeColor": Color.whiteColor(), + "strokeColorTransform": "asStrokeColor", + "strokeWidth": 0.5, + "shouldFill": true, + "shouldStroke": true, + "drawXAxis": true, + "drawYAxis": true, + "axisLineColor": Color.blackColor(), + "axisLineWidth": 0.5, + "axisTickSize": 3, + "axisLabelColor": Color.blackColor(), + "axisLabelFont": "Arial", + "axisLabelFontSize": 9, + "axisLabelWidth": 50, + "pieRadius": 0.4, + "enableEvents": true + }; + MochiKit.Base.update(this.options, options ? options : {}); + + this.layout = layout; + this.element = MochiKit.DOM.getElement(element); + this.container = this.element.parentNode; + + // Stuff relating to Canvas on IE support + this.isIE = PlotKit.Base.excanvasSupported(); + + if (this.isIE && !isNil(G_vmlCanvasManager)) { + this.IEDelay = 0.5; + this.maxTries = 5; + this.renderDelay = null; + this.clearDelay = null; + this.element = G_vmlCanvasManager.initElement(this.element); + } + + this.height = this.element.height; + this.width = this.element.width; + + // --- check whether everything is ok before we return + + if (isNil(this.element)) + throw "CanvasRenderer() - passed canvas is not found"; + + if (!this.isIE && !(PlotKit.CanvasRenderer.isSupported(this.element))) + throw "CanvasRenderer() - Canvas is not supported."; + + if (isNil(this.container) || (this.container.nodeName.toLowerCase() != "div")) + throw "CanvasRenderer() - needs to be enclosed in
    "; + + // internal state + this.xlabels = new Array(); + this.ylabels = new Array(); + this.isFirstRender = true; + + this.area = { + x: this.options.padding.left, + y: this.options.padding.top, + w: this.width - this.options.padding.left - this.options.padding.right, + h: this.height - this.options.padding.top - this.options.padding.bottom + }; + + MochiKit.DOM.updateNodeAttributes(this.container, + {"style":{ "position": "relative", "width": this.width + "px"}}); + + // load event system if we have Signals + /* Disabled until we have a proper implementation + try { + this.event_isinside = null; + if (MochiKit.Signal && this.options.enableEvents) { + this._initialiseEvents(); + } + } + catch (e) { + // still experimental + } + */ +}; + +PlotKit.CanvasRenderer.prototype.render = function() { + if (this.isIE) { + // VML takes a while to start up, so we just poll every this.IEDelay + try { + if (this.renderDelay) { + this.renderDelay.cancel(); + this.renderDelay = null; + } + var context = this.element.getContext("2d"); + } + catch (e) { + this.isFirstRender = false; + if (this.maxTries-- > 0) { + this.renderDelay = MochiKit.Async.wait(this.IEDelay); + this.renderDelay.addCallback(bind(this.render, this)); + } + return; + } + } + + if (this.options.drawBackground) + this._renderBackground(); + + if (this.layout.style == "bar") { + this._renderBarChart(); + this._renderBarAxis(); + } + else if (this.layout.style == "pie") { + this._renderPieChart(); + this._renderPieAxis(); + } + else if (this.layout.style == "line") { + this._renderLineChart(); + this._renderLineAxis(); + } +}; + +PlotKit.CanvasRenderer.prototype._renderBarChartWrap = function(data, plotFunc) { + var context = this.element.getContext("2d"); + var colorCount = this.options.colorScheme.length; + var colorScheme = this.options.colorScheme; + var setNames = MochiKit.Base.keys(this.layout.datasets); + var setCount = setNames.length; + + for (var i = 0; i < setCount; i++) { + var setName = setNames[i]; + var color = colorScheme[i%colorCount]; + context.save(); + context.fillStyle = color.toRGBString(); + if (this.options.strokeColor) + context.strokeStyle = this.options.strokeColor.toRGBString(); + else if (this.options.strokeColorTransform) + context.strokeStyle = color[this.options.strokeColorTransform]().toRGBString(); + + context.lineWidth = this.options.strokeWidth; + var forEachFunc = function(obj) { + if (obj.name == setName) + plotFunc(context, obj); + }; + + MochiKit.Iter.forEach(data, bind(forEachFunc, this)); + context.restore(); + } +}; + +PlotKit.CanvasRenderer.prototype._renderBarChart = function() { + var bind = MochiKit.Base.bind; + + var drawRect = function(context, bar) { + var x = this.area.w * bar.x + this.area.x; + var y = this.area.h * bar.y + this.area.y; + var w = this.area.w * bar.w; + var h = this.area.h * bar.h; + if ((w < 1) || (h < 1)) + return; + if (this.options.shouldFill) + context.fillRect(x, y, w, h); + if (this.options.shouldStroke) + context.strokeRect(x, y, w, h); + }; + this._renderBarChartWrap(this.layout.bars, bind(drawRect, this)); +}; + +PlotKit.CanvasRenderer.prototype._renderLineChart = function() { + var context = this.element.getContext("2d"); + var colorCount = this.options.colorScheme.length; + var colorScheme = this.options.colorScheme; + var setNames = MochiKit.Base.keys(this.layout.datasets); + var setCount = setNames.length; + var bind = MochiKit.Base.bind; + var partial = MochiKit.Base.partial; + + for (var i = 0; i < setCount; i++) { + var setName = setNames[i]; + var color = colorScheme[i%colorCount]; + var strokeX = this.options.strokeColorTransform; + + // setup graphics context + context.save(); + context.fillStyle = color.toRGBString(); + if (this.options.strokeColor) + context.strokeStyle = this.options.strokeColor.toRGBString(); + else if (this.options.strokeColorTransform) + context.strokeStyle = color[strokeX]().toRGBString(); + + context.lineWidth = this.options.strokeWidth; + + // create paths + var makePath = function(ctx) { + ctx.beginPath(); + ctx.moveTo(this.area.x, this.area.y + this.area.h); + var addPoint = function(ctx_, point) { + if (point.name == setName) + ctx_.lineTo(this.area.w * point.x + this.area.x, + this.area.h * point.y + this.area.y); + }; + MochiKit.Iter.forEach(this.layout.points, partial(addPoint, ctx), this); + ctx.lineTo(this.area.w + this.area.x, + this.area.h + this.area.y); + ctx.lineTo(this.area.x, this.area.y + this.area.h); + ctx.closePath(); + }; + + if (this.options.shouldFill) { + bind(makePath, this)(context); + context.fill(); + } + if (this.options.shouldStroke) { + bind(makePath, this)(context); + context.stroke(); + } + + context.restore(); + } +}; + +PlotKit.CanvasRenderer.prototype._renderPieChart = function() { + var context = this.element.getContext("2d"); + var colorCount = this.options.colorScheme.length; + var slices = this.layout.slices; + + var centerx = this.area.x + this.area.w * 0.5; + var centery = this.area.y + this.area.h * 0.5; + var radius = Math.min(this.area.w * this.options.pieRadius, + this.area.h * this.options.pieRadius); + + if (this.isIE) { + centerx = parseInt(centerx); + centery = parseInt(centery); + radius = parseInt(radius); + } + + + // NOTE NOTE!! Canvas Tag draws the circle clockwise from the y = 0, x = 1 + // so we have to subtract 90 degrees to make it start at y = 1, x = 0 + + for (var i = 0; i < slices.length; i++) { + var color = this.options.colorScheme[i%colorCount]; + context.save(); + context.fillStyle = color.toRGBString(); + + var makePath = function() { + context.beginPath(); + context.moveTo(centerx, centery); + context.arc(centerx, centery, radius, + slices[i].startAngle - Math.PI/2, + slices[i].endAngle - Math.PI/2, + false); + context.lineTo(centerx, centery); + context.closePath(); + }; + + if (Math.abs(slices[i].startAngle - slices[i].endAngle) > 0.001) { + if (this.options.shouldFill) { + makePath(); + context.fill(); + } + + if (this.options.shouldStroke) { + makePath(); + context.lineWidth = this.options.strokeWidth; + if (this.options.strokeColor) + context.strokeStyle = this.options.strokeColor.toRGBString(); + else if (this.options.strokeColorTransform) + context.strokeStyle = color[this.options.strokeColorTransform]().toRGBString(); + context.stroke(); + } + } + context.restore(); + } +}; + +PlotKit.CanvasRenderer.prototype._renderBarAxis = function() { + this._renderAxis(); +} + +PlotKit.CanvasRenderer.prototype._renderLineAxis = function() { + this._renderAxis(); +}; + + +PlotKit.CanvasRenderer.prototype._renderAxis = function() { + if (!this.options.drawXAxis && !this.options.drawYAxis) + return; + + var context = this.element.getContext("2d"); + + var labelStyle = {"style": + {"position": "absolute", + "fontSize": this.options.axisLabelFontSize + "px", + "zIndex": 10, + "color": this.options.axisLabelColor.toRGBString(), + "width": this.options.axisLabelWidth + "px", + "overflow": "hidden" + } + }; + + // axis lines + context.save(); + context.strokeStyle = this.options.axisLineColor.toRGBString(); + context.lineWidth = this.options.axisLineWidth; + + + if (this.options.drawYAxis) { + if (this.layout.yticks) { + var drawTick = function(tick) { + if (typeof(tick) == "function") return; + var x = this.area.x; + var y = this.area.y + tick[0] * this.area.h; + context.beginPath(); + context.moveTo(x, y); + context.lineTo(x - this.options.axisTickSize, y); + context.closePath(); + context.stroke(); + + var label = DIV(labelStyle, tick[1]); + label.style.top = (y - this.options.axisLabelFontSize) + "px"; + label.style.left = (x - this.options.padding.left - this.options.axisTickSize) + "px"; + label.style.textAlign = "right"; + label.style.width = (this.options.padding.left - this.options.axisTickSize * 2) + "px"; + MochiKit.DOM.appendChildNodes(this.container, label); + this.ylabels.push(label); + }; + + MochiKit.Iter.forEach(this.layout.yticks, bind(drawTick, this)); + } + + context.beginPath(); + context.moveTo(this.area.x, this.area.y); + context.lineTo(this.area.x, this.area.y + this.area.h); + context.closePath(); + context.stroke(); + } + + if (this.options.drawXAxis) { + if (this.layout.xticks) { + var drawTick = function(tick) { + if (typeof(dataset) == "function") return; + + var x = this.area.x + tick[0] * this.area.w; + var y = this.area.y + this.area.h; + context.beginPath(); + context.moveTo(x, y); + context.lineTo(x, y + this.options.axisTickSize); + context.closePath(); + context.stroke(); + + var label = DIV(labelStyle, tick[1]); + label.style.top = (y + this.options.axisTickSize) + "px"; + label.style.left = (x - this.options.axisLabelWidth/2) + "px"; + label.style.textAlign = "center"; + label.style.width = this.options.axisLabelWidth + "px"; + MochiKit.DOM.appendChildNodes(this.container, label); + this.xlabels.push(label); + }; + + MochiKit.Iter.forEach(this.layout.xticks, bind(drawTick, this)); + } + + context.beginPath(); + context.moveTo(this.area.x, this.area.y + this.area.h); + context.lineTo(this.area.x + this.area.w, this.area.y + this.area.h); + context.closePath(); + context.stroke(); + } + + context.restore(); + +}; + +PlotKit.CanvasRenderer.prototype._renderPieAxis = function() { + if (!this.options.drawXAxis) + return; + + if (this.layout.xticks) { + // make a lookup dict for x->slice values + var lookup = new Array(); + for (var i = 0; i < this.layout.slices.length; i++) { + lookup[this.layout.slices[i].xval] = this.layout.slices[i]; + } + + var centerx = this.area.x + this.area.w * 0.5; + var centery = this.area.y + this.area.h * 0.5; + var radius = Math.min(this.area.w * this.options.pieRadius, + this.area.h * this.options.pieRadius); + var labelWidth = this.options.axisLabelWidth; + + for (var i = 0; i < this.layout.xticks.length; i++) { + var slice = lookup[this.layout.xticks[i][0]]; + if (MochiKit.Base.isUndefinedOrNull(slice)) + continue; + + + var angle = (slice.startAngle + slice.endAngle)/2; + // normalize the angle + var normalisedAngle = angle; + if (normalisedAngle > Math.PI * 2) + normalisedAngle = normalisedAngle - Math.PI * 2; + else if (normalisedAngle < 0) + normalisedAngle = normalisedAngle + Math.PI * 2; + + var labelx = centerx + Math.sin(normalisedAngle) * (radius + 10); + var labely = centery - Math.cos(normalisedAngle) * (radius + 10); + + var attrib = {"position": "absolute", + "zIndex": 11, + "width": labelWidth + "px", + "fontSize": this.options.axisLabelFontSize + "px", + "overflow": "hidden", + "color": this.options.axisLabelColor.toHexString() + }; + + if (normalisedAngle <= Math.PI * 0.5) { + // text on top and align left + attrib["textAlign"] = "left"; + attrib["verticalAlign"] = "top"; + attrib["left"] = labelx + "px"; + attrib["top"] = (labely - this.options.axisLabelFontSize) + "px"; + } + else if ((normalisedAngle > Math.PI * 0.5) && (normalisedAngle <= Math.PI)) { + // text on bottom and align left + attrib["textAlign"] = "left"; + attrib["verticalAlign"] = "bottom"; + attrib["left"] = labelx + "px"; + attrib["top"] = labely + "px"; + + } + else if ((normalisedAngle > Math.PI) && (normalisedAngle <= Math.PI*1.5)) { + // text on bottom and align right + attrib["textAlign"] = "right"; + attrib["verticalAlign"] = "bottom"; + attrib["left"] = (labelx - labelWidth) + "px"; + attrib["top"] = labely + "px"; + } + else { + // text on top and align right + attrib["textAlign"] = "right"; + attrib["verticalAlign"] = "bottom"; + attrib["left"] = (labelx - labelWidth) + "px"; + attrib["top"] = (labely - this.options.axisLabelFontSize) + "px"; + } + + var label = DIV({'style': attrib}, this.layout.xticks[i][1]); + this.xlabels.push(label); + MochiKit.DOM.appendChildNodes(this.container, label); + } + + } +}; + +PlotKit.CanvasRenderer.prototype._renderBackground = function() { + var context = this.element.getContext("2d"); + context.save(); + context.fillStyle = this.options.backgroundColor.toRGBString(); + context.fillRect(0, 0, this.width, this.height); + context.restore(); +}; + +PlotKit.CanvasRenderer.prototype.clear = function() { + if (this.isIE) { + // VML takes a while to start up, so we just poll every this.IEDelay + try { + if (this.clearDelay) { + this.clearDelay.cancel(); + this.clearDelay = null; + } + var context = this.element.getContext("2d"); + } + catch (e) { + this.isFirstRender = false; + this.clearDelay = MochiKit.Async.wait(this.IEDelay); + this.clearDelay.addCallback(bind(this.clear, this)); + return; + } + } + + var context = this.element.getContext("2d"); + context.clearRect(0, 0, this.width, this.height); + + MochiKit.Iter.forEach(this.xlabels, MochiKit.DOM.removeElement); + MochiKit.Iter.forEach(this.ylabels, MochiKit.DOM.removeElement); + this.xlabels = new Array(); + this.ylabels = new Array(); +}; + +// ---------------------------------------------------------------- +// Everything below here is experimental and undocumented. +// ---------------------------------------------------------------- + +PlotKit.CanvasRenderer.prototype._initialiseEvents = function() { + var connect = MochiKit.Signal.connect; + var bind = MochiKit.Base.bind; + //MochiKit.Signal.registerSignals(this, ['onmouseover', 'onclick', 'onmouseout', 'onmousemove']); + //connect(this.element, 'onmouseover', bind(this.onmouseover, this)); + //connect(this.element, 'onmouseout', bind(this.onmouseout, this)); + //connect(this.element, 'onmousemove', bind(this.onmousemove, this)); + connect(this.element, 'onclick', bind(this.onclick, this)); +}; + +PlotKit.CanvasRenderer.prototype._resolveObject = function(e) { + // does not work in firefox + //var x = (e.event().offsetX - this.area.x) / this.area.w; + //var y = (e.event().offsetY - this.area.y) / this.area.h; + + var x = (e.mouse().page.x - PlotKit.Base.findPosX(this.element) - this.area.x) / this.area.w; + var y = (e.mouse().page.y - PlotKit.Base.findPosY(this.element) - this.area.y) / this.area.h; + + //log(x, y); + + var isHit = this.layout.hitTest(x, y); + if (isHit) + return isHit; + return null; +}; + +PlotKit.CanvasRenderer.prototype._createEventObject = function(layoutObj, e) { + if (layoutObj == null) { + return null; + } + + e.chart = layoutObj + return e; +}; + + +PlotKit.CanvasRenderer.prototype.onclick = function(e) { + var layoutObject = this._resolveObject(e); + var eventObject = this._createEventObject(layoutObject, e); + if (eventObject != null) + MochiKit.Signal.signal(this, "onclick", eventObject); +}; + +PlotKit.CanvasRenderer.prototype.onmouseover = function(e) { + var layoutObject = this._resolveObject(e); + var eventObject = this._createEventObject(layoutObject, e); + if (eventObject != null) + signal(this, "onmouseover", eventObject); +}; + +PlotKit.CanvasRenderer.prototype.onmouseout = function(e) { + var layoutObject = this._resolveObject(e); + var eventObject = this._createEventObject(layoutObject, e); + if (eventObject == null) + signal(this, "onmouseout", e); + else + signal(this, "onmouseout", eventObject); + +}; + +PlotKit.CanvasRenderer.prototype.onmousemove = function(e) { + var layoutObject = this._resolveObject(e); + var eventObject = this._createEventObject(layoutObject, e); + + if ((layoutObject == null) && (this.event_isinside == null)) { + // TODO: should we emit an event anyway? + return; + } + + if ((layoutObject != null) && (this.event_isinside == null)) + signal(this, "onmouseover", eventObject); + + if ((layoutObject == null) && (this.event_isinside != null)) + signal(this, "onmouseout", eventObject); + + if ((layoutObject != null) && (this.event_isinside != null)) + signal(this, "onmousemove", eventObject); + + this.event_isinside = layoutObject; + //log("move", x, y); +}; + +PlotKit.CanvasRenderer.isSupported = function(canvasName) { + var canvas = null; + try { + if (MochiKit.Base.isUndefinedOrNull(canvasName)) + canvas = MochiKit.DOM.CANVAS({}); + else + canvas = MochiKit.DOM.getElement(canvasName); + var context = canvas.getContext("2d"); + } + catch (e) { + var ie = navigator.appVersion.match(/MSIE (\d\.\d)/); + var opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + if ((!ie) || (ie[1] < 6) || (opera)) + return false; + return true; + } + return true; +}; + +// Namespace Iniitialisation + +PlotKit.Canvas = {} +PlotKit.Canvas.CanvasRenderer = PlotKit.CanvasRenderer; + +PlotKit.Canvas.EXPORT = [ + "CanvasRenderer" +]; + +PlotKit.Canvas.EXPORT_OK = [ + "CanvasRenderer" +]; + +PlotKit.Canvas.__new__ = function() { + var m = MochiKit.Base; + + m.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; +}; + +PlotKit.Canvas.__new__(); +MochiKit.Base._exportSymbols(this, PlotKit.Canvas); + diff --git a/plotkit_v091/PlotKit/EasyPlot.js b/plotkit_v091/PlotKit/EasyPlot.js new file mode 100644 index 0000000..7607731 --- /dev/null +++ b/plotkit_v091/PlotKit/EasyPlot.js @@ -0,0 +1,161 @@ +/* + PlotKit EasyPlot + ================ + + User friendly wrapper around the common plotting functions. + + Copyright + --------- + Copyright 2005,2006 (c) Alastair Tse + For use under the BSD license. + +*/ + +try { + if (typeof(PlotKit.CanvasRenderer) == 'undefined') + { + throw "" + } +} +catch (e) { + throw "PlotKit.EasyPlot depends on all of PlotKit's components"; +} + +// -------------------------------------------------------------------- +// Start of EasyPlot definition +// -------------------------------------------------------------------- + +if (typeof(PlotKit.EasyPlot) == 'undefined') { + PlotKit.EasyPlot = {}; +} + +PlotKit.EasyPlot.NAME = "PlotKit.EasyPlot"; +PlotKit.EasyPlot.VERSION = PlotKit.VERSION; + +PlotKit.EasyPlot.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.EasyPlot.toString = function() { + return this.__repr__(); +} + +// -------------------------------------------------------------------- +// Start of EasyPlot definition +// -------------------------------------------------------------------- + +PlotKit.EasyPlot = function(style, options, divElem, datasources) { + this.layout = new Layout(style, options); + this.divElem = divElem; + this.width = parseInt(divElem.getAttribute('width')); + this.height = parseInt(divElem.getAttribute('height')); + this.deferredCount = 0; + + // make sure we have non-zero width + if (this.width < 1) { + this.width = this.divElem.width ? this.divElem.width : 300; + } + + if (this.height < 1) { + this.height = this.divElem.height ? this.divElem.height : 300; + } + + // load data sources + if (isArrayLike(datasources)) { + for (var i = 0; i < datasources.length; i++) { + if (typeof(datasources[i]) == "string") { + this.deferredCount++; + // load CSV via ajax + var d = MochiKit.Async.doSimpleXMLHttpRequest(datasources[i]); + d.addCallback(MochiKit.Base.bind(PlotKit.EasyPlot.onDataLoaded, this)); + } + else if (isArrayLike(datasources[i])) { + this.layout.addDataset("data-" + i, datasources[i]); + } + } + } + else if (!isUndefinedOrNull(datasources)) { + throw "Passed datasources are not Array like"; + } + + // setup canvas to render + + if (CanvasRenderer.isSupported()) { + this.element = CANVAS({"id": this.divElem.getAttribute("id") + "-canvas", + "width": this.width, + "height": this.height}, ""); + this.divElem.appendChild(this.element); + this.renderer = new SweetCanvasRenderer(this.element, this.layout, options); + } + else if (SVGRenderer.isSupported()) { + this.element = SVGRenderer.SVG({"id": this.divElem.getAttribute("id") + "-svg", + "width": this.width, + "height": this.height, + "version": "1.1", + "baseProfile": "full"}, ""); + this.divElem.appendChild(this.element); + this.renderer = new SweetSVGRenderer(this.element, this.layout, options); + } + + if ((this.deferredCount == 0) && (PlotKit.Base.keys(this.layout.datasets).length > 0)) { + this.layout.evaluate(); + this.renderer.clear(); + this.renderer.render(); + } + +}; + +PlotKit.EasyPlot.onDataLoaded = function(request) { + + // very primitive CSV parser, should fix to make it more compliant. + var table = new Array(); + var lines = request.responseText.split('\n'); + for (var i = 0; i < lines.length; i++) { + var stripped = MochiKit.Format.strip(lines[i]); + if ((stripped.length > 1) && (stripped.charAt(0) != '#')) { + table.push(stripped.split(',')); + } + } + + this.layout.addDataset("data-ajax-" + this.deferredCount, table); + this.deferredCount--; + + if ((this.deferredCount == 0) && (PlotKit.Base.keys(this.layout.datasets).length > 0)) { + this.layout.evaluate(); + this.renderer.clear(); + this.renderer.render(); + } +}; + +PlotKit.EasyPlot.prototype.reload = function() { + this.layout.evaluate(); + this.renderer.clear(); + this.renderer.render(); +}; + +// Namespace Iniitialisation + +PlotKit.EasyPlotModule = {}; +PlotKit.EasyPlotModule.EasyPlot = PlotKit.EasyPlot; + +PlotKit.EasyPlotModule.EXPORT = [ + "EasyPlot" +]; + +PlotKit.EasyPlotModule.EXPORT_OK = []; + +PlotKit.EasyPlotModule.__new__ = function() { + var m = MochiKit.Base; + + m.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; +}; + +PlotKit.EasyPlotModule.__new__(); +MochiKit.Base._exportSymbols(this, PlotKit.EasyPlotModule); + + diff --git a/plotkit_v091/PlotKit/Layout.js b/plotkit_v091/PlotKit/Layout.js new file mode 100644 index 0000000..ff1c9db --- /dev/null +++ b/plotkit_v091/PlotKit/Layout.js @@ -0,0 +1,756 @@ +/* + PlotKit Layout + ============== + + Handles laying out data on to a virtual canvas square canvas between 0.0 + and 1.0. If you want to add new chart/plot types such as point plots, + you need to add them here. + + Copyright + --------- + Copyright 2005,2006 (c) Alastair Tse + For use under the BSD license. + +*/ + +try { + if (typeof(PlotKit.Base) == 'undefined') + { + throw "" + } +} +catch (e) { + throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Base" +} + +// -------------------------------------------------------------------- +// Start of Layout definition +// -------------------------------------------------------------------- + +if (typeof(PlotKit.Layout) == 'undefined') { + PlotKit.Layout = {}; +} + +PlotKit.Layout.NAME = "PlotKit.Layout"; +PlotKit.Layout.VERSION = PlotKit.VERSION; + +PlotKit.Layout.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.Layout.toString = function() { + return this.__repr__(); +} + +PlotKit.Layout.valid_styles = ["bar", "line", "pie", "point"]; + +// -------------------------------------------------------------------- +// Start of Layout definition +// -------------------------------------------------------------------- + +PlotKit.Layout = function(style, options) { + + this.options = { + "barWidthFillFraction": 0.75, + "barOrientation": "vertical", + "xOriginIsZero": true, + "yOriginIsZero": true, + "xAxis": null, // [xmin, xmax] + "yAxis": null, // [ymin, ymax] + "xTicks": null, // [{label: "somelabel", v: value}, ..] (label opt.) + "yTicks": null, // [{label: "somelabel", v: value}, ..] (label opt.) + "xNumberOfTicks": 10, + "yNumberOfTicks": 5, + "xTickPrecision": 1, + "yTickPrecision": 1, + "pieRadius": 0.4 + }; + + // valid external options : TODO: input verification + this.style = style; + MochiKit.Base.update(this.options, options ? options : {}); + + // externally visible states + // overriden if xAxis and yAxis are set in options + if (!MochiKit.Base.isUndefinedOrNull(this.options.xAxis)) { + this.minxval = this.options.xAxis[0]; + this.maxxval = this.options.xAxis[1]; + this.xscale = this.maxxval - this.minxval; + } + else { + this.minxval = 0; + this.maxxval = null; + this.xscale = null; // val -> pos factor (eg, xval * xscale = xpos) + } + + if (!MochiKit.Base.isUndefinedOrNull(this.options.yAxis)) { + this.minyval = this.options.yAxis[0]; + this.maxyval = this.options.yAxis[1]; + this.yscale = this.maxyval - this.minyval; + } + else { + this.minyval = 0; + this.maxyval = null; + this.yscale = null; + } + + this.bars = new Array(); // array of bars to plot for bar charts + this.points = new Array(); // array of points to plot for line plots + this.slices = new Array(); // array of slices to draw for pie charts + + this.xticks = new Array(); + this.yticks = new Array(); + + // internal states + this.datasets = new Array(); + this.minxdelta = 0; + this.xrange = 1; + this.yrange = 1; + + this.hitTestCache = {x2maxy: null}; + +}; + +// -------------------------------------------------------------------- +// Dataset Manipulation +// -------------------------------------------------------------------- + + +PlotKit.Layout.prototype.addDataset = function(setname, set_xy) { + this.datasets[setname] = set_xy; +}; + +PlotKit.Layout.prototype.removeDataset = function(setname, set_xy) { + delete this.datasets[setname]; +}; + +PlotKit.Layout.prototype.addDatasetFromTable = function(name, tableElement, xcol, ycol, lcol) { + var isNil = MochiKit.Base.isUndefinedOrNull; + var scrapeText = MochiKit.DOM.scrapeText; + var strip = MochiKit.Format.strip; + + if (isNil(xcol)) + xcol = 0; + if (isNil(ycol)) + ycol = 1; + if (isNil(lcol)) + lcol = -1; + + var rows = tableElement.tBodies[0].rows; + var data = new Array(); + var labels = new Array(); + + if (!isNil(rows)) { + for (var i = 0; i < rows.length; i++) { + data.push([parseFloat(strip(scrapeText(rows[i].cells[xcol]))), + parseFloat(strip(scrapeText(rows[i].cells[ycol])))]); + if (lcol >= 0){ + labels.push({v: parseFloat(strip(scrapeText(rows[i].cells[xcol]))), + label: strip(scrapeText(rows[i].cells[lcol]))}); + } + } + this.addDataset(name, data); + if (lcol >= 0) { + this.options.xTicks = labels; + } + return true; + } + return false; +}; + +// -------------------------------------------------------------------- +// Evaluates the layout for the current data and style. +// -------------------------------------------------------------------- + +PlotKit.Layout.prototype.evaluate = function() { + this._evaluateLimits(); + this._evaluateScales(); + if (this.style == "bar") { + if (this.options.barOrientation == "horizontal") { + this._evaluateHorizBarCharts(); + } + else { + this._evaluateBarCharts(); + } + this._evaluateBarTicks(); + } + else if (this.style == "line") { + this._evaluateLineCharts(); + this._evaluateLineTicks(); + } + else if (this.style == "pie") { + this._evaluatePieCharts(); + this._evaluatePieTicks(); + } +}; + + + +// Given the fractional x, y positions, report the corresponding +// x, y values. +PlotKit.Layout.prototype.hitTest = function(x, y) { + // TODO: make this more efficient with better datastructures + // for this.bars, this.points and this.slices + + var f = MochiKit.Format.twoDigitFloat; + + if ((this.style == "bar") && this.bars && (this.bars.length > 0)) { + for (var i = 0; i < this.bars.length; i++) { + var bar = this.bars[i]; + if ((x >= bar.x) && (x <= bar.x + bar.w) + && (y >= bar.y) && (y - bar.y <= bar.h)) + return bar; + } + } + + else if (this.style == "line") { + if (this.hitTestCache.x2maxy == null) { + this._regenerateHitTestCache(); + } + + // 1. find the xvalues that equal or closest to the give x + var xval = x / this.xscale; + var xvalues = this.hitTestCache.xvalues; + var xbefore = null; + var xafter = null; + + for (var i = 1; i < xvalues.length; i++) { + if (xvalues[i] > xval) { + xbefore = xvalues[i-1]; + xafter = xvalues[i]; + break; + } + } + + if ((xbefore != null)) { + var ybefore = this.hitTestCache.x2maxy[xbefore]; + var yafter = this.hitTestCache.x2maxy[xafter]; + var yval = (1.0 - y)/this.yscale; + + // interpolate whether we will fall inside or outside + var gradient = (yafter - ybefore) / (xafter - xbefore); + var projmaxy = ybefore + gradient * (xval - xbefore); + if (projmaxy >= yval) { + // inside the highest curve (roughly) + var obj = {xval: xval, yval: yval, + xafter: xafter, yafter: yafter, + xbefore: xbefore, ybefore: ybefore, + yprojected: projmaxy + }; + return obj; + } + } + } + + else if (this.style == "pie") { + var dist = Math.sqrt((y-0.5)*(y-0.5) + (x-0.5)*(x-0.5)); + if (dist > this.options.pieRadius) + return null; + + // TODO: actually doesn't work if we don't know how the Canvas + // lays it out, need to fix! + var angle = Math.atan2(y - 0.5, x - 0.5) - Math.PI/2; + for (var i = 0; i < this.slices.length; i++) { + var slice = this.slices[i]; + if (slice.startAngle < angle && slice.endAngle >= angle) + return slice; + } + } + + return null; +}; + +// Reports valid position rectangle for X value (only valid for bar charts) +PlotKit.Layout.prototype.rectForX = function(x) { + return null; +}; + +// Reports valid angles through which X value encloses (only valid for pie charts) +PlotKit.Layout.prototype.angleRangeForX = function(x) { + return null; +}; + +// -------------------------------------------------------------------- +// START Internal Functions +// -------------------------------------------------------------------- + +PlotKit.Layout.prototype._evaluateLimits = function() { + // take all values from all datasets and find max and min + var map = PlotKit.Base.map; + var items = PlotKit.Base.items; + var itemgetter = MochiKit.Base.itemgetter; + var collapse = PlotKit.Base.collapse; + var listMin = MochiKit.Base.listMin; + var listMax = MochiKit.Base.listMax; + var isNil = MochiKit.Base.isUndefinedOrNull; + + + var all = collapse(map(itemgetter(1), items(this.datasets))); + if (isNil(this.options.xAxis)) { + if (this.options.xOriginIsZero) + this.minxval = 0; + else + this.minxval = listMin(map(parseFloat, map(itemgetter(0), all))); + + this.maxxval = listMax(map(parseFloat, map(itemgetter(0), all))); + } + else { + this.minxval = this.options.xAxis[0]; + this.maxxval = this.options.xAxis[1]; + this.xscale = this.maxval - this.minxval; + } + + if (isNil(this.options.yAxis)) { + if (this.options.yOriginIsZero) + this.minyval = 0; + else + this.minyval = listMin(map(parseFloat, map(itemgetter(1), all))); + + this.maxyval = listMax(map(parseFloat, map(itemgetter(1), all))); + } + else { + this.minyval = this.options.yAxis[0]; + this.maxyval = this.options.yAxis[1]; + this.yscale = this.maxyval - this.minyval; + } + +}; + +PlotKit.Layout.prototype._evaluateScales = function() { + var isNil = MochiKit.Base.isUndefinedOrNull; + + this.xrange = this.maxxval - this.minxval; + if (this.xrange == 0) + this.xscale = 1.0; + else + this.xscale = 1/this.xrange; + + this.yrange = this.maxyval - this.minyval; + if (this.yrange == 0) + this.yscale = 1.0; + else + this.yscale = 1/this.yrange; +}; + +PlotKit.Layout.prototype._uniqueXValues = function() { + var collapse = PlotKit.Base.collapse; + var map = PlotKit.Base.map; + var uniq = PlotKit.Base.uniq; + var getter = MochiKit.Base.itemgetter; + var items = PlotKit.Base.items; + + var xvalues = map(parseFloat, map(getter(0), collapse(map(getter(1), items(this.datasets))))); + xvalues.sort(MochiKit.Base.compare); + return uniq(xvalues); +}; + +// Create the bars +PlotKit.Layout.prototype._evaluateBarCharts = function() { + var items = PlotKit.Base.items; + + var setCount = items(this.datasets).length; + + // work out how far separated values are + var xdelta = 10000000; + var xvalues = this._uniqueXValues(); + for (var i = 1; i < xvalues.length; i++) { + xdelta = Math.min(Math.abs(xvalues[i] - xvalues[i-1]), xdelta); + } + + var barWidth = 0; + var barWidthForSet = 0; + var barMargin = 0; + if (xvalues.length == 1) { + // note we have to do something smarter if we only plot one value + xdelta = 1.0; + this.xscale = 1.0; + this.minxval = xvalues[0]; + barWidth = 1.0 * this.options.barWidthFillFraction; + barWidthForSet = barWidth/setCount; + barMargin = (1.0 - this.options.barWidthFillFraction)/2; + } + else { + // readjust xscale to fix with bar charts + if (this.xrange == 1) { + this.xscale = 0.5; + } + else if (this.xrange == 2) { + this.xscale = 1/3.0; + } + else { + this.xscale = (1.0 - xdelta/this.xrange)/this.xrange; + } + barWidth = xdelta * this.xscale * this.options.barWidthFillFraction; + barWidthForSet = barWidth / setCount; + barMargin = xdelta * this.xscale * (1.0 - this.options.barWidthFillFraction)/2; + } + + this.minxdelta = xdelta; // need this for tick positions + + // add all the rects + this.bars = new Array(); + var i = 0; + for (var setName in this.datasets) { + var dataset = this.datasets[setName]; + if (PlotKit.Base.isFuncLike(dataset)) continue; + for (var j = 0; j < dataset.length; j++) { + var item = dataset[j]; + var rect = { + x: ((parseFloat(item[0]) - this.minxval) * this.xscale) + (i * barWidthForSet) + barMargin, + y: 1.0 - ((parseFloat(item[1]) - this.minyval) * this.yscale), + w: barWidthForSet, + h: ((parseFloat(item[1]) - this.minyval) * this.yscale), + xval: parseFloat(item[0]), + yval: parseFloat(item[1]), + name: setName + }; + if ((rect.x >= 0.0) && (rect.x <= 1.0) && + (rect.y >= 0.0) && (rect.y <= 1.0)) { + this.bars.push(rect); + } + } + i++; + } +}; + +// Create the horizontal bars +PlotKit.Layout.prototype._evaluateHorizBarCharts = function() { + var items = PlotKit.Base.items; + + var setCount = items(this.datasets).length; + + // work out how far separated values are + var xdelta = 10000000; + var xvalues = this._uniqueXValues(); + for (var i = 1; i < xvalues.length; i++) { + xdelta = Math.min(Math.abs(xvalues[i] - xvalues[i-1]), xdelta); + } + + var barWidth = 0; + var barWidthForSet = 0; + var barMargin = 0; + + // work out how far each far each bar is separated + if (xvalues.length == 1) { + // do something smarter if we only plot one value + xdelta = 1.0; + this.xscale = 1.0; + this.minxval = xvalues[0]; + barWidth = 1.0 * this.options.barWidthFillFraction; + barWidthForSet = barWidth/setCount; + barMargin = (1.0 - this.options.barWidthFillFraction)/2; + } + else { + // readjust yscale to fix with bar charts + this.xscale = (1.0 - xdelta/this.xrange)/this.xrange; + barWidth = xdelta * this.xscale * this.options.barWidthFillFraction; + barWidthForSet = barWidth / setCount; + barMargin = xdelta * this.xscale * (1.0 - this.options.barWidthFillFraction)/2; + } + + this.minxdelta = xdelta; // need this for tick positions + + // add all the rects + this.bars = new Array(); + var i = 0; + for (var setName in this.datasets) { + var dataset = this.datasets[setName]; + if (PlotKit.Base.isFuncLike(dataset)) continue; + for (var j = 0; j < dataset.length; j++) { + var item = dataset[j]; + var rect = { + y: ((parseFloat(item[0]) - this.minxval) * this.xscale) + (i * barWidthForSet) + barMargin, + x: 0.0, + h: barWidthForSet, + w: ((parseFloat(item[1]) - this.minyval) * this.yscale), + xval: parseFloat(item[0]), + yval: parseFloat(item[1]), + name: setName + }; + + // limit the x, y values so they do not overdraw + if (rect.y <= 0.0) { + rect.y = 0.0; + } + if (rect.y >= 1.0) { + rect.y = 1.0; + } + if ((rect.x >= 0.0) && (rect.x <= 1.0)) { + this.bars.push(rect); + } + } + i++; + } +}; + + +// Create the line charts +PlotKit.Layout.prototype._evaluateLineCharts = function() { + var items = PlotKit.Base.items; + + var setCount = items(this.datasets).length; + + // add all the rects + this.points = new Array(); + var i = 0; + for (var setName in this.datasets) { + var dataset = this.datasets[setName]; + if (PlotKit.Base.isFuncLike(dataset)) continue; + dataset.sort(function(a, b) { return compare(parseFloat(a[0]), parseFloat(b[0])); }); + for (var j = 0; j < dataset.length; j++) { + var item = dataset[j]; + var point = { + x: ((parseFloat(item[0]) - this.minxval) * this.xscale), + y: 1.0 - ((parseFloat(item[1]) - this.minyval) * this.yscale), + xval: parseFloat(item[0]), + yval: parseFloat(item[1]), + name: setName + }; + + // limit the x, y values so they do not overdraw + if (point.y <= 0.0) { + point.y = 0.0; + } + if (point.y >= 1.0) { + point.y = 1.0; + } + if ((point.x >= 0.0) && (point.x <= 1.0)) { + this.points.push(point); + } + } + i++; + } +}; + +// Create the pie charts +PlotKit.Layout.prototype._evaluatePieCharts = function() { + var items = PlotKit.Base.items; + var sum = MochiKit.Iter.sum; + var getter = MochiKit.Base.itemgetter; + + var setCount = items(this.datasets).length; + + // we plot the y values of the first dataset + var dataset = items(this.datasets)[0][1]; + var total = sum(map(getter(1), dataset)); + + this.slices = new Array(); + var currentAngle = 0.0; + for (var i = 0; i < dataset.length; i++) { + var fraction = dataset[i][1] / total; + var startAngle = currentAngle * Math.PI * 2; + var endAngle = (currentAngle + fraction) * Math.PI * 2; + + var slice = {fraction: fraction, + xval: dataset[i][0], + yval: dataset[i][1], + startAngle: startAngle, + endAngle: endAngle + }; + if (dataset[i][1] != 0) { + this.slices.push(slice); + } + currentAngle += fraction; + } +}; + +PlotKit.Layout.prototype._evaluateLineTicksForXAxis = function() { + var isNil = MochiKit.Base.isUndefinedOrNull; + + if (this.options.xTicks) { + // we use use specified ticks with optional labels + + this.xticks = new Array(); + var makeTicks = function(tick) { + var label = tick.label; + if (isNil(label)) + label = tick.v.toString(); + var pos = this.xscale * (tick.v - this.minxval); + if ((pos >= 0.0) && (pos <= 1.0)) { + this.xticks.push([pos, label]); + } + }; + MochiKit.Iter.forEach(this.options.xTicks, bind(makeTicks, this)); + } + else if (this.options.xNumberOfTicks) { + // we use defined number of ticks as hint to auto generate + var xvalues = this._uniqueXValues(); + var roughSeparation = this.xrange / this.options.xNumberOfTicks; + var tickCount = 0; + + this.xticks = new Array(); + for (var i = 0; i <= xvalues.length; i++) { + if ((xvalues[i] - this.minxval) >= (tickCount * roughSeparation)) { + var pos = this.xscale * (xvalues[i] - this.minxval); + if ((pos > 1.0) || (pos < 0.0)) + continue; + this.xticks.push([pos, xvalues[i]]); + tickCount++; + } + if (tickCount > this.options.xNumberOfTicks) + break; + } + } +}; + +PlotKit.Layout.prototype._evaluateLineTicksForYAxis = function() { + var isNil = MochiKit.Base.isUndefinedOrNull; + + + if (this.options.yTicks) { + this.yticks = new Array(); + var makeTicks = function(tick) { + var label = tick.label; + if (isNil(label)) + label = tick.v.toString(); + var pos = 1.0 - (this.yscale * (tick.v - this.minyval)); + if ((pos >= 0.0) && (pos <= 1.0)) { + this.yticks.push([pos, label]); + } + }; + MochiKit.Iter.forEach(this.options.yTicks, bind(makeTicks, this)); + } + else if (this.options.yNumberOfTicks) { + // We use the optionally defined number of ticks as a guide + this.yticks = new Array(); + + // if we get this separation right, we'll have good looking graphs + var roundInt = PlotKit.Base.roundInterval; + var prec = this.options.yTickPrecision; + var roughSeparation = roundInt(this.yrange, + this.options.yNumberOfTicks, prec); + + // round off each value of the y-axis to the precision + // eg. 1.3333 at precision 1 -> 1.3 + for (var i = 0; i <= this.options.yNumberOfTicks; i++) { + var yval = this.minyval + (i * roughSeparation); + var pos = 1.0 - ((yval - this.minyval) * this.yscale); + if ((pos > 1.0) || (pos < 0.0)) + continue; + this.yticks.push([pos, MochiKit.Format.roundToFixed(yval, prec)]); + } + } +}; + +PlotKit.Layout.prototype._evaluateLineTicks = function() { + this._evaluateLineTicksForXAxis(); + this._evaluateLineTicksForYAxis(); +}; + +PlotKit.Layout.prototype._evaluateBarTicks = function() { + this._evaluateLineTicks(); + var centerInBar = function(tick) { + return [tick[0] + (this.minxdelta * this.xscale)/2, tick[1]]; + }; + this.xticks = MochiKit.Base.map(bind(centerInBar, this), this.xticks); + + if (this.options.barOrientation == "horizontal") { + // swap scales + var tempticks = this.xticks; + this.xticks = this.yticks; + this.yticks = tempticks; + + // we need to invert the "yaxis" (which is now the xaxis when drawn) + var invert = function(tick) { + return [1.0 - tick[0], tick[1]]; + } + this.xticks = MochiKit.Base.map(invert, this.xticks); + } +}; + +PlotKit.Layout.prototype._evaluatePieTicks = function() { + var isNil = MochiKit.Base.isUndefinedOrNull; + var formatter = MochiKit.Format.numberFormatter("#%"); + + this.xticks = new Array(); + if (this.options.xTicks) { + // make a lookup dict for x->slice values + var lookup = new Array(); + for (var i = 0; i < this.slices.length; i++) { + lookup[this.slices[i].xval] = this.slices[i]; + } + + for (var i =0; i < this.options.xTicks.length; i++) { + var tick = this.options.xTicks[i]; + var slice = lookup[tick.v]; + var label = tick.label; + if (slice) { + if (isNil(label)) + label = tick.v.toString(); + label += " (" + formatter(slice.fraction) + ")"; + this.xticks.push([tick.v, label]); + } + } + } + else { + // we make our own labels from all the slices + for (var i =0; i < this.slices.length; i++) { + var slice = this.slices[i]; + var label = slice.xval + " (" + formatter(slice.fraction) + ")"; + this.xticks.push([slice.xval, label]); + } + } +}; + +PlotKit.Layout.prototype._regenerateHitTestCache = function() { + this.hitTestCache.xvalues = this._uniqueXValues(); + this.hitTestCache.xlookup = new Array(); + this.hitTestCache.x2maxy = new Array(); + + var listMax = MochiKit.Base.listMax; + var itemgetter = MochiKit.Base.itemgetter; + var map = MochiKit.Base.map; + + // generate a lookup table for x values to y values + var setNames = keys(this.datasets); + for (var i = 0; i < setNames.length; i++) { + var dataset = this.datasets[setNames[i]]; + for (var j = 0; j < dataset.length; j++) { + var xval = dataset[j][0]; + var yval = dataset[j][1]; + if (this.hitTestCache.xlookup[xval]) + this.hitTestCache.xlookup[xval].push([yval, setNames[i]]); + else + this.hitTestCache.xlookup[xval] = [[yval, setNames[i]]]; + } + } + + for (var x in this.hitTestCache.xlookup) { + var yvals = this.hitTestCache.xlookup[x]; + this.hitTestCache.x2maxy[x] = listMax(map(itemgetter(0), yvals)); + } + + +}; + +// -------------------------------------------------------------------- +// END Internal Functions +// -------------------------------------------------------------------- + + +// Namespace Iniitialisation + +PlotKit.LayoutModule = {}; +PlotKit.LayoutModule.Layout = PlotKit.Layout; + +PlotKit.LayoutModule.EXPORT = [ + "Layout" +]; + +PlotKit.LayoutModule.EXPORT_OK = []; + +PlotKit.LayoutModule.__new__ = function() { + var m = MochiKit.Base; + + m.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; +}; + +PlotKit.LayoutModule.__new__(); +MochiKit.Base._exportSymbols(this, PlotKit.LayoutModule); + + diff --git a/plotkit_v091/PlotKit/PlotKit.js b/plotkit_v091/PlotKit/PlotKit.js new file mode 100644 index 0000000..e79abf7 --- /dev/null +++ b/plotkit_v091/PlotKit/PlotKit.js @@ -0,0 +1,151 @@ +/*** + +PlotKit Autoload Javascript Module. + +This file was adapted from MochiKit. +See for documentation, downloads, license, etc. +(c) 2005 Bob Ippolito. All rights Reserved. + +Modified by Alastair Tse, 2006, for PlotKit. + +***/ + +if (typeof(PlotKit) == 'undefined') { + PlotKit = {}; +} + +if (typeof(PlotKit.PlotKit) == 'undefined') { + PlotKit.PlotKit = {}; +} + +PlotKit.PlotKit.NAME = "PlotKit.PlotKit"; +PlotKit.PlotKit.VERSION = "0.9.1"; +PlotKit.PlotKit.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.PlotKit.toString = function () { + return this.__repr__(); +}; + +PlotKit.PlotKit.SUBMODULES = [ + "Base", + "Layout", + "Canvas", + "SVG", + "SweetCanvas", + "SweetSVG", + "EasyPlot" +]; + +if (typeof(JSAN) != 'undefined' || typeof(dojo) != 'undefined') { + if (typeof(dojo) != 'undefined') { + dojo.provide('PlotKit.PlotKit'); + dojo.require("PlotKit.*"); + } + if (typeof(JSAN) != 'undefined') { + // hopefully this makes it easier for static analysis? + JSAN.use("PlotKit.Base", []); + JSAN.use("PlotKit.Layout", []); + JSAN.use("PlotKit.Canvas", []); + JSAN.use("PlotKit.SweetCanvas", []); + JSAN.use("PlotKit.SVG", []); + JSAN.use("PlotKit.SweetSVG", []); + } + (function () { + var extend = MochiKit.Base.extend; + var self = PlotKit.PlotKit; + var modules = self.SUBMODULES; + var EXPORT = []; + var EXPORT_OK = []; + var EXPORT_TAGS = {}; + var i, k, m, all; + for (i = 0; i < modules.length; i++) { + m = PlotKit[modules[i]]; + extend(EXPORT, m.EXPORT); + extend(EXPORT_OK, m.EXPORT_OK); + for (k in m.EXPORT_TAGS) { + EXPORT_TAGS[k] = extend(EXPORT_TAGS[k], m.EXPORT_TAGS[k]); + } + all = m.EXPORT_TAGS[":all"]; + if (!all) { + all = extend(null, m.EXPORT, m.EXPORT_OK); + } + var j; + for (j = 0; j < all.length; j++) { + k = all[j]; + self[k] = m[k]; + } + } + self.EXPORT = EXPORT; + self.EXPORT_OK = EXPORT_OK; + self.EXPORT_TAGS = EXPORT_TAGS; + }()); + +} else { + if (typeof(PlotKit.__compat__) == 'undefined') { + PlotKit.__compat__ = true; + } + (function () { + if (typeof(document) == "undefined") { + return; + } + + var scripts = document.getElementsByTagName("script"); + var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + var base = null; + var baseElem = null; + var allScripts = {}; + var i; + for (i = 0; i < scripts.length; i++) { + var src = scripts[i].getAttribute("src"); + if (!src) { + continue; + } + allScripts[src] = true; + if (src.match(/PlotKit.js$/)) { + base = src.substring(0, src.lastIndexOf('PlotKit.js')); + baseElem = scripts[i]; + } + + } + + if (base === null) { + return; + } + var modules = PlotKit.PlotKit.SUBMODULES; + for (var i = 0; i < modules.length; i++) { + if (PlotKit[modules[i]]) { + continue; + } + var uri = base + modules[i] + '.js'; + if (uri in allScripts) { + continue; + } + if (document.documentElement && + document.documentElement.namespaceURI == kXULNSURI) { + // XUL + var s = document.createElementNS(kXULNSURI, 'script'); + s.setAttribute("id", "PlotKit_" + base + modules[i]); + s.setAttribute("src", uri); + s.setAttribute("type", "application/x-javascript"); + baseElem.parentNode.appendChild(s); + } else { + // HTML + /* + DOM can not be used here because Safari does + deferred loading of scripts unless they are + in the document or inserted with document.write + + This is not XHTML compliant. If you want XHTML + compliance then you must use the packed version of MochiKit + or include each script individually (basically unroll + these document.write calls into your XHTML source) + + */ + document.write(''); + } + }; + })(); +} diff --git a/plotkit_v091/PlotKit/PlotKit_Packed.js b/plotkit_v091/PlotKit/PlotKit_Packed.js new file mode 100644 index 0000000..363042a --- /dev/null +++ b/plotkit_v091/PlotKit/PlotKit_Packed.js @@ -0,0 +1,2177 @@ +/*** + + PlotKit.PlotKit 0.9.1 : PACKED VERSION + + THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please + diff against the source tree, not this file. + + For more information, . + + Copyright (c) 2006. Alastair Tse. + +***/ + +try{ +if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.DOM)=="undefined"||typeof (MochiKit.Color)=="undefined"||typeof (MochiKit.Format)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format}"; +} +MochiKit.Base.update(MochiKit.Color.Color.prototype,{asFillColor:function(){ +return this.lighterColorWithLevel(0.3); +},asStrokeColor:function(){ +return this.darkerColorWithLevel(0.1); +},asPointColor:function(){ +return this.lighterColorWithLevel(0.1); +}}); +if(typeof (PlotKit)=="undefined"){ +PlotKit={}; +} +PlotKit.NAME="PlotKit"; +PlotKit.VERSION="0.8"; +PlotKit.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.toString=function(){ +return this.__repr__(); +}; +if(typeof (PlotKit.Base)=="undefined"){ +PlotKit.Base={}; +} +PlotKit.Base.NAME="PlotKit.Base"; +PlotKit.Base.VERSION=PlotKit.VERSION; +PlotKit.Base.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.Base.toString=function(){ +return this.__repr__(); +}; +PlotKit.Base.usingPrototype=function(){ +try{ +return (typeof (Object.extend)=="function"); +} +catch(e){ +return false; +} +}; +MochiKit.Base.update(PlotKit.Base,{roundInterval:function(_1,_2,_3){ +var _4=MochiKit.Format.roundToFixed; +var _5=_1/_2; +return parseFloat(_4(_5,_3)); +},collapse:function(_6){ +var m=MochiKit.Base; +var _8=new Array(); +for(var i=0;i<_6.length;i++){ +_8=m.concat(_8,_6[i]); +} +if(PlotKit.Base.usingPrototype()){ +delete _8.extend; +delete _8.from; +delete _8.inspect; +} +return _8; +},uniq:function(_10){ +var m=MochiKit.Base; +if(!m.isArrayLike(_10)||(_10.length<1)){ +return new Array(); +} +var _11=new Array(); +var _12=_10[0]; +_11.push(_10[0]); +for(var i=1;i<_10.length;i++){ +if(m.compare(_10[i],_12)!=0){ +_12=_10[i]; +_11.push(_10[i]); +} +} +return _11; +},colorScheme:function(){ +var mb=MochiKit.Base; +var mc=MochiKit.Color; +var _15=["red","orange","yellow","green","cyan","blue","purple","magenta"]; +var _16=function(_17){ +return mc.Color[_17+"Color"](); +}; +return mb.map(_16,_15); +},baseDarkPrimaryColors:function(){ +var _18=MochiKit.Color.Color.fromHexString; +return [_18("#ad3f40"),_18("#ddac2c"),_18("#dfdd0c"),_18("#5276c4"),_18("#739c5a")]; +},basePrimaryColors:function(){ +var _19=MochiKit.Color.Color.fromHexString; +return [_19("#d24c4d"),_19("#f2b32f"),_19("#ece90e"),_19("#5d83da"),_19("#78a15d")]; +},baseBlueColors:function(){ +var _20=MochiKit.Color.Color.fromHexString; +return [_20("#4b6b94"),_20("#5d81b4"),_20("#acbad2")]; +},palette:function(_21,_22,_23,_24){ +var _25=MochiKit.Base.isUndefinedOrNull; +var _26=new Array(); +if(_25(_24)){ +_24=0.1; +} +if(_25(_23)){ +_23=0.4; +} +if(_25(_22)){ +_22=-0.2; +} +var _27=_22; +while(_27<=_23){ +_26.push(_27); +_27+=_24; +} +var _28=function(_29,_30){ +return _29.lighterColorWithLevel(_30); +}; +return MochiKit.Base.map(partial(_28,_21),_26); +},excanvasSupported:function(){ +if(/MSIE/.test(navigator.userAgent)&&!window.opera){ +return true; +} +return false; +},findPosX:function(obj){ +var _32=0; +if(obj.offsetParent){ +while(obj.offsetParent){ +_32+=obj.offsetLeft; +obj=obj.offsetParent; +} +}else{ +if(obj.x){ +_32+=obj.x; +} +} +return _32; +},findPosY:function(obj){ +var _33=0; +if(obj.offsetParent){ +while(obj.offsetParent){ +_33+=obj.offsetTop; +obj=obj.offsetParent; +} +}else{ +if(obj.y){ +_33+=obj.y; +} +} +return _33; +},isFuncLike:function(obj){ +return (typeof (obj)=="function"); +}}); +PlotKit.Base.map=function(fn,lst){ +if(PlotKit.Base.usingPrototype()){ +var _36=[]; +for(var x in lst){ +if(typeof (lst[x])=="function"){ +continue; +} +_36.push(fn(lst[x])); +} +return _36; +}else{ +return MochiKit.Base.map(fn,lst); +} +}; +PlotKit.Base.items=function(lst){ +if(PlotKit.Base.usingPrototype()){ +var _38=[]; +for(var x in lst){ +if(typeof (lst[x])=="function"){ +continue; +} +_38.push([x,lst[x]]); +} +return _38; +}else{ +return MochiKit.Base.items(lst); +} +}; +PlotKit.Base.keys=function(lst){ +if(PlotKit.Base.usingPrototype()){ +var _39=[]; +for(var x in lst){ +if(typeof (lst[x])=="function"){ +continue; +} +_39.push(x); +} +return _39; +}else{ +return MochiKit.Base.keys(lst); +} +}; +PlotKit.Base.baseColors=function(){ +var _40=MochiKit.Color.Color.fromHexString; +return [_40("#476fb2"),_40("#be2c2b"),_40("#85b730"),_40("#734a99"),_40("#26a1c5"),_40("#fb8707"),_40("#000000")]; +}; +PlotKit.Base.officeBaseStyle={"axisLineWidth":2,"axisLabelColor":Color.grayColor(),"axisLineColor":Color.whiteColor(),"padding":{top:5,bottom:10,left:30,right:30}}; +MochiKit.Base.update(PlotKit.Base,{officeBlue:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"backgroundColor":PlotKit.Base.baseColors()[0].lighterColorWithLevel(0.45)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeRed:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[1]),"backgroundColor":PlotKit.Base.baseColors()[1].lighterColorWithLevel(0.5)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeGreen:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[2]),"backgroundColor":PlotKit.Base.baseColors()[2].lighterColorWithLevel(0.5)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officePurple:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[3]),"backgroundColor":PlotKit.Base.baseColors()[3].lighterColorWithLevel(0.5)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeCyan:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[4]),"backgroundColor":PlotKit.Base.baseColors()[4].lighterColorWithLevel(0.5)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeOrange:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[5]),"backgroundColor":PlotKit.Base.baseColors()[5].lighterColorWithLevel(0.4)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +},officeBlack:function(){ +var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[6],0,0.6),"backgroundColor":PlotKit.Base.baseColors()[6].lighterColorWithLevel(0.9)}; +MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle); +return r; +}}); +PlotKit.Base.EXPORT=["baseColors","collapse","colorScheme","findPosX","findPosY","officeBaseStyle","officeBlue","officeRed","officeGreen","officePurple","officeCyan","officeOrange","officeBlack","roundInterval","uniq","isFuncLike","excanvasSupported"]; +PlotKit.Base.EXPORT_OK=[]; +PlotKit.Base.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.Base.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.Base); +try{ +if(typeof (PlotKit.Base)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Base"; +} +if(typeof (PlotKit.Layout)=="undefined"){ +PlotKit.Layout={}; +} +PlotKit.Layout.NAME="PlotKit.Layout"; +PlotKit.Layout.VERSION=PlotKit.VERSION; +PlotKit.Layout.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.Layout.toString=function(){ +return this.__repr__(); +}; +PlotKit.Layout.valid_styles=["bar","line","pie","point"]; +PlotKit.Layout=function(_42,_43){ +this.options={"barWidthFillFraction":0.75,"barOrientation":"vertical","xOriginIsZero":true,"yOriginIsZero":true,"xAxis":null,"yAxis":null,"xTicks":null,"yTicks":null,"xNumberOfTicks":10,"yNumberOfTicks":5,"xTickPrecision":1,"yTickPrecision":1,"pieRadius":0.4}; +this.style=_42; +MochiKit.Base.update(this.options,_43?_43:{}); +if(!MochiKit.Base.isUndefinedOrNull(this.options.xAxis)){ +this.minxval=this.options.xAxis[0]; +this.maxxval=this.options.xAxis[1]; +this.xscale=this.maxxval-this.minxval; +}else{ +this.minxval=0; +this.maxxval=null; +this.xscale=null; +} +if(!MochiKit.Base.isUndefinedOrNull(this.options.yAxis)){ +this.minyval=this.options.yAxis[0]; +this.maxyval=this.options.yAxis[1]; +this.yscale=this.maxyval-this.minyval; +}else{ +this.minyval=0; +this.maxyval=null; +this.yscale=null; +} +this.bars=new Array(); +this.points=new Array(); +this.slices=new Array(); +this.xticks=new Array(); +this.yticks=new Array(); +this.datasets=new Array(); +this.minxdelta=0; +this.xrange=1; +this.yrange=1; +this.hitTestCache={x2maxy:null}; +}; +PlotKit.Layout.prototype.addDataset=function(_44,_45){ +this.datasets[_44]=_45; +}; +PlotKit.Layout.prototype.removeDataset=function(_46,_47){ +delete this.datasets[_46]; +}; +PlotKit.Layout.prototype.addDatasetFromTable=function(_48,_49,_50,_51,_52){ +var _53=MochiKit.Base.isUndefinedOrNull; +var _54=MochiKit.DOM.scrapeText; +var _55=MochiKit.Format.strip; +if(_53(_50)){ +_50=0; +} +if(_53(_51)){ +_51=1; +} +if(_53(_52)){ +_52=-1; +} +var _56=_49.tBodies[0].rows; +var _57=new Array(); +var _58=new Array(); +if(!_53(_56)){ +for(var i=0;i<_56.length;i++){ +_57.push([parseFloat(_55(_54(_56[i].cells[_50]))),parseFloat(_55(_54(_56[i].cells[_51])))]); +if(_52>=0){ +_58.push({v:parseFloat(_55(_54(_56[i].cells[_50]))),label:_55(_54(_56[i].cells[_52]))}); +} +} +this.addDataset(_48,_57); +if(_52>=0){ +this.options.xTicks=_58; +} +return true; +} +return false; +}; +PlotKit.Layout.prototype.evaluate=function(){ +this._evaluateLimits(); +this._evaluateScales(); +if(this.style=="bar"){ +if(this.options.barOrientation=="horizontal"){ +this._evaluateHorizBarCharts(); +}else{ +this._evaluateBarCharts(); +} +this._evaluateBarTicks(); +}else{ +if(this.style=="line"){ +this._evaluateLineCharts(); +this._evaluateLineTicks(); +}else{ +if(this.style=="pie"){ +this._evaluatePieCharts(); +this._evaluatePieTicks(); +} +} +} +}; +PlotKit.Layout.prototype.hitTest=function(x,y){ +var f=MochiKit.Format.twoDigitFloat; +if((this.style=="bar")&&this.bars&&(this.bars.length>0)){ +for(var i=0;i=bar.x)&&(x<=bar.x+bar.w)&&(y>=bar.y)&&(y-bar.y<=bar.h)){ +return bar; +} +} +}else{ +if(this.style=="line"){ +if(this.hitTestCache.x2maxy==null){ +this._regenerateHitTestCache(); +} +var _62=x/this.xscale; +var _63=this.hitTestCache.xvalues; +var _64=null; +var _65=null; +for(var i=1;i<_63.length;i++){ +if(_63[i]>_62){ +_64=_63[i-1]; +_65=_63[i]; +break; +} +} +if((_64!=null)){ +var _66=this.hitTestCache.x2maxy[_64]; +var _67=this.hitTestCache.x2maxy[_65]; +var _68=(1-y)/this.yscale; +var _69=(_67-_66)/(_65-_64); +var _70=_66+_69*(_62-_64); +if(_70>=_68){ +var obj={xval:_62,yval:_68,xafter:_65,yafter:_67,xbefore:_64,ybefore:_66,yprojected:_70}; +return obj; +} +} +}else{ +if(this.style=="pie"){ +var _71=Math.sqrt((y-0.5)*(y-0.5)+(x-0.5)*(x-0.5)); +if(_71>this.options.pieRadius){ +return null; +} +var _72=Math.atan2(y-0.5,x-0.5)-Math.PI/2; +for(var i=0;i=_72){ +return _73; +} +} +} +} +} +return null; +}; +PlotKit.Layout.prototype.rectForX=function(x){ +return null; +}; +PlotKit.Layout.prototype.angleRangeForX=function(x){ +return null; +}; +PlotKit.Layout.prototype._evaluateLimits=function(){ +var map=PlotKit.Base.map; +var _75=PlotKit.Base.items; +var _76=MochiKit.Base.itemgetter; +var _77=PlotKit.Base.collapse; +var _78=MochiKit.Base.listMin; +var _79=MochiKit.Base.listMax; +var _80=MochiKit.Base.isUndefinedOrNull; +var all=_77(map(_76(1),_75(this.datasets))); +if(_80(this.options.xAxis)){ +if(this.options.xOriginIsZero){ +this.minxval=0; +}else{ +this.minxval=_78(map(parseFloat,map(_76(0),all))); +} +this.maxxval=_79(map(parseFloat,map(_76(0),all))); +}else{ +this.minxval=this.options.xAxis[0]; +this.maxxval=this.options.xAxis[1]; +this.xscale=this.maxval-this.minxval; +} +if(_80(this.options.yAxis)){ +if(this.options.yOriginIsZero){ +this.minyval=0; +}else{ +this.minyval=_78(map(parseFloat,map(_76(1),all))); +} +this.maxyval=_79(map(parseFloat,map(_76(1),all))); +}else{ +this.minyval=this.options.yAxis[0]; +this.maxyval=this.options.yAxis[1]; +this.yscale=this.maxyval-this.minyval; +} +}; +PlotKit.Layout.prototype._evaluateScales=function(){ +var _82=MochiKit.Base.isUndefinedOrNull; +this.xrange=this.maxxval-this.minxval; +if(this.xrange==0){ +this.xscale=1; +}else{ +this.xscale=1/this.xrange; +} +this.yrange=this.maxyval-this.minyval; +if(this.yrange==0){ +this.yscale=1; +}else{ +this.yscale=1/this.yrange; +} +}; +PlotKit.Layout.prototype._uniqueXValues=function(){ +var _83=PlotKit.Base.collapse; +var map=PlotKit.Base.map; +var _84=PlotKit.Base.uniq; +var _85=MochiKit.Base.itemgetter; +var _86=PlotKit.Base.items; +var _87=map(parseFloat,map(_85(0),_83(map(_85(1),_86(this.datasets))))); +_87.sort(MochiKit.Base.compare); +return _84(_87); +}; +PlotKit.Layout.prototype._evaluateBarCharts=function(){ +var _88=PlotKit.Base.items; +var _89=_88(this.datasets).length; +var _90=10000000; +var _91=this._uniqueXValues(); +for(var i=1;i<_91.length;i++){ +_90=Math.min(Math.abs(_91[i]-_91[i-1]),_90); +} +var _92=0; +var _93=0; +var _94=0; +if(_91.length==1){ +_90=1; +this.xscale=1; +this.minxval=_91[0]; +_92=1*this.options.barWidthFillFraction; +_93=_92/_89; +_94=(1-this.options.barWidthFillFraction)/2; +}else{ +if(this.xrange==1){ +this.xscale=0.5; +}else{ +if(this.xrange==2){ +this.xscale=1/3; +}else{ +this.xscale=(1-_90/this.xrange)/this.xrange; +} +} +_92=_90*this.xscale*this.options.barWidthFillFraction; +_93=_92/_89; +_94=_90*this.xscale*(1-this.options.barWidthFillFraction)/2; +} +this.minxdelta=_90; +this.bars=new Array(); +var i=0; +for(var _95 in this.datasets){ +var _96=this.datasets[_95]; +if(PlotKit.Base.isFuncLike(_96)){ +continue; +} +for(var j=0;j<_96.length;j++){ +var _98=_96[j]; +var _99={x:((parseFloat(_98[0])-this.minxval)*this.xscale)+(i*_93)+_94,y:1-((parseFloat(_98[1])-this.minyval)*this.yscale),w:_93,h:((parseFloat(_98[1])-this.minyval)*this.yscale),xval:parseFloat(_98[0]),yval:parseFloat(_98[1]),name:_95}; +if((_99.x>=0)&&(_99.x<=1)&&(_99.y>=0)&&(_99.y<=1)){ +this.bars.push(_99); +} +} +i++; +} +}; +PlotKit.Layout.prototype._evaluateHorizBarCharts=function(){ +var _100=PlotKit.Base.items; +var _101=_100(this.datasets).length; +var _102=10000000; +var _103=this._uniqueXValues(); +for(var i=1;i<_103.length;i++){ +_102=Math.min(Math.abs(_103[i]-_103[i-1]),_102); +} +var _104=0; +var _105=0; +var _106=0; +if(_103.length==1){ +_102=1; +this.xscale=1; +this.minxval=_103[0]; +_104=1*this.options.barWidthFillFraction; +_105=_104/_101; +_106=(1-this.options.barWidthFillFraction)/2; +}else{ +this.xscale=(1-_102/this.xrange)/this.xrange; +_104=_102*this.xscale*this.options.barWidthFillFraction; +_105=_104/_101; +_106=_102*this.xscale*(1-this.options.barWidthFillFraction)/2; +} +this.minxdelta=_102; +this.bars=new Array(); +var i=0; +for(var _107 in this.datasets){ +var _108=this.datasets[_107]; +if(PlotKit.Base.isFuncLike(_108)){ +continue; +} +for(var j=0;j<_108.length;j++){ +var item=_108[j]; +var rect={y:((parseFloat(item[0])-this.minxval)*this.xscale)+(i*_105)+_106,x:0,h:_105,w:((parseFloat(item[1])-this.minyval)*this.yscale),xval:parseFloat(item[0]),yval:parseFloat(item[1]),name:_107}; +if(rect.y<=0){ +rect.y=0; +} +if(rect.y>=1){ +rect.y=1; +} +if((rect.x>=0)&&(rect.x<=1)){ +this.bars.push(rect); +} +} +i++; +} +}; +PlotKit.Layout.prototype._evaluateLineCharts=function(){ +var _111=PlotKit.Base.items; +var _112=_111(this.datasets).length; +this.points=new Array(); +var i=0; +for(var _113 in this.datasets){ +var _114=this.datasets[_113]; +if(PlotKit.Base.isFuncLike(_114)){ +continue; +} +_114.sort(function(a,b){ +return compare(parseFloat(a[0]),parseFloat(b[0])); +}); +for(var j=0;j<_114.length;j++){ +var item=_114[j]; +var _117={x:((parseFloat(item[0])-this.minxval)*this.xscale),y:1-((parseFloat(item[1])-this.minyval)*this.yscale),xval:parseFloat(item[0]),yval:parseFloat(item[1]),name:_113}; +if(_117.y<=0){ +_117.y=0; +} +if(_117.y>=1){ +_117.y=1; +} +if((_117.x>=0)&&(_117.x<=1)){ +this.points.push(_117); +} +} +i++; +} +}; +PlotKit.Layout.prototype._evaluatePieCharts=function(){ +var _118=PlotKit.Base.items; +var sum=MochiKit.Iter.sum; +var _120=MochiKit.Base.itemgetter; +var _121=_118(this.datasets).length; +var _122=_118(this.datasets)[0][1]; +var _123=sum(map(_120(1),_122)); +this.slices=new Array(); +var _124=0; +for(var i=0;i<_122.length;i++){ +var _125=_122[i][1]/_123; +var _126=_124*Math.PI*2; +var _127=(_124+_125)*Math.PI*2; +var _128={fraction:_125,xval:_122[i][0],yval:_122[i][1],startAngle:_126,endAngle:_127}; +if(_122[i][1]!=0){ +this.slices.push(_128); +} +_124+=_125; +} +}; +PlotKit.Layout.prototype._evaluateLineTicksForXAxis=function(){ +var _129=MochiKit.Base.isUndefinedOrNull; +if(this.options.xTicks){ +this.xticks=new Array(); +var _130=function(tick){ +var _132=tick.label; +if(_129(_132)){ +_132=tick.v.toString(); +} +var pos=this.xscale*(tick.v-this.minxval); +if((pos>=0)&&(pos<=1)){ +this.xticks.push([pos,_132]); +} +}; +MochiKit.Iter.forEach(this.options.xTicks,bind(_130,this)); +}else{ +if(this.options.xNumberOfTicks){ +var _134=this._uniqueXValues(); +var _135=this.xrange/this.options.xNumberOfTicks; +var _136=0; +this.xticks=new Array(); +for(var i=0;i<=_134.length;i++){ +if((_134[i]-this.minxval)>=(_136*_135)){ +var pos=this.xscale*(_134[i]-this.minxval); +if((pos>1)||(pos<0)){ +continue; +} +this.xticks.push([pos,_134[i]]); +_136++; +} +if(_136>this.options.xNumberOfTicks){ +break; +} +} +} +} +}; +PlotKit.Layout.prototype._evaluateLineTicksForYAxis=function(){ +var _137=MochiKit.Base.isUndefinedOrNull; +if(this.options.yTicks){ +this.yticks=new Array(); +var _138=function(tick){ +var _139=tick.label; +if(_137(_139)){ +_139=tick.v.toString(); +} +var pos=1-(this.yscale*(tick.v-this.minyval)); +if((pos>=0)&&(pos<=1)){ +this.yticks.push([pos,_139]); +} +}; +MochiKit.Iter.forEach(this.options.yTicks,bind(_138,this)); +}else{ +if(this.options.yNumberOfTicks){ +this.yticks=new Array(); +var _140=PlotKit.Base.roundInterval; +var prec=this.options.yTickPrecision; +var _142=_140(this.yrange,this.options.yNumberOfTicks,prec); +for(var i=0;i<=this.options.yNumberOfTicks;i++){ +var yval=this.minyval+(i*_142); +var pos=1-((yval-this.minyval)*this.yscale); +if((pos>1)||(pos<0)){ +continue; +} +this.yticks.push([pos,MochiKit.Format.roundToFixed(yval,prec)]); +} +} +} +}; +PlotKit.Layout.prototype._evaluateLineTicks=function(){ +this._evaluateLineTicksForXAxis(); +this._evaluateLineTicksForYAxis(); +}; +PlotKit.Layout.prototype._evaluateBarTicks=function(){ +this._evaluateLineTicks(); +var _144=function(tick){ +return [tick[0]+(this.minxdelta*this.xscale)/2,tick[1]]; +}; +this.xticks=MochiKit.Base.map(bind(_144,this),this.xticks); +if(this.options.barOrientation=="horizontal"){ +var _145=this.xticks; +this.xticks=this.yticks; +this.yticks=_145; +var _146=function(tick){ +return [1-tick[0],tick[1]]; +}; +this.xticks=MochiKit.Base.map(_146,this.xticks); +} +}; +PlotKit.Layout.prototype._evaluatePieTicks=function(){ +var _147=MochiKit.Base.isUndefinedOrNull; +var _148=MochiKit.Format.numberFormatter("#%"); +this.xticks=new Array(); +if(this.options.xTicks){ +var _149=new Array(); +for(var i=0;i0){ +this.__init__(_158,_159,_160); +} +}; +PlotKit.CanvasRenderer.prototype.__init__=function(_161,_162,_163){ +var _164=MochiKit.Base.isUndefinedOrNull; +var _165=MochiKit.Color.Color; +this.options={"drawBackground":true,"backgroundColor":_165.whiteColor(),"padding":{left:30,right:30,top:5,bottom:10},"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"strokeColor":_165.whiteColor(),"strokeColorTransform":"asStrokeColor","strokeWidth":0.5,"shouldFill":true,"shouldStroke":true,"drawXAxis":true,"drawYAxis":true,"axisLineColor":_165.blackColor(),"axisLineWidth":0.5,"axisTickSize":3,"axisLabelColor":_165.blackColor(),"axisLabelFont":"Arial","axisLabelFontSize":9,"axisLabelWidth":50,"pieRadius":0.4,"enableEvents":true}; +MochiKit.Base.update(this.options,_163?_163:{}); +this.layout=_162; +this.element=MochiKit.DOM.getElement(_161); +this.container=this.element.parentNode; +this.isIE=PlotKit.Base.excanvasSupported(); +if(this.isIE&&!_164(G_vmlCanvasManager)){ +this.IEDelay=0.5; +this.maxTries=5; +this.renderDelay=null; +this.clearDelay=null; +this.element=G_vmlCanvasManager.initElement(this.element); +} +this.height=this.element.height; +this.width=this.element.width; +if(_164(this.element)){ +throw "CanvasRenderer() - passed canvas is not found"; +} +if(!this.isIE&&!(PlotKit.CanvasRenderer.isSupported(this.element))){ +throw "CanvasRenderer() - Canvas is not supported."; +} +if(_164(this.container)||(this.container.nodeName.toLowerCase()!="div")){ +throw "CanvasRenderer() - needs to be enclosed in
    "; +} +this.xlabels=new Array(); +this.ylabels=new Array(); +this.isFirstRender=true; +this.area={x:this.options.padding.left,y:this.options.padding.top,w:this.width-this.options.padding.left-this.options.padding.right,h:this.height-this.options.padding.top-this.options.padding.bottom}; +MochiKit.DOM.updateNodeAttributes(this.container,{"style":{"position":"relative","width":this.width+"px"}}); +}; +PlotKit.CanvasRenderer.prototype.render=function(){ +if(this.isIE){ +try{ +if(this.renderDelay){ +this.renderDelay.cancel(); +this.renderDelay=null; +} +var _166=this.element.getContext("2d"); +} +catch(e){ +this.isFirstRender=false; +if(this.maxTries-->0){ +this.renderDelay=MochiKit.Async.wait(this.IEDelay); +this.renderDelay.addCallback(bind(this.render,this)); +} +return; +} +} +if(this.options.drawBackground){ +this._renderBackground(); +} +if(this.layout.style=="bar"){ +this._renderBarChart(); +this._renderBarAxis(); +}else{ +if(this.layout.style=="pie"){ +this._renderPieChart(); +this._renderPieAxis(); +}else{ +if(this.layout.style=="line"){ +this._renderLineChart(); +this._renderLineAxis(); +} +} +} +}; +PlotKit.CanvasRenderer.prototype._renderBarChartWrap=function(data,_168){ +var _169=this.element.getContext("2d"); +var _170=this.options.colorScheme.length; +var _171=this.options.colorScheme; +var _172=MochiKit.Base.keys(this.layout.datasets); +var _173=_172.length; +for(var i=0;i<_173;i++){ +var _174=_172[i]; +var _175=_171[i%_170]; +_169.save(); +_169.fillStyle=_175.toRGBString(); +if(this.options.strokeColor){ +_169.strokeStyle=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_169.strokeStyle=_175[this.options.strokeColorTransform]().toRGBString(); +} +} +_169.lineWidth=this.options.strokeWidth; +var _176=function(obj){ +if(obj.name==_174){ +_168(_169,obj); +} +}; +MochiKit.Iter.forEach(data,bind(_176,this)); +_169.restore(); +} +}; +PlotKit.CanvasRenderer.prototype._renderBarChart=function(){ +var bind=MochiKit.Base.bind; +var _178=function(_179,bar){ +var x=this.area.w*bar.x+this.area.x; +var y=this.area.h*bar.y+this.area.y; +var w=this.area.w*bar.w; +var h=this.area.h*bar.h; +if((w<1)||(h<1)){ +return; +} +if(this.options.shouldFill){ +_179.fillRect(x,y,w,h); +} +if(this.options.shouldStroke){ +_179.strokeRect(x,y,w,h); +} +}; +this._renderBarChartWrap(this.layout.bars,bind(_178,this)); +}; +PlotKit.CanvasRenderer.prototype._renderLineChart=function(){ +var _182=this.element.getContext("2d"); +var _183=this.options.colorScheme.length; +var _184=this.options.colorScheme; +var _185=MochiKit.Base.keys(this.layout.datasets); +var _186=_185.length; +var bind=MochiKit.Base.bind; +var _187=MochiKit.Base.partial; +for(var i=0;i<_186;i++){ +var _188=_185[i]; +var _189=_184[i%_183]; +var _190=this.options.strokeColorTransform; +_182.save(); +_182.fillStyle=_189.toRGBString(); +if(this.options.strokeColor){ +_182.strokeStyle=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_182.strokeStyle=_189[_190]().toRGBString(); +} +} +_182.lineWidth=this.options.strokeWidth; +var _191=function(ctx){ +ctx.beginPath(); +ctx.moveTo(this.area.x,this.area.y+this.area.h); +var _193=function(ctx_,_195){ +if(_195.name==_188){ +ctx_.lineTo(this.area.w*_195.x+this.area.x,this.area.h*_195.y+this.area.y); +} +}; +MochiKit.Iter.forEach(this.layout.points,_187(_193,ctx),this); +ctx.lineTo(this.area.w+this.area.x,this.area.h+this.area.y); +ctx.lineTo(this.area.x,this.area.y+this.area.h); +ctx.closePath(); +}; +if(this.options.shouldFill){ +bind(_191,this)(_182); +_182.fill(); +} +if(this.options.shouldStroke){ +bind(_191,this)(_182); +_182.stroke(); +} +_182.restore(); +} +}; +PlotKit.CanvasRenderer.prototype._renderPieChart=function(){ +var _196=this.element.getContext("2d"); +var _197=this.options.colorScheme.length; +var _198=this.layout.slices; +var _199=this.area.x+this.area.w*0.5; +var _200=this.area.y+this.area.h*0.5; +var _201=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius); +if(this.isIE){ +_199=parseInt(_199); +_200=parseInt(_200); +_201=parseInt(_201); +} +for(var i=0;i<_198.length;i++){ +var _202=this.options.colorScheme[i%_197]; +_196.save(); +_196.fillStyle=_202.toRGBString(); +var _203=function(){ +_196.beginPath(); +_196.moveTo(_199,_200); +_196.arc(_199,_200,_201,_198[i].startAngle-Math.PI/2,_198[i].endAngle-Math.PI/2,false); +_196.lineTo(_199,_200); +_196.closePath(); +}; +if(Math.abs(_198[i].startAngle-_198[i].endAngle)>0.001){ +if(this.options.shouldFill){ +_203(); +_196.fill(); +} +if(this.options.shouldStroke){ +_203(); +_196.lineWidth=this.options.strokeWidth; +if(this.options.strokeColor){ +_196.strokeStyle=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_196.strokeStyle=_202[this.options.strokeColorTransform]().toRGBString(); +} +} +_196.stroke(); +} +} +_196.restore(); +} +}; +PlotKit.CanvasRenderer.prototype._renderBarAxis=function(){ +this._renderAxis(); +}; +PlotKit.CanvasRenderer.prototype._renderLineAxis=function(){ +this._renderAxis(); +}; +PlotKit.CanvasRenderer.prototype._renderAxis=function(){ +if(!this.options.drawXAxis&&!this.options.drawYAxis){ +return; +} +var _204=this.element.getContext("2d"); +var _205={"style":{"position":"absolute","fontSize":this.options.axisLabelFontSize+"px","zIndex":10,"color":this.options.axisLabelColor.toRGBString(),"width":this.options.axisLabelWidth+"px","overflow":"hidden"}}; +_204.save(); +_204.strokeStyle=this.options.axisLineColor.toRGBString(); +_204.lineWidth=this.options.axisLineWidth; +if(this.options.drawYAxis){ +if(this.layout.yticks){ +var _206=function(tick){ +if(typeof (tick)=="function"){ +return; +} +var x=this.area.x; +var y=this.area.y+tick[0]*this.area.h; +_204.beginPath(); +_204.moveTo(x,y); +_204.lineTo(x-this.options.axisTickSize,y); +_204.closePath(); +_204.stroke(); +var _207=DIV(_205,tick[1]); +_207.style.top=(y-this.options.axisLabelFontSize)+"px"; +_207.style.left=(x-this.options.padding.left-this.options.axisTickSize)+"px"; +_207.style.textAlign="right"; +_207.style.width=(this.options.padding.left-this.options.axisTickSize*2)+"px"; +MochiKit.DOM.appendChildNodes(this.container,_207); +this.ylabels.push(_207); +}; +MochiKit.Iter.forEach(this.layout.yticks,bind(_206,this)); +} +_204.beginPath(); +_204.moveTo(this.area.x,this.area.y); +_204.lineTo(this.area.x,this.area.y+this.area.h); +_204.closePath(); +_204.stroke(); +} +if(this.options.drawXAxis){ +if(this.layout.xticks){ +var _206=function(tick){ +if(typeof (dataset)=="function"){ +return; +} +var x=this.area.x+tick[0]*this.area.w; +var y=this.area.y+this.area.h; +_204.beginPath(); +_204.moveTo(x,y); +_204.lineTo(x,y+this.options.axisTickSize); +_204.closePath(); +_204.stroke(); +var _208=DIV(_205,tick[1]); +_208.style.top=(y+this.options.axisTickSize)+"px"; +_208.style.left=(x-this.options.axisLabelWidth/2)+"px"; +_208.style.textAlign="center"; +_208.style.width=this.options.axisLabelWidth+"px"; +MochiKit.DOM.appendChildNodes(this.container,_208); +this.xlabels.push(_208); +}; +MochiKit.Iter.forEach(this.layout.xticks,bind(_206,this)); +} +_204.beginPath(); +_204.moveTo(this.area.x,this.area.y+this.area.h); +_204.lineTo(this.area.x+this.area.w,this.area.y+this.area.h); +_204.closePath(); +_204.stroke(); +} +_204.restore(); +}; +PlotKit.CanvasRenderer.prototype._renderPieAxis=function(){ +if(!this.options.drawXAxis){ +return; +} +if(this.layout.xticks){ +var _209=new Array(); +for(var i=0;iMath.PI*2){ +_216=_216-Math.PI*2; +}else{ +if(_216<0){ +_216=_216+Math.PI*2; +} +} +var _217=_210+Math.sin(_216)*(_212+10); +var _218=_211-Math.cos(_216)*(_212+10); +var _219={"position":"absolute","zIndex":11,"width":_213+"px","fontSize":this.options.axisLabelFontSize+"px","overflow":"hidden","color":this.options.axisLabelColor.toHexString()}; +if(_216<=Math.PI*0.5){ +_219["textAlign"]="left"; +_219["verticalAlign"]="top"; +_219["left"]=_217+"px"; +_219["top"]=(_218-this.options.axisLabelFontSize)+"px"; +}else{ +if((_216>Math.PI*0.5)&&(_216<=Math.PI)){ +_219["textAlign"]="left"; +_219["verticalAlign"]="bottom"; +_219["left"]=_217+"px"; +_219["top"]=_218+"px"; +}else{ +if((_216>Math.PI)&&(_216<=Math.PI*1.5)){ +_219["textAlign"]="right"; +_219["verticalAlign"]="bottom"; +_219["left"]=(_217-_213)+"px"; +_219["top"]=_218+"px"; +}else{ +_219["textAlign"]="right"; +_219["verticalAlign"]="bottom"; +_219["left"]=(_217-_213)+"px"; +_219["top"]=(_218-this.options.axisLabelFontSize)+"px"; +} +} +} +var _220=DIV({"style":_219},this.layout.xticks[i][1]); +this.xlabels.push(_220); +MochiKit.DOM.appendChildNodes(this.container,_220); +} +} +}; +PlotKit.CanvasRenderer.prototype._renderBackground=function(){ +var _221=this.element.getContext("2d"); +_221.save(); +_221.fillStyle=this.options.backgroundColor.toRGBString(); +_221.fillRect(0,0,this.width,this.height); +_221.restore(); +}; +PlotKit.CanvasRenderer.prototype.clear=function(){ +if(this.isIE){ +try{ +if(this.clearDelay){ +this.clearDelay.cancel(); +this.clearDelay=null; +} +var _222=this.element.getContext("2d"); +} +catch(e){ +this.isFirstRender=false; +this.clearDelay=MochiKit.Async.wait(this.IEDelay); +this.clearDelay.addCallback(bind(this.clear,this)); +return; +} +} +var _222=this.element.getContext("2d"); +_222.clearRect(0,0,this.width,this.height); +MochiKit.Iter.forEach(this.xlabels,MochiKit.DOM.removeElement); +MochiKit.Iter.forEach(this.ylabels,MochiKit.DOM.removeElement); +this.xlabels=new Array(); +this.ylabels=new Array(); +}; +PlotKit.CanvasRenderer.prototype._initialiseEvents=function(){ +var _223=MochiKit.Signal.connect; +var bind=MochiKit.Base.bind; +_223(this.element,"onclick",bind(this.onclick,this)); +}; +PlotKit.CanvasRenderer.prototype._resolveObject=function(e){ +var x=(e.mouse().page.x-PlotKit.Base.findPosX(this.element)-this.area.x)/this.area.w; +var y=(e.mouse().page.y-PlotKit.Base.findPosY(this.element)-this.area.y)/this.area.h; +var _225=this.layout.hitTest(x,y); +if(_225){ +return _225; +} +return null; +}; +PlotKit.CanvasRenderer.prototype._createEventObject=function(_226,e){ +if(_226==null){ +return null; +} +e.chart=_226; +return e; +}; +PlotKit.CanvasRenderer.prototype.onclick=function(e){ +var _227=this._resolveObject(e); +var _228=this._createEventObject(_227,e); +if(_228!=null){ +MochiKit.Signal.signal(this,"onclick",_228); +} +}; +PlotKit.CanvasRenderer.prototype.onmouseover=function(e){ +var _229=this._resolveObject(e); +var _230=this._createEventObject(_229,e); +if(_230!=null){ +signal(this,"onmouseover",_230); +} +}; +PlotKit.CanvasRenderer.prototype.onmouseout=function(e){ +var _231=this._resolveObject(e); +var _232=this._createEventObject(_231,e); +if(_232==null){ +signal(this,"onmouseout",e); +}else{ +signal(this,"onmouseout",_232); +} +}; +PlotKit.CanvasRenderer.prototype.onmousemove=function(e){ +var _233=this._resolveObject(e); +var _234=this._createEventObject(_233,e); +if((_233==null)&&(this.event_isinside==null)){ +return; +} +if((_233!=null)&&(this.event_isinside==null)){ +signal(this,"onmouseover",_234); +} +if((_233==null)&&(this.event_isinside!=null)){ +signal(this,"onmouseout",_234); +} +if((_233!=null)&&(this.event_isinside!=null)){ +signal(this,"onmousemove",_234); +} +this.event_isinside=_233; +}; +PlotKit.CanvasRenderer.isSupported=function(_235){ +var _236=null; +try{ +if(MochiKit.Base.isUndefinedOrNull(_235)){ +_236=MochiKit.DOM.CANVAS({}); +}else{ +_236=MochiKit.DOM.getElement(_235); +} +var _237=_236.getContext("2d"); +} +catch(e){ +var ie=navigator.appVersion.match(/MSIE (\d\.\d)/); +var _239=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1); +if((!ie)||(ie[1]<6)||(_239)){ +return false; +} +return true; +} +return true; +}; +PlotKit.Canvas={}; +PlotKit.Canvas.CanvasRenderer=PlotKit.CanvasRenderer; +PlotKit.Canvas.EXPORT=["CanvasRenderer"]; +PlotKit.Canvas.EXPORT_OK=["CanvasRenderer"]; +PlotKit.Canvas.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.Canvas.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.Canvas); +try{ +if(typeof (PlotKit.Layout)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Layout"; +} +PlotKit.SVGRenderer=function(_240,_241,_242){ +if(arguments.length>0){ +this.__init__(_240,_241,_242); +} +}; +PlotKit.SVGRenderer.NAME="PlotKit.SVGRenderer"; +PlotKit.SVGRenderer.VERSION=PlotKit.VERSION; +PlotKit.SVGRenderer.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.SVGRenderer.toString=function(){ +return this.__repr__(); +}; +PlotKit.SVGRenderer.SVGNS="http://www.w3.org/2000/svg"; +PlotKit.SVGRenderer.prototype.__init__=function(_243,_244,_245){ +var _246=MochiKit.Base.isUndefinedOrNull; +this.options={"drawBackground":true,"backgroundColor":Color.whiteColor(),"padding":{left:30,right:30,top:5,bottom:10},"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[1]),"strokeColor":Color.whiteColor(),"strokeColorTransform":"asStrokeColor","strokeWidth":0.5,"shouldFill":true,"shouldStroke":true,"drawXAxis":true,"drawYAxis":true,"axisLineColor":Color.blackColor(),"axisLineWidth":0.5,"axisTickSize":3,"axisLabelColor":Color.blackColor(),"axisLabelFont":"Arial","axisLabelFontSize":9,"axisLabelWidth":50,"axisLabelUseDiv":true,"pieRadius":0.4,"enableEvents":true}; +MochiKit.Base.update(this.options,_245?_245:{}); +this.layout=_244; +this.element=MochiKit.DOM.getElement(_243); +this.container=this.element.parentNode; +this.height=parseInt(this.element.getAttribute("height")); +this.width=parseInt(this.element.getAttribute("width")); +this.document=document; +this.root=this.element; +try{ +this.document=this.element.getSVGDocument(); +this.root=_246(this.document.documentElement)?this.element:this.document.documentElement; +} +catch(e){ +} +this.element.style.zIndex=1; +if(_246(this.element)){ +throw "SVGRenderer() - passed SVG object is not found"; +} +if(_246(this.container)||this.container.nodeName.toLowerCase()!="div"){ +throw "SVGRenderer() - No DIV's around the SVG."; +} +this.xlabels=new Array(); +this.ylabels=new Array(); +this.defs=this.createSVGElement("defs"); +this.area={x:this.options.padding.left,y:this.options.padding.top,w:this.width-this.options.padding.left-this.options.padding.right,h:this.height-this.options.padding.top-this.options.padding.bottom}; +MochiKit.DOM.updateNodeAttributes(this.container,{"style":{"position":"relative","width":this.width+"px"}}); +}; +PlotKit.SVGRenderer.prototype.render=function(){ +if(this.options.drawBackground){ +this._renderBackground(); +} +if(this.layout.style=="bar"){ +this._renderBarChart(); +this._renderBarAxis(); +}else{ +if(this.layout.style=="pie"){ +this._renderPieChart(); +this._renderPieAxis(); +}else{ +if(this.layout.style=="line"){ +this._renderLineChart(); +this._renderLineAxis(); +} +} +} +}; +PlotKit.SVGRenderer.prototype._renderBarOrLine=function(data,_247,_248,_249){ +var _250=this.options.colorScheme.length; +var _251=this.options.colorScheme; +var _252=MochiKit.Base.keys(this.layout.datasets); +var _253=_252.length; +for(var i=0;i<_253;i++){ +var _254=_252[i]; +var _255=new Array(); +var _256=_251[i%_250]; +if(this.options.shouldFill){ +_255["fill"]=_256.toRGBString(); +}else{ +_255["fill"]="none"; +} +if(this.options.shouldStroke&&(this.options.strokeColor||this.options.strokeColorTransform)){ +if(this.options.strokeColor){ +_255["stroke"]=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_255["stroke"]=_256[this.options.strokeColorTransform]().toRGBString(); +} +} +_255["strokeWidth"]=this.options.strokeWidth; +} +if(_248){ +_248(_255); +} +var _257=function(obj){ +if(obj.name==_254){ +_247(_255,obj); +} +}; +MochiKit.Iter.forEach(data,bind(_257,this)); +if(_249){ +_249(_255); +} +} +}; +PlotKit.SVGRenderer.prototype._renderBarChart=function(){ +var bind=MochiKit.Base.bind; +var _258=function(_259,bar){ +var x=this.area.w*bar.x+this.area.x; +var y=this.area.h*bar.y+this.area.y; +var w=this.area.w*bar.w; +var h=this.area.h*bar.h; +this._drawRect(x,y,w,h,_259); +}; +this._renderBarOrLine(this.layout.bars,bind(_258,this)); +}; +PlotKit.SVGRenderer.prototype._renderLineChart=function(){ +var bind=MochiKit.Base.bind; +var _260=function(_261,_262){ +this._tempPointsBuffer+=(this.area.w*_262.x+this.area.x)+","+(this.area.h*_262.y+this.area.y)+" "; +}; +var _263=function(_264){ +this._tempPointsBuffer=""; +this._tempPointsBuffer+=(this.area.x)+","+(this.area.y+this.area.h)+" "; +}; +var _265=function(_266){ +this._tempPointsBuffer+=(this.area.w+this.area.x)+","+(this.area.h+this.area.y); +_266["points"]=this._tempPointsBuffer; +var elem=this.createSVGElement("polygon",_266); +this.root.appendChild(elem); +}; +this._renderBarOrLine(this.layout.points,bind(_260,this),bind(_263,this),bind(_265,this)); +}; +PlotKit.SVGRenderer.prototype._renderPieChart=function(){ +var _268=this.options.colorScheme.length; +var _269=this.layout.slices; +var _270=this.area.x+this.area.w*0.5; +var _271=this.area.y+this.area.h*0.5; +var _272=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius); +if(_269.length==1&&(Math.abs(_269[0].startAngle)-Math.abs(_269[0].endAngle)<0.1)){ +var _273={"cx":_270,"cy":_271,"r":_272}; +var _274=this.options.colorScheme[0]; +if(this.options.shouldFill){ +_273["fill"]=_274.toRGBString(); +}else{ +_273["fill"]="none"; +} +if(this.options.shouldStroke&&(this.options.strokeColor||this.options.strokeColorTransform)){ +if(this.options.strokeColor){ +_273["stroke"]=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_273["stroke"]=_274[this.options.strokeColorTransform]().toRGBString(); +} +} +_273["style"]="stroke-width: "+this.options.strokeWidth; +} +this.root.appendChild(this.createSVGElement("circle",_273)); +return; +} +for(var i=0;i<_269.length;i++){ +var _273=new Array(); +var _274=this.options.colorScheme[i%_268]; +if(this.options.shouldFill){ +_273["fill"]=_274.toRGBString(); +}else{ +_273["fill"]="none"; +} +if(this.options.shouldStroke&&(this.options.strokeColor||this.options.strokeColorTransform)){ +if(this.options.strokeColor){ +_273["stroke"]=this.options.strokeColor.toRGBString(); +}else{ +if(this.options.strokeColorTransform){ +_273["stroke"]=_274[this.options.strokeColorTransform]().toRGBString(); +} +} +_273["style"]="stroke-width:"+this.options.strokeWidth; +} +var _275=0; +if(Math.abs(_269[i].endAngle-_269[i].startAngle)>Math.PI){ +_275=1; +} +var x1=Math.cos(_269[i].startAngle-Math.PI/2)*_272; +var y1=Math.sin(_269[i].startAngle-Math.PI/2)*_272; +var x2=Math.cos(_269[i].endAngle-Math.PI/2)*_272; +var y2=Math.sin(_269[i].endAngle-Math.PI/2)*_272; +var rx=x2-x1; +var ry=y2-y1; +var _282="M"+_270+","+_271+" "; +_282+="l"+x1+","+y1+" "; +_282+="a"+_272+","+_272+" 0 "+_275+",1 "+rx+","+ry+" z"; +_273["d"]=_282; +var elem=this.createSVGElement("path",_273); +this.root.appendChild(elem); +} +}; +PlotKit.SVGRenderer.prototype._renderBarAxis=function(){ +this._renderAxis(); +}; +PlotKit.SVGRenderer.prototype._renderLineAxis=function(){ +this._renderAxis(); +}; +PlotKit.SVGRenderer.prototype._renderAxis=function(){ +if(!this.options.drawXAxis&&!this.options.drawYAxis){ +return; +} +var _283={"style":{"position":"absolute","textAlign":"center","fontSize":this.options.axisLabelFontSize+"px","zIndex":10,"color":this.options.axisLabelColor.toRGBString(),"width":this.options.axisLabelWidth+"px","overflow":"hidden"}}; +var _284={"stroke":this.options.axisLineColor.toRGBString(),"strokeWidth":this.options.axisLineWidth}; +if(this.options.drawYAxis){ +if(this.layout.yticks){ +var _285=function(tick){ +var x=this.area.x; +var y=this.area.y+tick[0]*this.area.h; +this._drawLine(x,y,x-3,y,_284); +if(this.options.axisLabelUseDiv){ +var _286=DIV(_283,tick[1]); +_286.style.top=(y-this.options.axisLabelFontSize)+"px"; +_286.style.left=(x-this.options.padding.left+this.options.axisTickSize)+"px"; +_286.style.textAlign="left"; +_286.style.width=(this.options.padding.left-3)+"px"; +MochiKit.DOM.appendChildNodes(this.container,_286); +this.ylabels.push(_286); +}else{ +var _287={y:y+3,x:(x-this.options.padding.left+3),width:(this.options.padding.left-this.options.axisTickSize)+"px",height:(this.options.axisLabelFontSize+3)+"px",fontFamily:"Arial",fontSize:this.options.axisLabelFontSize+"px",fill:this.options.axisLabelColor.toRGBString()}; +var _286=this.createSVGElement("text",_287); +_286.appendChild(this.document.createTextNode(tick[1])); +this.root.appendChild(_286); +} +}; +MochiKit.Iter.forEach(this.layout.yticks,bind(_285,this)); +} +this._drawLine(this.area.x,this.area.y,this.area.x,this.area.y+this.area.h,_284); +} +if(this.options.drawXAxis){ +if(this.layout.xticks){ +var _285=function(tick){ +var x=this.area.x+tick[0]*this.area.w; +var y=this.area.y+this.area.h; +this._drawLine(x,y,x,y+this.options.axisTickSize,_284); +if(this.options.axisLabelUseDiv){ +var _288=DIV(_283,tick[1]); +_288.style.top=(y+this.options.axisTickSize)+"px"; +_288.style.left=(x-this.options.axisLabelWidth/2)+"px"; +_288.style.textAlign="center"; +_288.style.width=this.options.axisLabelWidth+"px"; +MochiKit.DOM.appendChildNodes(this.container,_288); +this.xlabels.push(_288); +}else{ +var _289={y:(y+this.options.axisTickSize+this.options.axisLabelFontSize),x:x-3,width:this.options.axisLabelWidth+"px",height:(this.options.axisLabelFontSize+3)+"px",fontFamily:"Arial",fontSize:this.options.axisLabelFontSize+"px",fill:this.options.axisLabelColor.toRGBString(),textAnchor:"middle"}; +var _288=this.createSVGElement("text",_289); +_288.appendChild(this.document.createTextNode(tick[1])); +this.root.appendChild(_288); +} +}; +MochiKit.Iter.forEach(this.layout.xticks,bind(_285,this)); +} +this._drawLine(this.area.x,this.area.y+this.area.h,this.area.x+this.area.w,this.area.y+this.area.h,_284); +} +}; +PlotKit.SVGRenderer.prototype._renderPieAxis=function(){ +if(this.layout.xticks){ +var _290=new Array(); +for(var i=0;iMath.PI*2){ +_297=_297-Math.PI*2; +}else{ +if(_297<0){ +_297=_297+Math.PI*2; +} +} +var _298=_291+Math.sin(_297)*(_293+10); +var _299=_292-Math.cos(_297)*(_293+10); +var _300={"position":"absolute","zIndex":11,"width":_294+"px","fontSize":this.options.axisLabelFontSize+"px","overflow":"hidden","color":this.options.axisLabelColor.toHexString()}; +var _301={"width":_294+"px","fontSize":this.options.axisLabelFontSize+"px","height":(this.options.axisLabelFontSize+3)+"px","fill":this.options.axisLabelColor.toRGBString()}; +if(_297<=Math.PI*0.5){ +MochiKit.Base.update(_300,{"textAlign":"left","verticalAlign":"top","left":_298+"px","top":(_299-this.options.axisLabelFontSize)+"px"}); +MochiKit.Base.update(_301,{"x":_298,"y":(_299-this.options.axisLabelFontSize),"textAnchor":"left"}); +}else{ +if((_297>Math.PI*0.5)&&(_297<=Math.PI)){ +MochiKit.Base.update(_300,{"textAlign":"left","verticalAlign":"bottom","left":_298+"px","top":_299+"px"}); +MochiKit.Base.update(_301,{"textAnchor":"left","x":_298,"y":_299}); +}else{ +if((_297>Math.PI)&&(_297<=Math.PI*1.5)){ +MochiKit.Base.update(_300,{"textAlign":"right","verticalAlign":"bottom","left":_298+"px","top":_299+"px"}); +MochiKit.Base.update(_301,{"textAnchor":"right","x":_298-_294,"y":_299}); +}else{ +MochiKit.Base.update(_300,{"textAlign":"left","verticalAlign":"bottom","left":_298+"px","top":_299+"px"}); +MochiKit.Base.update(_301,{"textAnchor":"left","x":_298-_294,"y":_299-this.options.axisLabelFontSize}); +} +} +} +if(this.options.axisLabelUseDiv){ +var _302=DIV({"style":_300},this.layout.xticks[i][1]); +this.xlabels.push(_302); +MochiKit.DOM.appendChildNodes(this.container,_302); +}else{ +var _302=this.createSVGElement("text",_301); +_302.appendChild(this.document.createTextNode(this.layout.xticks[i][1])); +this.root.appendChild(_302); +} +} +} +}; +PlotKit.SVGRenderer.prototype._renderBackground=function(){ +var opts={"stroke":"none","fill":this.options.backgroundColor.toRGBString()}; +this._drawRect(0,0,this.width,this.height,opts); +}; +PlotKit.SVGRenderer.prototype._drawRect=function(x,y,w,h,_304){ +var _305={x:x+"px",y:y+"px",width:w+"px",height:h+"px"}; +if(_304){ +MochiKit.Base.update(_305,_304); +} +var elem=this.createSVGElement("rect",_305); +this.root.appendChild(elem); +}; +PlotKit.SVGRenderer.prototype._drawLine=function(x1,y1,x2,y2,_306){ +var _307={x1:x1+"px",y1:y1+"px",x2:x2+"px",y2:y2+"px"}; +if(_306){ +MochiKit.Base.update(_307,_306); +} +var elem=this.createSVGElement("line",_307); +this.root.appendChild(elem); +}; +PlotKit.SVGRenderer.prototype.clear=function(){ +while(this.element.firstChild){ +this.element.removeChild(this.element.firstChild); +} +if(this.options.axisLabelUseDiv){ +for(var i=0;i=6)&&(!_313)){ +var _314=_312["width"]?_312["width"]:"100"; +var _315=_312["height"]?_312["height"]:"100"; +var eid=_312["id"]?_312["id"]:"notunique"; +var html=""; +var _318=document.createElement(html); +var _319=_318.getSVGDocument().createElementNS(PlotKit.SVGRenderer.SVGNS,"svg"); +_319.setAttribute("width",_314); +_319.setAttribute("height",_315); +_318.getSVGDocument().appendChild(_319); +return _318; +}else{ +return PlotKit.SVGRenderer.prototype.createSVGElement("svg",_312); +} +}; +PlotKit.SVGRenderer.isSupported=function(){ +var _320=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1); +var _321=navigator.appVersion.match(/MSIE (\d\.\d)/); +var _322=navigator.userAgent.match(/AppleWebKit\/(\d+)/); +var _323=navigator.userAgent.match(/Opera\/(\d*\.\d*)/); +var _324=navigator.userAgent.match(/rv:(\d*\.\d*).*Gecko/); +var _325="http://www.w3.org/TR/SVG11/feature#SVG"; +if(_321&&(_321[1]>=6)&&!_320){ +return document.implementation.hasFeature(_325,"1.1"); +} +if(_323&&(_323[1]>8.9)){ +return true; +} +if(_324&&(_324>1.7)){ +return true; +} +return false; +}; +PlotKit.SVG={}; +PlotKit.SVG.SVGRenderer=PlotKit.SVGRenderer; +PlotKit.SVG.EXPORT=["SVGRenderer"]; +PlotKit.SVG.EXPORT_OK=["SVGRenderer"]; +PlotKit.SVG.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.SVG.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.SVG); +try{ +if(typeof (PlotKit.CanvasRenderer)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "SweetCanvas depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Layout, Canvas}"; +} +if(typeof (PlotKit.SweetCanvasRenderer)=="undefined"){ +PlotKit.SweetCanvasRenderer={}; +} +PlotKit.SweetCanvasRenderer=function(_326,_327,_328){ +if(arguments.length>0){ +this.__init__(_326,_327,_328); +} +}; +PlotKit.SweetCanvasRenderer.NAME="PlotKit.SweetCanvasRenderer"; +PlotKit.SweetCanvasRenderer.VERSION=PlotKit.VERSION; +PlotKit.SweetCanvasRenderer.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.SweetCanvasRenderer.toString=function(){ +return this.__repr__(); +}; +PlotKit.SweetCanvasRenderer.prototype=new PlotKit.CanvasRenderer(); +PlotKit.SweetCanvasRenderer.prototype.constructor=PlotKit.SweetCanvasRenderer; +PlotKit.SweetCanvasRenderer.__super__=PlotKit.CanvasRenderer.prototype; +PlotKit.SweetCanvasRenderer.prototype.__init__=function(el,_330,opts){ +var _331=PlotKit.Base.officeBlue(); +MochiKit.Base.update(_331,opts); +PlotKit.SweetCanvasRenderer.__super__.__init__.call(this,el,_330,_331); +}; +PlotKit.SweetCanvasRenderer.prototype._renderBarChart=function(){ +var bind=MochiKit.Base.bind; +var _332=Color.blackColor().colorWithAlpha(0.1).toRGBString(); +var _333=function(_334,x,y,w,h){ +_334.fillStyle=_332; +_334.fillRect(x-2,y-2,w+4,h+2); +_334.fillStyle=_332; +_334.fillRect(x-1,y-1,w+2,h+1); +}; +var _335=this.options.colorScheme.length; +var _336=this.options.colorScheme; +var _337=PlotKit.Base.keys(this.layout.datasets); +var _338=_337.length; +var _339=function(name){ +for(var i=0;i<_338;i++){ +if(name==_337[i]){ +return _336[i%_335]; +} +} +return _336[0]; +}; +var _340=function(_341,bar){ +var x=this.area.w*bar.x+this.area.x; +var y=this.area.h*bar.y+this.area.y; +var w=this.area.w*bar.w; +var h=this.area.h*bar.h; +if((w<1)||(h<1)){ +return; +} +_341.save(); +_341.shadowBlur=5; +_341.shadowColor=Color.fromHexString("#888888").toRGBString(); +if(this.isIE){ +_341.save(); +_341.fillStyle="#cccccc"; +_341.fillRect(x-2,y-2,w+4,h+2); +_341.restore(); +}else{ +_333(_341,x,y,w,h); +} +if(this.options.shouldFill){ +_341.fillStyle=_339(bar.name).toRGBString(); +_341.fillRect(x,y,w,h); +} +_341.shadowBlur=0; +_341.strokeStyle=Color.whiteColor().toRGBString(); +_341.lineWidth=2; +if(this.options.shouldStroke){ +_341.strokeRect(x,y,w,h); +} +_341.restore(); +}; +this._renderBarChartWrap(this.layout.bars,bind(_340,this)); +}; +PlotKit.SweetCanvasRenderer.prototype._renderLineChart=function(){ +var _342=this.element.getContext("2d"); +var _343=this.options.colorScheme.length; +var _344=this.options.colorScheme; +var _345=PlotKit.Base.keys(this.layout.datasets); +var _346=_345.length; +var bind=MochiKit.Base.bind; +for(var i=0;i<_346;i++){ +var _347=_345[i]; +var _348=_344[i%_343]; +var _349=this.options.strokeColorTransform; +_342.save(); +var _350=function(ctx){ +ctx.beginPath(); +ctx.moveTo(this.area.x,this.area.y+this.area.h); +var _351=function(ctx_,_352){ +if(_352.name==_347){ +ctx_.lineTo(this.area.w*_352.x+this.area.x,this.area.h*_352.y+this.area.y); +} +}; +MochiKit.Iter.forEach(this.layout.points,partial(_351,ctx),this); +ctx.lineTo(this.area.w+this.area.x,this.area.h+this.area.y); +ctx.lineTo(this.area.x,this.area.y+this.area.h); +ctx.closePath(); +}; +if(this.options.shouldFill){ +_342.save(); +if(this.isIE){ +_342.fillStyle="#cccccc"; +}else{ +_342.fillStyle=Color.blackColor().colorWithAlpha(0.2).toRGBString(); +} +_342.translate(-1,-2); +bind(_350,this)(_342); +if(this.options.shouldFill){ +_342.fill(); +} +_342.restore(); +} +_342.shadowBlur=5; +_342.shadowColor=Color.fromHexString("#888888").toRGBString(); +_342.fillStyle=_348.toRGBString(); +_342.lineWidth=2; +_342.strokeStyle=Color.whiteColor().toRGBString(); +if(this.options.shouldFill){ +bind(_350,this)(_342); +_342.fill(); +} +if(this.options.shouldStroke){ +bind(_350,this)(_342); +_342.stroke(); +} +_342.restore(); +} +}; +PlotKit.SweetCanvasRenderer.prototype._renderPieChart=function(){ +var _353=this.element.getContext("2d"); +var _354=this.options.colorScheme.length; +var _355=this.layout.slices; +var _356=this.area.x+this.area.w*0.5; +var _357=this.area.y+this.area.h*0.5; +var _358=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius); +if(this.isIE){ +_356=parseInt(_356); +_357=parseInt(_357); +_358=parseInt(_358); +} +if(!this.isIE){ +_353.save(); +var _359=Color.blackColor().colorWithAlpha(0.2); +_353.fillStyle=_359.toRGBString(); +_353.shadowBlur=5; +_353.shadowColor=Color.fromHexString("#888888").toRGBString(); +_353.translate(1,1); +_353.beginPath(); +_353.moveTo(_356,_357); +_353.arc(_356,_357,_358+2,0,Math.PI*2,false); +_353.closePath(); +_353.fill(); +_353.restore(); +} +_353.save(); +_353.strokeStyle=Color.whiteColor().toRGBString(); +_353.lineWidth=2; +for(var i=0;i<_355.length;i++){ +var _360=this.options.colorScheme[i%_354]; +_353.fillStyle=_360.toRGBString(); +var _361=function(){ +_353.beginPath(); +_353.moveTo(_356,_357); +_353.arc(_356,_357,_358,_355[i].startAngle-Math.PI/2,_355[i].endAngle-Math.PI/2,false); +_353.lineTo(_356,_357); +_353.closePath(); +}; +if(Math.abs(_355[i].startAngle-_355[i].endAngle)>0.0001){ +if(this.options.shouldFill){ +_361(); +_353.fill(); +} +if(this.options.shouldStroke){ +_361(); +_353.stroke(); +} +} +} +_353.restore(); +}; +PlotKit.SweetCanvasRenderer.prototype._renderBackground=function(){ +var _362=this.element.getContext("2d"); +if(this.layout.style=="bar"||this.layout.style=="line"){ +_362.save(); +_362.fillStyle=this.options.backgroundColor.toRGBString(); +_362.fillRect(this.area.x,this.area.y,this.area.w,this.area.h); +_362.strokeStyle=this.options.axisLineColor.toRGBString(); +_362.lineWidth=1; +var _363=this.layout.yticks; +var _364=false; +if(this.layout.style=="bar"&&this.layout.options.barOrientation=="horizontal"){ +_363=this.layout.xticks; +_364=true; +} +for(var i=0;i<_363.length;i++){ +var x1=0; +var y1=0; +var x2=0; +var y2=0; +if(_364){ +x1=_363[i][0]*this.area.w+this.area.x; +y1=this.area.y; +x2=x1; +y2=y1+this.area.h; +}else{ +x1=this.area.x; +y1=_363[i][0]*this.area.h+this.area.y; +x2=x1+this.area.w; +y2=y1; +} +_362.beginPath(); +_362.moveTo(x1,y1); +_362.lineTo(x2,y2); +_362.closePath(); +_362.stroke(); +} +_362.restore(); +}else{ +PlotKit.SweetCanvasRenderer.__super__._renderBackground.call(this); +} +}; +PlotKit.SweetCanvas={}; +PlotKit.SweetCanvas.SweetCanvasRenderer=PlotKit.SweetCanvasRenderer; +PlotKit.SweetCanvas.EXPORT=["SweetCanvasRenderer"]; +PlotKit.SweetCanvas.EXPORT_OK=["SweetCanvasRenderer"]; +PlotKit.SweetCanvas.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.SweetCanvas.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.SweetCanvas); +try{ +if(typeof (PlotKit.SVGRenderer)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "SweetSVG depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Layout, SVG}"; +} +if(typeof (PlotKit.SweetSVGRenderer)=="undefined"){ +PlotKit.SweetSVGRenderer={}; +} +PlotKit.SweetSVGRenderer=function(_365,_366,_367){ +if(arguments.length>0){ +this.__init__(_365,_366,_367); +} +}; +PlotKit.SweetSVGRenderer.NAME="PlotKit.SweetSVGRenderer"; +PlotKit.SweetSVGRenderer.VERSION=PlotKit.VERSION; +PlotKit.SweetSVGRenderer.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.SweetSVGRenderer.toString=function(){ +return this.__repr__(); +}; +PlotKit.SweetSVGRenderer.prototype=new PlotKit.SVGRenderer(); +PlotKit.SweetSVGRenderer.prototype.constructor=PlotKit.SweetSVGRenderer; +PlotKit.SweetSVGRenderer.__super__=PlotKit.SVGRenderer.prototype; +PlotKit.SweetSVGRenderer.prototype.__init__=function(_368,_369,_370){ +var _371=PlotKit.Base.officeBlue(); +MochiKit.Base.update(_371,_370); +PlotKit.SweetSVGRenderer.__super__.__init__.call(this,_368,_369,_371); +}; +PlotKit.SweetSVGRenderer.prototype._addDropShadowFilter=function(){ +var _372=this.createSVGElement("filter",{x:0,y:0,"id":"dropShadow"}); +var _373=this.createSVGElement("feOffset",{"in":"SourceGraphic","dx":0,"dy":0,"result":"topCopy"}); +var blur=this.createSVGElement("feGaussianBlur",{"in":"SourceAlpha","StdDeviation":2,"result":"shadow"}); +var _375=this.createSVGElement("feOffset",{"in":"shadow","dx":-1,"dy":-2,"result":"movedShadow"}); +var _376=this.createSVGElement("feMerge"); +var _377=this.createSVGElement("feMergeNode",{"in":"topCopy"}); +var _378=this.createSVGElement("feMergeNode",{"in":"movedShadow"}); +_376.appendChild(_377); +_376.appendChild(_378); +_372.appendChild(_373); +_372.appendChild(blur); +_372.appendChild(_375); +_372.appendChild(_376); +this.defs.appendChild(_372); +}; +PlotKit.SweetSVGRenderer.prototype._renderBarChart=function(){ +var bind=MochiKit.Base.bind; +var _379=Color.blackColor().toRGBString(); +var _380="fill:"+_379+";fill-opacity:0.15"; +var _381="stroke-width: 2.0; stroke:"+Color.whiteColor().toRGBString(); +var _382=function(_383,bar){ +var x=this.area.w*bar.x+this.area.x; +var y=this.area.h*bar.y+this.area.y; +var w=this.area.w*bar.w; +var h=this.area.h*bar.h; +if((w<1)||(h<1)){ +return; +} +_383["style"]=_381; +this._drawRect(x-2,y-1,w+4,h+2,{"style":_380}); +this._drawRect(x,y,w,h,_383); +}; +this._renderBarOrLine(this.layout.bars,bind(_382,this)); +}; +PlotKit.SweetSVGRenderer.prototype._renderLineChart=function(){ +var bind=MochiKit.Base.bind; +var _384=Color.blackColor().toRGBString(); +var _385="fill:"+_384+";fill-opacity:0.15"; +var _386="stroke-width: 2.0; stroke:"+Color.whiteColor().toRGBString(); +var _387=function(_388,_389){ +this._tempPointsBuffer+=(this.area.w*_389.x+this.area.x)+","+(this.area.h*_389.y+this.area.y)+" "; +}; +var _390=function(_391){ +this._tempPointsBuffer=""; +this._tempPointsBuffer+=(this.area.x)+","+(this.area.y+this.area.h)+" "; +}; +var _392=function(_393){ +this._tempPointsBuffer+=(this.area.w+this.area.x)+","+(this.area.h+this.area.y); +_393["points"]=this._tempPointsBuffer; +_393["stroke"]="none"; +_393["transform"]="translate(-2, -1)"; +_393["style"]=_385; +var _394=this.createSVGElement("polygon",_393); +this.root.appendChild(_394); +_393["transform"]=""; +_393["style"]=_386; +var elem=this.createSVGElement("polygon",_393); +this.root.appendChild(elem); +}; +this._renderBarOrLine(this.layout.points,bind(_387,this),bind(_390,this),bind(_392,this)); +}; +PlotKit.SweetSVGRenderer.prototype._renderPieChart=function(){ +var _395=this.area.x+this.area.w*0.5; +var _396=this.area.y+this.area.h*0.5; +var _397=Color.blackColor().toRGBString(); +var _398=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius); +var _399="fill:"+_397+";fill-opacity:0.15"; +var _400=this.createSVGElement("circle",{"style":_399,"cx":_395+1,"cy":_396+1,"r":_398+1}); +this.root.appendChild(_400); +PlotKit.SweetSVGRenderer.__super__._renderPieChart.call(this); +}; +PlotKit.SweetSVGRenderer.prototype._renderBackground=function(){ +var _401={"fill":this.options.backgroundColor.toRGBString(),"stroke":"none"}; +if(this.layout.style=="bar"||this.layout.style=="line"){ +this._drawRect(this.area.x,this.area.y,this.area.w,this.area.h,_401); +var _402=this.layout.yticks; +var _403=false; +if(this.layout.style=="bar"&&this.layout.options.barOrientation=="horizontal"){ +_402=this.layout.xticks; +_403=true; +} +for(var i=0;i<_402.length;i++){ +var x=0; +var y=0; +var w=0; +var h=0; +if(_403){ +x=_402[i][0]*this.area.w+this.area.x; +y=this.area.y; +w=1; +h=this.area.w; +}else{ +x=this.area.x; +y=_402[i][0]*this.area.h+this.area.y; +w=this.area.w; +h=1; +} +this._drawRect(x,y,w,h,{"fill":this.options.axisLineColor.toRGBString()}); +} +}else{ +PlotKit.SweetSVGRenderer.__super__._renderBackground.call(this); +} +}; +PlotKit.SweetSVG={}; +PlotKit.SweetSVG.SweetSVGRenderer=PlotKit.SweetSVGRenderer; +PlotKit.SweetSVG.EXPORT=["SweetSVGRenderer"]; +PlotKit.SweetSVG.EXPORT_OK=["SweetSVGRenderer"]; +PlotKit.SweetSVG.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.SweetSVG.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.SweetSVG); +try{ +if(typeof (PlotKit.CanvasRenderer)=="undefined"){ +throw ""; +} +} +catch(e){ +throw "PlotKit.EasyPlot depends on all of PlotKit's components"; +} +if(typeof (PlotKit.EasyPlot)=="undefined"){ +PlotKit.EasyPlot={}; +} +PlotKit.EasyPlot.NAME="PlotKit.EasyPlot"; +PlotKit.EasyPlot.VERSION=PlotKit.VERSION; +PlotKit.EasyPlot.__repr__=function(){ +return "["+this.NAME+" "+this.VERSION+"]"; +}; +PlotKit.EasyPlot.toString=function(){ +return this.__repr__(); +}; +PlotKit.EasyPlot=function(_404,_405,_406,_407){ +this.layout=new Layout(_404,_405); +this.divElem=_406; +this.width=parseInt(_406.getAttribute("width")); +this.height=parseInt(_406.getAttribute("height")); +this.deferredCount=0; +if(this.width<1){ +this.width=this.divElem.width?this.divElem.width:300; +} +if(this.height<1){ +this.height=this.divElem.height?this.divElem.height:300; +} +if(isArrayLike(_407)){ +for(var i=0;i<_407.length;i++){ +if(typeof (_407[i])=="string"){ +this.deferredCount++; +var d=MochiKit.Async.doSimpleXMLHttpRequest(_407[i]); +d.addCallback(MochiKit.Base.bind(PlotKit.EasyPlot.onDataLoaded,this)); +}else{ +if(isArrayLike(_407[i])){ +this.layout.addDataset("data-"+i,_407[i]); +} +} +} +}else{ +if(!isUndefinedOrNull(_407)){ +throw "Passed datasources are not Array like"; +} +} +if(CanvasRenderer.isSupported()){ +this.element=CANVAS({"id":this.divElem.getAttribute("id")+"-canvas","width":this.width,"height":this.height},""); +this.divElem.appendChild(this.element); +this.renderer=new SweetCanvasRenderer(this.element,this.layout,_405); +}else{ +if(SVGRenderer.isSupported()){ +this.element=SVGRenderer.SVG({"id":this.divElem.getAttribute("id")+"-svg","width":this.width,"height":this.height,"version":"1.1","baseProfile":"full"},""); +this.divElem.appendChild(this.element); +this.renderer=new SweetSVGRenderer(this.element,this.layout,_405); +} +} +if((this.deferredCount==0)&&(PlotKit.Base.keys(this.layout.datasets).length>0)){ +this.layout.evaluate(); +this.renderer.clear(); +this.renderer.render(); +} +}; +PlotKit.EasyPlot.onDataLoaded=function(_409){ +var _410=new Array(); +var _411=_409.responseText.split("\n"); +for(var i=0;i<_411.length;i++){ +var _412=MochiKit.Format.strip(_411[i]); +if((_412.length>1)&&(_412.charAt(0)!="#")){ +_410.push(_412.split(",")); +} +} +this.layout.addDataset("data-ajax-"+this.deferredCount,_410); +this.deferredCount--; +if((this.deferredCount==0)&&(PlotKit.Base.keys(this.layout.datasets).length>0)){ +this.layout.evaluate(); +this.renderer.clear(); +this.renderer.render(); +} +}; +PlotKit.EasyPlot.prototype.reload=function(){ +this.layout.evaluate(); +this.renderer.clear(); +this.renderer.render(); +}; +PlotKit.EasyPlotModule={}; +PlotKit.EasyPlotModule.EasyPlot=PlotKit.EasyPlot; +PlotKit.EasyPlotModule.EXPORT=["EasyPlot"]; +PlotKit.EasyPlotModule.EXPORT_OK=[]; +PlotKit.EasyPlotModule.__new__=function(){ +var m=MochiKit.Base; +m.nameFunctions(this); +this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)}; +}; +PlotKit.EasyPlotModule.__new__(); +MochiKit.Base._exportSymbols(this,PlotKit.EasyPlotModule); + + diff --git a/plotkit_v091/PlotKit/SVG.js b/plotkit_v091/PlotKit/SVG.js new file mode 100644 index 0000000..3687bc0 --- /dev/null +++ b/plotkit_v091/PlotKit/SVG.js @@ -0,0 +1,705 @@ +/* + PlotKit SVG + =========== + SVG Renderer for PlotKit + + Copyright + --------- + Copyright 2005,2006 (c) Alastair Tse + For use under the BSD license. +*/ + +// ------------------------------------------------------------------------- +// NOTES: - If you use XHTML1.1 strict, then you must include each MochiKit +// file individuall. +// - For IE support, you must include the AdobeSVG object hack. +// See tests/svg.html for details. +// ------------------------------------------------------------------------- +// ------------------------------------------------------------------------- +// Check required components +// ------------------------------------------------------------------------- + +try { + if (typeof(PlotKit.Layout) == 'undefined') + { + throw ""; + } +} +catch (e) { + throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Layout" +} + + +// --------------------------------------------------------------------------- +// SVG Renderer +// --------------------------------------------------------------------------- + +PlotKit.SVGRenderer = function(element, layout, options) { + if (arguments.length > 0) + this.__init__(element, layout, options); +}; + +PlotKit.SVGRenderer.NAME = "PlotKit.SVGRenderer"; +PlotKit.SVGRenderer.VERSION = PlotKit.VERSION; + +PlotKit.SVGRenderer.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.SVGRenderer.toString = function() { + return this.__repr__(); +} + +PlotKit.SVGRenderer.SVGNS = 'http://www.w3.org/2000/svg'; + +PlotKit.SVGRenderer.prototype.__init__ = function(element, layout, options) { + var isNil = MochiKit.Base.isUndefinedOrNull; + + // default options + this.options = { + "drawBackground": true, + "backgroundColor": Color.whiteColor(), + "padding": {left: 30, right: 30, top: 5, bottom: 10}, + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[1]), + "strokeColor": Color.whiteColor(), + "strokeColorTransform": "asStrokeColor", + "strokeWidth": 0.5, + "shouldFill": true, + "shouldStroke": true, + "drawXAxis": true, + "drawYAxis": true, + "axisLineColor": Color.blackColor(), + "axisLineWidth": 0.5, + "axisTickSize": 3, + "axisLabelColor": Color.blackColor(), + "axisLabelFont": "Arial", + "axisLabelFontSize": 9, + "axisLabelWidth": 50, + "axisLabelUseDiv": true, + "pieRadius": 0.4, + "enableEvents": true + }; + + MochiKit.Base.update(this.options, options ? options : {}); + this.layout = layout; + this.element = MochiKit.DOM.getElement(element); + this.container = this.element.parentNode; + this.height = parseInt(this.element.getAttribute("height")); + this.width = parseInt(this.element.getAttribute("width")); + this.document = document; + this.root = this.element; + + // Adobe SVG Support: + // - if an exception is thrown, then no Adobe SVG Plugin support. + try { + this.document = this.element.getSVGDocument(); + this.root = isNil(this.document.documentElement) ? this.element : this.document.documentElement; + } + catch (e) { + } + + this.element.style.zIndex = 1; + + if (isNil(this.element)) + throw "SVGRenderer() - passed SVG object is not found"; + + if (isNil(this.container) || this.container.nodeName.toLowerCase() != "div") + throw "SVGRenderer() - No DIV's around the SVG."; + + // internal state + this.xlabels = new Array(); + this.ylabels = new Array(); + + // initialise some meta structures in SVG + this.defs = this.createSVGElement("defs"); + + this.area = { + x: this.options.padding.left, + y: this.options.padding.top, + w: this.width - this.options.padding.left - this.options.padding.right, + h: this.height - this.options.padding.top - this.options.padding.bottom + }; + + MochiKit.DOM.updateNodeAttributes(this.container, + {"style":{ "position": "relative", "width": this.width + "px"}}); + + +}; + + +PlotKit.SVGRenderer.prototype.render = function() { + if (this.options.drawBackground) + this._renderBackground(); + + if (this.layout.style == "bar") { + this._renderBarChart(); + this._renderBarAxis(); + } + else if (this.layout.style == "pie") { + this._renderPieChart(); + this._renderPieAxis(); + } + else if (this.layout.style == "line") { + this._renderLineChart(); + this._renderLineAxis(); + } +}; + +PlotKit.SVGRenderer.prototype._renderBarOrLine = function(data, plotFunc, startFunc, endFunc) { + + var colorCount = this.options.colorScheme.length; + var colorScheme = this.options.colorScheme; + var setNames = MochiKit.Base.keys(this.layout.datasets); + var setCount = setNames.length; + + for (var i = 0; i < setCount; i++) { + var setName = setNames[i]; + var attrs = new Array(); + var color = colorScheme[i%colorCount]; + + if (this.options.shouldFill) + attrs["fill"] = color.toRGBString(); + else + attrs["fill"] = "none"; + + if (this.options.shouldStroke && + (this.options.strokeColor || this.options.strokeColorTransform)) { + if (this.options.strokeColor) + attrs["stroke"] = this.options.strokeColor.toRGBString(); + else if (this.options.strokeColorTransform) + attrs["stroke"] = color[this.options.strokeColorTransform]().toRGBString(); + attrs["strokeWidth"] = this.options.strokeWidth; + } + + if (startFunc) + startFunc(attrs); + + var forEachFunc = function(obj) { + if (obj.name == setName) + plotFunc(attrs, obj); + }; + + MochiKit.Iter.forEach(data, bind(forEachFunc, this)); + if (endFunc) + endFunc(attrs); + } +}; + +PlotKit.SVGRenderer.prototype._renderBarChart = function() { + var bind = MochiKit.Base.bind; + + var drawRect = function(attrs, bar) { + var x = this.area.w * bar.x + this.area.x; + var y = this.area.h * bar.y + this.area.y; + var w = this.area.w * bar.w; + var h = this.area.h * bar.h; + this._drawRect(x, y, w, h, attrs); + }; + this._renderBarOrLine(this.layout.bars, bind(drawRect, this)); +}; + +PlotKit.SVGRenderer.prototype._renderLineChart = function() { + var bind = MochiKit.Base.bind; + + var addPoint = function(attrs, point) { + this._tempPointsBuffer += (this.area.w * point.x + this.area.x) + "," + + (this.area.h * point.y + this.area.y) + " "; + }; + + var startLine = function(attrs) { + this._tempPointsBuffer = ""; + this._tempPointsBuffer += (this.area.x) + "," + (this.area.y+this.area.h) + " "; + }; + + var endLine = function(attrs) { + this._tempPointsBuffer += (this.area.w + this.area.x) + "," +(this.area.h + this.area.y); + attrs["points"] = this._tempPointsBuffer; + var elem = this.createSVGElement("polygon", attrs); + this.root.appendChild(elem); + }; + + this._renderBarOrLine(this.layout.points, + bind(addPoint, this), + bind(startLine, this), + bind(endLine, this)); +}; + + +PlotKit.SVGRenderer.prototype._renderPieChart = function() { + var colorCount = this.options.colorScheme.length; + var slices = this.layout.slices; + + var centerx = this.area.x + this.area.w * 0.5; + var centery = this.area.y + this.area.h * 0.5; + var radius = Math.min(this.area.w * this.options.pieRadius, + this.area.h * this.options.pieRadius); + + // NOTE NOTE!! Canvas Tag draws the circle clockwise from the y = 0, x = 1 + // so we have to subtract 90 degrees to make it start at y = 1, x = 0 + + // workaround if we only have 1 slice of 100% + if (slices.length == 1 && (Math.abs(slices[0].startAngle) - Math.abs(slices[0].endAngle) < 0.1)) { + var attrs = {"cx": centerx , "cy": centery , "r": radius }; + var color = this.options.colorScheme[0]; + if (this.options.shouldFill) + attrs["fill"] = color.toRGBString(); + else + attrs["fill"] = "none"; + + if (this.options.shouldStroke && + (this.options.strokeColor || this.options.strokeColorTransform)) { + if (this.options.strokeColor) + attrs["stroke"] = this.options.strokeColor.toRGBString(); + else if (this.options.strokeColorTransform) + attrs["stroke"] = color[this.options.strokeColorTransform]().toRGBString(); + attrs["style"] = "stroke-width: " + this.options.strokeWidth; + } + + this.root.appendChild(this.createSVGElement("circle", attrs)); + return; + } + + for (var i = 0; i < slices.length; i++) { + var attrs = new Array(); + var color = this.options.colorScheme[i%colorCount]; + if (this.options.shouldFill) + attrs["fill"] = color.toRGBString(); + else + attrs["fill"] = "none"; + + if (this.options.shouldStroke && + (this.options.strokeColor || this.options.strokeColorTransform)) { + if (this.options.strokeColor) + attrs["stroke"] = this.options.strokeColor.toRGBString(); + else if (this.options.strokeColorTransform) + attrs["stroke"] = color[this.options.strokeColorTransform]().toRGBString(); + attrs["style"] = "stroke-width:" + this.options.strokeWidth; + } + + var largearc = 0; + if (Math.abs(slices[i].endAngle - slices[i].startAngle) > Math.PI) + largearc = 1; + var x1 = Math.cos(slices[i].startAngle - Math.PI/2) * radius; + var y1 = Math.sin(slices[i].startAngle - Math.PI/2) * radius; + var x2 = Math.cos(slices[i].endAngle - Math.PI/2) * radius; + var y2 = Math.sin(slices[i].endAngle - Math.PI/2) * radius; + var rx = x2 - x1; + var ry = y2 - y1; + + var pathString = "M" + centerx + "," + centery + " "; + pathString += "l" + x1 + "," + y1 + " "; + pathString += "a" + radius + "," + radius + " 0 " + largearc + ",1 " + rx + "," + ry + " z"; + + attrs["d"] = pathString; + + var elem = this.createSVGElement("path", attrs); + this.root.appendChild(elem); + } +}; + +PlotKit.SVGRenderer.prototype._renderBarAxis = function() { + this._renderAxis(); +} + +PlotKit.SVGRenderer.prototype._renderLineAxis = function() { + this._renderAxis(); +}; + + +PlotKit.SVGRenderer.prototype._renderAxis = function() { + + if (!this.options.drawXAxis && !this.options.drawYAxis) + return; + + var labelStyle = {"style": + {"position": "absolute", + "textAlign": "center", + "fontSize": this.options.axisLabelFontSize + "px", + "zIndex": 10, + "color": this.options.axisLabelColor.toRGBString(), + "width": this.options.axisLabelWidth + "px", + "overflow": "hidden" + } + }; + + // axis lines + var lineAttrs = { + "stroke": this.options.axisLineColor.toRGBString(), + "strokeWidth": this.options.axisLineWidth + }; + + + if (this.options.drawYAxis) { + if (this.layout.yticks) { + var drawTick = function(tick) { + var x = this.area.x; + var y = this.area.y + tick[0] * this.area.h; + this._drawLine(x, y, x - 3, y, lineAttrs); + + if (this.options.axisLabelUseDiv) { + var label = DIV(labelStyle, tick[1]); + label.style.top = (y - this.options.axisLabelFontSize) + "px"; + label.style.left = (x - this.options.padding.left + this.options.axisTickSize) + "px"; + label.style.textAlign = "left"; + label.style.width = (this.options.padding.left - 3) + "px"; + MochiKit.DOM.appendChildNodes(this.container, label); + this.ylabels.push(label); + } + else { + var attrs = { + y: y + 3, + x: (x - this.options.padding.left + 3), + width: (this.options.padding.left - this.options.axisTickSize) + "px", + height: (this.options.axisLabelFontSize + 3) + "px", + fontFamily: "Arial", + fontSize: this.options.axisLabelFontSize + "px", + fill: this.options.axisLabelColor.toRGBString() + }; + + /* we can do clipping just like DIVs + http://www.xml.com/pub/a/2004/06/02/svgtype.html */ + /* + var mask = this.createSVGElement("mask", {id: "mask" + tick[0]}); + var maskShape = this.createSVGElement("rect", + {y: y + 3, + x: (x - this.options.padding.left + 3), + width: (this.options.padding.left - this.options.axisTickSize) + "px", + height: (this.options.axisLabelFontSize + 3) + "px", + style: {"fill": "#ffffff", "stroke": "#000000"}}); + mask.appendChild(maskShape); + this.defs.appendChild(mask); + + attrs["filter"] = "url(#mask" + tick[0] + ")"; + */ + + var label = this.createSVGElement("text", attrs); + label.appendChild(this.document.createTextNode(tick[1])); + this.root.appendChild(label); + } + }; + + MochiKit.Iter.forEach(this.layout.yticks, bind(drawTick, this)); + } + + this._drawLine(this.area.x, this.area.y, this.area.x, this.area.y + this.area.h, lineAttrs); + } + + if (this.options.drawXAxis) { + if (this.layout.xticks) { + var drawTick = function(tick) { + var x = this.area.x + tick[0] * this.area.w; + var y = this.area.y + this.area.h; + this._drawLine(x, y, x, y + this.options.axisTickSize, lineAttrs); + + if (this.options.axisLabelUseDiv) { + var label = DIV(labelStyle, tick[1]); + label.style.top = (y + this.options.axisTickSize) + "px"; + label.style.left = (x - this.options.axisLabelWidth/2) + "px"; + label.style.textAlign = "center"; + label.style.width = this.options.axisLabelWidth + "px"; + MochiKit.DOM.appendChildNodes(this.container, label); + this.xlabels.push(label); + } + else { + var attrs = { + y: (y + this.options.axisTickSize + this.options.axisLabelFontSize), + x: x - 3, + width: this.options.axisLabelWidth + "px", + height: (this.options.axisLabelFontSize + 3) + "px", + fontFamily: "Arial", + fontSize: this.options.axisLabelFontSize + "px", + fill: this.options.axisLabelColor.toRGBString(), + textAnchor: "middle" + }; + var label = this.createSVGElement("text", attrs); + label.appendChild(this.document.createTextNode(tick[1])); + this.root.appendChild(label); + } + }; + + MochiKit.Iter.forEach(this.layout.xticks, bind(drawTick, this)); + } + + this._drawLine(this.area.x, this.area.y + this.area.h, this.area.x + this.area.w, this.area.y + this.area.h, lineAttrs) + } +}; + +PlotKit.SVGRenderer.prototype._renderPieAxis = function() { + + if (this.layout.xticks) { + // make a lookup dict for x->slice values + var lookup = new Array(); + for (var i = 0; i < this.layout.slices.length; i++) { + lookup[this.layout.slices[i].xval] = this.layout.slices[i]; + } + + var centerx = this.area.x + this.area.w * 0.5; + var centery = this.area.y + this.area.h * 0.5; + var radius = Math.min(this.area.w * this.options.pieRadius + 10, + this.area.h * this.options.pieRadius + 10); + var labelWidth = this.options.axisLabelWidth; + + for (var i = 0; i < this.layout.xticks.length; i++) { + var slice = lookup[this.layout.xticks[i][0]]; + if (MochiKit.Base.isUndefinedOrNull(slice)) + continue; + + + var angle = (slice.startAngle + slice.endAngle)/2; + // normalize the angle + var normalisedAngle = angle; + if (normalisedAngle > Math.PI * 2) + normalisedAngle = normalisedAngle - Math.PI * 2; + else if (normalisedAngle < 0) + normalisedAngle = normalisedAngle + Math.PI * 2; + + var labelx = centerx + Math.sin(normalisedAngle) * (radius + 10); + var labely = centery - Math.cos(normalisedAngle) * (radius + 10); + + var attrib = { + "position": "absolute", + "zIndex": 11, + "width": labelWidth + "px", + "fontSize": this.options.axisLabelFontSize + "px", + "overflow": "hidden", + "color": this.options.axisLabelColor.toHexString() + }; + + var svgattrib = { + "width": labelWidth + "px", + "fontSize": this.options.axisLabelFontSize + "px", + "height": (this.options.axisLabelFontSize + 3) + "px", + "fill": this.options.axisLabelColor.toRGBString() + }; + + if (normalisedAngle <= Math.PI * 0.5) { + // text on top and align left + MochiKit.Base.update(attrib, { + 'textAlign': 'left', 'verticalAlign': 'top', + 'left': labelx + 'px', + 'top': (labely - this.options.axisLabelFontSize) + "px" + }); + MochiKit.Base.update(svgattrib, { + "x": labelx, + "y" :(labely - this.options.axisLabelFontSize), + "textAnchor": "left" + }); + } + else if ((normalisedAngle > Math.PI * 0.5) && (normalisedAngle <= Math.PI)) { + // text on bottom and align left + MochiKit.Base.update(attrib, { + 'textAlign': 'left', 'verticalAlign': 'bottom', + 'left': labelx + 'px', + 'top': labely + "px" + }); + MochiKit.Base.update(svgattrib, { + 'textAnchor': 'left', + 'x': labelx, + 'y': labely + }); + } + else if ((normalisedAngle > Math.PI) && (normalisedAngle <= Math.PI*1.5)) { + // text on bottom and align right + MochiKit.Base.update(attrib, { + 'textAlign': 'right', 'verticalAlign': 'bottom', + 'left': labelx + 'px', + 'top': labely + "px" + }); + MochiKit.Base.update(svgattrib, { + 'textAnchor': 'right', + 'x': labelx - labelWidth, + 'y': labely + }); + } + else { + // text on top and align right + MochiKit.Base.update(attrib, { + 'textAlign': 'left', 'verticalAlign': 'bottom', + 'left': labelx + 'px', + 'top': labely + "px" + }); + MochiKit.Base.update(svgattrib, { + 'textAnchor': 'left', + 'x': labelx - labelWidth, + 'y': labely - this.options.axisLabelFontSize + }); + } + + if (this.options.axisLabelUseDiv) { + var label = DIV({'style': attrib}, this.layout.xticks[i][1]); + this.xlabels.push(label); + MochiKit.DOM.appendChildNodes(this.container, label); + } + else { + var label = this.createSVGElement("text", svgattrib); + label.appendChild(this.document.createTextNode(this.layout.xticks[i][1])) + this.root.appendChild(label); + } + } + + } +}; + +PlotKit.SVGRenderer.prototype._renderBackground = function() { + var opts = {"stroke": "none", + "fill": this.options.backgroundColor.toRGBString() + }; + this._drawRect(0, 0, this.width, this.height, opts); +}; + +PlotKit.SVGRenderer.prototype._drawRect = function(x, y, w, h, moreattrs) { + var attrs = {x: x + "px", y: y + "px", width: w + "px", height: h + "px"}; + if (moreattrs) + MochiKit.Base.update(attrs, moreattrs); + + var elem = this.createSVGElement("rect", attrs); + this.root.appendChild(elem); +}; + +PlotKit.SVGRenderer.prototype._drawLine = function(x1, y1, x2, y2, moreattrs) { + var attrs = {x1: x1 + "px", y1: y1 + "px", x2: x2 + "px", y2: y2 + "px"}; + if (moreattrs) + MochiKit.Base.update(attrs, moreattrs); + + var elem = this.createSVGElement("line", attrs); + this.root.appendChild(elem); +} + +PlotKit.SVGRenderer.prototype.clear = function() { + while(this.element.firstChild) { + this.element.removeChild(this.element.firstChild); + } + + if (this.options.axisLabelUseDiv) { + for (var i = 0; i < this.xlabels.length; i++) { + MochiKit.DOM.removeElement(this.xlabels[i]); + } + for (var i = 0; i < this.ylabels.length; i++) { + MochiKit.DOM.removeElement(this.ylabels[i]); + } + } + this.xlabels = new Array(); + this.ylabels = new Array(); +}; + + +PlotKit.SVGRenderer.prototype.createSVGElement = function(name, attrs) { + var isNil = MochiKit.Base.isUndefinedOrNull; + var elem; + var doc = isNil(this.document) ? document : this.document; + + try { + elem = doc.createElementNS(PlotKit.SVGRenderer.SVGNS, name); + } + catch (e) { + elem = doc.createElement(name); + elem.setAttribute("xmlns", PlotKit.SVGRenderer.SVGNS); + } + + if (attrs) + MochiKit.DOM.updateNodeAttributes(elem, attrs); + + // TODO: we don't completely emulate the MochiKit.DOM.createElement + // as we don't care about nodes contained. We really should though. + + return elem; + +}; + + +PlotKit.SVGRenderer.SVG = function(attrs) { + // we have to do things differently for IE+AdobeSVG. + // My guess this works (via trial and error) is that we need to + // have an SVG object in order to use SVGDocument.createElementNS + // but IE doesn't allow us to that. + + var ie = navigator.appVersion.match(/MSIE (\d\.\d)/); + var opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + if (ie && (ie[1] >= 6) && (!opera)) { + var width = attrs["width"] ? attrs["width"] : "100"; + var height = attrs["height"] ? attrs["height"] : "100"; + var eid = attrs["id"] ? attrs["id"] : "notunique"; + + var html = ''; + + var canvas = document.createElement(html); + + // create embedded SVG inside SVG. + var group = canvas.getSVGDocument().createElementNS(PlotKit.SVGRenderer.SVGNS, "svg"); + group.setAttribute("width", width); + group.setAttribute("height", height); + canvas.getSVGDocument().appendChild(group); + + return canvas; + } + else { + return PlotKit.SVGRenderer.prototype.createSVGElement("svg", attrs); + } +}; + +PlotKit.SVGRenderer.isSupported = function() { + var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + var ieVersion = navigator.appVersion.match(/MSIE (\d\.\d)/); + var safariVersion = navigator.userAgent.match(/AppleWebKit\/(\d+)/); + var operaVersion = navigator.userAgent.match(/Opera\/(\d*\.\d*)/); + var mozillaVersion = navigator.userAgent.match(/rv:(\d*\.\d*).*Gecko/); + var svgFeature = "http://www.w3.org/TR/SVG11/feature#SVG"; + + if (ieVersion && (ieVersion[1] >= 6) && !isOpera) { + return document.implementation.hasFeature(svgFeature,"1.1"); + /* + var dummysvg = document.createElement(''); + try { + dummysvg.getSVGDocument(); + dummysvg = null; + return true; + } + catch (e) { + return false; + } + */ + + } + + /* support not really there yet. no text and paths are buggy + if (safariVersion && (safariVersion[1] > 419)) + return true; + */ + + if (operaVersion && (operaVersion[1] > 8.9)) + return true + + if (mozillaVersion && (mozillaVersion > 1.7)) + return true; + + return false; +}; + +// Namespace Iniitialisation + +PlotKit.SVG = {} +PlotKit.SVG.SVGRenderer = PlotKit.SVGRenderer; + +PlotKit.SVG.EXPORT = [ + "SVGRenderer" +]; + +PlotKit.SVG.EXPORT_OK = [ + "SVGRenderer" +]; + +PlotKit.SVG.__new__ = function() { + var m = MochiKit.Base; + + m.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; +}; + +PlotKit.SVG.__new__(); +MochiKit.Base._exportSymbols(this, PlotKit.SVG); + diff --git a/plotkit_v091/PlotKit/SweetCanvas.js b/plotkit_v091/PlotKit/SweetCanvas.js new file mode 100644 index 0000000..bb6fe5c --- /dev/null +++ b/plotkit_v091/PlotKit/SweetCanvas.js @@ -0,0 +1,348 @@ +/* + PlotKit Sweet Canvas Renderer + ============================= + Canvas Renderer for PlotKit which looks pretty! + + Copyright + --------- + Copyright 2005,2006 (c) Alastair Tse + For use under the BSD license. +*/ + +// ------------------------------------------------------------------------- +// Check required components +// ------------------------------------------------------------------------- + +try { + if (typeof(PlotKit.CanvasRenderer) == 'undefined') + { + throw ""; + } +} +catch (e) { + throw "SweetCanvas depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Layout, Canvas}" +} + + +if (typeof(PlotKit.SweetCanvasRenderer) == 'undefined') { + PlotKit.SweetCanvasRenderer = {}; +} + +PlotKit.SweetCanvasRenderer = function(element, layout, options) { + if (arguments.length > 0) { + this.__init__(element, layout, options); + } +}; + +PlotKit.SweetCanvasRenderer.NAME = "PlotKit.SweetCanvasRenderer"; +PlotKit.SweetCanvasRenderer.VERSION = PlotKit.VERSION; + +PlotKit.SweetCanvasRenderer.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.SweetCanvasRenderer.toString = function() { + return this.__repr__(); +}; + +// --------------------------------------------------------------------- +// Subclassing Magic +// --------------------------------------------------------------------- + +PlotKit.SweetCanvasRenderer.prototype = new PlotKit.CanvasRenderer(); +PlotKit.SweetCanvasRenderer.prototype.constructor = PlotKit.SweetCanvasRenderer; +PlotKit.SweetCanvasRenderer.__super__ = PlotKit.CanvasRenderer.prototype; + +// --------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------- + +PlotKit.SweetCanvasRenderer.prototype.__init__ = function(el, layout, opts) { + var moreOpts = PlotKit.Base.officeBlue(); + MochiKit.Base.update(moreOpts, opts); + PlotKit.SweetCanvasRenderer.__super__.__init__.call(this, el, layout, moreOpts); +}; + +// --------------------------------------------------------------------- +// Extended Plotting Functions +// --------------------------------------------------------------------- + +PlotKit.SweetCanvasRenderer.prototype._renderBarChart = function() { + var bind = MochiKit.Base.bind; + var shadowColor = Color.blackColor().colorWithAlpha(0.1).toRGBString(); + + var prepareFakeShadow = function(context, x, y, w, h) { + context.fillStyle = shadowColor; + context.fillRect(x-2, y-2, w+4, h+2); + context.fillStyle = shadowColor; + context.fillRect(x-1, y-1, w+2, h+1); + }; + + var colorCount = this.options.colorScheme.length; + var colorScheme = this.options.colorScheme; + var setNames = PlotKit.Base.keys(this.layout.datasets); + var setCount = setNames.length; + + var chooseColor = function(name) { + for (var i = 0; i < setCount; i++) { + if (name == setNames[i]) + return colorScheme[i%colorCount]; + } + return colorScheme[0]; + }; + + var drawRect = function(context, bar) { + var x = this.area.w * bar.x + this.area.x; + var y = this.area.h * bar.y + this.area.y; + var w = this.area.w * bar.w; + var h = this.area.h * bar.h; + + if ((w < 1) || (h < 1)) + return; + + context.save(); + + context.shadowBlur = 5.0; + context.shadowColor = Color.fromHexString("#888888").toRGBString(); + + if (this.isIE) { + context.save(); + context.fillStyle = "#cccccc"; + context.fillRect(x-2, y-2, w+4, h+2); + context.restore(); + } + else { + prepareFakeShadow(context, x, y, w, h); + } + + if (this.options.shouldFill) { + context.fillStyle = chooseColor(bar.name).toRGBString(); + context.fillRect(x, y, w, h); + } + + context.shadowBlur = 0; + context.strokeStyle = Color.whiteColor().toRGBString(); + context.lineWidth = 2.0; + + if (this.options.shouldStroke) { + context.strokeRect(x, y, w, h); + } + + context.restore(); + + }; + this._renderBarChartWrap(this.layout.bars, bind(drawRect, this)); +}; + +PlotKit.SweetCanvasRenderer.prototype._renderLineChart = function() { + var context = this.element.getContext("2d"); + var colorCount = this.options.colorScheme.length; + var colorScheme = this.options.colorScheme; + var setNames = PlotKit.Base.keys(this.layout.datasets); + var setCount = setNames.length; + var bind = MochiKit.Base.bind; + + + for (var i = 0; i < setCount; i++) { + var setName = setNames[i]; + var color = colorScheme[i%colorCount]; + var strokeX = this.options.strokeColorTransform; + + // setup graphics context + context.save(); + + // create paths + var makePath = function(ctx) { + ctx.beginPath(); + ctx.moveTo(this.area.x, this.area.y + this.area.h); + var addPoint = function(ctx_, point) { + if (point.name == setName) + ctx_.lineTo(this.area.w * point.x + this.area.x, + this.area.h * point.y + this.area.y); + }; + MochiKit.Iter.forEach(this.layout.points, partial(addPoint, ctx), this); + ctx.lineTo(this.area.w + this.area.x, + this.area.h + this.area.y); + ctx.lineTo(this.area.x, this.area.y + this.area.h); + ctx.closePath(); + }; + + // faux shadow for firefox + if (this.options.shouldFill) { + context.save(); + if (this.isIE) { + context.fillStyle = "#cccccc"; + } + else { + context.fillStyle = Color.blackColor().colorWithAlpha(0.2).toRGBString(); + } + context.translate(-1, -2); + bind(makePath, this)(context); + if (this.options.shouldFill) { + context.fill(); + } + context.restore(); + } + + context.shadowBlur = 5.0; + context.shadowColor = Color.fromHexString("#888888").toRGBString(); + context.fillStyle = color.toRGBString(); + context.lineWidth = 2.0; + context.strokeStyle = Color.whiteColor().toRGBString(); + + if (this.options.shouldFill) { + bind(makePath, this)(context); + context.fill(); + } + if (this.options.shouldStroke) { + bind(makePath, this)(context); + context.stroke(); + } + context.restore(); + } +}; + +PlotKit.SweetCanvasRenderer.prototype._renderPieChart = function() { + var context = this.element.getContext("2d"); + + var colorCount = this.options.colorScheme.length; + var slices = this.layout.slices; + + var centerx = this.area.x + this.area.w * 0.5; + var centery = this.area.y + this.area.h * 0.5; + var radius = Math.min(this.area.w * this.options.pieRadius, + this.area.h * this.options.pieRadius); + + if (this.isIE) { + centerx = parseInt(centerx); + centery = parseInt(centery); + radius = parseInt(radius); + } + + // NOTE NOTE!! Canvas Tag draws the circle clockwise from the y = 0, x = 1 + // so we have to subtract 90 degrees to make it start at y = 1, x = 0 + + if (!this.isIE) { + context.save(); + var shadowColor = Color.blackColor().colorWithAlpha(0.2); + context.fillStyle = shadowColor.toRGBString(); + context.shadowBlur = 5.0; + context.shadowColor = Color.fromHexString("#888888").toRGBString(); + context.translate(1, 1); + context.beginPath(); + context.moveTo(centerx, centery); + context.arc(centerx, centery, radius + 2, 0, Math.PI*2, false); + context.closePath(); + context.fill(); + context.restore(); + } + + context.save(); + context.strokeStyle = Color.whiteColor().toRGBString(); + context.lineWidth = 2.0; + for (var i = 0; i < slices.length; i++) { + var color = this.options.colorScheme[i%colorCount]; + context.fillStyle = color.toRGBString(); + + var makePath = function() { + context.beginPath(); + context.moveTo(centerx, centery); + context.arc(centerx, centery, radius, + slices[i].startAngle - Math.PI/2, + slices[i].endAngle - Math.PI/2, + false); + context.lineTo(centerx, centery); + context.closePath(); + }; + + if (Math.abs(slices[i].startAngle - slices[i].endAngle) > 0.0001) { + if (this.options.shouldFill) { + makePath(); + context.fill(); + } + if (this.options.shouldStroke) { + makePath(); + context.stroke(); + } + } + } + context.restore(); +}; + +PlotKit.SweetCanvasRenderer.prototype._renderBackground = function() { + var context = this.element.getContext("2d"); + + if (this.layout.style == "bar" || this.layout.style == "line") { + context.save(); + context.fillStyle = this.options.backgroundColor.toRGBString(); + context.fillRect(this.area.x, this.area.y, this.area.w, this.area.h); + context.strokeStyle = this.options.axisLineColor.toRGBString(); + context.lineWidth = 1.0; + + var ticks = this.layout.yticks; + var horiz = false; + if (this.layout.style == "bar" && + this.layout.options.barOrientation == "horizontal") { + ticks = this.layout.xticks; + horiz = true; + } + + for (var i = 0; i < ticks.length; i++) { + var x1 = 0; + var y1 = 0; + var x2 = 0; + var y2 = 0; + + if (horiz) { + x1 = ticks[i][0] * this.area.w + this.area.x; + y1 = this.area.y; + x2 = x1; + y2 = y1 + this.area.h; + } + else { + x1 = this.area.x; + y1 = ticks[i][0] * this.area.h + this.area.y; + x2 = x1 + this.area.w; + y2 = y1; + } + + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.closePath(); + context.stroke(); + } + context.restore(); + } + else { + PlotKit.SweetCanvasRenderer.__super__._renderBackground.call(this); + } +}; + +// Namespace Iniitialisation + +PlotKit.SweetCanvas = {} +PlotKit.SweetCanvas.SweetCanvasRenderer = PlotKit.SweetCanvasRenderer; + +PlotKit.SweetCanvas.EXPORT = [ + "SweetCanvasRenderer" +]; + +PlotKit.SweetCanvas.EXPORT_OK = [ + "SweetCanvasRenderer" +]; + +PlotKit.SweetCanvas.__new__ = function() { + var m = MochiKit.Base; + + m.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; +}; + +PlotKit.SweetCanvas.__new__(); +MochiKit.Base._exportSymbols(this, PlotKit.SweetCanvas); + diff --git a/plotkit_v091/PlotKit/SweetSVG.js b/plotkit_v091/PlotKit/SweetSVG.js new file mode 100644 index 0000000..4183058 --- /dev/null +++ b/plotkit_v091/PlotKit/SweetSVG.js @@ -0,0 +1,247 @@ +/* + PlotKit Sweet SVG Renderer + ========================== + SVG Renderer for PlotKit which looks pretty! + + Copyright + --------- + Copyright 2005,2006 (c) Alastair Tse + For use under the BSD license. +*/ + + +// ------------------------------------------------------------------------- +// Check required components +// ------------------------------------------------------------------------- + +try { + if (typeof(PlotKit.SVGRenderer) == 'undefined') + { + throw ""; + } +} +catch (e) { + throw "SweetSVG depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Layout, SVG}" +} + + +if (typeof(PlotKit.SweetSVGRenderer) == 'undefined') { + PlotKit.SweetSVGRenderer = {}; +} + +PlotKit.SweetSVGRenderer = function(element, layout, options) { + if (arguments.length > 0) { + this.__init__(element, layout, options); + } +}; + +PlotKit.SweetSVGRenderer.NAME = "PlotKit.SweetSVGRenderer"; +PlotKit.SweetSVGRenderer.VERSION = PlotKit.VERSION; + +PlotKit.SweetSVGRenderer.__repr__ = function() { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +PlotKit.SweetSVGRenderer.toString = function() { + return this.__repr__(); +}; + +// --------------------------------------------------------------------- +// Subclassing Magic +// --------------------------------------------------------------------- + +PlotKit.SweetSVGRenderer.prototype = new PlotKit.SVGRenderer(); +PlotKit.SweetSVGRenderer.prototype.constructor = PlotKit.SweetSVGRenderer; +PlotKit.SweetSVGRenderer.__super__ = PlotKit.SVGRenderer.prototype; + +// --------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------- + +PlotKit.SweetSVGRenderer.prototype.__init__ = function(element, layout, options) { + var moreOpts = PlotKit.Base.officeBlue(); + MochiKit.Base.update(moreOpts, options); + PlotKit.SweetSVGRenderer.__super__.__init__.call(this, element, layout, moreOpts); + //this._addDropShadowFilter(); +}; + +PlotKit.SweetSVGRenderer.prototype._addDropShadowFilter = function() { + var filter = this.createSVGElement("filter", {x: 0, y: 0, "id":"dropShadow"}); + var goffset = this.createSVGElement("feOffset", + {"in": "SourceGraphic", "dx": 0, "dy": 0, "result": "topCopy"}); + var blur = this.createSVGElement("feGaussianBlur", + {"in": "SourceAlpha", "StdDeviation": 2, "result": "shadow"}); + var soffset = this.createSVGElement("feOffset", + {"in": "shadow", "dx": -1, "dy": -2, "result":"movedShadow"}); + var merge = this.createSVGElement("feMerge"); + var gmerge = this.createSVGElement("feMergeNode", {"in":"topCopy"}); + var smerge = this.createSVGElement("feMergeNode", {"in":"movedShadow"}); + + merge.appendChild(gmerge); + merge.appendChild(smerge); + filter.appendChild(goffset); + filter.appendChild(blur); + filter.appendChild(soffset); + filter.appendChild(merge); + this.defs.appendChild(filter); +}; + +// --------------------------------------------------------------------- +// Extended Plotting Functions +// --------------------------------------------------------------------- + +PlotKit.SweetSVGRenderer.prototype._renderBarChart = function() { + var bind = MochiKit.Base.bind; + var shadowColor = Color.blackColor().toRGBString(); + var shadowStyle = "fill:" + shadowColor + ";fill-opacity:0.15"; + var strokeStyle = "stroke-width: 2.0; stroke:" + Color.whiteColor().toRGBString(); + + var drawRect = function(attrs, bar) { + var x = this.area.w * bar.x + this.area.x; + var y = this.area.h * bar.y + this.area.y; + var w = this.area.w * bar.w; + var h = this.area.h * bar.h; + + if ((w < 1) || (h < 1)) + return; + + //attrs["filter"] = "url(#dropShadow)"; + attrs["style"] = strokeStyle; + this._drawRect(x - 2, y - 1, w+4, h+2, {"style":shadowStyle}); + this._drawRect(x, y, w, h, attrs); + }; + this._renderBarOrLine(this.layout.bars, bind(drawRect, this)); + +}; + +PlotKit.SweetSVGRenderer.prototype._renderLineChart = function() { + var bind = MochiKit.Base.bind; + var shadowColor = Color.blackColor().toRGBString(); + var shadowStyle = "fill:" + shadowColor + ";fill-opacity:0.15"; + var strokeStyle = "stroke-width: 2.0; stroke:" + Color.whiteColor().toRGBString(); + + var addPoint = function(attrs, point) { + this._tempPointsBuffer += (this.area.w * point.x + this.area.x) + "," + + (this.area.h * point.y + this.area.y) + " "; + }; + + var startLine = function(attrs) { + this._tempPointsBuffer = ""; + this._tempPointsBuffer += (this.area.x) + "," + (this.area.y+this.area.h) + " "; + }; + + var endLine = function(attrs) { + this._tempPointsBuffer += (this.area.w + this.area.x) + "," +(this.area.h + this.area.y); + attrs["points"] = this._tempPointsBuffer; + + attrs["stroke"] = "none"; + attrs["transform"] = "translate(-2, -1)"; + attrs["style"] = shadowStyle; + var shadow = this.createSVGElement("polygon", attrs); + this.root.appendChild(shadow); + + attrs["transform"] = ""; + attrs["style"] = strokeStyle; + var elem = this.createSVGElement("polygon", attrs); + this.root.appendChild(elem); + + + }; + + this._renderBarOrLine(this.layout.points, + bind(addPoint, this), + bind(startLine, this), + bind(endLine, this)); +}; + +PlotKit.SweetSVGRenderer.prototype._renderPieChart = function() { + var centerx = this.area.x + this.area.w * 0.5; + var centery = this.area.y + this.area.h * 0.5; + var shadowColor = Color.blackColor().toRGBString(); + var radius = Math.min(this.area.w * this.options.pieRadius, + this.area.h * this.options.pieRadius); + var shadowStyle = "fill:" + shadowColor + ";fill-opacity:0.15"; + + var shadow = this.createSVGElement("circle", + {"style": shadowStyle, "cx": centerx + 1, "cy": centery + 1, "r": radius + 1}); + this.root.appendChild(shadow); + + PlotKit.SweetSVGRenderer.__super__._renderPieChart.call(this); +}; + + +PlotKit.SweetSVGRenderer.prototype._renderBackground = function() { + var attrs = { + "fill": this.options.backgroundColor.toRGBString(), + "stroke": "none" + }; + + + if (this.layout.style == "bar" || this.layout.style == "line") { + this._drawRect(this.area.x, this.area.y, + this.area.w, this.area.h, attrs); + + var ticks = this.layout.yticks; + var horiz = false; + if (this.layout.style == "bar" && + this.layout.options.barOrientation == "horizontal") { + ticks = this.layout.xticks; + horiz = true; + } + + for (var i = 0; i < ticks.length; i++) { + var x = 0; + var y = 0; + var w = 0; + var h = 0; + + if (horiz) { + x = ticks[i][0] * this.area.w + this.area.x; + y = this.area.y; + w = 1; + h = this.area.w; + } + else { + x = this.area.x; + y = ticks[i][0] * this.area.h + this.area.y; + w = this.area.w; + h = 1; + } + + this._drawRect(x, y, w, h, + {"fill": this.options.axisLineColor.toRGBString()}); + } + } + else { + PlotKit.SweetSVGRenderer.__super__._renderBackground.call(this); + + } + +}; + +// Namespace Iniitialisation + +PlotKit.SweetSVG = {} +PlotKit.SweetSVG.SweetSVGRenderer = PlotKit.SweetSVGRenderer; + +PlotKit.SweetSVG.EXPORT = [ + "SweetSVGRenderer" +]; + +PlotKit.SweetSVG.EXPORT_OK = [ + "SweetSVGRenderer" +]; + +PlotKit.SweetSVG.__new__ = function() { + var m = MochiKit.Base; + + m.nameFunctions(this); + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": m.concat(this.EXPORT, this.EXPORT_OK) + }; +}; + +PlotKit.SweetSVG.__new__(); +MochiKit.Base._exportSymbols(this, PlotKit.SweetSVG); diff --git a/plotkit_v091/PlotKit/dummy.svg b/plotkit_v091/PlotKit/dummy.svg new file mode 100644 index 0000000..6a82bd4 --- /dev/null +++ b/plotkit_v091/PlotKit/dummy.svg @@ -0,0 +1,9 @@ + + + diff --git a/plotkit_v091/PlotKit/excanvas.js b/plotkit_v091/PlotKit/excanvas.js new file mode 100644 index 0000000..ca77da2 --- /dev/null +++ b/plotkit_v091/PlotKit/excanvas.js @@ -0,0 +1,723 @@ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// TODO: Patterns +// TODO: Radial gradient +// TODO: Clipping paths +// TODO: Coordsize (still need to support stretching) +// TODO: Painting mode +// TODO: Optimize +// TODO: canvas width/height sets content size in moz, border size in ie + +// only add this code if we do not already have a canvas implementation +if (!window.CanvasRenderingContext2D) { + +(function () { + + // alias some functions to make (compiled) code shorter + var m = Math; + var mr = m.round; + var ms = m.sin; + var mc = m.cos; + + var G_vmlCanvasManager_ = { + init: function (opt_doc) { + var doc = opt_doc || document; + if (/MSIE/.test(navigator.userAgent) && !window.opera) { + var self = this; + doc.attachEvent("onreadystatechange", function () { + self.init_(doc); + }); + } + }, + + init_: function (doc, e) { + if (doc.readyState == "complete") { + // create xmlns + if (!doc.namespaces["g_vml_"]) { + doc.namespaces.add("g_vml_", "urn:schemas-microsoft-com:vml"); + } + + // setup default css + var ss = doc.createStyleSheet(); + ss.cssText = "canvas{display:inline-block;overflow:hidden;" + + "text-align:left;}" + + "g_vml_\\:*{behavior:url(#default#VML)}"; + + // find all canvas elements + var els = doc.getElementsByTagName("canvas"); + for (var i = 0; i < els.length; i++) { + if (!els[i].getContext) { + this.initElement(els[i]); + } + } + } + }, + + fixElement_: function (el) { + // in IE before version 5.5 we would need to add HTML: to the tag name + // but we do not care about IE before version 6 + var outerHTML = el.outerHTML; + var newEl = document.createElement(outerHTML); + // if the tag is still open IE has created the children as siblings and + // it has also created a tag with the name "/FOO" + if (outerHTML.slice(-2) != "/>") { + var tagName = "/" + el.tagName; + var ns; + // remove content + while ((ns = el.nextSibling) && ns.tagName != tagName) { + ns.removeNode(); + } + // remove the incorrect closing tag + if (ns) { + ns.removeNode(); + } + } + el.parentNode.replaceChild(newEl, el); + return newEl; + }, + + /** + * Public initializes a canvas element so that it can be used as canvas + * element from now on. This is called automatically before the page is + * loaded but if you are creating elements using createElement you need to + * make sure this is called on the element. + * @param {HTMLElement} el The canvas element to initialize. + * @return {HTMLElement} the element that was created. + */ + initElement: function (el) { + el = this.fixElement_(el); + el.getContext = function () { + if (this.context_) { + return this.context_; + } + return this.context_ = new CanvasRenderingContext2D_(this); + }; + + // do not use inline function because that will leak memory + // el.attachEvent('onpropertychange', onPropertyChange) + el.attachEvent('onresize', onResize); + + var attrs = el.attributes; + if (attrs.width && attrs.width.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setWidth_(attrs.width.nodeValue); + el.style.width = attrs.width.nodeValue + "px"; + } + if (attrs.height && attrs.height.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setHeight_(attrs.height.nodeValue); + el.style.height = attrs.height.nodeValue + "px"; + } + //el.getContext().setCoordsize_() + return el; + } + }; + + function onPropertyChange(e) { + // we need to watch changes to width and height + switch (e.propertyName) { + case 'width': + case 'height': + // TODO: coordsize and size + break; + } + } + + function onResize(e) { + var el = e.srcElement; + if (el.firstChild) { + el.firstChild.style.width = el.clientWidth + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + } + } + + G_vmlCanvasManager_.init(); + + // precompute "00" to "FF" + var dec2hex = []; + for (var i = 0; i < 16; i++) { + for (var j = 0; j < 16; j++) { + dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); + } + } + + function createMatrixIdentity() { + return [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1] + ]; + } + + function matrixMultiply(m1, m2) { + var result = createMatrixIdentity(); + + for (var x = 0; x < 3; x++) { + for (var y = 0; y < 3; y++) { + var sum = 0; + + for (var z = 0; z < 3; z++) { + sum += m1[x][z] * m2[z][y]; + } + + result[x][y] = sum; + } + } + return result; + } + + function copyState(o1, o2) { + o2.fillStyle = o1.fillStyle; + o2.lineCap = o1.lineCap; + o2.lineJoin = o1.lineJoin; + o2.lineWidth = o1.lineWidth; + o2.miterLimit = o1.miterLimit; + o2.shadowBlur = o1.shadowBlur; + o2.shadowColor = o1.shadowColor; + o2.shadowOffsetX = o1.shadowOffsetX; + o2.shadowOffsetY = o1.shadowOffsetY; + o2.strokeStyle = o1.strokeStyle; + } + + function processStyle(styleString) { + var str, alpha = 1; + + styleString = String(styleString); + if (styleString.substring(0, 3) == "rgb") { + var start = styleString.indexOf("(", 3); + var end = styleString.indexOf(")", start + 1); + var guts = styleString.substring(start + 1, end).split(","); + + str = "#"; + for (var i = 0; i < 3; i++) { + str += dec2hex[parseInt(guts[i])]; + } + + if ((guts.length == 4) && (styleString.substr(3, 1) == "a")) { + alpha = guts[3]; + } + } else { + str = styleString; + } + + return [str, alpha]; + } + + function processLineCap(lineCap) { + switch (lineCap) { + case "butt": + return "flat"; + case "round": + return "round"; + case "square": + default: + return "square"; + } + } + + /** + * This class implements CanvasRenderingContext2D interface as described by + * the WHATWG. + * @param {HTMLElement} surfaceElement The element that the 2D context should + * be associated with + */ + function CanvasRenderingContext2D_(surfaceElement) { + this.m_ = createMatrixIdentity(); + + this.mStack_ = []; + this.aStack_ = []; + this.currentPath_ = []; + + // Canvas context properties + this.strokeStyle = "#000"; + this.fillStyle = "#ccc"; + + this.lineWidth = 1; + this.lineJoin = "miter"; + this.lineCap = "butt"; + this.miterLimit = 10; + this.globalAlpha = 1; + + var el = document.createElement('div'); + el.style.width = surfaceElement.clientWidth + 'px'; + el.style.height = surfaceElement.clientHeight + 'px'; + el.style.overflow = 'hidden'; + el.style.position = 'absolute'; + surfaceElement.appendChild(el); + + this.element_ = el; + this.arcScaleX_ = 1; + this.arcScaleY_ = 1; + }; + + var contextPrototype = CanvasRenderingContext2D_.prototype; + contextPrototype.clearRect = function() { + this.element_.innerHTML = ""; + this.currentPath_ = []; + }; + + contextPrototype.beginPath = function() { + // TODO: Branch current matrix so that save/restore has no effect + // as per safari docs. + + this.currentPath_ = []; + }; + + contextPrototype.moveTo = function(aX, aY) { + this.currentPath_.push({type: "moveTo", x: aX, y: aY}); + }; + + contextPrototype.lineTo = function(aX, aY) { + this.currentPath_.push({type: "lineTo", x: aX, y: aY}); + }; + + contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, + aCP2x, aCP2y, + aX, aY) { + this.currentPath_.push({type: "bezierCurveTo", + cp1x: aCP1x, + cp1y: aCP1y, + cp2x: aCP2x, + cp2y: aCP2y, + x: aX, + y: aY}); + }; + + contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { + // VML's qb produces different output to Firefox's + // FF's behaviour seems to have changed in 1.5.0.1, check this + this.bezierCurveTo(aCPx, aCPy, aCPx, aCPy, aX, aY); + }; + + contextPrototype.arc = function(aX, aY, aRadius, + aStartAngle, aEndAngle, aClockwise) { + aRadius *= 10; + var arcType = aClockwise ? "at" : "wa"; + + var xStart = aX + (mc(aStartAngle) * aRadius) - 5; + var yStart = aY + (ms(aStartAngle) * aRadius) - 5; + + var xEnd = aX + (mc(aEndAngle) * aRadius) - 5; + var yEnd = aY + (ms(aEndAngle) * aRadius) - 5; + + this.currentPath_.push({type: arcType, + x: aX, + y: aY, + radius: aRadius, + xStart: xStart, + yStart: yStart, + xEnd: xEnd, + yEnd: yEnd}); + + }; + + contextPrototype.rect = function(aX, aY, aWidth, aHeight) { + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + }; + + contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { + // Will destroy any existing path (same as FF behaviour) + this.beginPath(); + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.stroke(); + }; + + contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { + // Will destroy any existing path (same as FF behaviour) + this.beginPath(); + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.fill(); + }; + + contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { + var gradient = new CanvasGradient_("gradient"); + return gradient; + }; + + contextPrototype.createRadialGradient = function(aX0, aY0, + aR0, aX1, + aY1, aR1) { + var gradient = new CanvasGradient_("gradientradial"); + gradient.radius1_ = aR0; + gradient.radius2_ = aR1; + gradient.focus_.x = aX0; + gradient.focus_.y = aY0; + return gradient; + }; + + contextPrototype.drawImage = function (image, var_args) { + var dx, dy, dw, dh, sx, sy, sw, sh; + var w = image.width; + var h = image.height; + + if (arguments.length == 3) { + dx = arguments[1]; + dy = arguments[2]; + sx = sy = 0; + sw = dw = w; + sh = dh = h; + } else if (arguments.length == 5) { + dx = arguments[1]; + dy = arguments[2]; + dw = arguments[3]; + dh = arguments[4]; + sx = sy = 0; + sw = w; + sh = h; + } else if (arguments.length == 9) { + sx = arguments[1]; + sy = arguments[2]; + sw = arguments[3]; + sh = arguments[4]; + dx = arguments[5]; + dy = arguments[6]; + dw = arguments[7]; + dh = arguments[8]; + } else { + throw "Invalid number of arguments"; + } + + var d = this.getCoords_(dx, dy); + + var w2 = (sw / 2); + var h2 = (sh / 2); + + var vmlStr = []; + + // For some reason that I've now forgotten, using divs didn't work + vmlStr.push(' ' , + '', + ''); + + this.element_.insertAdjacentHTML("BeforeEnd", + vmlStr.join("")); + }; + + contextPrototype.stroke = function(aFill) { + var lineStr = []; + var lineOpen = false; + var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); + var color = a[0]; + var opacity = a[1] * this.globalAlpha; + + lineStr.push(' max.x) { + max.x = c.x; + } + if (min.y == null || c.y < min.y) { + min.y = c.y; + } + if (max.y == null || c.y > max.y) { + max.y = c.y; + } + } + } + lineStr.push(' ">'); + + if (typeof this.fillStyle == "object") { + var focus = {x: "50%", y: "50%"}; + var width = (max.x - min.x); + var height = (max.y - min.y); + var dimension = (width > height) ? width : height; + + focus.x = mr((this.fillStyle.focus_.x / width) * 100 + 50) + "%"; + focus.y = mr((this.fillStyle.focus_.y / height) * 100 + 50) + "%"; + + var colors = []; + + // inside radius (%) + if (this.fillStyle.type_ == "gradientradial") { + var inside = (this.fillStyle.radius1_ / dimension * 100); + + // percentage that outside radius exceeds inside radius + var expansion = (this.fillStyle.radius2_ / dimension * 100) - inside; + } else { + var inside = 0; + var expansion = 100; + } + + var insidecolor = {offset: null, color: null}; + var outsidecolor = {offset: null, color: null}; + + // We need to sort 'colors' by percentage, from 0 > 100 otherwise ie + // won't interpret it correctly + this.fillStyle.colors_.sort(function (cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + for (var i = 0; i < this.fillStyle.colors_.length; i++) { + var fs = this.fillStyle.colors_[i]; + + colors.push( (fs.offset * expansion) + inside, "% ", fs.color, ","); + + if (fs.offset > insidecolor.offset || insidecolor.offset == null) { + insidecolor.offset = fs.offset; + insidecolor.color = fs.color; + } + + if (fs.offset < outsidecolor.offset || outsidecolor.offset == null) { + outsidecolor.offset = fs.offset; + outsidecolor.color = fs.color; + } + } + colors.pop(); + + lineStr.push(''); + } else if (aFill) { + lineStr.push(''); + } else { + lineStr.push( + '' + ); + } + + lineStr.push(""); + + this.element_.insertAdjacentHTML("beforeEnd", lineStr.join("")); + + this.currentPath_ = []; + }; + + contextPrototype.fill = function() { + this.stroke(true); + } + + contextPrototype.closePath = function() { + this.currentPath_.push({type: "close"}); + }; + + /** + * @private + */ + contextPrototype.getCoords_ = function(aX, aY) { + return { + x: 10 * (aX * this.m_[0][0] + aY * this.m_[1][0] + this.m_[2][0]) - 5, + y: 10 * (aX * this.m_[0][1] + aY * this.m_[1][1] + this.m_[2][1]) - 5 + } + }; + + contextPrototype.save = function() { + var o = {}; + copyState(this, o); + this.aStack_.push(o); + this.mStack_.push(this.m_); + this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); + }; + + contextPrototype.restore = function() { + copyState(this.aStack_.pop(), this); + this.m_ = this.mStack_.pop(); + }; + + contextPrototype.translate = function(aX, aY) { + var m1 = [ + [1, 0, 0], + [0, 1, 0], + [aX, aY, 1] + ]; + + this.m_ = matrixMultiply(m1, this.m_); + }; + + contextPrototype.rotate = function(aRot) { + var c = mc(aRot); + var s = ms(aRot); + + var m1 = [ + [c, s, 0], + [-s, c, 0], + [0, 0, 1] + ]; + + this.m_ = matrixMultiply(m1, this.m_); + }; + + contextPrototype.scale = function(aX, aY) { + this.arcScaleX_ *= aX; + this.arcScaleY_ *= aY; + var m1 = [ + [aX, 0, 0], + [0, aY, 0], + [0, 0, 1] + ]; + + this.m_ = matrixMultiply(m1, this.m_); + }; + + /******** STUBS ********/ + contextPrototype.clip = function() { + // TODO: Implement + }; + + contextPrototype.arcTo = function() { + // TODO: Implement + }; + + contextPrototype.createPattern = function() { + return new CanvasPattern_; + }; + + // Gradient / Pattern Stubs + function CanvasGradient_(aType) { + this.type_ = aType; + this.radius1_ = 0; + this.radius2_ = 0; + this.colors_ = []; + this.focus_ = {x: 0, y: 0}; + } + + CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { + aColor = processStyle(aColor); + this.colors_.push({offset: 1-aOffset, color: aColor}); + }; + + function CanvasPattern_() {} + + // set up externs + G_vmlCanvasManager = G_vmlCanvasManager_; + CanvasRenderingContext2D = CanvasRenderingContext2D_; + CanvasGradient = CanvasGradient_; + CanvasPattern = CanvasPattern_; + +})(); + +} // if diff --git a/plotkit_v091/README b/plotkit_v091/README new file mode 100644 index 0000000..7e77bac --- /dev/null +++ b/plotkit_v091/README @@ -0,0 +1 @@ +For more information, go to http://www.liquidx.net/plotkit/. diff --git a/plotkit_v091/doc/MochiKitAdditions.html b/plotkit_v091/doc/MochiKitAdditions.html new file mode 100644 index 0000000..d21b157 --- /dev/null +++ b/plotkit_v091/doc/MochiKitAdditions.html @@ -0,0 +1,2 @@ +.. title: MochiKit Additions + diff --git a/plotkit_v091/doc/MochiKitAdditions.txt b/plotkit_v091/doc/MochiKitAdditions.txt new file mode 100644 index 0000000..d21b157 --- /dev/null +++ b/plotkit_v091/doc/MochiKitAdditions.txt @@ -0,0 +1,2 @@ +.. title: MochiKit Additions + diff --git a/plotkit_v091/doc/PlotKit.Base.html b/plotkit_v091/doc/PlotKit.Base.html new file mode 100644 index 0000000..3cb0f7c --- /dev/null +++ b/plotkit_v091/doc/PlotKit.Base.html @@ -0,0 +1,302 @@ + + + + + PlotKit.Base | liquidx + + + + + + + + + + + + + + + + +
    +
    + +

    PlotKit Home | >> +

    + +

    PlotKit Base

    +

    PlotKit Base contains a number of simple functions that are needed for the rest of the PlotKit libraries. +

    + +

    PlotKit.Base Functions

    +
      +
    • + collapse() +
    • +
    +

    Given an array, it will collapse all the values from the passed array into one big array. +

    +

    [[1,2], [3,4], [5,6]] --> [1, 2, 3, 4, 5, 6] +

    +
      +
    • + findPosX(element) +
    • +
    +

    Returns the X value of the element relative to the document in a browser independent way. +

    +
      +
    • + findPosY(element) +
    • +
    +

    Returns the Y value of the element relative to the document in a browser independent way. +

    +
      +
    • + palette(baseColor, fromLevel = -0.2, toLevel = 0.2, increment = 0.1) +
    • +
    +

    Takes in a base colour and generates a palette of colours based on the intensive levels. +

    +
      +
    • + roundInterval(value, precision) +
    • +
    +

    Rounds a number to a specified precision. TODO: make more robust +

    +
      +
    • + uniq(array) +
    • +
    +

    Acts like the UNIX uniq, takes a sorted array and returns a new array that only contains uniq elements. +

    +
      +
    • + isFuncLike(obj) (PlotKit 0.9+) +
    • +
    +

    Returns true if it is of type function. +

    +
      +
    • + usingPrototype() (PlotKit 0.9+) +
    • +
    +

    Checks whether the javascript runtime is polluted by prototype.js +

    +
      +
    • + items(lst) (PlotKit 0.9+) +
    • +
    +

    A version of MochiKit.Base.items() that is aware of prototype.js +

    +
      +
    • + keys(lst) (PlotKit 0.9+) +
    • +
    +

    A version of MochiKit.Base.keys() that is aware of prototype.js +

    +
      +
    • + map(fn, lst) (PlotKit 0.9+) +
    • +
    +

    A version of MochiKit.Base.map() that is aware of prototype.js +

    + +

    Preset Styles

    + +

    Color Schemes

    +

    There are some colour schemes, which are an array of + MochiKit.Color.Colors. +

    +
      +
    • + colorScheme() +
    • +
    +

    A default colour scheme that consists of red, orange, yellow, green, cyan, blue, purple and magenta. +

    +
      +
    • + baseDarkPrimaryColors() +
    • +
    +

    A set of five dark colours. +

    +
      +
    • + basePrimaryColors() +
    • +
    +

    A set of five bright primary colours. +

    +
      +
    • + baseBlueColors() +
    • +
    +

    Three colour set that have a nice professional blue hue. +

    + +

    Office Style

    +

    These are base styles that were inspired by charts in Office 12. The + color schemes are fairly similar to those found in screenshots of + charts available online. +

    +
      +
    • + officeBaseStyle +
    • +
    +

    Contains the basic style independent of colours. +

    +
      +
    • + officeBlue() +
    • +
    +

    Blue colors: bluecolors +

    +
      +
    • + officeRed() +
    • +
    +

    Red colors: redcolors +

    +
      +
    • + officeGreen() +
    • +
    +

    Green colors: greencolors +

    +
      +
    • + officePurple() +
    • +
    +

    Purple colors: purplecolors +

    +
      +
    • + officeCyan() +
    • +
    +

    Cyan colors: cyancolors +

    +
      +
    • + officeOrange() +
    • +
    +

    Orange colors: orangecolors +

    +
      +
    • + officeBlack() +
    • +
    +

    Black colors: blackcolors +

    + +

    Usage

    +

    var layout = PlotKit.Layout("bar", officeOrange()); +

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.Base.txt b/plotkit_v091/doc/PlotKit.Base.txt new file mode 100644 index 0000000..c0d8c3a --- /dev/null +++ b/plotkit_v091/doc/PlotKit.Base.txt @@ -0,0 +1,139 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block headers %} + +{% endblock %} +{% block title %}PlotKit.Base{% endblock %} + +{% block content %} +
    +{% filter markdown %} +[PlotKit Home](PlotKit.html) | [>>](PlotKit.Layout.html) + +PlotKit Base +============ + +PlotKit Base contains a number of simple functions that are needed for the rest of the PlotKit libraries. + +PlotKit.Base Functions +---------------------- + +* ``collapse()`` + + Given an array, it will collapse all the values from the passed array into one big array. + + ``[[1,2], [3,4], [5,6]] --> [1, 2, 3, 4, 5, 6]`` + +* ``findPosX(element)`` + + Returns the X value of the element relative to the document in a browser independent way. + +* ``findPosY(element)`` + + Returns the Y value of the element relative to the document in a browser independent way. + +* ``palette(baseColor, fromLevel = -0.2, toLevel = 0.2, increment = 0.1)`` + + Takes in a base colour and generates a palette of colours based on the intensive levels. + +* ``roundInterval(value, precision)`` + + Rounds a number to a specified precision. __TODO: make more robust__ + +* ``uniq(array)`` + + Acts like the UNIX uniq, takes a sorted array and returns a new array that only contains uniq elements. + +* ``isFuncLike(obj)`` (PlotKit 0.9+) + + Returns true if it is of type ``function``. + +* ``usingPrototype()`` (PlotKit 0.9+) + + Checks whether the javascript runtime is polluted by prototype.js + +* ``items(lst)`` (PlotKit 0.9+) + + A version of ``MochiKit.Base.items()`` that is aware of prototype.js + +* ``keys(lst)`` (PlotKit 0.9+) + + A version of ``MochiKit.Base.keys()`` that is aware of prototype.js + +* ``map(fn, lst)`` (PlotKit 0.9+) + + A version of ``MochiKit.Base.map()`` that is aware of prototype.js + +Preset Styles +============= + +Color Schemes +------------- + +There are some colour schemes, which are an array of +MochiKit.Color.Colors. + +* ``colorScheme()`` + +A default colour scheme that consists of red, orange, yellow, green, cyan, blue, purple and magenta. + +* ``baseDarkPrimaryColors()`` + +A set of five dark colours. + +* ``basePrimaryColors()`` + +A set of five bright primary colours. + +* ``baseBlueColors()`` + +Three colour set that have a nice professional blue hue. + +Office Style +------------ + +These are base styles that were inspired by charts in Office 12. The +color schemes are fairly similar to those found in screenshots of +charts available online. + +* ``officeBaseStyle`` + + Contains the basic style independent of colours. + +* ``officeBlue()`` + + Blue colors: ![bluecolors](blue.png) + +* ``officeRed()`` + + Red colors: ![redcolors](red.png) + +* ``officeGreen()`` + + Green colors: ![greencolors](green.png) + +* ``officePurple()`` + + Purple colors: ![purplecolors](purple.png) + +* ``officeCyan()`` + + Cyan colors: ![cyancolors](cyan.png) + +* ``officeOrange()`` + + Orange colors: ![orangecolors](orange.png) + +* ``officeBlack()`` + + Black colors: ![blackcolors](black.png) + +Usage +----- + + ``var layout = PlotKit.Layout("bar", officeOrange());`` + +{% endfilter %} +
    +{% endblock %} \ No newline at end of file diff --git a/plotkit_v091/doc/PlotKit.Canvas.html b/plotkit_v091/doc/PlotKit.Canvas.html new file mode 100644 index 0000000..4689952 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.Canvas.html @@ -0,0 +1,172 @@ + + + + + PlotKit.Canvas | liquidx + + + + + + + + + + + + + + + + +
    +
    + +

    PlotKit Home | << | >> +

    + +

    PlotKit Canvas

    +

    This contains the CanvasRenderer, the default renderer and most well supported one used in PlotKit. +

    +

    It supports Safari 2, Firefox 1.5, Opera 9 and IE 6. Note that for IE6 + support, you will need iecanvas.htc which is included with PlotKit. +

    +

    Please see the Canvas/SVG Browser Support Status for bugs + with the Canvas implementation on different browsers. +

    + +

    PlotKit Canvas Extra Options

    +

    In addition to the options outlined in PlotKit.Renderer, here are additional options that the CanvasRenderer supports. +

    + + + + + + + + + + + + +
    Option nameDescriptionTypeDefault
    IECanvasHTCPath relative to the HTML document of the iecanvas.htc file.stringiecanvas.htc
    + + +

    PlotKit Canvas Example

    +
    var options = {
    +    "drawsBackground": true,
    +    "drawYAxis": false,
    +    "IECanvasHTC": "contrib/iecanvas.htc"
    +};
    +
    +var layout = new Layout("bar", {});
    +layout.addDataset("squares", [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16]]);
    +layout.evaluate()
    +var renderer = new CanvasRenderer($('canvas'), layout, options);
    +layout.render();
    +
    +

    PlotKit Canvas Events/Signals

    +

    There is preliminary support for events in the CanvasRenderer. If enableEvents is set true in the options, you can hook into the onmousemove, onclick, onmouseover and onmouseout events via the MochiKit.Signal.connect. Note that you must have included MochiKit/Signal.js before instantiating the CanvasRenderer +

    + +

    PlotKit Canvas Notes

    + +

    IE Support

    +

    IE Support is done thanks to webfx's great iecanvas.htc which emulates + part of the WHATWG canvas specification. Note that alpha values and + clear() does not work in IE. +

    +

    Remember that iecanvas.htc must reside on the same domain as the + HTML page itself. +

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.Canvas.txt b/plotkit_v091/doc/PlotKit.Canvas.txt new file mode 100644 index 0000000..c1e383c --- /dev/null +++ b/plotkit_v091/doc/PlotKit.Canvas.txt @@ -0,0 +1,81 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block headers %} + +{% endblock %} +{% block title %}PlotKit.Canvas{% endblock %} + +{% block content %} +
    +{% filter markdown %} +[PlotKit Home](PlotKit.html) | [<<](PlotKit.Renderer.html) | [>>](PlotKit.SVG.html) + +PlotKit Canvas +============== + +This contains the CanvasRenderer, the default renderer and most well supported one used in PlotKit. + +It supports Safari 2, Firefox 1.5, Opera 9 and IE 6. Note that for IE6 +support, you will need iecanvas.htc which is included with PlotKit. + +Please see the [Canvas/SVG Browser Support Status][Browser] for bugs +with the Canvas implementation on different browsers. + +PlotKit Canvas Extra Options +---------------------------- + +In addition to the options outlined in [PlotKit.Renderer][], here are additional options that the CanvasRenderer supports. + + + + + + + + + + + + + +
    Option nameDescriptionTypeDefault
    IECanvasHTCPath relative to the HTML document of the iecanvas.htc file.stringiecanvas.htc
    + +PlotKit Canvas Example +---------------------- + + var options = { + "drawsBackground": true, + "drawYAxis": false, + "IECanvasHTC": "contrib/iecanvas.htc" + }; + + var layout = new Layout("bar", {}); + layout.addDataset("squares", [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16]]); + layout.evaluate() + var renderer = new CanvasRenderer($('canvas'), layout, options); + layout.render(); + +PlotKit Canvas Events/Signals +----------------------------- + +There is preliminary support for events in the CanvasRenderer. If ``enableEvents`` is set ``true`` in the options, you can hook into the ``onmousemove``, ``onclick``, ``onmouseover`` and ``onmouseout`` events via the MochiKit.Signal.connect. Note that you must have included MochiKit/Signal.js before instantiating the CanvasRenderer + +PlotKit Canvas Notes +-------------------- + +### IE Support + +IE Support is done thanks to webfx's great iecanvas.htc which emulates +part of the WHATWG canvas specification. Note that alpha values and +clear() does not work in IE. + +Remember that iecanvas.htc __must__ reside on the same domain as the +HTML page itself. + +[PlotKit.Renderer]: PlotKit.Renderer.html +[Browser]: SVGCanvasCompat.html + +{% endfilter %} +
    +{% endblock %} \ No newline at end of file diff --git a/plotkit_v091/doc/PlotKit.EasyPlot.html b/plotkit_v091/doc/PlotKit.EasyPlot.html new file mode 100644 index 0000000..a9a1549 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.EasyPlot.html @@ -0,0 +1,155 @@ + + + + + PlotKit.Canvas | liquidx + + + + + + + + + + + + + + + + +
    +
    + +

    PlotKit Home | << +

    + +

    PlotKit EasyPlot

    +

    EasyPlot is a wrapper around the various PlotKit classes to allow you to get a chart plotted as quick as possible with as little code as possible. Using EasyPlot, you will get a chart started with just a single line. +

    + +

    Constructor

    +

    PlotKit.EasyPlot(style, options, divElement, datasourceArray) +

    +

    EasyPlot object will automatically choose the supported render method, currently Canvas or SVG in that order, and render the datasources given in datasourceArray. +

    + +

    Arguments:

    +
      +
    • + style may be line, bar or pie. +
    • + +
    • + options is an associative dictionary that is the combined options of both Layout and Renderer. +
    • + +
    • + divElement is the container that the chart should be rendered in. It is best that the width and height attribute is set in the DIV element. +
    • + +
    • + datasourceArray is an array of data sources. The elements of the array can either be a two dimensional array given in Plotkit.Layout.addDataset or it can be a string that points to the relative URL of a comma separated data file. +
    • +
    + +

    EasyPlot Example

    +
    <div id="example" style="margin: 0 auto 0 auto;" width="400" height="400"></div>
    +
    +<script type="text/javascript">
    +var data = [[0,0], [1,2], [2,3], [3, 7], [4, 8], [5, 6]];
    +var plotter = EasyPlot("line", {}, $("example"), [data, "sample.txt"]);
    +</script>
    +

    In this example, two datasets are passed, one defined as a 2D array and another which is a comma separated text file (CSV) at the location "sample.txt". A demonstration of this is found in the QuickStartEasy example. +

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.EasyPlot.txt b/plotkit_v091/doc/PlotKit.EasyPlot.txt new file mode 100644 index 0000000..b23bbe7 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.EasyPlot.txt @@ -0,0 +1,50 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block headers %} + +{% endblock %} +{% block title %}PlotKit.Canvas{% endblock %} + +{% block content %} +
    +{% filter markdown %} +[PlotKit Home](PlotKit.html) | [<<](PlotKit.SweetSVG.html) + +PlotKit EasyPlot +================ + +EasyPlot is a wrapper around the various PlotKit classes to allow you to get a chart plotted as quick as possible with as little code as possible. Using EasyPlot, you will get a chart started with just a single line. + +Constructor +----------- +``PlotKit.EasyPlot(style, options, divElement, datasourceArray)`` + +EasyPlot object will automatically choose the supported render method, currently Canvas or SVG in that order, and render the datasources given in ``datasourceArray``. + +### Arguments: + +* ``style`` may be ``line``, ``bar`` or ``pie``. +* ``options`` is an associative dictionary that is the combined options of both ``Layout`` and ``Renderer``. +* ``divElement`` is the container that the chart should be rendered in. It is best that the ``width`` and ``height`` attribute is set in the ``DIV`` element. +* ``datasourceArray`` is an array of data sources. The elements of the array can either be a two dimensional array given in ``Plotkit.Layout.addDataset`` or it can be a string that points to the relative URL of a comma separated data file. + +EasyPlot Example +---------------- + +
    + + + + +In this example, two datasets are passed, one defined as a 2D array and another which is a comma separated text file (CSV) at the location "sample.txt". A demonstration of this is found in the [QuickStartEasy][] example. + + +[QuickStartEasy]: http://media.liquidx.net/js/plotkit-tests/quickstart-easy.html + +{% endfilter %} +
    +{% endblock %} \ No newline at end of file diff --git a/plotkit_v091/doc/PlotKit.Layout.html b/plotkit_v091/doc/PlotKit.Layout.html new file mode 100644 index 0000000..72e99cf --- /dev/null +++ b/plotkit_v091/doc/PlotKit.Layout.html @@ -0,0 +1,428 @@ + + + + + PlotKit.Layout | liquidx + + + + + + + + + + + + + + + + +
    +
    + +

    PlotKit Home | << | >> +

    + +

    PlotKit Layout

    +

    PlotKit Layout is the core of the plotting engine. It deals exclusively with laying objects out on a virtual canvas that has the dimension of 1.0 x 1.0. +

    +

    The layout engine abstracts away all the complex layout problems with plotting charts and presents a list of objects that need to rendered rather than mixing this with the rendering logic. +

    +

    PlotKit Layout also is responsible for simple chart state querying so renderers can implement basic event support for objects on the canvas. +

    + +

    Constructor

    +

    new Layout(style, options); +

    +

    Layout takes the following arguments: +

    +

    style which can be bar, line or pie which represnts the style of the graph that is desired. +

    +

    options is a dictionary/associative array of layout options. Unrecognised keys are ignored. The following options are supported: +

    + +

    Layout Options

    + +

    Bar and Line Chart layout options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Option nameDescriptionTypeDefault
    barWidthFillFractionAmount of space the total amount of bars should consume per X value.Real number0.75
    barOrientationOrientation of a bar chart. (PlotKit 0.9+ only)String ("vertical", "horizontal")vertical
    xAxisMinimum and Maximum values on the X axis.Array of 2 Real numbers. (eg. [0.0, 10.0])null
    xNumberOfTicksUsed when automatically calculating axis ticks. This denotes the number of ticks there should be in the graph.integer10
    xOriginIsZeroShould graph have X axis origin at 0booleantrue
    xTickPrecisionThe number of decimal places we should round to for tick values.integer1
    xTicksX values at which ticks should be drawn. Automatically calculated if not defined using the parameters `xNumberOfTicks` and ``xTickPrecision``.Array of {label: "somelabel", v:value}.null
    yAxisMinimum and Maximum values on the Y axis.Array of 2 Real numbers. (eg. [0.0, 10.0])null
    yNumberOfTicksUsed when automatically calculating axis ticks. This denotes the number of ticks there should be in the graph.integer5
    yOriginIsZeroShould graph have Y axis origin at 0true
    yTickPrecisionThe number of decimal places we should round to for tick values.integer1
    yTicksY values at which ticks should be drawn. Automatically calculated if not defined using the parameters ``yNumberOfTicks`` and ``yTickPrecision``.Array of {label: "somelabel", v:value}.null
    + + +

    Pie Chart Layout Options

    + + + + + + + + + + + + +
    Option nameDescriptionTypeDefault
    pieRadiusRadius of the circle to be drawn.Real number0.4
    + + +

    Layout Properties

    +

    There are some properties you can access, either because you are using a layout inside a renderer or if you would like additional information. Under normal operations, you will not need to, or should modify these parameters. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    styleStringThis denotes the type of chart this layout is using. Valid values are ``bar``, ``line`` or ``pie``. Renderers will use this to determine which parameter (``bars``, ``points`` or ``slices``) to access in order to get draw the chart.
    barsArray of Bar.This is a list of rectangles with values that the renderer should plot. This will only be valid after ``evaluate()`` has run. The properties of ``bar`` is described here. This is only valid if style is ``bar``. This array is sorted by dataset and then x-values.
    pointsArray of Point.This is a list of points with values that the renderer should plot. This will only be valid after ``evaluate()`` has run. The properties of ``bar`` is described here. This is only valid if style is ``line``. This array is sorted by dataset and then x-values.
    slicesArray of Slice.This is a list of pie slices with values that the renderer should plot. This will only be valid after ``evaluate()`` has run. The properties of ``bar`` is described here. This is only valid if style is ``pie``.
    xticksArray of Tick.For style in ``bar`` or ``line``, these are the ticks on the X axis. A ``tick`` is represented as a two element array with the first element representing the x position of the tick and the second element representing the string value of the label at that position.
    yticksArray of Tick.For style in ``bar`` or ``line``, these are the ticks on the Y axis. A ``tick`` is represented as a two element array with the first element representing the y position of the tick and the second element representing the string value of the label at that position.
    datasetsAssociative Array of datasetsThis should normally only be used to find the number of datasets by performing ``keys(layout.datasets)``. If you are looking at this in a renderer, then the layout engine needs to be extended.
    + + +

    Layout Types

    +

    Here are the definition of the types that you will encounter if you access the properties of the Layout object, specifically bars, points and slices. If you are not writing a renderer, you do not need to know this. +

    + +

    Bar Type

    +

    Represents a bar that the renderer will draw. It contains the following properties. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    x, yfloattop left position of the bar between 0.0 and 1.0.
    w, hfloatwidth and height of the bar from (``x``, ``y``) between 0.0 and 1.0.
    xval, yvalfloatThe actual x value and y value this bar represents.
    namestringName of the dataset which this bar belongs to.
    + + +

    Point Type

    +

    This represents a point on a line chart. +

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    x, yfloattop left position of the point between 0.0 and 1.0.
    xval, yvalfloatThe actual x value and y value this bar represents.
    namestringName of the dataset which this bar belongs to.
    + + +

    Slice Type

    +

    This represents a pie slice in a pie chart. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    fractionfloatThe fractional value this slice represents. This number is between 0.0 and 1.0
    xval, yvalfloatThe x and y values of this slice.
    startAnglefloatThis is the angle of the start of the slice, in radians.
    endAnglefloatThis is the angle of the end of the slice, in radians.
    + + +

    Layout Methods

    +
      +
    • + addDataset(name, values) +
    • +
    +

    Adds a dataset to the layout engine and assigns it with name. values is an array of \[x, y\] values. +

    +
      +
    • + removeDataset(name) +
    • +
    +

    Removes a dataset from the layout engine. In order for the new data to take effect, you must run evaluate(). +

    +
      +
    • + addDatasetFromTable(name, tableElement, xcol = 0, ycol = 1, labelCol = -1) +
    • +
    +

    Handy function to read values off a table. name is the name to give to the dataset just like in addDataset(), tableElement is the table which contains the values. Optionally, the user may specify to extract alternative columns using xcol and ycol. +

    +

    New in 0.9.1: If labelCol is specified to a value greater than -1, it will take the contents of that column as the xTick labels. +

    +
      +
    • + evaluate() +
    • +
    +

    Performs the evaluation of the layout. It is not done automatically, and you must execute this before passing the layout to a renderer. +

    +
      +
    • + hitTest(x, y) +
    • +
    +

    Used by renderers to see if a virtual canvas position corresponds to any data. The return value varies per style. For bar charts, it will return the Bar type if it is a hit, or null if not. For line charts, it will return a value if the point is underneath the highest curve, otherwise null (TODO: expand this or change implementation). For pie charts, it will return the Slice object that is at the point, otherwise null. +

    +

    Note that the specification of this function is subject to change. +

    + +

    Layout Notes

    + +

    Pie Chart Data and Ticks Restrictions

    +

    Note that you can only use one dataset for pie charts. Only the y value of the dataset will be used, but the x value must be unique and set as it will correspond to the xTicks that are given. +

    +

    Labels for pie charts will only use xTicks. +

    + +

    Layout Examples

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.Layout.txt b/plotkit_v091/doc/PlotKit.Layout.txt new file mode 100644 index 0000000..ec692bb --- /dev/null +++ b/plotkit_v091/doc/PlotKit.Layout.txt @@ -0,0 +1,330 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block headers %} + +{% endblock %} +{% block title %}PlotKit.Layout{% endblock %} + +{% block content %} +
    +{% filter markdown %} +[PlotKit Home](PlotKit.html) | [<<](PlotKit.Base.html) | [>>](PlotKit.Renderer.html) + +PlotKit Layout +============== + +PlotKit Layout is the core of the plotting engine. It deals exclusively with laying objects out on a virtual canvas that has the dimension of 1.0 x 1.0. + +The layout engine abstracts away all the complex layout problems with plotting charts and presents a list of objects that need to rendered rather than mixing this with the rendering logic. + +PlotKit Layout also is responsible for simple chart state querying so renderers can implement basic event support for objects on the canvas. + +Constructor +=========== + + `new Layout(style, options);` + +Layout takes the following arguments: + +__style__ which can be `bar`, `line` or `pie` which represnts the style of the graph that is desired. + +__options__ is a dictionary/associative array of layout options. Unrecognised keys are ignored. The following options are supported: + +Layout Options +============== + +Bar and Line Chart layout options +--------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Option nameDescriptionTypeDefault
    barWidthFillFractionAmount of space the total amount of bars should consume per X value.Real number0.75
    barOrientationOrientation of a bar chart. (PlotKit 0.9+ only)String ("vertical", "horizontal")vertical
    xAxisMinimum and Maximum values on the X axis.Array of 2 Real numbers. (eg. [0.0, 10.0])null
    xNumberOfTicksUsed when automatically calculating axis ticks. This denotes the number of ticks there should be in the graph.integer10
    xOriginIsZeroShould graph have X axis origin at 0booleantrue
    xTickPrecisionThe number of decimal places we should round to for tick values.integer1
    xTicksX values at which ticks should be drawn. Automatically calculated if not defined using the parameters `xNumberOfTicks` and ``xTickPrecision``.Array of {label: "somelabel", v:value}.null
    yAxisMinimum and Maximum values on the Y axis.Array of 2 Real numbers. (eg. [0.0, 10.0])null
    yNumberOfTicksUsed when automatically calculating axis ticks. This denotes the number of ticks there should be in the graph.integer5
    yOriginIsZeroShould graph have Y axis origin at 0true
    yTickPrecisionThe number of decimal places we should round to for tick values.integer1
    yTicksY values at which ticks should be drawn. Automatically calculated if not defined using the parameters ``yNumberOfTicks`` and ``yTickPrecision``.Array of {label: "somelabel", v:value}.null
    + +Pie Chart Layout Options +------------------------ + + + + + + + + + + + + + +
    Option nameDescriptionTypeDefault
    pieRadiusRadius of the circle to be drawn.Real number0.4
    + +Layout Properties +================= + +There are some properties you can access, either because you are using a layout inside a renderer or if you would like additional information. Under normal operations, you will not need to, or should modify these parameters. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    styleStringThis denotes the type of chart this layout is using. Valid values are ``bar``, ``line`` or ``pie``. Renderers will use this to determine which parameter (``bars``, ``points`` or ``slices``) to access in order to get draw the chart.
    barsArray of Bar.This is a list of rectangles with values that the renderer should plot. This will only be valid after ``evaluate()`` has run. The properties of ``bar`` is described here. This is only valid if style is ``bar``. This array is sorted by dataset and then x-values.
    pointsArray of Point.This is a list of points with values that the renderer should plot. This will only be valid after ``evaluate()`` has run. The properties of ``bar`` is described here. This is only valid if style is ``line``. This array is sorted by dataset and then x-values.
    slicesArray of Slice.This is a list of pie slices with values that the renderer should plot. This will only be valid after ``evaluate()`` has run. The properties of ``bar`` is described here. This is only valid if style is ``pie``.
    xticksArray of Tick.For style in ``bar`` or ``line``, these are the ticks on the X axis. A ``tick`` is represented as a two element array with the first element representing the x position of the tick and the second element representing the string value of the label at that position.
    yticksArray of Tick.For style in ``bar`` or ``line``, these are the ticks on the Y axis. A ``tick`` is represented as a two element array with the first element representing the y position of the tick and the second element representing the string value of the label at that position.
    datasetsAssociative Array of datasetsThis should normally only be used to find the number of datasets by performing ``keys(layout.datasets)``. If you are looking at this in a renderer, then the layout engine needs to be extended.
    + +Layout Types +============ + +Here are the definition of the types that you will encounter if you access the properties of the Layout object, specifically ``bars``, ``points`` and ``slices``. If you are not writing a renderer, you do not need to know this. + +Bar Type +-------- + +Represents a bar that the renderer will draw. It contains the following properties. + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    x, yfloattop left position of the bar between 0.0 and 1.0.
    w, hfloatwidth and height of the bar from (``x``, ``y``) between 0.0 and 1.0.
    xval, yvalfloatThe actual x value and y value this bar represents.
    namestringName of the dataset which this bar belongs to.
    + +Point Type +---------- + +This represents a point on a line chart. + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    x, yfloattop left position of the point between 0.0 and 1.0.
    xval, yvalfloatThe actual x value and y value this bar represents.
    namestringName of the dataset which this bar belongs to.
    + +Slice Type +---------- + +This represents a pie slice in a pie chart. + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    fractionfloatThe fractional value this slice represents. This number is between 0.0 and 1.0
    xval, yvalfloatThe x and y values of this slice.
    startAnglefloatThis is the angle of the start of the slice, in radians.
    endAnglefloatThis is the angle of the end of the slice, in radians.
    + +Layout Methods +============== + +* ``addDataset(name, values)`` + + Adds a dataset to the layout engine and assigns it with ``name``. ``values`` is an array of ``\[x, y\]`` values. + +* ``removeDataset(name)`` + + Removes a dataset from the layout engine. In order for the new data to take effect, you must run ``evaluate()``. + +* ``addDatasetFromTable(name, tableElement, xcol = 0, ycol = 1, labelCol = -1)`` + + Handy function to read values off a table. ``name`` is the name to give to the dataset just like in ``addDataset()``, ``tableElement`` is the table which contains the values. Optionally, the user may specify to extract alternative columns using ``xcol`` and ``ycol``. + + **New in 0.9.1:** If ``labelCol`` is specified to a value greater than -1, it will take the contents of that column as the xTick labels. + +* ``evaluate()`` + + Performs the evaluation of the layout. It is not done automatically, and you __must__ execute this before passing the layout to a renderer. + +* hitTest(x, y) + + Used by renderers to see if a virtual canvas position corresponds to any data. The return value varies per style. For ``bar`` charts, it will return the Bar type if it is a hit, or null if not. For ``line`` charts, it will return a value if the point is underneath the highest curve, otherwise null __(TODO: expand this or change implementation)__. For ``pie`` charts, it will return the Slice object that is at the point, otherwise null. + + __Note that the specification of this function is subject to change__. + +Layout Notes +============ + +Pie Chart Data and Ticks Restrictions +------------------------------------- + +Note that you can only use one dataset for pie charts. Only the y value of the dataset will be used, but the x value must be unique and set as it will correspond to the xTicks that are given. + +Labels for pie charts will only use xTicks. + +Layout Examples +=============== + +{% endfilter %} +
    +{% endblock %} + + + diff --git a/plotkit_v091/doc/PlotKit.QuickStart.html b/plotkit_v091/doc/PlotKit.QuickStart.html new file mode 100644 index 0000000..20635c6 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.QuickStart.html @@ -0,0 +1,368 @@ + + + + + PlotKit Quick Start | liquidx + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +

    PlotKit Quick Start

    +

    This is just a quick guide on how to get started with PlotKit. If you + want to delve in deeper, be sure to check out the + documentation. +

    + +

    Canvas or SVG

    +

    Before we start, you should know a little about HTML Canvas and SVG + support in the real browser world. For a more indepth coverage, please + check the SVG/Canvas Browser Support Status. +

    +

    Basically, Canvas and SVG have similar support across modern + browsers. Canvas is supported by Opera 9, Safari 2 and Firefox 1.5, + which probably only accounts for 10% of browsers. PlotKit also supports + a degraded Emulated Canvas mode under IE which means you can achieve + nearly 90% browser support using this technology. +

    +

    However, the future is in SVG where Firefox 1.5 and Opera 8 have + support it, and IE6 with the Adobe SVG Viewer (ASV) install means you + get around the same coverage as HTML Canvas. +

    +

    PlotKit plans to support both to maximise compatiblity. Canvas has a + simplier rendering engine, but can do the equivalent to what SVG can + apart from animation. SVG has wider support, but is more complex and + support for key features varies widely across different + implementations. +

    + +

    Graphing with Canvas

    +

    Download the latest PlotKit and MochiKit and extract it on to + your web server and make sure plotkit-0.8/PlotKit and + mochikit/MochiKit is visible. +

    + +

    Preparing the HTML

    +

    Add the script headers for PlotKit to work. +

    +
    <script type="text/javascript" src="/mochikit/MochiKit.js"></script>
    +<script type="text/javascript" src="/plotkit/Base.js"></script>
    +<script type="text/javascript" src="/plotkit/Layout.js"></script>
    +<script type="text/javascript" src="/plotkit/Canvas.js"></script>
    +<script type="text/javascript" src="/plotkit/SweetCanvas.js"></script>
    +

    MochiKit.js is an autoloader for all the elements of MochiKit. You can + reduce the size of it by making your own packed version or just + including the script headers individually. +

    +

    The other four PlotKit javascript files deal with some basic + functionality, the layout engine and two renderers, Canvas and + SweetCanvas. +

    +

    Now we add the <canvas> tag to where we want the graph to + appear. Note PlotKit requires the <canvas> tag is enclosed + inside a

    tags for labels to work. +

    +
     <div><canvas id="graph" height="300" width="300"></canvas></div>
    +

    This will create a blank canvas of 300 by 300 pixels. +

    + +

    Javascript

    +

    There are only two simple steps to draw a chart, first is the create a + layout with our data and second is to create the renderer. So lets + start off with creating the layout. +

    + +

    Layout and Data

    +
    var layout = new PlotKit.Layout("bar", {});
    +layout.addDataset("sqrt", [[0, 0], [1, 1], [2, 1.414], [3, 1.73], [4, 2]]);
    +layout.evaluate();
    +

    There, it is that simple. Lets explain what each line is doing: +

    +
      +
    1. var layout = new PlotKit.Layout("bar", {}); +

      +

      We create a new layout object, and tell it that we want a bar chart in the first parameter. The second parameter allows us to pass additional options, which we will go on to later. It can be left null, or in this case just an empty array. +

      + +
    2. + +
    3. layout.addDataset("sqrt", [[0, 0], [1, 1]...) +

      +

      This will add a new dataset to the layout. You can add multiple datasets by specifying a different name in the first parameter for each dataset. The dataset consists of an array of (x, y) values. These must be numeric, either floating point or integers. +

      +

      Note that PlotKit does not deal with negative numbers at the moment. +

      + +
    4. + +
    5. layout.evaluate(); +

      +

      This will be the last command you make on the layout before passing it to the renderer. This will tell the layout to calculate the layout of the chart so the renderer can draw it. It is an expensive operation, so do not call it frequently, only unless the data or options have been changed. +

      + +
    6. +
    + +

    Renderer

    +
     var canvas = MochiKit.DOM.getElement("graph");
    + var plotter = new PlotKit.SweetCanvasRenderer(canvas, layout, {});
    + plotter.render();
    +
      +
    1. var canvas = MochiKit.DOM.getElement("graph"); +

      +

      This line will get the HTML element we defined earlier. +

      + +
    2. + +
    3. var plotter = new PlotKit.SweetCanvasRenderer(canvas, layout, {}); +

      +

      This will create the renderer to work on the object passed, and also with the data in the layout we created earlier. Again, the third parameter here is for options to relates to the look of the graph. We will show you some things you can do with this in the following section. +

      + +
    4. + +
    5. plotter.render() +

      +

      This line will render the graph. +

      + +
    6. +
    + +

    Putting it altogether

    +
    function drawGraph() {
    +    var layout = new PlotKit.Layout("bar", {});
    +    layout.addDataset("sqrt", [[0, 0], [1, 1], [2, 1.414], [3, 1.73], [4, 2]]);
    +    layout.evaluate();
    +    var canvas = MochiKit.DOM.getElement("graph");
    +    var plotter = new PlotKit.SweetCanvasRenderer(canvas, layout, {});
    +    plotter.render();
    +}
    +MochiKit.DOM.addLoadEvent(drawGraph);
    +

    This is a sample of what you would use to plot the graph of sqare roots for 0 to 4. Make sure you plot the graph on the load event because the DOM will not be ready if when the Javascript is first loaded. +

    +

    See this in an [HTML example here][example1]. +

    + +

    Additional Options

    +

    We mentioned that both the layout and renderer may take some additional options. In order to take advantage of that, we can use a simple options dictionary to store options for both layout and the renderer, in this way: +

    +
    var options = {
    +   "IECanvasHTC": "/plotkit/iecanvas.htc",
    +   "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),
    +   "padding": {left: 0, right: 0, top: 10, bottom: 30},
    +   "xTicks": [{v:0, label:"zero"}, 
    +          {v:1, label:"one"}, 
    +          {v:2, label:"two"},
    +          {v:3, label:"three"},
    +          {v:4, label:"four"}],
    +   "drawYAxis": false
    +};
    +
    +function drawGraph() {
    +    var layout = new PlotKit.Layout("bar", options);
    +    layout.addDataset("sqrt", [[0, 0], [1, 1], [2, 1.414], [3, 1.73], [4, 2]]);
    +    layout.evaluate();
    +    var canvas = MochiKit.DOM.getElement("graph");
    +    var plotter = new PlotKit.SweetCanvasRenderer(canvas, layout, options);
    +    plotter.render();
    +}
    +MochiKit.DOM.addLoadEvent(drawGraph);
    +

    Here we define some additional options to affect how our graph is rendered. +

    +
      +
    1. + First line defines where the IECanvasHTC behaviour file is so that we can have IE support. +
    2. + +
    3. + Second line defines a new colorScheme to use. Here we are just using another preset color scheme that creates a palette out of the 6th preset base colour. +
    4. + +
    5. + Third line defines some custom labels we would like by giving the mapping from X value to label. +
    6. + +
    7. + Fourth line tells the renderer not to draw the Y axis. +
    8. +
    + +

    Demonstration

    +

    To show you that is how it works, below is the graph defined exactly how it is presented in this quick start guide. On the left is a PNG of what you should expect and on the right is what it actually renders to. +

    + +

    Bar charts

    +
    +
    screenshot of graph
    +
    +
     
    +
    + + +

    Pie Charts

    +
    +
    screenshot of graph
    +
    +
     
    +
    + + +

    Author

    +

    Alastair Tse - Last Updated: 17th March 2006 +

    + + +
    + +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.QuickStart.txt b/plotkit_v091/doc/PlotKit.QuickStart.txt new file mode 100644 index 0000000..44e6593 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.QuickStart.txt @@ -0,0 +1,256 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block title %}PlotKit Quick Start{% endblock %} +{% block headers %} + + + + + + +{% endblock %} + + +{% block content %} +
    +{% filter markdown %} +PlotKit Quick Start +=================== + +This is just a quick guide on how to get started with PlotKit. If you +want to delve in deeper, be sure to check out the +[documentation][docs]. + +Canvas or SVG +============= + +Before we start, you should know a little about HTML Canvas and SVG +support in the real browser world. For a more indepth coverage, please +check the [SVG/Canvas Browser Support Status][Browser]. + +Basically, Canvas and SVG have similar support across modern +browsers. Canvas is supported by Opera 9, Safari 2 and Firefox 1.5, +which probably only accounts for 10% of browsers. PlotKit also supports +a degraded Emulated Canvas mode under IE which means you can achieve +nearly 90% browser support using this technology. + +However, the future is in SVG where Firefox 1.5 and Opera 8 have +support it, and IE6 with the Adobe SVG Viewer (ASV) install means you +get around the same coverage as HTML Canvas. + +PlotKit plans to support both to maximise compatiblity. Canvas has a +simplier rendering engine, but can do the equivalent to what SVG can +apart from animation. SVG has wider support, but is more complex and +support for key features varies widely across different +implementations. + +Graphing with Canvas +==================== + +Download the latest [PlotKit][] and [MochiKit][] and extract it on to +your web server and make sure ``plotkit-0.8/PlotKit`` and +``mochikit/MochiKit`` is visible. + +Preparing the HTML +------------------ + +Add the script headers for PlotKit to work. + + + + + + + +MochiKit.js is an autoloader for all the elements of MochiKit. You can +reduce the size of it by making your own packed version or just +including the script headers individually. + +The other four PlotKit javascript files deal with some basic +functionality, the layout engine and two renderers, Canvas and +SweetCanvas. + +Now we add the ```` tag to where we want the graph to +appear. Note PlotKit __requires__ the ```` tag is enclosed +inside a
    tags for labels to work. + +
    + +This will create a blank canvas of 300 by 300 pixels. + +Javascript +---------- + +There are only two simple steps to draw a chart, first is the create a +layout with our data and second is to create the renderer. So lets +start off with creating the layout. + +### Layout and Data + + var layout = new PlotKit.Layout("bar", {}); + layout.addDataset("sqrt", [[0, 0], [1, 1], [2, 1.414], [3, 1.73], [4, 2]]); + layout.evaluate(); + +There, it is that simple. Lets explain what each line is doing: + +1. ``var layout = new PlotKit.Layout("bar", {});`` + + We create a new layout object, and tell it that we want a bar chart in the first parameter. The second parameter allows us to pass additional options, which we will go on to later. It can be left null, or in this case just an empty array. + +2. ``layout.addDataset("sqrt", [[0, 0], [1, 1]...)`` + + This will add a new dataset to the layout. You can add multiple datasets by specifying a different name in the first parameter for each dataset. The dataset consists of an array of (x, y) values. These must be numeric, either floating point or integers. + + Note that PlotKit does not deal with negative numbers at the moment. + +3. ``layout.evaluate();`` + + This will be the last command you make on the layout before passing it to the renderer. This will tell the layout to calculate the layout of the chart so the renderer can draw it. It is an expensive operation, so do not call it frequently, only unless the data or options have been changed. + +### Renderer + + var canvas = MochiKit.DOM.getElement("graph"); + var plotter = new PlotKit.SweetCanvasRenderer(canvas, layout, {}); + plotter.render(); + +1. ``var canvas = MochiKit.DOM.getElement("graph");`` + + This line will get the HTML element we defined earlier. + +2. ``var plotter = new PlotKit.SweetCanvasRenderer(canvas, layout, {});`` + + This will create the renderer to work on the object passed, and also with the data in the layout we created earlier. Again, the third parameter here is for options to relates to the look of the graph. We will show you some things you can do with this in the following section. + +3. ``plotter.render()`` + + This line will render the graph. + +### Putting it altogether + + function drawGraph() { + var layout = new PlotKit.Layout("bar", {}); + layout.addDataset("sqrt", [[0, 0], [1, 1], [2, 1.414], [3, 1.73], [4, 2]]); + layout.evaluate(); + var canvas = MochiKit.DOM.getElement("graph"); + var plotter = new PlotKit.SweetCanvasRenderer(canvas, layout, {}); + plotter.render(); + } + MochiKit.DOM.addLoadEvent(drawGraph); + +This is a sample of what you would use to plot the graph of sqare roots for 0 to 4. Make sure you plot the graph on the load event because the DOM will not be ready if when the Javascript is first loaded. + +See this in an [HTML example here][example1]. + +### Additional Options + +We mentioned that both the layout and renderer may take some additional options. In order to take advantage of that, we can use a simple options dictionary to store options for both layout and the renderer, in this way: + + var options = { + "IECanvasHTC": "/plotkit/iecanvas.htc", + "colorScheme": PlotKit.Base.palette(PlotKit.Base.baseColors()[0]), + "padding": {left: 0, right: 0, top: 10, bottom: 30}, + "xTicks": [{v:0, label:"zero"}, + {v:1, label:"one"}, + {v:2, label:"two"}, + {v:3, label:"three"}, + {v:4, label:"four"}], + "drawYAxis": false + }; + + function drawGraph() { + var layout = new PlotKit.Layout("bar", options); + layout.addDataset("sqrt", [[0, 0], [1, 1], [2, 1.414], [3, 1.73], [4, 2]]); + layout.evaluate(); + var canvas = MochiKit.DOM.getElement("graph"); + var plotter = new PlotKit.SweetCanvasRenderer(canvas, layout, options); + plotter.render(); + } + MochiKit.DOM.addLoadEvent(drawGraph); + + +Here we define some additional options to affect how our graph is rendered. + +1. First line defines where the ``IECanvasHTC`` behaviour file is so that we can have IE support. +2. Second line defines a new colorScheme to use. Here we are just using another preset color scheme that creates a palette out of the 6th preset base colour. +3. Third line defines some custom labels we would like by giving the mapping from X value to label. +4. Fourth line tells the renderer not to draw the Y axis. + +Demonstration +============= + +To show you that is how it works, below is the graph defined exactly how it is presented in this quick start guide. On the left is a PNG of what you should expect and on the right is what it actually renders to. + +### Bar charts + +
    +
    screenshot of graph
    +
    +
     
    +
    + +### Pie Charts + +
    +
    screenshot of graph
    +
    +
     
    +
    + +Author +====== + +Alastair Tse - Last Updated: 17th March 2006 + +[docs]: PlotKit.html +[Browser]: SVGCanvasCompat.html +[PlotKit]: http://www.liquidx.net/plotkit/ +[MochiKit]: http://www.mochikit.com/ + +{% endfilter %} +
    + +{% endblock %} \ No newline at end of file diff --git a/plotkit_v091/doc/PlotKit.Renderer.html b/plotkit_v091/doc/PlotKit.Renderer.html new file mode 100644 index 0000000..49ad300 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.Renderer.html @@ -0,0 +1,436 @@ + + + + + PlotKit.Renderer | liquidx + + + + + + + + + + + + + + + + +
    +
    + +

    PlotKit Home | << | >> +

    + +

    PlotKit Renderer

    +

    A Renderer is responsible for translating the layout calculated by PlotKit.Layout and draw it on to a HTML Canvas, SVG object or any other way. One way to use the renderer is to allow theming of graphs by tweaking the layout. +

    +

    PlotKit includes some common basic renderers, so you do not need to customise anything if you just plan to change the spacing, colors, fonts, or layout. +

    +

    PlotKit Renderers should follow an informal protocol to allow users to plug and play different renderers. Below is the informal protocol: +

    + +

    PlotKit Renderer Protocol

    +
      +
    • + Constructor: new Renderer(element, layout, options = {}) +
    • +
    +

    element is the element which this renderer will perform on, layout is the PlotKit.Layout object and options is an associative dictionary described below. +

    +
      +
    • + class function: isSupported() +
    • +
    +

    Optional check that returns true if the renderer is supported in the current browser. +

    +
      +
    • + object method: render() +
    • +
    +

    Renders to canvas, can be called multiple times, but clear() must be called between invokations. +

    +
      +
    • + object method: clear() +
    • +
    +

    Clear the canvas. +

    + +

    PlotKit Renderer Options

    +

    To allow some basic flexibility of the output, a renderer should + accept and act on the following options passed in the constructor. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Option nameDescriptionTypeDefault
    backgroundColorcolor to use for backgroundMochiKit.Color.ColorColor.whiteColor()
    colorSchemeColor scheme usedArray of MochiKit.Color.Coloroutput of PlotKit.Base.colorScheme()
    strokeColorColor used stroking. If set to null, the renderer will + attempt to use strokeColorTransformMochiKit.Color.Color or nullnull
    strokeColorTransformName of the method to call to transform Color into stroke color.string (name of a function that accepts no arguments)"asStrokeColor"
    drawBackgroundWhether the background should be drawnbooleantrue
    shouldFillShould fill in area under chartbooleantrue
    shouldStrokeShould stroke the borders of shapes in chartbooleantrue
    strokeWidthWidth of stroke used (if shouldStroke is set)float0.1
    paddingPadding of the graph drawn (excluding labels)Object with properties: top, bottom, left, right.{left: 30, right:20, top: 10, bottom: 10}
    drawYAxisdraw Y Axisbooleantrue
    drawXAxisdraw X Axisbooleantrue
    axisLineColorColor of axes line.MochiKit.Color.ColorColor.blackColor()
    axisLineWidthaxis line widthfloat0.5
    axisTickSizelength or height of a tick on the y and x axis respectively, in pixelsfloat3.0
    axisLabelColorcolor of text label on axis.MochiKit.Color.ColorColor.blackColor()
    axisLabelFontSizeFont size of labels in pixels integer9
    axisLabelWidthWidth of labels on ticks, in pixelsinteger50
    enableEventsEnable events (if supported)booleantrue
    + + +

    Internal Renderer Methods and Style

    +

    The default renderers that are available follow a rough structure. If + you plan to write a new renderer, you should think about using a + similar structure. +

    +

    Also, it is important that you follow an Object Orientated style and + split up the rendering methods as much as logically possible to allow + other developers to extend the work by using a "psuedo subclassing" + method described below. +

    + +

    Subclassing

    +

    PlotKit Renderers should adopt a Javascript subclassing structure to + allow developers/themers to customise certain aspects of the + rendering. Here is an example of what is expected: +

    +
    MyRenderer = function(element, layout, options) {
    +    if (arguments.length  > 0)
    +       this.__init__(element, layout, options);
    +};
    +
    +MyRenderer.prototype.__init__ = function(element, layout, options) {
    +  ....
    +};
    +

    In this case, the default javascript constructor acts only when passed + arguments. MyRenderer.prototype.__init__ is the real + constructor. It is named in similar vein to Python's constructor. +

    +

    For users who would like to subclass, they will need to use the + following snippet of code: +

    +
     MyAlternateRenderer = function(element, layout. options) {
    +   if (arguments.length > 0) 
    +      this.__init__(element, layout, options);
    + };
    + MyAlternateRenderer.prototype = new MyRenderer();
    + MyAlternateRenderer.prototype.constructor = MyAlternateRenderer;
    + MyAlternateRenderer.__super__ = MyRenderer.prototype;
    +
    + MyAlternateRenderer.prototype.__init__ = function(element, layout, options) {
    +     MyAlternateRenderer.__super__.__init__.call(this, element, layout, options);
    + };
    +

    For subclasses, they will need the following magic in order to + initialise their subclass. But after that, you can either override + MyAlternateRenderer.prototype.__init__ with your own + implementation or just leave the superclass to deal with the + constructor. +

    +

    A more thorough example can be found in the PlotKit source for + Canvas.js and SweetCanvas.js respectively. +

    + +

    Internal Renderer Properties

    +

    The bundled renderers are have the following common properties to + allow standard access by all subclasses: +

    +
      +
    • + this.layout +
    • +
    +

    The PlotKit.Layout object passed by the user. +

    +
      +
    • + this.element +
    • +
    +

    The HTML element to use, either a Canvas Element or SVG Element depending + on whether a Canvas Renderer or SVG Renderer is in use. +

    +
      +
    • + this.options +
    • +
    +

    A dictionary of options that are applicable to the rendering style. +

    +
      +
    • + this.xlabels +
    • +
    +

    A list of elements that represent the axis. Should be cleared whenever + clear() is executed. +

    +
      +
    • + this.ylabels +
    • +
    +

    A list of elements that represent the axis. Should be cleared whenever + clear() is executed. +

    + +

    Internal Renderer Methods

    +
      +
    • + _renderBarChart() +
    • +
    +

    Renders only the bars of a bar chart on the element by looking at + this.layout.bars for the bars to render. Will only be called if + this.layout.style == "bars" +

    +
      +
    • + _renderLineChart() +
    • +
    +

    Renders only the lines of a line chart on the element by looking at + this.layout.points for the points to render. Will only be called if + this.layout.style == "line" +

    +
      +
    • + _renderPieChart() +
    • +
    +

    Renders only the slices of the pie in this.layout.slices. + Will only be called if this.layout.style == "pie" +

    +
      +
    • + _renderBarAxis() +
    • +
    +

    Renders the axis for a bar chart by looking at the + this.layout.xticks and this.layout.yticks. +

    +
      +
    • + _renderLineAxis() +
    • +
    +

    Renders the axis for a line chart by looking at the + this.layout.xticks and this.layout.yticks. +

    +
      +
    • + _renderPieAxis() +
    • +
    +

    Renders the labels for a pie chart by looking at + this.layout.xticks only. +

    +
      +
    • + _renderBackground() +
    • +
    +

    Called to render the background of the chart. Should check whether + this.options.drawsBackground is set before proceeding. +

    + +

    Events from the Chart

    +

    There is preliminary support for events from the chart for the Canvas + Renderer but the API is not stablised and subject to change. (TODO). +

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.Renderer.txt b/plotkit_v091/doc/PlotKit.Renderer.txt new file mode 100644 index 0000000..6b58e87 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.Renderer.txt @@ -0,0 +1,299 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block headers %} + +{% endblock %} +{% block title %}PlotKit.Renderer{% endblock %} + +{% block content %} +
    +{% filter markdown %} +[PlotKit Home](PlotKit.html) | [<<](PlotKit.Layout.html) | [>>](PlotKit.Canvas.html) + +PlotKit Renderer +================ + +A Renderer is responsible for translating the layout calculated by PlotKit.Layout and draw it on to a HTML Canvas, SVG object or any other way. One way to use the renderer is to allow theming of graphs by tweaking the layout. + +PlotKit includes some common basic renderers, so you do not need to customise anything if you just plan to change the spacing, colors, fonts, or layout. + +PlotKit Renderers should follow an informal protocol to allow users to plug and play different renderers. Below is the informal protocol: + +PlotKit Renderer Protocol +------------------------- +* Constructor: ``new Renderer(element, layout, options = {})`` + + ``element`` is the element which this renderer will perform on, ``layout`` is the PlotKit.Layout object and ``options`` is an associative dictionary described below. + +* class function: ``isSupported()`` + + Optional check that returns ``true`` if the renderer is supported in the current browser. + +* object method: ``render()`` + + Renders to canvas, can be called multiple times, but ``clear()`` must be called between invokations. + +* object method: ``clear()`` + + Clear the canvas. + +PlotKit Renderer Options +------------------------ +To allow some basic flexibility of the output, a renderer should +accept and act on the following options passed in the constructor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Option nameDescriptionTypeDefault
    backgroundColorcolor to use for backgroundMochiKit.Color.ColorColor.whiteColor()
    colorSchemeColor scheme usedArray of MochiKit.Color.Coloroutput of PlotKit.Base.colorScheme()
    strokeColorColor used stroking. If set to null, the renderer will + attempt to use strokeColorTransformMochiKit.Color.Color or nullnull
    strokeColorTransformName of the method to call to transform Color into stroke color.string (name of a function that accepts no arguments)"asStrokeColor"
    drawBackgroundWhether the background should be drawnbooleantrue
    shouldFillShould fill in area under chartbooleantrue
    shouldStrokeShould stroke the borders of shapes in chartbooleantrue
    strokeWidthWidth of stroke used (if shouldStroke is set)float0.1
    paddingPadding of the graph drawn (excluding labels)Object with properties: top, bottom, left, right.{left: 30, right:20, top: 10, bottom: 10}
    drawYAxisdraw Y Axisbooleantrue
    drawXAxisdraw X Axisbooleantrue
    axisLineColorColor of axes line.MochiKit.Color.ColorColor.blackColor()
    axisLineWidthaxis line widthfloat0.5
    axisTickSizelength or height of a tick on the y and x axis respectively, in pixelsfloat3.0
    axisLabelColorcolor of text label on axis.MochiKit.Color.ColorColor.blackColor()
    axisLabelFontSizeFont size of labels in pixels integer9
    axisLabelWidthWidth of labels on ticks, in pixelsinteger50
    enableEventsEnable events (if supported)booleantrue
    + +Internal Renderer Methods and Style +=================================== + +The default renderers that are available follow a rough structure. If +you plan to write a new renderer, you should think about using a +similar structure. + +Also, it is important that you follow an Object Orientated style and +split up the rendering methods as much as logically possible to allow +other developers to extend the work by using a "psuedo subclassing" +method described below. + +Subclassing +----------- + +PlotKit Renderers should adopt a Javascript subclassing structure to +allow developers/themers to customise certain aspects of the +rendering. Here is an example of what is expected: + + MyRenderer = function(element, layout, options) { + if (arguments.length > 0) + this.__init__(element, layout, options); + }; + + MyRenderer.prototype.__init__ = function(element, layout, options) { + .... + }; + +In this case, the default javascript constructor acts only when passed +arguments. ``MyRenderer.prototype.__init__`` is the real +constructor. It is named in similar vein to Python's constructor. + +For users who would like to subclass, they will need to use the +following snippet of code: + + MyAlternateRenderer = function(element, layout. options) { + if (arguments.length > 0) + this.__init__(element, layout, options); + }; + MyAlternateRenderer.prototype = new MyRenderer(); + MyAlternateRenderer.prototype.constructor = MyAlternateRenderer; + MyAlternateRenderer.__super__ = MyRenderer.prototype; + + MyAlternateRenderer.prototype.__init__ = function(element, layout, options) { + MyAlternateRenderer.__super__.__init__.call(this, element, layout, options); + }; + + +For subclasses, they will need the following magic in order to +initialise their subclass. But after that, you can either override +``MyAlternateRenderer.prototype.__init__`` with your own +implementation or just leave the superclass to deal with the +constructor. + +A more thorough example can be found in the PlotKit source for +``Canvas.js`` and ``SweetCanvas.js`` respectively. + +Internal Renderer Properties +---------------------------- + +The bundled renderers are have the following common properties to +allow standard access by all subclasses: + +* ``this.layout`` + +The PlotKit.Layout object passed by the user. + +* ``this.element`` + +The HTML element to use, either a Canvas Element or SVG Element depending +on whether a Canvas Renderer or SVG Renderer is in use. + +* ``this.options`` + +A dictionary of options that are applicable to the rendering style. + +* ``this.xlabels`` + +A list of elements that represent the axis. Should be cleared whenever +``clear()`` is executed. + +* ``this.ylabels`` + +A list of elements that represent the axis. Should be cleared whenever +``clear()`` is executed. + +Internal Renderer Methods +------------------------- + +* ``_renderBarChart()`` + +Renders only the bars of a bar chart on the element by looking at +``this.layout.bars`` for the bars to render. Will only be called if +``this.layout.style == "bars"`` + +* ``_renderLineChart()`` + +Renders only the lines of a line chart on the element by looking at +``this.layout.points`` for the points to render. Will only be called if +``this.layout.style == "line"`` + +* ``_renderPieChart()`` + +Renders only the slices of the pie in ``this.layout.slices``. +Will only be called if ``this.layout.style == "pie"`` + +* ``_renderBarAxis()`` + +Renders the axis for a bar chart by looking at the +``this.layout.xticks`` and ``this.layout.yticks``. + +* ``_renderLineAxis()`` + +Renders the axis for a line chart by looking at the +``this.layout.xticks`` and ``this.layout.yticks``. + +* ``_renderPieAxis()`` + +Renders the labels for a pie chart by looking at +``this.layout.xticks`` only. + +* ``_renderBackground()`` + +Called to render the background of the chart. Should check whether +``this.options.drawsBackground`` is set before proceeding. + + +Events from the Chart +===================== + +There is preliminary support for events from the chart for the Canvas +Renderer but the API is not stablised and subject to change. __(TODO)__. + +{% endfilter %} +
    +{% endblock %} diff --git a/plotkit_v091/doc/PlotKit.SVG.html b/plotkit_v091/doc/PlotKit.SVG.html new file mode 100644 index 0000000..1ca29d1 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.SVG.html @@ -0,0 +1,159 @@ + + + + + PlotKit.SVG | liquidx + + + + + + + + + + + + + + + + +
    +
    + +

    PlotKit Home | << | >> +

    + +

    PlotKit SVG

    +

    PlotKit SVG includes the SVGRenderer which allows chart plotting on SVG capable browsers such as Firefox 1.5 and Opera 9.0. It should support Adobe SVG plugin, but is current untested. +

    + +

    Important Implementation Requirements

    +

    In order to use the SVG Renderer, the file and webserver must support inline SVG files. This means the following conditions must exist: +

    + +

    The HTML file must be XHTML compliant.

    +

    So it should start off with this: +

    +
    <?xml version="1.0" encoding="UTF-8"?>
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    +<html
    +xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
    +xmlns:svg="http://www.w3.org/2000/svg"
    +xmlns:xlink="http://www.w3.org/1999/xlink">
    +<head>        
    +  <object id="AdobeSVG" classid="clsid:78156a80-c6a1-4bbf-8e6a-3cd390eeb4e2" width="1" height="1"></object>
    +  <?import namespace="svg" implementation="#AdobeSVG"?>
    +...
    +
    +

    Correct XHTML Mime-Type

    +

    Firefox and MSIE are fussy about the mimetype to do in-line + SVG. Firefox requires that either the URL ends in .html or that the + file is returned as mime type application/xhtml+xml in the HTTP + headers. +

    +

    However, MSIE does not recognise application/xhtml+xml and will + work fine with regular text/html mimetype for XHTML. +

    + +

    Non XHTML Compliant javascript includes

    +

    You cannot use the autoloading MochiKit.js, but instead include all the JS files individually or use the packed MochiKit. This is because MochiKit's way of autoloading is not XHTML compliant. +

    +

    An example of this is in the tests. +

    + +

    PlotKit SVG Options

    +

    There are no additional options for the SVG Renderer apart from the default Renderer options. +

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.SVG.txt b/plotkit_v091/doc/PlotKit.SVG.txt new file mode 100644 index 0000000..a590d9a --- /dev/null +++ b/plotkit_v091/doc/PlotKit.SVG.txt @@ -0,0 +1,64 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block headers %} + +{% endblock %} +{% block title %}PlotKit.SVG{% endblock %} + +{% block content %} +
    +{% filter markdown %} +[PlotKit Home](PlotKit.html) | [<<](PlotKit.Canvas.html) | [>>](PlotKit.SweetCanvas.html) + +PlotKit SVG +=========== + +PlotKit SVG includes the SVGRenderer which allows chart plotting on SVG capable browsers such as Firefox 1.5 and Opera 9.0. It should support Adobe SVG plugin, but is current untested. + +Important Implementation Requirements +------------------------------------- + +In order to use the SVG Renderer, the file and webserver must support inline SVG files. This means the following conditions must exist: + +###The HTML file must be XHTML compliant. + +So it should start off with this: + + + + + + + + ... + +###Correct XHTML Mime-Type + +Firefox and MSIE are fussy about the mimetype to do in-line +SVG. Firefox requires that either the URL ends in .html or that the +file is returned as mime type ``application/xhtml+xml`` in the HTTP +headers. + +However, MSIE does not recognise ``application/xhtml+xml`` and will +work fine with regular ``text/html`` mimetype for XHTML. + +###Non XHTML Compliant javascript includes + +You cannot use the autoloading MochiKit.js, but instead include all the JS files individually or use the packed MochiKit. This is because MochiKit's way of autoloading is not XHTML compliant. + +An example of this is in the tests. + + +PlotKit SVG Options +------------------- + +There are no additional options for the SVG Renderer apart from the default Renderer options. + +{% endfilter %} +
    +{% endblock %} \ No newline at end of file diff --git a/plotkit_v091/doc/PlotKit.SweetCanvas.html b/plotkit_v091/doc/PlotKit.SweetCanvas.html new file mode 100644 index 0000000..ae170df --- /dev/null +++ b/plotkit_v091/doc/PlotKit.SweetCanvas.html @@ -0,0 +1,131 @@ + + + + + PlotKit.SweetCanvas | liquidx + + + + + + + + + + + + + + + + +
    +
    + +

    PlotKit Home | << | >> +

    + +

    PlotKit Sweet Canvas Renderer

    +

    This renderer is an extension of the basic Canvas Renderer to show off + what you can do to make graphs pretty without learning any graph + layout code. +

    +

    There are no extra methods or options to use. The interface is exactly + the same as PlotKit.Canvas's CanvasRenderer. +

    +

    SweetCanvasRenderer adds a fake shadow around bars, lines and circles + along with a 2.0 width white outline and a etched light coloured + background. +

    + +

    Example

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.SweetCanvas.txt b/plotkit_v091/doc/PlotKit.SweetCanvas.txt new file mode 100644 index 0000000..6f9e6b0 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.SweetCanvas.txt @@ -0,0 +1,34 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block headers %} + +{% endblock %} +{% block title %}PlotKit.SweetCanvas{% endblock %} + +{% block content %} +
    +{% filter markdown %} +[PlotKit Home](PlotKit.html) | [<<](PlotKit.SVG.html) | [>>](PlotKit.SweetSVG.html) + +PlotKit Sweet Canvas Renderer +============================= + +This renderer is an extension of the basic Canvas Renderer to show off +what you can do to make graphs pretty without learning any graph +layout code. + +There are no extra methods or options to use. The interface is exactly +the same as ``PlotKit.Canvas``'s CanvasRenderer. + +SweetCanvasRenderer adds a fake shadow around bars, lines and circles +along with a 2.0 width white outline and a etched light coloured +background. + +Example +======= + +{% endfilter %} +
    +{% endblock %} + diff --git a/plotkit_v091/doc/PlotKit.SweetSVG.html b/plotkit_v091/doc/PlotKit.SweetSVG.html new file mode 100644 index 0000000..0e9c4ff --- /dev/null +++ b/plotkit_v091/doc/PlotKit.SweetSVG.html @@ -0,0 +1,131 @@ + + + + + PlotKit.SweetSVG | liquidx + + + + + + + + + + + + + + + + +
    +
    + +

    PlotKit Home | << | >> +

    + +

    PlotKit Sweet SVG Renderer

    +

    This renderer is an extension of the basic SVG Renderer to show off + what you can do to make graphs pretty without learning any graph + layout code. +

    +

    There are no extra methods or options to use. The interface is exactly + the same as PlotKit.SVG's SVGRenderer. +

    +

    SweetSVGRenderer adds a fake shadow around bars, lines and circles + along with a 2.0 width white outline and a etched light coloured + background. +

    + +

    Example

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.SweetSVG.txt b/plotkit_v091/doc/PlotKit.SweetSVG.txt new file mode 100644 index 0000000..0af13df --- /dev/null +++ b/plotkit_v091/doc/PlotKit.SweetSVG.txt @@ -0,0 +1,34 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block headers %} + +{% endblock %} +{% block title %}PlotKit.SweetSVG{% endblock %} + +{% block content %} +
    +{% filter markdown %} +[PlotKit Home](PlotKit.html) | [<<](PlotKit.SweetCanvas.html) | [>>](PlotKit.EasyPlot.html) + +PlotKit Sweet SVG Renderer +============================= + +This renderer is an extension of the basic SVG Renderer to show off +what you can do to make graphs pretty without learning any graph +layout code. + +There are no extra methods or options to use. The interface is exactly +the same as ``PlotKit.SVG``'s SVGRenderer. + +SweetSVGRenderer adds a fake shadow around bars, lines and circles +along with a 2.0 width white outline and a etched light coloured +background. + +Example +======= + +{% endfilter %} +
    +{% endblock %} + diff --git a/plotkit_v091/doc/PlotKit.html b/plotkit_v091/doc/PlotKit.html new file mode 100644 index 0000000..5d9827c --- /dev/null +++ b/plotkit_v091/doc/PlotKit.html @@ -0,0 +1,334 @@ + + + + + PlotKit Documentation | liquidx + + + + + + + + + + + + + + + + +
    +
    + + +

    PlotKit

    +

    PlotKit is a Javascript graph plotting library. It is aimed at web + applications that require plotting series of data in modern web + browsers. +

    +

    PlotKit requires MochiKit. (1.3 or higher) +

    +

    PlotKit supports both HTML Canvas and SVG, along with an + emulated canvas for Internet Explorer. +

    +

    PlotKit is easily extensible to include other rendering engines, + styles and layouts. Please pursue the documentation for more + information. +

    +

    PlotKit is licensed under the BSD License, so you can include it in + your free or commercial applications without worrying. +

    + +

    PlotKit Components

    + +

    Base Classes

    +
      +
    • + Base : Common functionality that is used in other classes, + including default styles. +
    • + +
    • + Layout : The default chart layout engine, supports bar, line and + pie charts. +
    • + +
    • + Renderer: Customising the look of the output +
    • +
    + +

    Renderer Specific Implementations

    +
      +
    • + CanvasRenderer: Basic renderer using an HTML Canvas. +
    • + +
    • + SVGRenderer: Basic renderer using SVG. +
    • + +
    • + SweetCanvasRenderer: Customised Renderer that builds on CanvasRenderer to provide nicer looking charts. +
    • + +
    • + SweetSVGRenderer: Customised renderer that builds on SVGRenderer to provide nicer looking charts. +
    • +
    + +

    Utility Classes

    +
      +
    • + EasyPlot: Simple Wrapper around classes to provide one-line plotting. +
    • +
    + +

    Getting Started

    + + +

    More Demos

    + + +

    Version History

    + +

    PlotKit 0.8

    + + +

    PlotKit 0.9

    +
      +
    • + Fixed some redraw issues with clear() +
    • + +
    • + Replaced IECanvas.HTC with ExplorerCanvas +
    • + +
    • + Added auto import and packed versions just like MochiKit. +
    • + +
    • + Added horizontal bar chart rendering mode. +
    • + +
    • + Added awareness of prototype.js and workaround Array/Object mutilation issues with MochiKit. +
    • + +
    • + Added EasyPlot for single line plotting with Ajax support. +
    • + +
    • + More tests, dynamic charting and quickstart demos. +
    • +
    + +

    PlotKit 0.9.1

    +
      +
    • + Make Sweet{Canvas/SVG}Renderers respect shouldFill. +
    • + +
    • + Fixed ignoring of maximum x and y values when setting xAxis/yAxis. +
    • + +
    • + Fixed typo for calculating yrange in Layout.js (thanks to + HubrisSonic). +
    • + +
    • + Changed SweetCanvasRenderer to use axisLineColor for drawing lines over + background (thanks to HubrisSonic). +
    • + +
    • + Fixed bug in y-axis tick drawing (thanks to Cliff). +
    • + +
    • + Fixed x-axis calculation bug when xAxisIsZero is false (thanks to + Loic Jeannin) +
    • + +
    • + Fixed xTicks drawing that exceed the bounds of the chart (thanks to + Cliff) +
    • + +
    • + Fixed barchart drawing with only 2 values (thanks to HubrisSonic) +
    • + +
    • + Hide pie chart labels of 0% (thanks to Attiks) +
    • + +
    • + Added optional field to addDatasetFromTable to include x-axis labels. +
    • + +
    • + Updated excanvas.js version to fix possible printing issues. +
    • +
    + +

    Road Map

    + +

    Version 0.9

    +
      +
    • + AutoSelectRenderer, automatically choose Canvas or SVG by auto detecting browser support. +
    • +
    + +

    Version 0.10

    +
      +
    • + Point plots +
    • + +
    • + Defined Event System Support +
    • + +
    • + Animation support. +
    • +
    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/PlotKit.txt b/plotkit_v091/doc/PlotKit.txt new file mode 100644 index 0000000..03a5dd7 --- /dev/null +++ b/plotkit_v091/doc/PlotKit.txt @@ -0,0 +1,151 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block title %}PlotKit Documentation{% endblock %} +{% block headers %} + +{% endblock %} + + +{% block content %} +
    +{% filter markdown %} +PlotKit +======= + +[PlotKit][] is a Javascript graph plotting library. It is aimed at web +applications that require plotting series of data in modern web +browsers. + +PlotKit requires [MochiKit][]. (1.3 or higher) + +PlotKit supports both HTML Canvas and SVG, along with an +[emulated canvas for Internet Explorer][IECanvas]. + +PlotKit is easily extensible to include other rendering engines, +styles and layouts. Please pursue the documentation for more +information. + +PlotKit is licensed under the BSD License, so you can include it in +your free or commercial applications without worrying. + +PlotKit Components +================== + +Base Classes +------------ + +* [Base][] : Common functionality that is used in other classes, + including default styles. +* [Layout][] : The default chart layout engine, supports bar, line and + pie charts. +* [Renderer][]: Customising the look of the output + +Renderer Specific Implementations +--------------------------------- + +* [CanvasRenderer][]: Basic renderer using an HTML Canvas. +* [SVGRenderer][]: Basic renderer using SVG. +* [SweetCanvasRenderer][]: Customised Renderer that builds on CanvasRenderer to provide nicer looking charts. +* [SweetSVGRenderer][]: Customised renderer that builds on SVGRenderer to provide nicer looking charts. + +Utility Classes +--------------- + +* [EasyPlot][]: Simple Wrapper around classes to provide one-line plotting. + +Getting Started +=============== + +* [PlotKit Quick Start][QuickStart] - A thorough quick start to getting charts working for Safari, Mozilla, Firefox, Opera and IE. +* [SVG/Canvas Browser Support Status][Browser] - Quirks about browser support that you should know about. +* [Simple Canvas Demo][QuickstartCanvasDemo] - Very basic Canvas demo all contained in an HTML file. +* [Simple SVG Demo][QuickstartSVGDemo] - Very basic SVG demo all contained in an HTML file. + +More Demos +========== + +* Unit Tests [Canvas][CanvasTest], [SVG][SVGTest], [SweetCanvas][SCanvasTest], [SweetSVG][SSVGTest]. +* [Dynamic Charting][DynamicTest]. +* [Labels Example][]. Thanks to Christopher Armstrong. +* [Labels with Images][]. +* [Axis Restrictions][]. + +Version History +=============== + + +###PlotKit 0.8 + +* Total rewrite from [CanvasGraph 0.7][CanvasGraph] + +###PlotKit 0.9 + +* Fixed some redraw issues with clear() +* Replaced IECanvas.HTC with ExplorerCanvas +* Added auto import and packed versions just like MochiKit. +* Added horizontal bar chart rendering mode. +* Added awareness of prototype.js and workaround Array/Object mutilation issues with MochiKit. +* Added EasyPlot for single line plotting with Ajax support. +* More tests, [dynamic charting][DynamicTest] and quickstart demos. + +###PlotKit 0.9.1 + +* Make Sweet{Canvas/SVG}Renderers respect shouldFill. +* Fixed ignoring of maximum x and y values when setting xAxis/yAxis. +* Fixed typo for calculating yrange in Layout.js (thanks to + HubrisSonic). +* Changed SweetCanvasRenderer to use axisLineColor for drawing lines over + background (thanks to HubrisSonic). +* Fixed bug in y-axis tick drawing (thanks to Cliff). +* Fixed x-axis calculation bug when xAxisIsZero is false (thanks to + Loic Jeannin) +* Fixed xTicks drawing that exceed the bounds of the chart (thanks to + Cliff) +* Fixed barchart drawing with only 2 values (thanks to HubrisSonic) +* Hide pie chart labels of 0% (thanks to Attiks) +* Added optional field to addDatasetFromTable to include x-axis labels. +* Updated excanvas.js version to fix possible printing issues. + +Road Map +======== +###Version 0.9 + +* AutoSelectRenderer, automatically choose Canvas or SVG by auto detecting browser support. + +###Version 0.10 + +* Point plots +* Defined Event System Support +* Animation support. + +[QuickStart]: PlotKit.QuickStart.html +[CanvasGraph]: http://www.liquidx.net/canvasgraphjs/ +[PlotKit]: http://www.liquidx.net/plotkit/ +[MochiKit]: http://mochikit.com/ +[IECanvas]: http://me.eae.net/archive/2005/12/29/canvas-in-ie/ +[Base]: PlotKit.Base.html +[Styles]: PlotKit.Styles.html +[Layout]: PlotKit.Layout.html +[Renderer]: PlotKit.Renderer.html +[CanvasRenderer]: PlotKit.Canvas.html +[SVGRenderer]: PlotKit.SVG.html +[SweetCanvasRenderer]: PlotKit.SweetCanvas.html +[SweetSVGRenderer]: PlotKit.SweetSVG.html +[EasyPlot]: PlotKit.EasyPlot.html +[Browser]: SVGCanvasCompat.html +[CanvasTest]: http://media.liquidx.net/js/plotkit-tests/basic.html +[SVGTest]: http://media.liquidx.net/js/plotkit-tests/svg.html +[SCanvasTest]: http://media.liquidx.net/js/plotkit-tests/sweet.html +[SSVGTest]: http://media.liquidx.net/js/plotkit-tests/sweet-svg.html +[QuickstartCanvasDemo]: http://media.liquidx.net/js/plotkit-tests/quickstart.html +[QuickstartSVGDemo]: http://media.liquidx.net/js/plotkit-tests/quickstart-svg.html +[QuickstartEasyDemo]: http://media.liquidx.net/js/plotkit-tests/quickstart-easy.html +[DynamicTest]: http://media.liquidx.net/js/plotkit-tests/dynamic.html +[Labels Example]: http://media.liquidx.net/js/plotkit-tests/labels.html +[Labels with Images]: http://media.liquidx.net/js/plotkit-tests/labels-img.html +[Axis Restrictions]: http://media.liquidx.net/js/plotkit-tests/axis.html + +{% endfilter %} +
    +{% endblock %} diff --git a/plotkit_v091/doc/SVGCanvasCompat.html b/plotkit_v091/doc/SVGCanvasCompat.html new file mode 100644 index 0000000..58e7d64 --- /dev/null +++ b/plotkit_v091/doc/SVGCanvasCompat.html @@ -0,0 +1,304 @@ + + + + + SVG and Canvas Support Status in Various Browsers. | liquidx + + + + + + + + + + + + + + + + +
    +
    + + +

    State of SVG and Canvas in Modern Browsers

    +

    By: Alastair Tse - Last Updated: 27 April 2006 +

    +

    My friends, just like HTML and CSS, different browsers support + different subsections of the SVG and Canvas specification. As part of + my work on PlotKit, the next generation javascript plotting library, + I've decided to summarise all the quirks in SVG and Canvas support. +

    + +

    Browsers Considered

    +

    I am looking at browsers that are considered "modern" as of + March 2006. These include: +

    + +

    I am also looking at some experiemental browsers as of March 2006. +

    + + +

    Canvas

    + + +

    Supporting Browsers

    +
      +
    • + Safari 2.0 and above. +
    • + +
    • + Opera 9.0 and above. +
    • + +
    • + Firefox 1.5 and above. +
    • +
    + +

    Quirks

    +
      +
    • Safari will forget a path after fill() or stroke() has + been called. Therefore, if you need to fill and stroke the same + path, you must draw the path out twice. +

      + +
    • + +
    • Opera will not obey stroke() for arc paths. +

      + +
    • + +
    • Firefox and Opera will not draw shadows even with + shadowStyle or shadowOffset is set on the context object. +

      + +
    • +
    + +

    SVG

    +
      +
    • + SVG support is either provided natively, or through the Adobe SVG + Viewer (ASV). +
    • +
    + +

    Supporting Browsers (Inline)

    +
      +
    • + Safari 2.0 + ASV +
    • + +
    • + Internet Explorer 6 + ASV +
    • + +
    • + Safari Webkit+SVG Nightly +
    • + +
    • + Opera 9.0 and above +
    • + +
    • + Mozilla Firefox 1.5 and above +
    • +
    + +

    Quirks (Inline)

    +
      +
    • Safari Nightly will not render any text elements when + inlined. (Will do so if using embed) +

      + +
    • + +
    • Safari 2.0 + ASV will not respect inlined SVG. +

      + +
    • + +
    • Internet Explorer 6 + ASV will only parse inlined SVG if the + following is added to the HTML and all SVG elements are in the + correct namespace svg:. +

      + +
    • +
    +

    following is added to the HTML and all SVG elements are in the + correct namespace svg:. +

    +
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
    +xmlns:svg="http://www.w3.org/2000/svg"
    +xmlns:xlink="http://www.w3.org/1999/xlink">
    +...
    +<body>
    +<!-- START Required for IE to support  inlined SVG -->
    +<object id="AdobeSVG"
    +classid="clsid:78156a80-c6a1-4bbf-8e6a-3cd390eeb4e2" width="1"
    +height="1"></object>
    +<?import namespace="svg" implementation="#AdobeSVG"?>
    +<!-- END   Required for IE to support inlined SVG -->
    +<svg:svg width="300" height="300" baseProfile="full" version="1.1"></svg:svg>
    +</body>
    +</html>
    +
      +
    • Mozilla Firefox (1.5 and nightly) on Mac will not render + text elements when inlined. Note that it does for Linux and Windows. +

      + +
    • + +
    • Opera 9 will refuse to draw an element if attribute filter + is defined. +

      + +
    • +
    +

    is defined. +

    +
      +
    • + Internet Explorer 7b2p + ASV will not work with the Adobe SVG Viewer. +
    • +
    + +

    Disclaimer

    +

    The above is presented as-is with my own findings. There may be + errors. Please do not use this to base your multi-million dollar + business decisions. +

    + +

    Contact

    +

    If you have anything to add or modify, please contact me at + alastair@liquidx.net. +

    + + +
    +
    + + + + + + + + + + + + + diff --git a/plotkit_v091/doc/SVGCanvasCompat.txt b/plotkit_v091/doc/SVGCanvasCompat.txt new file mode 100644 index 0000000..4be4cd3 --- /dev/null +++ b/plotkit_v091/doc/SVGCanvasCompat.txt @@ -0,0 +1,144 @@ +{% extends "basex.html" %} +{% load markup %} +{% block pageid %}code{% endblock %} +{% block title %}SVG and Canvas Support Status in Various Browsers.{% endblock %} +{% block headers %} + +{% endblock %} + + +{% block content %} +
    +{% filter markdown %} +State of SVG and Canvas in Modern Browsers +========================================== + +__By: Alastair Tse - Last Updated: 27 April 2006__ + + +My friends, just like HTML and CSS, different browsers support +different subsections of the SVG and Canvas specification. As part of +my work on PlotKit, the next generation javascript plotting library, +I've decided to summarise all the quirks in SVG and Canvas support. + +Browsers Considered +=================== + +I am looking at browsers that are considered "modern" as of +March 2006. These include: + +* [Safari 2.0.x][Safari] (W/ [Adobe SVG Plugin][ASV]) +* [Firefox 1.5.x][Firefox] +* [Opera 9.0 Preview 2][OperaSnapshot] +* [Internet Explorer 6][IE6] (w/ [Adobe SVG Plugin][ASV]) + +I am also looking at some experiemental browsers as of March 2006. + +* [Internet Explorer 7 beta 2 preview + ASV][IE7] +* [Safari WebKit+SVG Nightly 2006-03-11][WebkitNightly] +* [Firefox Deerpark Nightly 2006-03-11][FirefoxNightly] + +[Safari]: http://apple.com/safari/ +[Firefox]: http://www.mozilla.com/firefox/ +[OperaSnapshot]: http://snapshot.opera.com/ +[IE6]: http://www.microsoft.com/windows/ie/ +[ASV]: http://www.adobe.com/svg/ +[IE7]: http://www.microsoft.com/windows/IE/ie7/default.mspx +[WebkitNightly]: http://nightly.webkit.org/ +[FirefoxNightly]: http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/ + + +Canvas +====== + +* Canvas is defined by the WHATWG in what is known as the + [Web Applications 1.0 specification][WHATWG] + +Supporting Browsers +------------------- + +* Safari 2.0 and above. +* Opera 9.0 and above. +* Firefox 1.5 and above. + +Quirks +------ + +* __Safari__ will forget a path after ``fill()`` or ``stroke()`` has + been called. Therefore, if you need to fill and stroke the same + path, you must draw the path out twice. + +* __Opera__ will not obey ``stroke()`` for arc paths. + +* __Firefox__ and __Opera__ will not draw shadows even with + ``shadowStyle`` or ``shadowOffset`` is set on the context object. + +SVG +=== + +* SVG support is either provided natively, or through the Adobe SVG + Viewer (ASV). + +Supporting Browsers (Inline) +---------------------------- + +* Safari 2.0 + ASV +* Internet Explorer 6 + ASV +* Safari Webkit+SVG Nightly +* Opera 9.0 and above +* Mozilla Firefox 1.5 and above + +Quirks (Inline) +--------------- + +* __Safari Nightly__ will not render any ``text`` elements when + inlined. (Will do so if using ``embed``) + +* __Safari 2.0 + ASV__ will not respect inlined SVG. + +* __Internet Explorer 6 + ASV__ will only parse inlined SVG if the + following is added to the HTML and all SVG elements are in the + correct namespace ``svg:``. + + + ... + + + + + + + + + +* __Mozilla Firefox (1.5 and nightly) on Mac__ will not render + ``text`` elements when inlined. Note that it does for Linux and Windows. + +* __Opera 9__ will refuse to draw an element if attribute ``filter`` + is defined. + +* __Internet Explorer 7b2p + ASV__ will not work with the Adobe SVG Viewer. + + +Disclaimer +========== + +The above is presented as-is with my own findings. There may be +errors. Please do not use this to base your multi-million dollar +business decisions. + +Contact +======= + +If you have anything to add or modify, please contact me at +. + +[WHATWG]: http://whatwg.org/specs/web-apps/current-work/ + +{% endfilter %} +
    +{% endblock %} \ No newline at end of file diff --git a/plotkit_v091/doc/barsample.png b/plotkit_v091/doc/barsample.png new file mode 100644 index 0000000000000000000000000000000000000000..f11e1ed3c49878920b8a51388b696cbfb0bcb439 GIT binary patch literal 2752 zcmeH}e>l@?AIBHTBGIqIp{#Lr^b|=tg<<7KT4+wE{9aCouvnJgX6YIw#UqC$%}z;@ za5TSWO!<*C<~Yo-%@Q*bqnXXvcaP5V&pA)$y3To?zn|;AUe|qJpZoLqT=)IH?$3RF zGCWSZXldwcfIuKE#7Uc>Vv9VKsNh)9)op3APskf)A6(MBeOh36iR}7xge6-%b^Pt z!H;{cP1(p*4S0uZ%RQ%_+MGi%R8+zoRBP30D$bRJeL(gD*EYsHM=`vgMP`l!A9gj) z_srd}>$az_pJ&-weWbg?dPHiwULb#nE#+b%%#@q?dyd35{Zr=OS;aO*=p}@1vZsf zj45f_Nh-QLq+;;K&8*-a7)s#F73SS+tW|RoFsa#crHv;15C%K)HZKbXMaQpYzYbpa zKhc`^N;%*PhSvC2P^rU34QB1FvH~UEgMdEZ<7wI+QI8bBoJ;!?mRU!+8;2hUZc^Y_ z$)T6(VTBm6(S&VO(>a*b^SLD(gDEa;m?p z^uG>KduIooz=`Wsbf7nN{)&d=Q=S-~Z}l@XB^~GQJ@zl#q@_hQGU8rsOM)0G2Ah<c_KW$H+HJphsR&hZnJCi5<4#hOrb_WsUk&P}W? zjTLR7?A@(k1=jlVUR>9Gmg7hRUaPSR|sn;g+h>=(hBc54I z;#F>_?=LpS<((32b@HA{Gr77YZeA})+s)8%Z+pYr&6?FFO9nw)9c;Shthie>@dC3U z{X4e)*djW}_=MF_qFdGuEF`FU*qU_sL&Xl0GPXg5FZ3pi z>QYQ8YF|D+Zp{nkH1T|y6hO~*=*B^;>Y$$T)opy>by2f2_Gw+1QMb*0h3bRnoGzuF zS>eO}o1e7Js0WwLOT{M`u zAGJufl~6kAahDDd4ko>q1T>4p5dD1$8I7N~rz|A1v<^3~9XWa>nN1&Fi!M07ldc>^ z+Dc}lfJb(}pq}#QyJ#umXQ{UG2r{f~Tc zO|N3JKPnc6)#`M~ikAH;{0gBtHsU-DC#V+He(0j(IwR?dB}e{pDJ6+^Wh#xAjRg93 zu?ae{N?vMj@)A=lGTTlrDMg0(XR7TQa#Bc6co#*U3-%ejY%hBWKR|{v5RLQv0B+1wcUA89 z$P__e5NR?(8)!480pk)+1=W1k?(X=ZUee`dmEPv}uK5Myk$#ysAn{Yf0`;GKR>p`+ zhIZn6H-PZoyUT2!Y0`SGuhk3b!bmed+7)~Oc(d4As7#o5vLIk2N$HMYff-wis0k&= z8BuqDk$CV!kD~kGYl?2BpwlBVS=A0;sAsxHPdy19$I9W)874i7ofx0N?A5PPIL^KuCt*|TcSIP z=a|79z&@}r6Z0b6#LK0JBRR_lhsiPFmT3{u)D5~1E_AIXkUr|U@=nj-@!uUsTiFQf>3HmC z_|d$jXC}43w)LF{-eOXQHn(cqC$16_7r)Z&PfexAeR7I^aJl5-Qfp){$8WHbbUHn~ qz8!PX8N7;LW+eVubKvcwR1NJWx=y}LyT8_Jf)LK9ohluExc)Ed6$r)v literal 0 HcmV?d00001 diff --git a/plotkit_v091/doc/black.png b/plotkit_v091/doc/black.png new file mode 100644 index 0000000000000000000000000000000000000000..9825e8fd7f1e3ae87d1e1b566ed9fd02129fc0f1 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^E-WR}DYhhUcNd2LAh=-f^2tCE&H|6f zVxTG^5N5n|x9$&6kiEpy*OmPmvw)bC%;H|gZlKU)PZ!4!kK=F8EAkyt5O4@Avo-Z~ zDBxu&UtoUl%Hvb41wU?GD`H;9w3XGt|QW`6N``WBxKaP#>e^<`y&t3b~g0JV}wp_zw$0NN~8mc|d zSu6Yh;T&(x^{=&-`dt3vRxgskz$|fqfz6=d=SKd`u@)zU-fuVnbRL7JtDnm{r-UW| D=woBo literal 0 HcmV?d00001 diff --git a/plotkit_v091/doc/blue.png b/plotkit_v091/doc/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..cde1bd37fce05654361f6a330e3897299756c261 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^As{vf6Oi1|ac?D%VoUONcVYMsf(!O8p9~b?Ebxdd zW?J;WTzrILz`~8|9jY)6z*Wb~(Z+uv1-~T_GpMMGV zVb}Kf^h%3+@Ba^tKrny)d`A6*#H5rX%4d(9IMES)@BvE?4^K}|k55a?xlf<|mfKvC zxBDX?nj}{=@Bhcw@1MV~ultjHczsW2B1?1N`TnZ9E1wt7lmGf>#dCLC`&T~`IT>tu W-Om`^+_VhnLk3S*KbLh*2~7Y1RF&KS literal 0 HcmV?d00001 diff --git a/plotkit_v091/doc/cyan.png b/plotkit_v091/doc/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..ff946d660cbd8f12ab7ec86bf78c8abb6392f257 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yZ!2~4DxlLJt6kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)5C}6~x?A@LD9B#o>FdgVjafiUQuk(EP!UjQrl*Tzh{fsTn(v?ane#sUyKAke z$H!=QZ^pdH-TE=klmCAI`}+0P&5{xlPhO`l_Wb+*v-RbWy+#Lq9+>?7 %s' % (src, dst) + c = Context({}) + filled = loader.render_to_string(src, {}) + open(dst, 'w').write(filled) + +if __name__ == "__main__": + for dirname, dirs, files in os.walk('.'): + if re.search('/\.svn', dirname): + continue + for f in files: + if f[-4:] == ".txt": + newname = f.replace('.txt', '.html') + make(os.path.join(dirname, f), os.path.join(dirname, newname)) diff --git a/plotkit_v091/doc/green.png b/plotkit_v091/doc/green.png new file mode 100644 index 0000000000000000000000000000000000000000..33f7da393819bf1aa8e148d4ce5028e9f7b0082e GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^E-WR}DYhhUcNd2LAh=-f^2tCE&H|6f zVxTG^5N5n|x9$&6kiEpy*OmPmvw)b0iYU*N*+8L1o-U3d9>XQuF#3rqg}`}uywWT}^dWzWAp3{C%hA*H_V zw{)UOaPYxTZ$7h5k6Y_D`R|{9;axwi^!)BQ_gC5fuj$kI`u=@=+xkQMj)m_3SGV&= z5i2vBz~gIEo^P-F{O;-e`ujhA{8VW2;W^CFQj!2~3=KG_@vQfx`y?k)`fL2$v|<�u1s;*b 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 GLH`S%(t@A> literal 0 HcmV?d00001 diff --git a/plotkit_v091/doc/purple.png b/plotkit_v091/doc/purple.png new file mode 100644 index 0000000000000000000000000000000000000000..952edf11344f258a33403fc2eb4faf047bee7b1f GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUH!2~2He$nRzQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0pdfpRr>`sfHD&=Z8Sy06`c|OOJWm(L5Rc=@e||iZW;Xlq?{9To zVjiR8zpgXigxSw8Jo)d}=f5}B>hkdL1cr%b1l9ll`>|_V*LmJub-ym&X_J+Zs$a6T z>eY-Da*@@KuY9x4*c4w^qcczN#M#4JYtQ}UUmqaz?frdwv3>U+R{GiR`)jxHrP;FP zr6DX=eN^K2*Zlr`Ti(vjE=5zVO_0IO*7DWKK>xm~qAQaZ&y)G8lE=VsdXLTX7yoTn Q0A0%9>FVdQ&MBb@0Ik(;S^xk5 literal 0 HcmV?d00001 diff --git a/plotkit_v091/doc/red.png b/plotkit_v091/doc/red.png new file mode 100644 index 0000000000000000000000000000000000000000..678cacb231019421c58eea19a33ca755d91f4055 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^{y@yb!2~4N%qkZKQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0pdfpRr>`sfHD&=ZVeM0&nE;HYUcYmw- z6cz0p4@wqp4FC4Vaq{0^-|zpKt}iJeu}n*QvFG1^|Kqi7@2=hR=j}r0>68Uco?W^0X!EwZ@1LIje}Dhy&mRV&28KN<2Cr@h-tYTWc4hnGeX?KQuE=+gTe~DWM4fZK;Iu literal 0 HcmV?d00001 diff --git a/plotkit_v091/scripts/custom_rhino.jar b/plotkit_v091/scripts/custom_rhino.jar new file mode 100644 index 0000000000000000000000000000000000000000..4391990406b782da9d9c04ac38d2ed1af0f88ad9 GIT binary patch literal 705856 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

    D4I z)|{Ui^Su$8tM(UM_-Z1UHgC6V*ZO=m566(6ZbX9}_zfOz3KN)KvG))PXIx|wZW9^o85D7?k}y!VUxhSHG#>ECAHlnXEgxo8rk5& zVHeP`81{G_`08=?t&{I4_ada_z6Q>3vgETjsLOe~TGu@=B>Lt~^691oj>u`YW2p6Y zk?$5p{{fHCE1pU5dUux5JJ@aWsMl;=tlw_^3IAgLebLSn@zA9EO{n3P;&D!a?@eEiueWumIAN~oLm zBx8DIh7hi?KRGy^rx*7xk-wxuVtoq~if&!8;|HlPCiMGgSxQo+W{2xY-Yo4x@>I5g zo|1Y%Y_2EWSQ*xrR;_U->8=pnAZDb35{&-v>nOAk`XzGVg;~VXrGP?rc3KxNnh|FH zyON@(ivgq(%Wh5131Fq9RlRIsRUV)ta0|ClzS0Fx3PR-m z9XeqxRUcTXM>?FbivPFO-L(|3Lzr!K&tJf_*gy@pEW&lgo$ zyFig^Zk#H{R9aQqxNd59F*3a`KRc)3OpmuC6o1->kQ-g3`NloZ)6il%o%LQpIB4O3 zkFmf(gRC`#Q(>Wp9_=Cq^C)NKT+}EoU&6h%fmxOhlnOv3jq|ke*aHNz1kFdjlob7t z-7OiYH7_WJJqNt|l1Xtyl!9V=meG<{%Lv}Bw#*%;er6N!J69}<4~ zWF+#j^mkIBwsaWN8-k8KucG3%jp3+|q@GKzh-tEII*!Z^#jQY`56&=;jn@5MuA?LE zMfpe~;*$ep*ZRSR_5i&|H9Q_}m#gH1OVjG1l^DISzEKZUw#loZJ1GQ>J<1k_B>wgX zotrZktW|};*-DmvW~L{(Ncx5rk+!PwrnD}+)U=7#drhW6d*lZH$!`0>pddUbZC$*DpECO-j~^v;uHYg873guC0QdNbW~^sAw4|`cehmkN^H+|GY6BA`6k)1*ja}v%S$|EMbD4S= zXtWgS4?tu7%witPs>UWiv4k0a`OzMpY$77mH=0h#sd-kjFT<}4c;Pi!n&Am7R= zsnSvy*P76udDG2hk6BJ#`(31?J30?Wq=nHGjrorq=u3l$jZ%EPIX$WIy&4Q4q!A0s zR7UImVK~j%sbTb2;8IQ8j$5w)u5AInEX?mQ+=@K>X@UzDK(tg}JT;h;1TL+p{BLRx zdIp#Q9PhxxvTsqi|ghnBDG#N6^jnKZ7dg;_KFp1Oc|dM%+#nr;GqsdzB$oY3X3zK znJVx8Y(Z+p+98D%%kQR1GJQ3@7dVrv72TuJETG#A(3gy?x5%TA`$coB=fLeyHs%

    i0T~0#AWm1YyzPg&K!?g7j9P0e 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

    oJTiJ2)pG`@;FsKImSC{>R2g7aFtpN$fm(Wk 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

    g~N( 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 >^BBL+%(k1U&M5ZR}QV!1Dx4 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

    !iJo=WY$qwzSEwH7?#0Y@?~9 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%0D09)|EG3!4o&3PU(!FVp7!Mrm51&hng! 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/CO%d}Re?l~)pURB1w#dCJ0@VSD<`79>n#?~bvpih$+(<{L)PI8QPJ=U1HlLO^ns7@% zeup1|H@oE?!->~c$>b^o0yRM1r@D_J@gi9udoPpME)l)~O=8hj3E!`rQM8B9@QCW) zVSu?|3EEB#9((t9-EZt(kv@h#dm_=_*vSXa!?=TQmtZ87FYJskn>Mo)=^;E^yE!m_ z!#c-Dc>b7m*G-yGjyTU8q31yyfZDz@4_ZUDQ?dK9`-*6i4WWCtV-W!Yt9>?M7fqb-}z00U9ZSJ9T?6comB zwI4kt_6u7o8?1&@)ofXU6ID#rcypVTaiiI<44mRey`N&>w+ZcziA&Z^rq$1~7oqij0l?lzPKlM= zncnpxv3^;eSho#%VR@J!Pi+LF8TeD-n2ZWos!DrEtw2o|Y5^MJ;268y!^bn3B2!R5 z`_YYumqnqu&pn6+H26tvP34RAgY=8ES_5fsf%tEV&dbmqZ=&GN{(zciWR*wpSG>eY z&KJ4xrwf6=b=6Gmr}!e!D|;YY-~ZL%mYWbIFRQz{?Eu}vjpGJRYrZZ>$8SN{2&=3P z0cDn$d(L**F%RysH4;-x24>h%{^Aj??r!V$W=qwPbp$0*sP&9qX!&I`6;z$hn@U_`cA?IWd`pHHkQ2W*LP^E=vGO zyqU#g|H_IQydumrW|OH~3=!($*dMn|`>QYaNE9X$OUTG0nEZuKvqzS6BBjjf611=d zdCQL7-k*G7f<_=jKT}8U7$TC+M9nz6m*N}E@Z7ySG(-u4^bCmvN>KZZdZe%tfYYjA zE}-49Y)^%PLM`4J(}{9RWhr2{%I*e>jOT^M2ke#u=9crzEvFdKCkFV7d-(zC549{& zSyvKh(FJszim_i4B}kDn27WcY|B->oH1{aR8Ja8=b|JjO31Irz?YGOy$E)IMo1&*M zd#|93Px8Y%i{0m?`nnx~rW&iO0&YTu{+}5!PO|+Q2ySMLXs0@yShROhvq<*}70MtLTl|P0OoT7CqeC`x z)?Uz$Z=8f$S2Khk|B82QPXApH?_Sx;ceR{|K^njr5zYJP%Dg3Tp@Z5 zrNcXpq2qXv^?z-KPi*>uk$?z-kCIt^mdZ(bR$=$F8SBBO#nU@0WyxQ}DZH0KI%E|h^^KB_z z6jWNrB1xV~XP|8epZZNJ?7aT)8vGgOr~;L|O2w&$#ora}BltE5=ou{6K&kz*A_9&j zKg?+vSeUm3t)t~FrK00`D?lltH6qQ*gLye?dWt3JQkA<|w~9CxGhJ}Ax!j1DW)tB@ z0Ba)cyve-s27*&1Yv#?|$y}L=;H!D@6VM3mJmopWn2)HYG~Y_aIm@+~hZI-J&SF$k z3m%&TibFiwJ-OYYdy^JID3rc4Th1TE0Fy;)H*)d5nb6MS^83K4Y+t>dc2QpjoZg9M^yz)E6g1NLyrvliAA)J;(( zX3j{!8XxbsY&K=)Z?m6#t*e zaxr5YV+Z~J4j1lL^Yl`BPUbt^;bL+%vBCXKOK(&l0G|j!Ox#!IzlTIJA;r&}2b*Yw z2u2DqLmZ}2ZPQroU6ZoyavvPQTJtPo`A2YAwfQCgdAZcuT6OcH#b&eG`BUM=)8}<2 zn>Y&f-Ecqglk3%W_V%mi^q%YV>qPVRnopc_dY^_saz2yvuWB6UIUDIV(V;ECLu%xQ z_1u;5d#8wR?2V7~ulz_W;3F~WcI?pi_}tB;?f4V{ciPKsro1cFKH$Sa=mVO2yQXLn2w4mi~iqB3ZgsCinUg#e;oC zoyZXb05@5nfrApUQkr+<$PiG&>fSLvn$A6Vl-_XUmS~#p6)?`yP_S~87UfJjn=)8OPgS|Uuko-;wO zOud=4m0~qU?AeL6@?^T$y$zKPy!nvpd{=22nsJRQetc(RB~_&V#aLJD(fP?n;sBzp zeSR%{4AQPdxSf2qn*=y!eKzhJs+LydVkKz||2E=GJd-{C5c7Sp29z|ybNCK6^jNtH z$?l?@OOvkS=Q-f4KdpR+eE0N7*AQ%<@7b7LYo$&>7pdrD#HBcubR>YJe-E*y{~n3y znc|nF`)z?$XD=ak&|pOStHjAxvaf1%m$JlNtZf~`JG)$&UeZ^R^>A6*k`W^Ka(D-1QJqP_HPAX{m?ex{+_L9>ulHbF4yyxd7l=e!YO1O-8Qk zg#0KB)T`!lz%Qj0Q*n`RKzVDSP-N;8JPbA!-;NY$1oODAajzC-9G5@yH@!&Ac+l2< zmCN*g79nbgs*X4ZuYN`Ox*faeeRGychFTDou3gczlj*>}Pd|&8V?>1Qg{7=>sV727 zxej(#0{54&r|#)-*g?k1ii&>YLU(rgjt_BwbpqW0j>8(_%|_m139NG)tRW|T{u&Z2Y`QvPxnLhgoUA^ zApLfxlq=^SHw*`5dk%=-N^->Eq+9LjD%%l*N5w5 z7T)+*(ivJz6gTzCdUk>qq^q*e1WEKa?29l=rR#j(NNzL3Qp8UZhB}Nq#Vjm+J8IEr zmp?sQ2onDFZiC1&~=g43WGt5`uy#+i^NV9mJ*H8*whqF4r@Z z+_8PkWL;gQVm7~ii~?1{-G#V8eQhO4T4!`YtfZ&KlI^#)@~thCz?WV~8rO@8l6z`s ziIuIArF7#J@|#JTm0AWlQmhxXQva83jSN9?j)rsjrH8BU>g6xwLKOQJjiJ@DO@N;H+W&4w6x~`E{Gl6b3A1 zSli-lAnzz6XAhTAYx6Jl!%i-!DiKzeY23ijRJeXYZwyJ_@{=~s6<9l^4_m%_p%-HY zcVkMqXAh&zEu&r+WK#FU;f5ADsXD`4v2=^1D9>hq5^Ox7s{i)jBwi_{#Su4g&|9#y zyiYD3(l)los%<^v_){=?W*_-7KZt4zPxZ9uH#VFSr+J%JQG!}2IK3P*(NK8oU0&UT zxLM5Dj*J@AeU9okr=jut#bRC4-kBH$jZO231T%pt)Tyg@qkwL)JI$v4EVd5)ALmxn zDf_KYOYOQYj5Og^=2A7Isp}{baKGhWH%;ur+NiEf z1y>{<>w=y2>jij$1*&Ics64WCd9vIUF-Xppb=MOw)8(*P*GLgf;=`VCL{S$E-er8d z{OBwfO-v2;@I2d+Y>j!>Hp#K3Wzb8R@or-kL3-k_A;Fd!k%a<<&C;OIF~`O3jVZCF z$pMvKxA^QJ4|K^8Q(W^rHDXRx4RQ}u8CBl{|76PV!RFd9k3VWLSQ-sj9$An5CN8fu z0Yz$s=Em}Ei#!y~1d117T53Zv)p#{&VA%z!8k?`Y+0ImeQW;4Ed5-TmEs1YyhtVc3 z8<$a71TTvuTYdSkeRZLbf{VNhs|;yJa>-{WY?i%AEja))+)piN>9Ljck1*cg7_<1#Re(hw`L0)e zXxV{)El6*M7Pm$Htmc=!*#Wf;SS#sPeTRO<8k5a4g~hW`=%6;ul5<_M)rZ7~5&}HZ zXdrtvd6?{?X@q|oJMPf=E!2Tz^SSA{qX@q=CfvbP0sePz4IP-lf*ZWl4w`W5#uL~_ z7uBf%BZF*H*-ai@W7`EnLnaK*O{2GRr72Jme8X)2Tf5j%Km**QQ!NrgA zzHZTh&fqK3`EFmSkOqm9e zQ=kuy&LVFnX#1ItK_O+X5c2$TD$G~K?VznSdEst4L3%yt9OsC?HGyFP2h}(f?I1B% zL+=2BvyO8U;^S@cu~(w^8=-^0xLdER*2jnE3OZ8iJ-=mUz$vxT;6UUK98{9pv=o=7 zDWN;g=$s-U184L6+m(Y`NTW-U;62EUf`7R%R@Fw!5rrUFD9pOw;VETcvT$bN7QE{U zaq8$rN=>>hdVq+{)4R-ty&tJ{TdK9gaNijdaLxi2D&l%=Jv ziTVV!D&~&{e`-_5fP)2FhZS{=r_sI2^RkG{bkSSQXS3Rs>EP~7zOLO8Nl94CLZe{- zgRw0%KV%cR5)D0TgPU`Vms)#UD=z2P40Y9+~Zcep&9ml6Ku1=rZ=QE&j_e z40>C1gdN}~s}coMNK+akK70;J-$VEd(r`=kn}D)8(7xAt1VrezoAQ8alpm9%6@FA# zK$|4#4Msy+QU4rF~xIMIZW@1yM-4$VT%GwdQY0hR_LT8Vv z8a=zP{pH>fdOIR=$lDQ%R|x*@{6X0(0(XyRmi8kJ_t@E_+jx%PtODlW0&)Jts`qNo zCNp%+4ni|R5#HwK@(H-Zg_~j7QV)Z2e%HS#W(d~3pma{Iq(;9L#rLUwQsUf zKLY1rKmb=s`NkV@%#EVm@Z#8q?7Z{`snXvT1y7b1a*^!qd_O&=T9c_sDzFJ<=%m6l zIaeVZA^D$tWT?X64l#<7@#`7+fnHbzs<5baejRhGsGX75vM!zLBj>YaD;57VJ2Gu{ z-p!nIM1)5IjfT`2Or+w%#cQ*XMzPRG_}S`?_!-6neBCVWjiqL3YIZ5h52fL~$gP%(3qM%XMQvy_F6KE>CriqV>zRv;7xV-iU*ZE=b)DVXwASxqt*P?t2-GDJ{`+VN*#g`sw-n3c8l~=?xpzX`v-yyKAo#I#Jy^c zWlf|;noj7Mx=HI?98uUXS$HpFodR4zm0UX_WnaCI&>ou|x=2kI^Dd*a?%v3>4KHoK zLNfNeD4F9!N3r+Mq=GVIM|C#mDOFc@0^zKN&)VhD7ah1ar# z9$6+i#FTkB`%o`Xkt4D(WNbl+AIb2uh&dJ{=GM|Khl9fV}x7C=$1_Ya#NsGJqzkA@XkQEr821 zmFtl%Y?P6L5-#@0w#$ln7EteeXd+2}4aejzEj%grkIq^^c!<*vR`5CA^~bC((w|UY z>-2=Y1W@{G*9xj%2@NkCflIf_-Hc=^wR3vcqq0%j8^uy3N#`yNX(MAUt-lOM3y8LO zHBUe>Z2grte1~3mlV18uQubyVKW(ar+|LMd+w4`dDz&-xM*F&;dWtf^Su3~FE;?VP zvh3Y1JgvZ@L#z6E?gxTSaGppTu<_icrR@Bq=Cc$ud;$G-DPJ9D4kD9Cb4dC050Be` zWV-mW3l%)YMIO~MRrl9^HxCb!$N#cszCCiHUQptG*|7bZ>TDhQYKTfgto7)0St*3q zh|&gX*^77B4TokA$_znQy!5~?EByBKZnz1PE&MlG@;BPAd!;9r*K$#UkdXs|<@(>} z%qZjselD}5*ExWV?vwm&7-XF8-PI((SKLRK=OTMrE3BZPVzoF?RpGGr!K}JYNKL|T z7%FyN7BzK#ua5}pC|3)}2^WEN8_2^Z*~5R)Ii6~PuO2t@k~G7ji+X7Ys{W#~|Fw#{ z$mL?C56R_92^EpuqHtYN+B7+ENzu;8IOkM>in>|<6T;BTYgxUC1N9sThCwSl zm<%e=I3M3R_8D3cb5jY!92rCZkdePC4y~DETNlT@id_$51yjlFCSV%OU_E-kl}cBx z&X@l80=-zBhvO{E4Q4fXIR-xqXhG<(1EuY=wtsgo0{8&xqq)kbSoJ(}kz7$OFa5rO ztj!X09t*sk>>IVJNJWo0##zy`he?9*f=MGK-Yl>`V+F%4&wlr$pgxRtkv^$?@mzQ4 zw}ZQLc!OBf73BOX_P2!CShW>sR^S8$RJG|NW=rqN+o*+^JgRTS6+?K_`nndg-icRg z6hy@aDmBL*!4FK$Z|b_bspQJ5X1 z5y|U1YdNW&FexfC)w*n^Y{T5^31YnH^B#H+57j6bv3Z|{_`Aa^DY}2k5x7CnWh0z6 zLg@_6>mK>GGNw7y2fy6E$?J4>Y|mHsK*Mg^ssM2qGSEs8zXMz5iXVR?n$VtzDQ}H- zAD1dus1%Gzg1`kr>4TS)m5HkKTBVQ&%Cb}M1@(8V*(=iY9nZ5u%ip}WS~6W|F#Wvj2l_#iK1+olPSC#5CJ#i+p>PGHJd!kR?R5L2 z<{W$i)@CyaU&zmQi_CqqbIo6Xt*Tyt?%wSjjoHS{!RguL7x(o(nq8-FJnnJo8P*qL z_t0*k>KphI)HeZUA71|WCqwrn-yweQ#POG7&O~iF&|2hN-Q3WZ5(|LI9G<3_SpkY% ztd@{{@J|oTlcOAJgB*CqGZ(=muZo+i12oFa4&`YIh|A0Kc=A@PEw^{B zS2Q|rI$SnwVw;;)K7Ds=9sC5gk6$NWb!I=eR=K=BtI6O71IxUKf|}oifPRqr@Pyuw zzOfHpbb;S?;lJFp`Fvp>9$WEu`gX0m$|HT(+@xf8PP7I79Eu1Ugp&oa4M_prpXcP_ zBmUVJ?ZSoEbPf0g5e(md3CR?}WDoo=o!y9HDSN&J`J7!;cAy10RF2lrxpXMSKEm3I zpL7jz{%?4TbVKn{$~Xash|Dro={nThTnQ5U9EzFp) zM}tJaK}*xw8fKi^A1(+|h;{4)R?tlYDaNtE>Iy&W4|CNu*uOSPSVb7co!C<1a62&ns&$YAq~@S5wNT3+FFZ&zL@` zMvUiE!S7g(poJQXIN9Sb!X^?Hoq8wZ@JlcPBuwW@DQwsNnYV&$+v!p+#I@2!6_*=^ z>sLUiJFv$F=`F%F6f5!YL0C^R&YslED&3r7_ZxrY_XMjVnr$MR5z6Ru#!eE-)o9aY zXk-#Bj4KbQiOw6i&l?C9j75(cs@GQ``nZD~9OXAM0eyI1M>SxipbNdy7c^mB5KFiQ?c1SIXL* zv9@k(c)%b{|K5Ph6gz zqUL42!fqt-K9)l`q!7n8f8nHBqWqU2d1u1f*OXew;)rv4S@_k5QM)@yzP^EKbv>CV zN4QEzf^<>R5WdLg*pB2~!{sDN({hk-gLXT4GfSzJiW{~Nto)`^C4RancluE=Z%2o% zXw6?QCU>uqO0z{lUHGUiLpSk;xgHI>PYPG?h@BVz?EHANk=~J*tciIc0_+#vk+&f^ zRlShih5aAVCwRsK3(J4`LN5@^V)T>Y9`{4h$Tb{M!aFl+Hc-yvfyyQ)aTD|~0KD-H zBFI+%czo#@7iwI#^ArTWf#dk>(Z%@UQqXcW=LV0B!Z5R~I4S5nsH0eOIW};}l5TKM zkQ}RPb|Jn-bJkU(8pyy5y9(s3cxoM_tQVblN_Jy4197ap;qYnNxCV^4EF$fO?S36> zg1}pNWtq&ht`#QjU>HA!J!3WwbJQ zZ-4J%x{MQINx~WG3u4R`b?Y2c!IPKolGS`*;d=!8c6PLwK!8%nd}V**hp%7AXNSYs$=Lg$eUN`+%yG5Nyh zyK-_S$+ek5-dz+f;>6lkyysFdFP-N)t4QLYh1^lma_C8VF)vTqhd$_7ytfnAdjMg# z>I;`c?v@YsGH2@Z=W%3=(F5cqtZ^(LU1Z}R~7Bwypf4Ce>MH;iBTw= z9|F=;N*Y1K=QZ*25|Wgxb(fG*ad5sqIGis?x_T1Mc~ewp>mBLPq|jrjq}qviu_Jl0 zo~rzBrY|k}eIsLl_nRM4?6`m!?kMj{20}$<;E$3-PMqaqmCdwfvX{-u)xj8n;(Vy0 zy_7h=2ljb#kDr$a{k!(0_|9APdCiL(rE2nxbP={YVl4Xtov!l{#qyaB$G_(m0ONUV z{!gnA@&@$yXd$y<>1@VYIfHPC8b{$s60YZQHipF*~-CH%`a4ZQHhOC)20S`DVUv zs%Gk(UHixWwQ5(bjeD(UJ@-ZY6N3B1c}qV4E8OZ9swI4_gK4dl+}=n$fyaIPypa#h zHr(`n)IJwb%dT5}d_L)sQn`KuH!3drI{LP`k5BCBvm|M_eG961Q(MqP6E9_=frDX9 zRw{2RXFWe^N1ED6QR?bFz!nYnj*{v&xK>XNa)6Boj>+7hoij$drh=Y_Qjugjh@0QBh%KFPW8Drvi zqse`+k&cJYXBeKz@f_Ho$Yl4?%a@PMEBD$jR^1=CrHomUX)2|*z7dq8G#31qnHv|L z$oD746yrawxt6E0SR~#Cn%5a-_5`a!x^bk&wpY(G&}riH&ZhjH!^Vv91GXdpcf(xV zllc})?`K4tKg(-@|2)%LK9kLun6_@Z0z1EWvxELr`pk6HZMu!7p{%=|^}C6Z0rQJ| z4zbaJuGU^$<(=dx!fI%o=}_oRCi9oNtwHPD@;s8is%K=3wqWi0(39YiCiua`R19`+ z1zd7$0`oA9u~gm6yT(Yk){OzY`(x*4Vr)XzT#Eo=Fy-y{P65VG-1Qgq5kTwt#3Y5_cF{xei|sh-A{x5Ilfe8X>LX4I#Cv4ZC>WOYUcgo`~6F^hDPv^9p@Q8 zguoUsH>b{wa{69r4g*>KkI7Cb78SLJ9z8`zICFKrfE_y(91#khGlEQGOkBDXVZ-}< zhqm2gIYhDNyb?%b9v>*L*J12IUd(pLCL>CZiJO|xZJ3~!ENQu;ykGZ7L!crKbn38< zcxN@3(lbGY8qtR>k#YMv*$(Vij34ZA`_qZWv)TO99x<8q-J-Ih^h2r-#@_YK7$^vN zY4=c~KzFD_s%!>7ld`1t#0=NXNM(fG1;Q;drS2XWBWnR90AqNj%&=5uv}y>(aA6>Q z9GJrtWaxN6Hxl0&a`sTfjb$i9UuZ#}j2F^g!wvX?>=#>X3EE zPvCD5q(~imk)ct7iSk z7X*=hW-o3$Pj*uCn7MG z2zPg?*~i?b^*hmi=gC`JuwnMwk|pfjOAppA!5+!8DNv4@rs{O!c+hk z{Y21kZy$F)>^4x~s~Oyw!Q2v$?DzrcrI|x|EQ@b%wF!>(WlPnmbSu$7EjS*Yq!fN)B1@Ik2tr@TPaY+m+Envp&xhA`z`foM`>k|tlB+*eGZkl- zqSAh2d(i{CBKfAim)a7d;~i98RDMHMHDuj_?ss&_eyi9KeQpY87YAjRq_jb!+9EpD zJ8VM7M;QH5pfkem&TN-l*`mwz0+*wolUVK;x)H>EsCJRU?U2e7)qeQvDxQzeIeQ4> z;5^6!{dx4+p}WK1?iC&{PW?9b;|Jm>w)@K6j`R`*k5TfD;yJ4KYI+RVl1x?kZHww3 z@(RSi!)4;ti~i)5t|!fOL&8gi?qd=AHH#s|mH#{m+hDe9s)iY@9y69`IjlAV>^0wS zDjM;pHA8Q3&n3N=xk8RBk8gd>$=!QBk@#!$24hP<@wK}9V=KCyztDZpYHyjREj~7w ze{|o-^wIMwcARj+cHen}bU#fDj%UAWT$lD!XQRC!$`&yp70T43IN)CuZ<^J?dB-!; zUpm8_6v~vm10C=gyyzXCa)F%_$Tz?6LQ*|5q_KGe{V#gJ>Cn$!06b$t$Av|1bDq!r z;<%NQ{h#4#zjyTtKM^on_;(_BHXd(w7}3S?8x;fqkh{fpMZ1o{`D&RTr`LDIY^;hA zH4^bUFsWU=0SJlPbh=G=2Tr$9EcG-=6jTLjSUtDun|)Y z6Q|!qxI^*Yj@nuDcJl~E#xHY;s@oBKIzxBdD&s;$c3%-cZ>-6VsiZ~twlZ|u8__22)colj3A`(2J!z$X^)@Zl zO~jF+ej;2GQWDmY&v>H_jz!5O2nu$`s3kiYV?wCeE$L+p) z%t3FCP>*}g6GWj5nF;V+3C^#TFYI z{h{eAbUqxOxl857171N{>#80jb{x@Y^*Yq`P_LFHltbRkX+QJR z%IBWFxueGl-V&@R(>77@%nCB5sZ#Jo3TdlKk<1i5I-36AOo+#0-svAY#v%0-0+d60 z;xCMhS%QOKKlu+Ybf|<>s~mOtbAL{$B$ox{)QYr9y|Afb@3gq9DJ}}?Z2qyvoWAg^ zvYp#0F~QV7W@Eqw42mmS84VRP?k~6G?*(%CKKu=P?lBMpR^e9Bh)JXwMLoelo^pd0GO@^vk;Ggj=YEtE(+d;ahObMqkBZ3 zHZf(*E{0@sr^SYY1Km7M-qABuh<`X)?^#<8xr_*{BPt)FBh#%ff8F_W-;`J`ahyS# zO>qa)st`PqB<66VU0^M02X$$b*_c_EH&9>!<*ZEgN(TJ*joe;wx(<*A?hd z8kGvk><2HeqR6(bi*_w@RTo{g$Vbz<{(4|{TK(jKqwaKg$YHp|7*%FsyeP6ujRhhq zi}vuRiZF9ONxC(Yl~LHz8EX8ul=on+Gz8@|^^nW}+dm1ZcE1ky2whaCIYIcvlUdk3 zdi1K%r|Y@_>hni6f>aIBjzcjQG5#hrwDS!HVidJzQ;DhRs~T<^)ijatN08?Gfq*bS z&m;?{b>elH;fQq6Jv>qP`IN_>mQR&cd(8n?_6e#|E9dQjz-_E5-*5T<<--L665ztl z{I3!Be;?%kuI!!6>22*jEp2QJ>8%WZ8#)_1Svt7TyV%>?IMX|sI@`NC8Jjx)Z>_!m z2=czuyaxKuM*I&R2ng4IKZvZUv$LVOsWY8}lf8qflZ&OPbC#yIGBzi=FP?931P`1F z5W(b0X>^IFB`VP|1SFEMR3*V_bhEBfrhSpxb)O;iyK9>>;mrunW=T~}V6IjF0r%GC z8t6`Kf5_6Q^lrs>s-P_mK<0%t9J6*JqaGmLrs{GiskVz2(SjQ_jQ{x3vG%9p~SiHjkyozjf zS%V)49et$7U|-(rzd5sV_x)7V=|JzlkKJ1yeLWSRNc+)rrfs?FZb%cxid9-CB9nXu zt%F(ZPpw*p!G+dJlfwF!H04NbRR}{mPP0j=Ze>U9S0BF25rUUF&=hoI;MVXwT+Om3r*vQ4}<~RwTDRp@Hj)2YIu3!){7IjJ-Lcr z1M>S6>WG-ADGHTrF_RHHGGHPo)?Kxb+5Kq@`3lccZy8f6CAanF6SxJ$ci<0P!^yS< zwa?F_i1fQp52xAKR{8@4O=#c5{ZR(&blHe3Pu=f5835*?H)b@H*K z?6X#qcUfl<4yw9hj62HUabJ!*y>k{T-ftDV>b))Vw_}U>Z`P2{gO``-L=>vQKa z9x$bUI|f(%nqt2;eADwuPInyMNj^>$f>eIu5QLc~6Qx^hrk4iOp%x$f5I@5q!xN&` zDuPw<5w)8_|kz@k>%_LSz`^Z@6Sh0!1FWX~E*(Mb?pW0_0%mFceR--HSNODr<9b-Cc zDusU@ohG^!^-&pLiBW4xHo++hMO-f;VdQU-eEZtKWfyRTs~aFxM9Fc}fyMe_%*Q)> zice4LQpSEB1tK5Xqi2;((vz6#f@fA)`UgyHgzCk#n>X5*AAFr?*0IDvQ_Re%BiQdZ zr8DbkK_L}O)knvWAtkc5>ec@)k6NzFrir7b2XBNR=fJIs0N`u|pFd0;S2mzVya0 zaxdbcv22nn7Pgx;QJZs6i~y@c7fc^lOQzJ-@0or1Hs0*OR<@L$#AlEe z&|N}wm+xO*jty3%EF1PGq3V};@))VhiIMm8Bj${qEv~8!V)(VM4hs!#7 zuFrq=W^K?yu$(a2fLH`1gx(cVS`>x zGTMns;`&0Wq(jD#c0#ocz$B;xgm`mFK#&EfxYSnTEK+{`u8Sw1H~W=HaWojKCn2sl zB&c^}NcpS)n3}%y_HVp8FKOYUv@k?!gBGy~|KlGBdFzJF@}7V@cjVk%G>tWbw~8<| zlr+5&u4;F#o7+=o17?oNlILX72Ej>ab$awS?fs}Q5c<%3{m|}?0C763w{173qY~dP zh&i_Vfztykp0=)*x0PG#c8Ju!gT{9^XfsWg>3!H9v9GKpcO}$P4?ji9cDLMMKrz=O z7t&{uuF$5S`J8cyyy>H`K`dj7>bj`27gn9^P3F9U?g-qSe0jS(d2yoUAtqz#Ar_wS zRQDOf;h!(R0;S_{KuB^gKn3k0p2KoUJ;gr!f@utTdhSX0<*3viW!1CR>lvWsnRcBp z-&#ZF>HcP_xpON9AqinLFN}SL4f=;rg4HiihKZ00R7$|`Z3_x?RqVxKFwh}dOWc#c zdUsAASkDm0cs+aAAbMGwWQ8;fMj$LZ4@;oCaK$Lznk0?4u4Vl&W_9hXQNGov#U0e8 zWCw?Dir(x8k!|Iip?kA~E;HB`#jftZ4 zjH8M`mae`%quQXYHb_v5Y6po$al?bJIwLaczqyrzYzz&wI^sI0rdQ)m$8}1evl9fm zAPwz5W47J^`Vtzo90cSe4#}DRq0xjds|pM_$JFSvIv_eomxzvrg_1yOG}f8vR%j(pdyd zn)?+9flI*t%Zw`I&;wv_d~IT&VekwcRpvHFmK6LZ?a#4&*KwYgLk{RtM@uvVJXR^)}1E??1(A(9~{sCc` z@-%>3B%HUYwikl!{palFr&4Q>Cr;oaruYQI!FC_|kYQ`ZLnL10(pAub@Q4VZ4Ws$n zV2CLnp$%$Up>91i+GiF)%n04QqGT9>>=4{GP`wzRh7a$oF!|>Xk?!2y{FxptoL;<~ z*oi>UJTkfg;h{hzE3wQ~&?Ook z*Ddi3+%&I+iD#d`Eo-Bte4Jg!MM6BEk?t=j05=|pUo7H(Mu+Bjb|IZhXiFB3{Iysc zc9*WW#^OLcb7124x?U@KX{KBJM2`poQ6?~rdExY{Qk@oHq}$KrIt6@kdKZ_U82{h$ z{NK9y|GzwUwlKA^`QN0u|37K2tZvmb`%jwpVt{~f{PzL~+uJ$Y+nB1Dy1NKEnHv6= zg_}CGyUHTkm%SMoJ&;ETii9K%^RGxq00T`#B~-)@o4Cqfxf0q~W_Y7LCT5wyApfPx zszs}ESFm6xwS^^c(mxW7Ez6Bs=UuAWjg``kO-+9rKc{`_NlBWXGVHI~$6Jp-%>Axs z>95)#5m?IpY_@=^w>hG*wK8I4M9xN)o3;$~ptHkVW>rG8ZBh(1)~%5B{{~xbWrX5S z9(-iFU~u?@EnKtO6Kx0AC~wDf!^}=)OUIwOp8>zIH}r1>%jAlt_p+rwTK5F$loG5x z(xDhTzeaq?ZS+r3Iq1&a6cm_yFRCVf8`(OWMO56Lrr%3!sL zyU2{QJ8EqB#_*;)sQlQCHCA>)XR+x^bOuKbQc5@LO~sA-R5X^mUK2aoF8J=vUz=`~ zz|>mx5cPwta;6Tm9ape!=9`cJcC;~MHJ$@R`ue?a1(v!7kCedla)uI0fF#Lh`~j0+ zOTUxrmDl5AmO2fua2`d^AB&ar0tOE~maQ}ESUb4je&1~^zhZu*uuvmOeI@`rxpz1l zHO>?3>cRMaUIAK8N;|)1FVdw1mC8h7Mwh}uGX-7*Nh-;HN_SQe0yUmG1)L~)u+h>F z6HQ<6ys*Bo4Z`q0lkpnjG4ZqLQY87e@GysLn&M2TPqg)*8wa&OKD(Hom2_0w6+2`M zPHES%)x?28Xk?Xv;3Pz)rL|58Q&ab0U+0cSN)sl?LHpA1z-kNSB<9BcJ582ztV5!uS>GY>azPI!ZzZ<`Ve|`G_f4H~TFl30#M1U+f~; z5|QCvJICw*RpyA*B71(^{ zCaMdLNvSIs4Mr7Al^liKpfH?&Pu}DC-f5{PN4A5S%pLI>`=w_<|0XXWR^|f@KjQ`a zOD@N>-(F6IX@Hj>5KdhV?POqy4rbK1700xNbH6hxaXE?ZHt%cJS_6$TaoLXjp#7hh?Qyr3nDKwH_7KvNaXr1qtEBv@*3c{DLzXR;k5$UZ2N^@wIsS zfY#PeBuKJXo+o%}BgPs;JdSrKk>pMecF}d?*)TdwnbE|5Y+WaW>YAbj+#N7@;_E)7 z?C)ZrL{`a@iF1Rx>M~kpH0NJz-AePF-&9G$&T^KPk>bni(RL0KayWhly3(1m!!W}G z(<_24F`si%`n)@Yq;G$E!DzXT#v_bFWQggeJ?W>T3Qg9=qg_82KlQw&kkypdzV2H1 zht94z1=&KM=j|@o!J8@zvXTxxDon+lsf&D$G~<^{GOqqsbVIle7zP%$dhDo?H|qvi zgx1hWiP`2=lmY=8#jT37tA^ujrqxF+4v$)%I`z(ELfD0S@B5DY`pGbAY_(4HrV8MD zcNI2us#FidMsK z_IW>vIk93x%te>Q8}j6GiG{*RZSzul(EMy^4)bdg;I)_JU%h;A_IMjb_{S+# zc^maD&#@VMYn9@MOeDu<8wOF|K2Xp2GmUHyGsazK#t!q_YL8%8$!7tYd}vQgHg9_}PPKKXQ$ms|fX?McA=`ANWdJ4P_|@BR}(q~bwp z_p>X)kd2K4?-`hDx}*y+OGF6slp?*9%fVk;^f}X)dDKJKLp69R4tk@LySya;`LQz8 zGPhg{L1P%=Qk`fwL@U^x!v}(D=3uUbSS>}pYYO7=Kgt{?iS7Z6br<=vS59N9A9 zdmn4kGdRV$fbD(t-O{w6c?USTVz;T>&*_4??c>XOk8d6)4oGZAy3(oRGsqW0x*pP& zU+WwwD4wH^#NUPu*2Z?z0B3Fwk#J*9VuFywFyo|#l?KLhk73a=XVEN={U?KlzK2eW z+__LXOz~u0R;HiW&jwK_+&g@8nzFLuY*&3Nv=oP$NYTCH`yEX3h8-`)7*rB7Bi}y> zWqOZkbJF@qs%Zr}M3Gn1X%bP3!qk;GWZ>AMhHh@mv275#hXe3Y4oDdsDdp++Uz2&d zGo|!@;PYD*8=;u(Sy8#e=bOU9*CkWAF}GC}N;c2BtT)CZ5M$7POS+suak1NyU_@_@ zx|DM zh2q7e=&K>eI`(`ux%S;9^0boF<=+0oWwyNR*lK;z>rp!x@hgM$m3d3H;(qI~jZGf; zT?#K_7unUk&6bsRBaFyR`tp*5JxHQdZM!I~@vk^MXM;K_YQdrs^V# z(24t?BM^IGV|xejwvNRry|gl2P^%Dw(a5ViV`q`Z#sR7@C%kT06pk&K?rovi?Fhg| zh_D0q&>lkeg;B$k0hdx*^k&owx2F4ZP3Dy;>c-^3=5R}UYOOmy@vd)XFr)(#p2-CN z0H$wRCf;tPc&jIz{JvvHAo&eK_5ozC@(X*m;-I@)@-Al=8Gp6d9{8d^MlvFOsinK- zWG{6Ycy$?po-$)cmE0iqnRiDiUB9*!^Ol@SJ3y7Z?m^cKU*SgmoEugnaOLPiCWX0+Q(;N-G~M?%*%&Y!yv;`TFJ%VF z*!@0sW79abDQWw<(``EQyC4HcmvnviaMLYc;yKvDo-leuECUk$F>AWyYEVYfkKkJx zWYDr~1*Tkt<&JP(@&X07LixKobyHv|OTFjoiDbP*fwtivw@i35j#8tJp7y$+l9#K2GXN-Jq#2TD!IfD&DXnz$IpQ0s}rvFtVD6L9?3I3{ZL}Axd-$%M$ zFUE`=1Vcp={3!?pLxqIT?ifbA{}1V=@&OEPBL`B-3oS8jnqcL zEHuFxP}dnV&=;*u_^9A)oZJ}@V}3}z5FqF;LC*xx{snxVZ6L)nw8Mo4e>;2^WzsVj zJS~!%k0gr>#GbLERZaIr9Q+1Xg*W9~=sTJ;8q*0+Gc1Jvbf$%C9&+I&qR~*iR#|jS z#)ldQe%GGV9p3K}UlaeSKt$A~EAp8zNFlUP2Ie&%zPC6{mWOmSN|8TOSh;K4e#>Fa zJ;TTM_USK6Qx~81GPIoJ#%_S1jw&Ey0WZid@-70MLXE0kAk=i+1;rh2!Kakx(ugm_ zBOHPqk}Z}jEO0wjfR<5tv0QPP6>!pWY9nKC1lvigQcgYee2IO`nd${v06bBHKSgXP zcHOh<2V|*|$208ztAvCC`Hu?l3XnxY^)Ic85Fj9I|MS%Tm#2G{^12*~BC4+W+T3qU za3qCRioHtOzFZ%~qvNXvlP4nq3>&tP@ZC~%N2ux4Knc1)|7JvcSY;~e6?i2%8ISSXXh5xLF*q;s^ ziM_uFV5u%TLkh_Kk~&Bd!B6!L3(d3v0e_F_Gs?G|PdQRvM?8(dN%gCO%}zYz3?QhR z_R~D3;dzF$BmRc`JVU2Gthc{j)wrtT#Cn_4#Z&fMG1q8g>Y#EUyyquc#R_oW z(yjvsM9ei_tEpkw`i*J1jLfM#NTo0vza~t_GvZZ^2<%+YEtvUWm6@Q(VrZ+&|rmf zP^vF6!p{@+2I*J#6Ur^BEJg4kF)ey2!QN*`X5NltuvcQuz|xcPF#H@-_jNE!A|-g)1c2G z{k$Z@)_!4|Kr&%eE8Ovf&_axNMZ>>H*`>I>SRLffB|57rz3IV0m{neBb~#C{RfLHc1y4VUxG`o)oz5lf z<4>f%e;mFzU<(ov&Ab4`e!?E~cj+#AKM-Blx-R$yFp6uOul8iiuV{0pgBKXgTA-Kq z%{9%shyp0@CiBD#-LwXuzCi!aw=ZGGlg8m6=g8vMe}i-MpA8&QyWf^h_I9?Wb}s+* zT~)Jm!(PPl9num@7?ws|A7B}ftO+O4M$atz#ZU-NKiI3Lbiv_j0c-3*B#${A28=g` zTti+1rJcdGI1yvtAhpc`X%dDBpx@2>3j7NH3h=df-dLSVancTW$3z9CLAm~&}ar@3fQ?o11?&% zNNAefsHkFN_aY=oZ`ohnba>kmJDQnj)Ui*Q1|MdbG~38I+vx4nuxqf;9bwlbH@Y1p z`-eZD4DL#VDkQG>&x{+zE8ItIH#L_!O6 zZM_0;LURxORG(6qG_q5$$Sr#rNRZU2(u7uom@|tNqzI{A?rxxGPV#mld}YO zBj6<^UkdTPc1Q(Mut$4XaA^lpn-hrb>Z%7ztKvo){)F8bo zZno7AR9etMbkoZ!w$P^1&G+tWbgh@Ds^Ko4uRr;0D{V)VfGYgy6kf1yZzDZ|p)-z- zr|Jp`CFD%?h$E$I?S@@8PhPU|kV}64Beq7v#*9IPoixfN^IXsthSn2NqZAA$c>c*U2cQXfTW8Px|Hs`M$a~`A+h2`9E|*= zqIs7x%u! zfa*4ZJI~b0eg~8>jM>#m`a<=?@J0WD@eO7-{m|;QztM(%x6{y`kh09Tq~Zw7hw%+% zN5dH+X7a7xp{1dI0sAW1k$v!S!qKT2yRFj-~U$OyGtaVI2x@c^rdWVSjG+X+653490Ne1pDZ`qoQ@!z?k>y;QP z!c`yLCh_s2a@cCEFuysfXiM01LV*ABwH=I2marBsD(IIOudUS0K*GM&eZ~6UVM4%k z!ttgn8YFF7YYQnIZ>cRD1I&<)HSsFB-P~-nUOO%K?MM9Ruy_p4_Syia2`4sAs-(XDhrCzkO;|>Je$FgUV?G>tq_O3K z3$0w6N|t3(_Fi;-?6S;_QOCcXf&uCxzN|ZRU#o(xG2vu#Z@j;{#RgV^*N4wOA6mIO zVB5e6Q4xMIX(c^zn>SmLR3uVU+*{Lz7+tY_musp%YlSMET#}jaf2?yS|8oS97aS7X zpasH>5W|97@Qv$B)*J0!^IL!N)ZXJ8k1kT4uuyL}&8|T`iq(caK@6#UywjRuky4xa z0YUks`CbfODZAR`cuiqvF;5IypxewHqY)5p83WW7Eo>iZ-W$iG!HK0oxvi`-U+i7X zVT-^o?Yg~u4J&wQ%VeJGchs}4sQR|JM0S5w7h?Q`dEIE%si#DaqYpT3rflEcR)n{KJ^K(Q?Wp!)xY)`* z!{cQZX>*wLG?`bsT2QC=6IId#6<7Uvi|Zi~pQ`L>r3{rq?ye?)FPsfkv)dDZ3$g$W z9sXe68fy?2aF8}o5M4fy+H{kT!Mt68=N~lp(hJL-EbK!ttK7a=??uZs{M&BO&C(p9 zOEl^oxK)46U%S7@s`g@@9e27MnwUExRLold`BJ4x&?W(ePU&BCOm@;7{>(hf^7X&6 zZ*%b~FdyOj>MP9wLdj;&$rf^Ond>ROX8OX3o$!1k_h(9`Dk#)q zCrP}edL&I^l#L8t(^vK+#=N1>i$n2xm1G4^eU{ltk3i%B2}hKisSQvkY#OT3Q6f+)Fz04YQ%XvunK67^AM;F&+Q7o%^^Xk4ksP?aaeX_irZ% z4?p(pktY1>nO5S>&q(4*d3LQ-iU!|2iDPyxU*9_*=eyepuW6Ka#4+bFINmXZc~;Io z%>R?(|CnFvU@y-M`nSA>Bm)9M|369beMWg_HAZ=(UE`va?V{TH z+j;dz_icQ;Cw#RlbLJ&ggT-hkq>o zL8!OMO+VioDSv{n_KPBZx-FUgvmyfj?ml^|@X_zIjZ@R+ROil%XQ%kouhTE7{I(B{ z!9T$1J87peOegUy_3rM*`M!R9&kXbL;d{NJd3=d1bx?IK7d$Il>OJ31zZ}oK2eWiP z++zQ$_HT+V?otds8&kK@m;Ck*-As;jJv^olo}Dep{B{nv(?1O9CU>`iA71o+Bn1DW zAqHNdB=SEhR!W@0eC3bky#BKh9Ub;Nnl60p8`n?&z`&h>Cy4{*RrK%&Rbtd% zJE)e+KXQc*4`(E)w##7-3TISA`J~GHW7*0DnV2}l(aH&n0B8B|A5Z{Rne<%5_b#f= zT|HJ%nzDF3RibIdBEV(7^D7el^c|DRH?u0$KBUC8z-e@E1AuO1INd7q!X>VB$V(Nd zE*m!+r=AR}6RfT(v{fdhCYQ9;JBMRbCaLFI5_`8`$miOUPBV!#hjXf|tg<2=E2MTJ zn{1XI%k>JYEc-mGTc$OGN7^r*VHLt-F2yWez>IyqfTKJ)2+As-ZY-l}dtS-Ox@4xNU1(Fy+&-GB4Uy}Ase zwDM+F_@gEj|4-E-bP?CAIDL6y0jK6t1?oY0LAXTy+W7KVy@>YciPjbw_{5a8MrQ$PE&I070ZTx#!GG|+w zWH}Oc#^_2}l4Tj4R1V&y4IH4ml!*_?Vq8>X0Xbb%f$@1hbHeCIQK`(9Mh9J1l-Lp@ z+A_?-fQFHgY)2uhEj$;;0>_9~HndhHa@3+uFEX@EWFQLxU#; z0>5@XKUxL_JDs?6L1Tt}smR_2(Z_f`T*TSR#>%##)#IY$Xy8nOSvkJZ)|sTsY>!5h zMtjLNqIg+sz80d0@qIv}7+)saQb>$7QIX9ME74l*FXNbs0(PW0MpKnGt}I=2h24-u zF54^!P@KS{WBpGRi^#ajR*nYiD$2i;woY(At?sKQugAs3*t6`{UjQ3Z@)aU73Dm1h z-X~!ew&gGEnU+bi^I*#l5Ov1Z{diZ!8?KWexLV=%+84mYk=XvZ@u-NmE(?MY0$v!; z(L=>AHio4>mp5P2`R$HEdByPs85oR8KGL#Z8zOtP>R(HO+}qi<$H6XPIdqYq7&DF;y z5-kv}LjEn>53I8DKVX5=1%D-R%xad4I*B7AdV|C`KvF0?|GY3Ou)!qL#=~ov4CP~+ zoe-Z&HVy61{$m#0Bg4~}vvs0#Kg7DC;64B|HPfY2|fRXkaw*BNIi2tD6oV)-SR$L$^t%$VB? z7Uzy*%H98+L#jtp8^Ehk{Cs0Dan>M`5bv7CWQ)wuFoaMp*54+k*~OUBWRxc@#6D!G zhlybrHpj4qEcu61zkf{vInDv5hkSmR6ud)Ki#Uj(Qx1z;_jl zByvE|%;+@B%3X;~0wP@|%#OubBnGsC8~kM9aZFmrl=|mFr=AkUN)?%YLK#E{?ZtAn zsr!r{Im!*&>N!ohR;CP#$e>rIQVQva8P*t8?FCzsj|=DqJMjg=SdXnTAvt52a$I&P z!2Q~!u8|b?^3dJMh_~R~z?zrd|F>S83SDFD@<4!urDFx@SthR}X}fy6meF1!SxV&# z`wK>;Q-?ZVdr9hjMY$#;WKnHfW2q!gD3>AG!gi8Og)^qZD7M)g^ugMx$WXQn%GjIh z^R`@;_I}K~`X2oKe7KC3D^oL~jSoT_GCf~m1^@X7jwU0aHjY~%dpHj-N6i}NfwsV{ zh3B55w3TV7T1%&4rx?=6{_NESX|tiN^~b`Rg?ID|n4Oct%9rkxx$`rPiT23^U4T&I z@uHz+?Grg?Za$f5YnoAbNsJc|_LY9I0WT?dv!Vk_@pi7Lg(B0H(`;pS4Q)|DQ(vfV z?}o(o#c?~ZdbG>ZQ#Vp$hGv1{cQmtdhH4ff-A{kj+R1-;pWl)ZbjV>x4Wq>Tg z7NYg$3|7;*UaFQdu?>-+yy%iaBoK@#^fUJnBvTF6!kB zxpFk5q;OJa{8n`ov|DS~t+)MxzSIqR=Ve#tU&AgCXy8r!uL3D ze=5xXncOAtfnURo2b%z0DjIzN>X~67a87Q1!&6$vE zyuNM)9phr5uPbovLOr#d`r}NhaaCpezPx;4(HF0mIJnyS;{h^WT9V(X_D;0BO-(n{ zTcJc_IbBM9aH)|+Jb2s=q$}9|vHW~d6us;V#i6@Ra5D@?P(hTvsfSw>yIe_2RF%sW zYjOJSa1D$6(<;(NX=a!R2?so%4^;J5q^(R+Mt-C%tMqqFr=lf^UiwT-8%q|2Yl1SI zaajZRaY`%vs0JXbQ4x}g=ywd|j*6{A!{_0?uWMo(@HFh30S%+Rbx`Hkk*!s^{-#_G zlk8buH%9#4ZQYCocu(Hv!IeznH~btEI*h4X+L>H;oAkxGoolTAX8BtD;T8F&kYnez z&|LME@^i-7k8aPnRjwkia>$^v&;k$4TNxPvbu1&P8_3ua@y`d=&&pK(8e~+>y2VfyWg#?i zfCAyo?MS|JzVYhcBS2n#SD1uina2iwS4$or-VC&ck29>t3Knit#Yj5+T&{nvZQG4j zu%Ex#a{i#SO_vQ!(|K-Bli$MdPbcUlWqeqru0?aKa*yg5hnq6bzkE`yjK$jE8@*~$ zYCLGlt~irw9w}jw-DOf(iy$hv#qUdOPP=;JMI3GsP`G#!oZxycPbXWP@G^+w&%A>% zH($L^#0TokXkxo8L#VbvJeOaW!^%8%=y&Gop{h5Fr>Dw1*6Dxxr@k&C7QV*6F)AN+ zC+i4LWj@?nS}ahXMd;nKX?I<#^CR7RsP^?*&wZ$LBH#o6AtcIkN^{;9=|!4&?}1-N z2h9_OvFb0RF?!cY>2Zqufzg+zpL#z>m|tqOj$bFh6S-@@eD6gS=PzP zS=RU?EO@2ACM2>zf+g{QwBNf}1c$r?qZZ1{Q_up-B#1{R z_i*?n*%rhd*tYrUUQ^Bcy*-;#;6oFTt@<{O@2n(OHbZnc6G(X7Pqfl?8TcJz0pPMcVb%0s)RK7C1H zqP?w^eUoI<+Ogb|Qm3jPXTl`fov6=nNaC0ZGe}*55MV_0txMS;bHps`f<9c!oUlL7 zWaF+!>Ji?P`C>6cP9yV)61`q$kn2hFCpI6Qon*Bm&=qW9JqfoQ#FIMxsrJn7q23Dv zCPV3zV#Im0FkOeqQWLU9m$pdT(JaMvI}6*?i5x}36nHi*Xo8mjj?~IKX(2if@cqG{HryhB|KV48@d*|;g*LdFvfuC$O#LSh)Y=56+w?WwaK|`Lq z46bo`on4dXvNTN_Z%p5arHH_bip;v(a0v)|w}Kv|em%I#vSV>LZ*HP#QoL0|v*BB5 z<4FF6XiR3SvN3=?Y;uoL?dUpB zM6bn|YpqfaH$X=`W_D@J)?COcTyy`;+-ug%pMz?&#sslNyUva%)^wftYCeN&hwOp|4I**3du+g-M8 z+je!?wr$&Xmu>Sc+uE9)Z)SJq>fhPtiL1QLjL6IrC(db#a1}WqXJKg>Tb5uGx%XU! zY&f9EX}X{btFDK<)h5Q*h<@?{`b~dQOt*gQN3d#I`CJ;~!M*u$^Q*^nwEaYsmsywE z_LG;orj+axFbyl=x^00!hUzHW)6yaZ*8`4%O2S8_;AsOj&w&tehDh#e;zx(9bTUB|E%p%O1^c6O z?CTe=0Qd~rD+%J^482EykFb>Op7gAy*>>?Z;FIgV+NWFe>g*W&@vh~b;BU|NNr|dW zU)`r6&rwo`?y)tuN6t)%*;i%l>E!^#6E_5vP1q}A4RBld@JX~G!DtXZp$p@%d+NXr> z>gcgS)$hX;S9uv8muqLa%Uiq+ULLNPTQhyIDKBu-ZY}sVc5DAO5cZ(_i@e(zWFwc@ zp4uJtu?jYz7w3oS-~8HLTykovSCA-+iy3~uwY%8pORKwQkTD{cU{DGkz=CrpAz_5i zpkV|vup#mvz=I1Wp(B51;A5z_{8GBXNa_><^^?zHZvV8WG$(@>*}zr8IxPfl2mIEz znCO?&vmyZ-@gpt>fLoK^&nc{z(*uH_p5Lz~qgWVlfrvz=31W{a04pzP02pz`sLYvY z2rnBPxL6c|Q%J0ribs$bF`S1QchH=IgGH@*+7Ypd%5_y}KXkc13a$WmnJY*czL~&juCRja1j^&q(>r-e z8Q}C_3o(8AgScr>z|RuFN%D|%c{r8=D+?*Cu^=@91#*W%JFqR|5+uX=iWQPmYPcj- zln$Y=EapQX^o1vJ-K*K3b>~0AaGB$?9bhJMb5$aLC$bYK{S!b?z6eE->W0{^I>KZ@ z1J$>=6$!oC+shq9yq12o&d23AHC7TU+`qE_%dF%NwY@>Z_U>DxN8)RQ)n83!-Z?N z$7V9vpx?U3nI&el^Zwz-W;)pJR4((K)&zCK;?TX^wwf61VAJW^xkqxG{?QBa!fxgH zT8+B=x4H#Su7P2HdJ($w6x=Fqu9Z=DcI9gAh^f+n#yTF9Bz$Oh<$D=H(=jHCG;%~O zc}Z4q`oZ;7T*mi-?WY!7?wN;Y=fMpI+@`8mPP&oLC$9<(U3aO2v{Bb=1}Cuud5@b5t;aU0psVLgOxw;?^a%*65O;J$YB`OIhv2{Yq=!8lPL-~q9S z+A%aT1e*9^?VbunfQfoG;9g9+G_tKP=^z?0qP@3~iyd;qy|>a=&T)j@nk)Aq;hEwyyMJp)L&Z^mOKln#&yzKsY-ivnq?Ft z0Ic$l511h2J-A&*i}HZ%oD`yZcQOdnfiu6p{BWxUHfJX0jUJgJ#sine1KAoez2;fo z^{gIv(h9k1W8DrgW@&ZqYl%5_sQ$6N5BM=z6+)_?BT)^st=Rh{bZ&h^v%wqKgTvd( z^?9vTnfTmLbW6eM2U)(gDstEN>gZ&EJ-Jg0PS}?Xq?^)^#X_qRJ6ja}mca>i zdFFw8JI)s2_!wbyPH?*qGIcP-|1EJo00rm7*1oW3DDD$Y^HpaDRlEa0Dd&iR59h_f zy&87%eVLbOfm{2-kT?3UL7vt^E{(9=4)WvCDi5uJBY5< zpjE8{sjFa6pBK*e3-{$`VNImski+d5Qx*9O5BZ7j^7rvi%j;mnLc*=V`tIrJ*Qz~Y zY{-x>CZ6YhTl5YIa#GMF%$a{r;J|_Xd{XSZY<>(@qUXImnZ0l|{1J}O9v4WfRYFs7^YK;!Qc@V2??oDdy ztJ@Sx@?z3@r(sUB4Ql9&D!x(S47M%d><&o2$!d(h%4hLnW4Ys57`t#H-4;E*19rmX z6H~ntTo{I*-+YJQ8C?h1Z^_8s88(LG5&Q)c;$eFN1A<+J0?UPZLK0zN+vL9K`Y6&}}%>VVsbKm&9RG$Mqzj^Lq!Xcj#zk@Z+l}0nNI2YpFGnyI%mn2FM;V> zUD~D~QvmhT59i?bMt*^|wa{7~YPkhx8af1i zSA1ZQj0Bx|JaIB2SJAeFB1v8f&I3n#KCI{hET0oyRPs}T$Ce|IYB&*$m#jwCbI*<* z##)pd9)1r$dSOubf1F-a{b2(Z@tc6USaH+EfO!V#-1da=kF98K`^JvOZ2b zYCkuqGJkY_6oub7#^?wbEh9(2<2Hqb2O;SZ$$Et{e<0ffO&E~rwhv4JsHmLqyqfHa z=Zl#7X@yV^VqE2_Ww54yI9BIk3y-ky_Pu`j^{$4{ zea%PcW!@9Wgg-K#nL)k84wOd*Xip(OW@zuul5#)En<|J|ijT~w{QV@2Mt8h#Ew%V4 zolK_mNvyqGLZ~|4yM7xfNgCsru{Rr{pjLW}s$Sa8ujrg7ya?-ErV*D^j{H1mrL;Md zQl7xSIObCtj}4J`T3D&HSz6YsC?&ds&>dIzD!4t>|;Z0r?PgEmnJj_<@9SmWF5IbRBe2 zpqMl2RyjVn%xPGKWMfo;IbEz`ys_-{VA)|Qj3IrOdS~dR(*flo%ZZ8cL6g{dI>E;s zd^0^x2u$0PoDOiAyWYR$a`Ok^Jfm`uob)(&vHL9==fbmFQA>6S@pc}@#R-t{l|?lY zYzI_(q%0(H0cP?psurev|`ww#?J}VHFb4 zlZH*I?EWO)=;+Mq+}(KW(*3*co!}VI&2s?z`a8{tQ%BsoS;FODvEs6zY^V)B=mS&k zQ+u})W~Nhn_Z{z9@3Y#j&-(xp?OXsY9QP95<54c}`o`BvYoYt;ESG}FWO(!=DAWR< zKPN|#i>Ba@14W}kcs`zN`V?Mv={9^ES-HPJqR6dJBey(K$~DkOw-6uE#vp@*=w*G} z^bg)~8QxqXeX?T$w44|_M*>(?bfN<-3B!eNU!#a{ZIP1%+*@Dtt#1fD{?yo*!$wW8*E z=u`XGI1hgv)zMKUvaX8keE7xr`?xjXoQlo+B#-RRG93dIx(3mYRL4astx}({p;Kqt zp=Y;9*}-R{NL52GxMB2C-P^EJ*yvI=j^eGo)>qh)g$}P^583q(G|JzsdcOiRq0c_! z4|-Cvflg=(*j|*3FnLE4+AuF^!Q)|WIPW{X%3)OpORZO9s%SAQ)bX1gu7VkX!upPnM zLVmZo|Acsd1e7nbG0T3y(0vlA2DXmLE$F$G{w2>()mIq1o&zHanPPM};Vy`!WxfR%aMQ5>X-rGUu0a4e zifWn!Wo!vO7-R%*D>Ad8Uu>vMU|0HXI_IT0kToB&G3 zW|L$+O3jW@f5cTHj!(44p#@%p?c7V>g6;GV9q-8<2FEt<&8)eU_nom%?`hX`V)CrH z01T1I`u8`iV6 z?3F4EFoF@L<%rZ0iFJtDRkDiAjT;tQ2qICkiOjEMNH@VKQnJMP?L6$)IEMjljxRJh z?6zhmWoJViZqAz%Mm#suDLj*)&3db@@%>JyVfxxq;K-P^rxjJJ;r6wpNdpl~YbnlJ zsxmhvy?O0kE(N(!PBfG%?HcdUPlCmLT5*JZEUIaHXDicQRNiHgJ zpe;8WrroHS%x6mT^@*5GkS$p*NsF`BRvjhcIxG0#qK@N+*L01b=k^oy2F}A?^{+HD zd+i8R`s*GFqH#vIrPEbzNGIoR=E&6~!x1cGuGrKEd`-YnIGUmvvN`Z37#Cfes!j0E0r6J^@TO|}-?`Q_ zw7abCDZAIYQFw&jfb%s4gA};{Bl98~Qp zZ$0*+=69DJ)+nV94)BIT#VXm0WS;jM=A>joV&9-)-w?;SL{Um9HXil}$HI<d+E^gf=O92TC^rz@QFf|ZQckfHIS0io#cQm&9z7{+!&r64=!?A~(m zN;t2%+(O7ltZbBBvewFubM|}zEB!7#dz{^~!}myul#2_Uh|{g;7>jw~@!?q{u_I>+ zd}qC^)rBifCLPpNS2w54Y4Sqk_%;nq7 zQV+(kdTY`L*rIu!qb}R-YFg`(SBv8$!&i5dqqV)&@t~a6_qHZ%3~OVywa3`b`@0s% zZIoAOTyNU!Yvx*Kkh6hk^~BQ2Yzu_e+H738N&Bur6uE|o0P5taa=R0*>RIX#W+axC zZZRvGBO*PFK<%V2wKZaHn-q;L(oS*fc@Q=>#T1>BhMoW)mAaPX-Ks4Y@2$nL&ZR>= zU*P|h(34vW0X7Kq<3|t3zs$OpQ2b}^{Xc12ikjcFEexJ{S{j=1D*tdbVd_?zBIs~* zn+FAEiZTS6cr#}E4wwtpakxt>(08)#=N+c7SG|8HZ$)lX!}1S6TOVbtzf8FvO`Kox z@%gM&nif5#?HtzAXf^} zV{;h_AAP1_GVft4zV7M*%!JUNRBUCp%%WOBvMauOD;zBJ&S2=kRHdSqFHi{;W*jU`1z0aah~viOk8VoQA?Q4fqBU_8C=^S7z+ppntB zcq~nwQ(&Urx*MAw1`9PwkF(!vk6gV5Bj1Zp4yzw_`S#R=s)bToT7sWLp-)=^kMeB>1hs@xF4)#*NuFS>*CQeS5Th|!+< zRIR^0n(*?>%{PP-k6-}7TmqM*l3q)#=-xujOG75GET=a zqxC!(A^vT*tqgR7tO3S3;Z>$SwF;Ww@{<4I6HK%F|4@r>=} zk+UK5&=2_vV-~02xjyn10gc0U(IUb^0C-|YzFr5#ZNwLm28dwtVF=*PVfvvvQSwt! zfn=kQgk2;NE-l^Aj)>R8GS+!5c{!PgYA*VL#gHw`Ec=q&&40SKBoQH^dUdYIs|e0gfPhL8Jq%i z#MR*b{QR$3VG}QGn(@tK-2cuD=6{Xm_J6X1@ju9n<1(5I2t1^84xV}3667>BglIoO z;H=g~$_Xjug*OYKEECki;tUHc1#`D&ANkr#HJtmv?+XwNk&CpI#OjP?z; z9p6e|P0JGPux}KoiomJh12YiQc&0fYc%p7hMPuWED1Jtr->dfwtHAsJa zt$%8(YPqE`9F+F~v_Q=DJvyEDJ8@(JqHJOP>iyFi*cA!lFmE5`X5ih0jk<0{Dx??6 zA?g?3W9p<){VFwx+5tpJePArc??GP(>ON9Z1aY8B1Lqao_}R@YCl{5OW)02twT?B# z^)-u%*!fCti@Yw`^|iP9s>fkj?{mH!UKsr3 zIGq4`5y4i;q0Q%3f7#M&!yX(T1!0hL=)a;Ck-To!qfdVNgQ{rs^F< z%6xX>j1U3#N&~h>s^`dXObqmi5L7SL!0Djt7X&=W-C2a_!0RA{ZjAmE0XM0>6hSww zA;NRj8<1?6T`B@E<-TPl=KV8=`$TG4=wUV#FGb-Dh>zrO7cWiLZA9^H)VgiOYj4yF zITT5s+?^20slJ$lqY=vNK3SueGXI=1HL_RUh@A0TXw;s;n!w9tN}qsjsCzCyAG#TQ zkk9TL{kV*rzPeKzOx*2Gw&vFCkVZrANuP?lQzJoVef{zrpr)|p50CabPQ2~N< zBtqTLcS=z5(s%)a;cpvKr6db+#j@yrs6{Fi0-@Vr>(jK0;4HSP4ZUSjAZO%LBo*2# z0EcNuHU)-Xkf7*MiOZx%=8ojKUZUOf;cJpdhIx}UE7LF*uZ(FhM8n3uxAjYxiA`yh z<|WcV@(>|L5$_OnRV0Jnxg+aJu#DQO;i{mu`k4h&!t8n=b58vvV##D(rBpW!pOq1# zb(jRDNnx>8c7GN<04qy|#}*18>(OZ3NR_Jskj`sM^;@dzES z{6_qRSIxR0wW&ptrN6>0K_0=-lwBkvdIP4tKEj5f3C=2Qc_>&8R`$LXn^}f7b)8*R z8dH`t^{P`OwZ4ckf@hRgUIZORf>gi%*t)gHS|ckO&d6920i}Ad>sjT%J#w1$g0Mvt zfCyk^DYhfTI;ofC`!SGwK@0_VRic%tr$uDVNwUG|H;!N-!uXm!mj(UAb&f{RSvsg@ zRL>`?6xaj-$p%kAJcx&ZQD4;$L7>9FukPNh1xXUJIc7BY&4SqcxD?LGP5>;QQG}e8 zPuD)Fxh#nx9}RW&o_c1n?n@9IH(J}tbAq}s`99i_M|o2S7^=fLT}omS`IGzU0h@l& zu}=I-l1|}vFqfHT^jotK9dPR9-Qox97lC-Z?irG>|LhFCdpDF*^*Z-t|Z? z-i0z^wkSNQ)a&U}KV&|U-a8>3u^3bH&?vx+6k(z$o~7oLE?C8wHG^9zqA5|}p@yp= zoZwbhjC(t4C6*03&UXP?sjSwTszt`+$zi)SSkj6*l1GMKXSF)2EVeP3zp6KvkV@WY zv?#0GWyu#jcs4jB1n8?aHa9!yJ6|#t1&sPR&G_%Lmc~`EFTUP)7Fy;m+Z76ub4_Ti zt!1Pjk27!}W68vh4eo&i9a%Q|qCtH%Uc)~aJBiLk?kh9}4owMTWzqI=1fW@>l#pm$ zk%>D9%zsfi>#tB-C6CSJ&oUY~rsR02F2@RAvMY~4i61nYJCQa~HEI>0HYyY}m>re{ z`?LvEFmq<8SUSN~E0zitur#U^IGSe(9Gf?0vzj%=Az@kP%S5q4JMjv-k?0i7j5D9c zb6*xiGphkT$kDmB?i2OY)tbgM2IVFSc=?HFno)^*_rGP9zB;T z|7F30DX$V=wJ6=j2o&UE)|gOCk+=XLgzOv2KUkpD7SGeh()LFT(y5*;`o@e)l8h}o zq|Ia&ix&+Y5Dx~;51pNqx4dI4LSRa!n?+#Ocl|ktbPiW5AC*{D1P?AbS!}Q8_1CGr z6U-g&>a9%H5o$8cK$s>{Gu&9~gTbUmtkYlgEw7dkiH@@zx|1Jn1Cwy;9Bkl^RlBp3 z9z6=;9yx7{9OO7ynJEm?E@2#VTnJ{vX7Ko$5CxU8s!Qf=6cgQ#R?engQ2tN|`qri@ zN4My^Zq>b<+>T`#_ErNXG1aL|ZyOF`$h7j5xi?7AxfQ>yNmnV7EnZS%?M&W@1^>n;z)>wWc8IZ0RU9arms2t62y3v2TXK&`@q%(gDiI{wi>781 zt4g>J_Zem2n!Ah?9O2+$NN$y$pN){32dP^*=D_~hfb~1Qoj|GQ;H}^rn>>TmVdsAS z6I6gSkRc;_zkph_R?R$=(6%{|aVd5Y(=i2SXW%MsN;m#ly&=}O8;a3BXnrFp_Ne1( z1b4ur!?drg-qt`Du}(Q{+1AM${lVbg=LK05Da|oVoFTLR7^|(f^f!cN>M0NTmdC6! zKiBkjq$#hegYG!G)&w%9INaK9Um7#MG)!m_4sAiSb(y{)Ic4Fl(^XVNaU?zS8)8ag zRDOna{gI}c%>zdklOkYDa9^~sN_;p;O0;FA5a$%2-Q^*JA0HUkS>>ipsUg-=84#Vu zfIE*MiXt+{oraIfs)s%N%T>a9aEvS9GRtawE7?zfeeLYyx8mwRmk95)e@qTibNh6R zDm(04uB2N6kB9YQI~N1FvM1)z-SqV)H(l}0h*Y6IeJ6M?3d{{Y{3PuJaNXM>L2%E{ z;oTSCW!39T%;Ni-Wh)*fvExk3O;kGI5ZTFV3A|JNs4&wBgZ1bhZ(M=*TA@_$tfOGW zNF3Sf>->vkeq~zW?d$G5;Vz0g+p;o!zEnq^;F0P?Sw3qH;8Yt=z2AwLoFer|O1vM{ zw#6M_V8Icx`<2#auMsWL(HN{TAj+#?14L+OdzrO@S8=)w^N$jha)$eLB9`0ot8?GXH#JH{7# z^#=ayYnxkO0u&KHJ3nG45`v{jlo6qJo;`S2$f|;UlF6-3NTwkbaeotLtE_FfSwGNX zI0TZOFphPWJOUKuOf^#5NQ47D^6n)kBuPDSL=#a~XNOqDRb5jsi;nL~VaQKvjW(wy zXO?8xNGoiOIW&)KW~iFADu1krY6CMOAhpKp_h>}DfT4p|VGdJ+F>o9Gs-|7p9g14# zkrF_PeS}~FC)+rniBb+(JSs72s@%Bqab_eJ0^P(XD0KpakW@&_- zraq{Ft~W4k?C%_pcZ^z>4Qg%nh+Zde6CoC9m;mk^ZP);w#TT7IgDbjRhvN}H4ypyi zUwu!HE`&0$0WQ_(*i>_@fq!7Z*0xl$Yw-tM^_52Jti>Me!t@lJeI3qmmV0dI7L_*5 zlzrQ0!1xvieQf*XT=-4(nC-jL|&4LRZP z3d}a0B>u_~Av$A3t{K5zDW==A>WpJ4H{|Kx!j#@k-pRT!+F0HPTbOU#5ICTwR+cZv z^()kC`=xQ&#CD3tg(;0%@?{hlriCI3RuMzdcP*@iNxBJnW_Rx{AK1=ib!&3P9 z7w>^G9nT;maOGCR212{1xum3%3?ll*M3}sgYzW^GpZ`)SUp>{FijZxHu0Nk2O=h!Z zK_(0OFuNpeq|JU&=qDkVh`ptxQ}a0gLzJN%imh$fl=G9b&Yl(i5S3>B-B^rEq(SSq z6OT`$BT4|x?8~LRG;^CVilb&ew8VOZo8~r>HozueHll@^%YSHmxURw-C&lfaF6EIa z9BfHVsgt@ruxa+numFEp@tKsChU8)~b^L5(1=O|H^Xfo^bxit-HZ!=x9*j4dR%Y7z znK-^RM02kzvmcxt_i8`dlP~1;CtM%Di+S9f+t=hR@;#Nsp?7H?!s>*Vw5-$8u<>&8?%__d+eg10ov zd#p2UE6*of%a5zU!1dvh>zpUstf!a%OEB@@X2A@vo{2lZKgl!S<9!1!>#)-w58=A*rpwiHQo`=6NB7pjvPc1afrph)NVnP^Wn< zQR+jQRj#v_ScpEzA&+td_B-I$-~Z)hbOjlC>x=V=yQz%hw2zPDV>%Ewe^JEr)=knc zna~b`%b?cjncFm{Gfe^&%y!^{uIJOIpvfY~IkORjo_UQGzr86)DA$l-nfMK_1c{r2 z&_BDhO}7oQoeX0nw8#=99UxcOB=aX?g+WO^?LOJBsDhr%i@eA>#l#0q3v;$i=MS{i zLSMdl9P~LLf~Mq6Zn_7C`h2%_goRwp6sq7GV~o{(CadsZ^qrZC!%VMrGQ*qMbq1ng zT4u6={55|@Yjef*U>UWp9zsZL^INlt@rOkT9};n*r1TYUM3OyJrc~WDjs`>P&SGyM)0u4kK)*~LnxOfEetgw$_4^3WPe z#P!PAO;y6VSzS&KKs+9^BIWwDefYzK-KxH-X*Rz_LN^GkMasip1pD8y69CDM!qhiz z()O*Q@;^To|9~h}N@w3-D$Q@$2C`c2t)LjXY3JuCIGR! z_+655NtqFZV0X+}eFLQtjA7)~xLzTk1guD!aq+JBXuGQTnb-+iHO=G`HJe##kZh+2 zCaiR5E}L3fAal#mJ8w@-!9P0g!VQI6Vk31@kGIycHeg5o4#0J|wfNf))=lDm;NR90 z5Nwu(Jo-dP&X9M2vNMkDRUL=x_`z{A2E4QT} z*8C_f%RpbOphk*lu`lNK=Z5EVmx%9P*hpmt{<98AZZI@mNHJcsPd5HVqXg0ZjM?D9 z4=t|+db3dX*I$CJu*a=)HnUYN(71Cs(Ajf4&^jyGO8;WIJX!cE``e#e`6)|b<><8e zbdhVC<9$fWsE{Pp6j%~kvXSR0kb*3CmUFADshdTG9if*5*`^#VA%jSe3?3N{y7ne! z@RMuD0gUkn5S<02oh6C*cCh#Z@vjxT79^OBx_!zLOX7IIVsWm4mkx<%twJ3#tUT0s zJ^u}4EYr;IRQpbpI?(^0L}B`O2&zfx!eU+z#b?XM*t#I&!s+aN<>=I^!CAf}l-yrQ zs0ff-&-W?OFw;#WDH5N&XgT94Z-(%(3;MiHHS>lrEgrC7T~wf#H|;s~_r>kDv*hFR z?Tn3BexM7-p*2nz?F@zulM+T5EJ~j!MtT9oied(J14+&^Seq4gomHcmq;}1&tJ!C# zI{{_(DJpw6BbyuM-Xrr??$`P`7yk%UAw_K1SPY2DFj~8e9xkZXNL%*_-dtvr{mCRC zlm66;#35HRd44T5QB)k;hDZ zD`R&E9gEhwuXeQ=b!}K=2np*LYs=#Ku}c5sj}3e%y4M(((fL^e!f2!WwU*Xi@roLkmJY;q*jE0 zPiEnjTfL~%`qCCMQ!H(lN_{^io$Sg_h2%dDK={Kpt6$r}2?Uihd_vJSTrn_E)HJKd zeK|mu+(O?N7<3oM_J+2N14&oN8>!I z_BXV~#u3SFeT=eg62b zP$}puTiV=rrzjTc#}AqR@sc4)ex-xD|okX(_m2Gu& zq}IX&Skm&$Zml71E^KDNpcjC%tt4wQVmCRI+rYt3FfI^R8c)rn&Piv}9wfK&6wqQ8 zh80prWh(tuj`uc>>L^A|3YB%n=OZys-;lv5-?u{|Q%LT@npUTC8j#!f4=Y&p*ox{% zHfFasjlvf3@?XFlpJ|$`oUX6IO3zg2bTcE_g4rZ6RUft2q{(Pg zS!!~2Ov-DsGATW>=qx0O@NF2J(P?rhsjcs~)<|hk>05f%);_4K;=E27lmY$NK~h1f zG?3<}qm`IJt=up3=j|-%{c&-*!ei8~*X|Lm%AGGEAv@_rM#fZD_qXnTVx`n~f}%Az zh9nh=S}RZCldn&|_0t8_DedRp0=MAV?r!Y0lpn09e?_h@BIxu@5(X==6{VYB4T)F5 zj;5EW{aN(u@>6ha?%M|Uf;Qy{XpIMmYRFPB1L3Y`@QthT6HFJ`wp;mqY3V_=p@4;5 z#=F{~P5ws6>o|*(0@*3&XFfwF;fi-=MP7`V(gU1pNn1O&F;)f)&FpDDn$JVFRDy+! z=Kk9JM0N)^rnl>b=#1GK30qU64DU=5%1_kI=-r8KsuPO8eZ#<%7KDu?RYw4*#qt+! zwlYCj+@q)2mS-(y`-xM$ANW+VO} zS*PYVFon)aSVBSvv>s%wgt7A$CScI+hyU4=-XpI(z!kfTyJkK8))HEdhmG9~AW^L~ z(i#%QLu-=6KOUvWsA4_Vkl~FK7nLn*ucL%Ei6wuZO*pJ0ip&xp-ks%e z@bbh+FLF|i0{H8MoQQKctmBs1M65zU4lSX=U|L&Wv8FKdG^|3jhEBnvqVQU$IJ<@r z*I(0dhtY(L@2Oy6r*nlc`CooG{q%oLBNS3f4BSMFtZwJ??ps?$z4@d+yx3sXb8J$P z{sdS7lESBXCN%GdAj9>1W0UDYZeUM7KL1;zX_S$HT=e_GU;M710{`RcDP^l~Wc-iT zV3FeVcjq1D(?qjfVTn-fw;T#8=vx12AATJOEQYkSp_oOh9agg;X4YlwrXR=`K}~uo z20RYWvnb{^Op`wi!R)|P_sdb&Ro7Ej8a`hSE@6Q1#^k^VY{v$U5M0AjyK%}o?~yn4 zGdaUSdi$jD1ij+7e~nvexEWiV37?j1BVt?}r_U*O`9TM@p}7hM-XuN;6<$j}%g}sd zwYwtmVgoxGD@MI#I|WAY86z5<>$)bP`%nuCL4h-_eN!K@`4cX^WwWtFSqu_ANE16+ z*f<4*ZrRzl`pg4Y84A4hBeTRoG-T8gCG5O)p3<}bj&qe!<2FEvb-gSl)YXm9V1V9U zLJ~$$`X=4N`Pab4%@#IkoP9-mTl=*u^N_LOmW%bn^SpWj_SBAbH6siqX3s?}x@V$u zx_g`f#z_Lv_DqL3@i*&zQOLGHl9l*3X3`HqH5mF(FJF6VPzZ*LeYk8?((?&@%(29pFg({aL(2D~5*ifa4u5I+4 zExwZ=Ob>rvjH%h(ew>`Cyn9lY}4y_>;vWduu zwrF{D;VWcE4F1pmbW(u$-$rM=5tH}g5I=rMqy6~7^*=qP|J>+m-+Fwim_8!OEVpW5 zxOC=;0@P$OM7DABB%mCDq!KN99i%dutqkKv%*|wx%m&Od7qyK=zkPvdq^kxhoKVHvy>VPpeu3K8CtBW*)&vgorFuC=w45QYq)vWK4rue~u-PzJ9fBTZ4y z2OR}6@JFBX{5RcnhM}PzcZ4zNC;)>ofvkMVH}#R@Na+eHOS7h#`kPZ2FP-|vcSwX! zrVZ^`jEi16$EIez3iIugDZnC2c5o7}vM0r9>|-bT`s;J|UY~da3!5ZBIpH;6C+kZ+YpY$+?a z!jMP6$Pv;XU2SP~%L*c*F4dSx9g zBVK1k4SAh&10MdK!h+l)~Fh4Gg--N)T)aIK>-;qYmkvPZV zl98B<(~3j>c4;zes^V@=&Kh`RQ$8sFl`ywEAvKWORt9penVKN8YgfuXI#$x0<`gc@ zP$4h?2@gl-S!|5Y#FKfesC)Qmj>_g^9Cu=9jAK04+)JXa=tcj_Rc>e|+%{}Hy0@_V z?2)d7Xh1=>3mBeq9U0>k>XlAs(_C<9Apc1QYg*23U*!+ZssXDo_-Mh8dT8)LQ&JHr zt#;>5(pXcG4x*kY|5OXE>=`dw-UfuolhV!G%_0-rXU^BlTE5IXp$QN`T-)xL<C3~Ib4C* z8O(uMBYG|Q9)3uO*jICd4XHUE;O^#OAkadTD#{N7jrfkH>NXi3!93>C@Gjnui`}mW zE+3?2&qhQq7^gX&9_=jaYqp!+YL9vZ)|e(xfNME8g0d-0Y)!K)4cSuDnLZwFG2~g) zq;M?uIvl^c+F4*qywHH38{_D-X{D}e?`_}JEo)7kvwvZ9#-WJ%U~b8sR8Ee%)Ns<- zI-n|l!*8E;;IKiGS3;@WX~7T3*heK#Q5lF~WF3e~s`qY8++w}$y){3FYYu25@)WM9ygsdHA7aYQvDW-9+n~eO0M5q((RXvW z`1FWcvUgf-vAjABty#|twf?hyowsFn^`!HexS?jt-u@0gaZ1*e?ouhh@|(+J2KuJp zH&Peq$ojK02!HoaX>HI2YC?8W@nt#9-++U&OxPWl=nVORo4bt{h~^#nji0latqLnK zTrV(tz|Xlc?9m84e#63}hT2`5JfMN-a;p9%*N|GjfwP_J+B-jZlieiqw})&8e|n8> zZiWUt(?39j9*r8t2UDQ$tqlp28*YLw!0Qa}3rc68)pB4)f?rFZa7`N;dw&q}}12T5RnU z=F=Vg&`Ju$y*38U|GM8dlb0DRk~R`<$w3W(UYTWzY0eWK9QN>lHp`)sOi&en#L{3; zMOten8Dmu_7OM>_WAf#fXlBF>zW!lM0<&Mh`(mEcnRkq3K)lYeBwerVXw1PZO9f3L z1S=^7%N~r#7J_AmL)O}n%vivFf|S*tDod<{V6p6)U{)LPcTHaA7EHLNotVM)3`x8T zda^mu{P|a25b)~k%S^ki;2EJy#C@l+9J@53@SB`%+xnJ?(l$TS7EN8Tb6DwOP|AkY zD+aI3Uz1Ot{+6QzIq$KrUlX{!{QA-gm*HcLWSDR|B=*wG-0_u~gV}Xv+COg!>qBL- zr?buIHLzh(XOb#omPC_4o#@V*H+gjb96r0AzQ7CJ$U5!lE}U&wXCL!4lkmX5!Xeu3 z!GLeHFwJOT!?%}k0J@7_RL;6jQh)h`q6)2$CzQmjdc`LT)nO~rn>mBCa74&5{CeZC zB@|o^i8GD{)9Og5KJ$}9|G-gO;yXBzmsUi_1CKy1Dq| zWx78fn#enDf`3azMYSTAo}AM9kL?CBt5pJi8#wGMaIHlnURV_$HuiVBP>bquE~)`?YDPjDMMsqxB%)x zX1V2cCdFJ7ROP&YY#%JQ{7eWfsOl`;Zkay{8j99{^PDDqri5@y%RE%J->74!Tx}=` zBqk_boN?-B<VaR~FsC$`Ak@cH5~mbvM=Q{Fx7|ko2-Gx{pWpKuS8(ay7zHL{{j$ z0mr*T{yOta2`k8`wCUb;X;VGSqxlP&CIgSg@hj;t(J4Zoa!KjSNgV6cX#MZgiN-1K zagnJFs>L;6e_u4xAeS!jT^TA@H7G z_Y^a2;*H3At7Am|#zOMFG<&buYZ(0(y(Kt8c_Rn~t&Zn+z;Lh07% zQA8wx1(#4n0*f>Am|D)l!$Dc{u)my~r=d1D{N;k5eZ1K_7{cJQgz{0h8U+}(2m@e9 zZV~QQ20yQWtcXxpM4B)MHh&nuf*4~x(aQh?oM<~`Vykehr59s(IiO3ipS)(9wH2m>Xk7Br#uN`+G@ zn4U2Wk_j0ErAl-2NdXic!E#^0@&{zyueBwC#rCFeXwR}|t?RPNW%=sQWd90&rvT5(vDnTQnp7!klejRJO(H$`O5cjAMs|`S2f?HJt5ni|N zvOD0HD6EZxW90r^iMqy;=XE+g`^m86m>}-PULJ2JzYbmEhzNYs9qCECx(;3Z$PnHu znyr1o9SP%}LO{_xwAv zF)~G z9al{I)5pSldG|#43S8&2GwRbnQZMeShdeg5=*YyQ)9@C)_%puhRb}qZ3iq3#hc-4h ztdp(iM^2=kFL8Z_hdFY``HoK5%}!#1?&yy1{+-IBlO|RV>k|v!22tEP-p6`x2lJCF z(9iA`kJ~x8QEz$%{ZkC%gDm|A2fk4mZYJyL=^oM%a@2=G>e7UK7tdqe`GI2aYQXu0g02d2tS>7iv17SmmE2Qk@FGAg=IBj0 zL~gz$2#pmii}+-aW8LlzqY$itsHlGPl1hveiNOaJ|gkRJ=Je`*XlT;Ges8KmdpSjekChV6PDP#7vkC1w^Op#wSbi8F$A?>GiV;u5Uj_`-Q2F&rEY%Y53jcg+Q{ z!203(^=0%k-ByYeO)Oav!MgeMcy(fy;4xKBQ^>?EMXlU*acb?I`9{txbrfwJ*a_DC ze0^sLdc^n_=R%$)R-n@;j`*V$P$Gs&8#}0o?f2B0NsZNhWkMvYENW=^y=ZA6$DZOA z9wQ_2&8&#Qra1iq1^i4gFjo+wM&WuFFLxvM#RcWwV5*!jX4$2Lta#H2ikQIWLM;rH z#CjnxL?#2runNj63E_1i(w91?82uN5OW)T!5PFV)aAA8TG}uWUAHdt-+K@7EyIyg* z0&4d#R8aWny~V1=hIc8s(F_f@tL*JBZ5yo19_HHi2hH(?1Q^zkrWez%A}4qwA@=wn z?UF=CUaj6N3^`^{rM9}dA<#S4OI!pb^_jjnk2`bXMvB0KV45jG7QnL#>fD>^lC8D>md7}3%YVUjjMPM3e;WJpPNZP{SQ&H=zR z6Xas*3_@IYDZ&srYj7WtPh2Mo(-A0aG?5H7ksFZhLg)u z%oC&^1(@$lKONNP_2UJ_&AG*ZnqgZ$R(RkoT}lgsM-)dZ1Cp6JkgZ(Uzh_jW%EXFa z3`w|ldblVvHe9v*^e9Cbt}I2bi3Zb`-(Y-Dk6ovG(4)tUYh9N_&xB|)Hcr=Qj~WbF_|qEyEDP5DI?{l80n%FR4rX&Y`>W$=G3 zQ<+1k0sBy{WqJ`I`jikGHCbSiDBl|7jpU8d?@{QCQXNB*T>~lp1L?4Krw#*WP2Xs@ ze580|Tyflsy%^w0F=zg0*bYV4jgIama~{hH9ZAyXHLN+5u?`RlW+4SwMOEC|Nf4r z7`rFK=q^<;RjXjsur87-MXQo!KGL1>oT5{7<;ya7@S>$xBwa|qvwRIJ8!2Nb9i4D} zq(9oc$Ba3>X=|9ZN$eDxNqa`*u&M;#XFj66uNL9WLX&n0(`8mDMzbujcUCAZy&lLc z(>$e8j7z`cy(j0(GA*5121x7_4nRohAR1Rtx`gDDW>_Xb^$Lp1Yi0D;E6>X(%D9wp zPADrau9a|#$y_n7_xq2zy5duQ$gs#{!wh^ZNYs~CEIA8J(Jx7}KzI6PfvhPvs6>|^ zhv{DVW>ZrAXe(t?RX5FBz9yzAENhjXA6cy`JDt@kLZ?3xcHuWc%dpJ6w}Xv7kPQgT z+A{xJSAJ0G8gqKp-o^DVQKYI;EPVya1`W|PuMn{$PEaFnXRJOQFN~;JjF64J$Z5~C ztPhBd{pb`kNz~29!?Y|fPbojj_9pOa-folH*2W1P|4jEJqbeE->{r_R6rusvdLs`} z1veTnx?8jlrx;+eW#+cP(EzgVMYSyEo@QD?TZ9nGwyRJ%k1TSQrCr5*N)2yun@F&Si+Z;DuIf;E#NK%;h#6EU;&aim@Lu`m1gh&QcLH~ z_8${%5>5%fw0VTYA(Tc{KufdCj>xD8_ridpaagjhc%lT{oV_6ZXdP6RD2F{JD3Nr4 zL~m47`t85=GIPh1rFZ@XY=qsHN2`b~Sua8`ozjkBT@vA@67t|VF6W@kUP;jI;6&F< zRVZg;gEPhq#b!!pX%pmrHEbG^Pfa^loV%tVOS?)xmpW&(FO0%)>W9ody}zIQ=Q;k2 z;4q}7Wtguob+Epe70fYEi-4|OUcuF{n}7pzOJ_{Na(Q?5?Nv-Q@s8eKYnyi@HeQ(n6$J-u^k z6aX&_d>!L=0rv}bo~N;j%dUhx4zohW3xZM>T_m8{3(q;e?g-hIzt4@S6;lXrSmRpK7+|z5qc(nJM#<(Z1$=!YzkdIUZ;WCrp+Qo6v^!89n+OYCK1l^U_#bCR^tqo5&7ow$RU zmw+r(oF3w^D68bN&Me@_680);bw}C;FR{d_0G6;#=63#Ov}4+-5lsA5Xn${>ZS+0k zwAWZgST7b!SUU+|sGkyrR9}vD&2`I^1~|VS{&qPBKZ8pxL^gJPOi<8Syg{e5FsFs( z_ojS|>SvSCO0z7A#+gcUH?Kcn`~8DaN*ZbE)5$S-5r4#nGo$!8CjhPWBm=oDFM| zRe^Y29V|!Q$~o8Ww?tQNMv+TB(E{DF^g3E1b&N*LW}aV*5$9V_V=(F;R@Z}{`5eES z)At6$+@P8h;;;urO)P0?nb2L!wn;mUZ0Un~Xdc|JE3y01s2|f> zE2cK*M`6O@yILc;$NMHXGl_RsT3T5}kSEuvVJF)1_OCySPFXWX=K;()RotCwqwW2Z z?DzkW3CDg;ftmm?^eVt)8y&7OC(Mx~C9UqY#=&u2O_X#=*)Ix#KyrxzauFhnK-~fRe|wn%c5`%1SqhHP5snDP zozi88IoM)lgX~OUzb;fs<{3dVYWnMTX0jp!C>>Mjaw22=2+R$j$m8WYF?bCc+o6B zkebaCoWB~oYJnD}o?EhB@kkWgm;{cjd~}&yDR*a6T61V+Ym2RaE_JNx-n*1+{S*dWOSn$>v_Z zKtb1hbhV`V_}ach0Fr*~Dz&g^$}U26NfpgS-GJsBYEEkO6nQ+un0s{9d<;^3&)?B1 zCV3Xb%9u7UF8$mNZ?_1sW^^O;WaneY0Wj;m9(W$PDU>jOSp&_lPP+F3)=V1dP9<$o z4BYWDHEkw*QG)Dwymhbjl`pj5iRq2LjBS&h37K{;(Rr;7VP4?%!)) z$bK&@;}my#Vvy?36}Sv+^*ukf!&IJrDG52&sYr8D3h zAv{MOpTUPSy3PRJV|<@}*hev~So?fw~cO&3b(#sr_5L`91x?s)f&NS0&LIls|AQI;mgn z99oeA1FAjX|7>i^zJyw?CSrUDKc1Sbukf=Cp9ZcMY*yX)WVBr`Nf&DAcEo;uwN+wG zHc-q}&4t4wOCdLj_?|VcXUGg(A<0fW&72WdQd$-!OD&dlGrB@e-Q=gP*YBP76yGh* zOOa=Qm0LammgsimoVp&?EqM7m^0NP2mx|=Q4#`Q2Ar>E(o(Lud55*+*)stZwa zNa<97l2XR8q~eh_a9>sbG#BXTydhGS@h>2?8l+p67K58(JT`i_eRmu3Rd33jENxU? zHdBh#8*$-KHmh+kjOy%t336q_Uuz$I8TJCqfC1O2o@3doy>4Ei1hlGVTsq~Kc8$+T z9?ZADV9a*S1c$Z&!mH!!;~yqTc%i2QMlHRs9k@T$P&7M%vw&&yt{7xoJ4xVQ}bw;Brs=XuhOiP{h z)fENz;J^U{?i@UslY5PPWcmi`8aoN(Q4OT9cRgmYzSX=QK&wk#u|VGn&%+LSVc+AR z)f6K2Yz3$Wkr8j{f~0R<1BT}mRM9U6^7e^+uN&){RTYXI5P}Dept3-F>4N~C zQ>T5s08cB2;DnrY+Juj5nbS}=@|yxUnPmd_flhGEljGcULd+8AT&3ZwEEe(-;+&)O z55>*bH9111x2aI+U$pLQRGOFz8lb8fowBccvach4Yb7DWp&TngC9(ep@8T$5U?$8- z%(qi4@B{I@=btr)ZExQ@23XkNk)KVwDcUtb`H9oW@VBm`1}NSP`9A0G9#c%*#H!SQ z8?+|t4)h>Kvuk^q{h@4zajhe2hw}$q#Vy9r-y0E?YeTnuGjI?2$8`yxs^duD5D*SD z$FfwweW(sS{HR&zGu{LGt+r57yTS{&*_0#HkF$io6A?lC2&v7`;~QsEfNsO!KDHA- zKyd!8k;Trx?I@oZB4yXVv|^=H!qdqgXOwTtcsuii9}(nt{r?BMtIs=Pw+|b?Ef+yD|$nGG#eQ=3H@5z18 z4f#ic*FOLjwY(WE@dzXsoU!zigFjATU=+AS2IMV^?U}HUBD2p>SKUEk_ZV9vkQ-78 zbCKJzvRv6)K0`9$Z2fxC0MIf3jo}wC?BR2}RtZQuz-X?VtBK=j%U`wSni6U&`v4Jp z^6V9^LocfB6ua`1NkO$``EjbKeIkmUNGlD}W@+Bt?dJC5azHolMarI4bLT>aFqNZ} zb>^S)+nMA1lFzdYp=5^UM8+RZMRh`4bQwU`mZvNLZ1~MdcmaaB!=vsjD35RY2XgcK z$i*HIDUWUlq;X5a%jAynW>LODWscCwGxQ2XJ{f67K0H35vS;`TmdZlkR4flydh7X0 zh_~5pFB;=_07kx(YL0RjqCZKuhV3lmH-id|G?v4bAhweA-O#dQql~e0BQ%L#m0IUT zR{F^g46xa3K;pLd7akeRtx|lNP1nq*-0P)FVYS-i88LLYa9BEOAk{dXW%&07UpC_6 zHB58=h8d=BMe~Arstjxk5%cs^)9lt+J5t8LAZ=np*kVv|c*9Ld#xy2ptxK}2?~L1c zLfYp2zVn|x2*sFbOacHAgr690{>(8ypsDZVh*uo+1D!+Kn+1r@*kkxz0=&M$9~dKV zX|sDW`oW!lZIS7!8Nl|Z#mUEc;TFXl@t+!!iP36i$*NOkr?dD?jkS5CQ2)*{$VX#T zWDX@Pnm!eB5yRn9H<*=nbZ^8&3Am?hj)ILg&Zrzyx-vIeIYc?)C6droC8-jU4L@id zi8wa3kI3mlpqmz!{~~96T8e;g5k%cMz31j}*?>%9@va~@%IqQ3e?dImZ7&J9(d|fW z5FpX)L%mp&wY+S@t=}be66|cQ{h@Evh^o>M1%a^v71}sd9Sh-PF`t+Wd9w=@De?x; zC`q~+Wu%#~4pBn%gW~ZO?aIsPjwl!BFpqPbw>Oy`8<#Os2F$LI&M14IMOjKUtt8aU zd!Ku&NW)a|YgdHLyGV+)RU>Isfi3V_LRc>roddQcZ>lhO48xT5y4$XiEr4SQfUAgq zjKZv@>A-N+0pJ3U+eWvKf)sbq1$}HOv9U&24V@8GwcNEgxkouH0NNPPz`|QjG0{Qx zqFlX^;KeGBj|Q6~5|1TzVMo2Dm*E<=ZV#$l@Mh08D?$!AnboRO0(El_xNcC;;-SWP zGIQZ+-LA#y%^mL1p~BqzR3#3z!PH0qt6nIki}dz^FQl};d`=WoNl=R}{I(=~TP#;D zkS+Z67&&c;_&kTftR=O`mY$2UMht`{1B55x?qoqq7lxb?3=o*oH;=9FRA zlRJ&?8Im;foX`i@J5Ft@siL2i)pOev3r^5aCg`iMBJtu`3B;j{nSBLbq^yS5e0-Z_ zQF#V_ymibq;^R@=kqibbeZgXfQMFRDDGm>-kJZ%a(V&|d39{<6(IYDDZp1*hcXunC zDYih`E*wGKxFJy65v=(4ainNw*9#cNOUs}IClUJrGkD1hSUTtwi40~#7CVF3J68Gv zNV!zGMz*t&$AEmui6F6d#@Sp`^2VN6E9L=x|BbWy0M{;;+A_aCOi)jS6hroDTsOw#Hk}9KzLzMVOd~_TBx}s{p6lotJsJlHbPeh zyO_s1&)F1ic&?~fOIuLXj!x_Z>7$_|x>7lD_QwTwtGuSLW9g|8_$ct)G;R|1v8+A* zxjfUnr#%|3Y~zgU9L`g~X5o1=*r*ZyNK3rM8UhittgY?<3M5yg6Meb|W#pWs6Qzk* zFwNUVe@3H;egY6TZmwW?lDV19#h7z#5eM0_P>FRFibDw1NJh-LYWw9XE>Qr|sSYDR* z-|nW(rd+toV*ieYZIuEypFiSPw&$hS!Cg0neU@ke!(T=2$*-ugNuiBq4EN1}kHjAT z6JrXmF~!OHi{Kdf<&HA_zjdDFE$mH{%^gh)jQ`hwemPGDO`7Cz6oL*t^qYyB@nwEC>yhi~ixE|D$P7>)8q&2%0{#K+l2O<6u{*(iQ3*yeKM05KN zlf9TQ?Gg0S9W$LLIS0@u3ac{4I-;8wRgA_(`s8>xw#4_Z7S}O&@AtHUN)}P5=(*}! zCGA#*p-d>+e21}#vWa3^x=eZEbEq_QtIvdbS7HJ>%|1Y`+K5-2ICuT_4?N>Np zj*Mt;ygG@>(7NX3r<8vLTvkDgoh5P%_UI_A2$MR=&azFoki1^@Ju&?fg63~-T`^QAcP|DZ6ZHGQ5m|1QImUm(%{qn)Lqi>>W{ z!SAb8Z2kj7>xE{gL(jTo?sE|d#kxCIR>Bdd+ZT?&|Xq++096$x?2@GTy+!t zEXs~XA`4YSnbKnm4TJ4!sLR=Kxt>Im0`d+&kyYubdisicq5|?BBU)5dgh8!j_z{V8 zgIRM%^9zEgY#z##QHnVUS^$~}jU}kgFX6;~15Kd6=qWmHAQ@@EQ&|~zy-m6US(ofK zX@@r5z4gMD4xxgBq{SZo^WLq+KuOhnfhkv!V+O8$gk*u>ZlA!opHjbHLQb3qq7r*a z4?Y418cXNRs8>4zX(fcea$3gkxm^pE!gFGe%m}a3W8GeuRh|zGjH&4$DulJp;=G>~ z0++Qk8&DO&g-J?ZZW!^UgSvouz1PkEy$XwB{-wsQGc6F-P%weP-5!O(0S+WI^3Hg= ze)_KCA1<05ZGZ97Qro8t)oJ7IK$e4jG|W1HOxhEZ@yuedsMLcfx2P2QgkV;NDs>Uy&Rx z{OiNL<7R|gMDujQ?g1x76W*3tBlzLYEi7gFe97Q;teamzb}5VB!#(6!H z^%AO>fU1%e1`%kHalQz~oCf^<2c-`fz8e7Tm&L#Td$az(?Zp4Z-T&`sI{6OS0eTc3 z+buA`eED#AeX01~FqW`lB&DFZ07_Lh_40Tuq7eZazoDSPUhrFmu#4GX0$|+hIgS^X znx1Yx-nkJBQieYEeuE&QkiF!Z#vapCvIP#{+%>Tw`f2B4+sq}wHm^4NB56h~ai&yR z@NU#Lz4MGc#)cXcs*j53_}aDOnM{Q(plTJ8o2K z;|afD?(h|g9VJJZBO0x@J}f9ZYK`R1Mr9WK&9+6~yjiwpKe?F0B#o!b3G+tz#V9;d(x0_p~h;>=8(0NNk3=P$ts$S)75SaAro* zgi}_F3<=H%BhnCuok0(nw9$H{9QcxW#8Wfn6mUi@dmWAD&9OXfos^vM>NQ7^Gpm@- z9eju^zE*gb4khpn$jMKux9=y=@C~VXU!H@?ghp-L4BG0|h5I7an=^*#S+YE2eiTGo zKnXvdN`9V13yIO`$pe8ll(Wi`fWx%^P$zGn*KL6B{#FfV287aQVJ1(7)B209Vf}q|2ahuyF~v0gF!>U zyw>d2I0z?>dpJ6`u%Tm z9sq#XZz=E_kN^9^`hBu`|3!8dAKh3Mhf1=XQ`Cfolxd_%`4a>L7H%8B0<+}n zV4GsqK5fe8^fKJ{4d4gg%rxG})RgO7!dLN2b0&ZwP3t>L^}5!b_Q*NulzBbb;rs4K z=pKxPEV5_uuf27F*&(J6wQ>-?tL~l>yVD8a?T$4N@S-NQ$B|N?CeuGn1vf)cvd zUGvsYQN`P&-8K`?jD0oIwQtp;vtGu9l%k=Bpp}D zX)9hXUMbVmRk9wJoNz#AW&GN&^qfbsSnF$ z-g+vhfC5`}P~zW!&QRx%G_c6U*55nAE+#SOe0)Z7<4Gy!+gw;_wfo0b%m9r`>np#Zo6aH1q zLvW&4lCs3yq&t7%x$1FSNQacxO3j(fYM`S3Q(`T ztQ_Z7f^(@$o>NjclrhGd_%rA#Q+p7-=!yMpS|9swj}8#eAi!F?mY*yw(Jk!K*cFd} z=>-$9IaLb&is)16noT&z=+#d6r9JNe1nBUL8evjJ(J?w{5}f$J20v?r3~&u(iw;2s z8?D2c%Q&==Zf+F>m>1fS|SP%E0P4)z7hz@xM%A_0f)_Yy_^ge2K0%R{{ z)(0vVv7fx8Bg*A|`8$zAvX1)$bBxbm)6XAXcUsYR?S$QlxR1Htd7HQlmatnS?-;8n zF&hfEXzaIf*5CN}3WVPauSighl@yGeI zE?$EZ+JBPj=f7p||JWc->&)>~fBzMPe*YCH|F3Z_XJ~0+kbOxjx%JN2iPHnK$$SbkT!BoT;s)Ad)x&N z#;pwjmaomq4H#VdikRqx2$j83nXLyE9J=dtUEuyKeGqZC6RipcDhWjxYNwk?paGR+ z1Kd$^t8;7+A)>3c(TaE50%{*a@LrQyysiUq~tRuH#79!}t8jh!;KIIT*-Mp64qA2EgKEMyjMDzsa67i)1e>3JAKVjKc zaVGO#cL?%%8B8*khe#>1u&+pWff_m%!UZ>IL`znGiD(vwa8riBJ;oA%d8)K!Pt=u0 zUHB_Dd!-ASO}M9+<&M_Ur*1_<(>U0L1_@Zj1FU^Lu(s&4)?63ex9@j+I$(JE!WG!b z{rv42iA3-AB9IxTGM|9cAikI4wSF`!M4+oo{=Tc>Ik&wZHcS*x zba!aerqc0-?eM-#Uj^~^78}=_<@!8xd~oe-o8^A&_3ZqR2&#v^7@qcSvp*a3gef4# zM!rUckr|qgBo^QxTv5!y%nb`mMY7UnP^>Q$$b_*{^e5~I%)y0^4%T66AhxmJlMgze zH$#vCv4xigrPb{Iv zWQxv8Tu+^P{9{9A=eA|o?vr$q=c5*rrn=L==7htWQEHee%Wz;h+bR&9&d^{wP2*p| zroGZU98t4o$KlW7$!=yWgK93)ljSUFSTuM_UzEPi!{1bSSk^Bbi=JN4QX*R|VG^|| zY#Fw3LfS6*FwWvQ%6&{eqdC)Xs+qnRcjo%$G+sIHm@FrhE|+Vy9#T0yVsYcHQJD96 zKJgi1v#@D_(%xxt)Iy%fHr$dVJ0Su4tJ6$$#kR>PEGGz`Mpf?`Y9-qSY=TiManf*P zTuZ+C)_BHFTts)$>dJ7X`KE2bTGL7$jccj(_Z76HNV38SgfWZH_?Ve_=RT?vzCPc3 zPBwF+Dr(=$7N<5VYfz$N18lt=Uz~#;Z*p4xI zB{enXX19a0JM_j%d@~6PHu9ucX$1Z@C8otec7&_oOMWm`xRYvxi*7yEL3H5#=lXd@ zpv~$sFZ~!+yGfri4SWK_5q1M-rc|ZUkoIEhlXb#%bK85`grdAk^cI;^qkLcliaT{X zbt2u>ZrC0>F`II2x!ZnTE1-$`MC7c%CbjwbIZ|_ad9zhe!Gy!nB8hSGpP~N5+0(fu zAg-~DR+Xu)4jxYvrVEe_0aX3?#)xE)pA`77_~Pg7%Hu=Fg%ZXU=G( zVnukmcr50r`GWD8w(Wf-Ef}QZ^j(P|GP_N_oG4GRS7#6OWu>*qVhU0GSiV(VwL@IvB|(>!R4I%S7XDsy?BZ@t z>{xDw!fqQ@$8Qs?PltGN))WX1FdHfhVm^~f9Tc&Za7?yJc1KIVQJHXJUUP&h#8em; zxe?dm3r@Id7Wfxuq=1`;gQl?4&@`U<7l)*9YF;BqHK|*Asph~>GyU~+S%u0Wko|OV z|GR^qIU7Z*>AAYY8y<^?UNvL4|-|P;|*h0r*}7hn2qyd zR7m(t{jw=;N_l#R|5C#*jaf0XR5!C!TxZ`T?jYa+8fk_Ai})oyg1U(4ro*9P=ix+V zQJI>kk{zhCAM?K8lxCH8vilRTs$UV8sH$%raMCZ%p z7j$#SFpvrqLI(1X zME5h`>6Oa(&g%XHE34OTZ13h4lh=6bOSj%7q9dy}yXw?-`8Be$g=f*ZW^1x1)Wd0E zGH%f$ib31-6mk2U_~o)#b;$jo>brVyA#lV4yqS>F8tifgU=g>^O>xVJpUFxWvP~wUfc3UP*RSNnd+h#0O{3fu+}P!JfE9Bh=x5&7yO3L-ce9fC zh{RPXh%av(!{t?Sm)e0#f;-5pzGl!PHY=?|chZLy_G9=*TMwtjV zBvD{S5aD%RH2zJCgXpyDzGrvwA^V0oz{>lUWZuU2M1GlKXsqsz>#*2o65!t|6`F4cMk6dxM1tDAqBt$=$V2Clb0kUcmGJ*H3^z)*8 zEegjrm;gAivY!38B_aOrf;RtAH>6Sa@NxY*C-7kd0MP#5iw;=>8xtpc10$3FRWTH+ zTj(n<{ZAqmc~j-4PPWPh1jxE~Ljp4I6~Z#NUI}d-_N2Jk2d7dsj;UBR^VSSah9w zpht90UH3p@arN=x@0<0^!b3OR(PQmz6t1%mqkHaZ-&omVogP5gCvm#w&ypo&)^hNm)XIP zJ?)HNm7}jj36U<0qJ_f4_#5{mRXr4CQf;Bg|&b1&3GnK?| z2CQWa$*l*Gfk2rJ29+wR6}-t2mo-A8*$r^Cnwwo3U9=lXiU;c{ks{G6L6<#edMmYod#&sYDAuJ9mnAOF}BaOznzL9>6rKDWqrK+ z^YvJZL?rae-3;kf5@oeIz2H592MN6_vN4hx^(|^Z+kob~Q`KfwA$d4ZSU>_wO~|Ln zgb)}2o8;Jvjy@w^^Y%Qu)QEgG6xUOY`{NVZ=E%R|(GAGc@nu94=Kt8R6T|DN!y{I* z+PQ=o7P28-NXUg6cHL3;59^5Z8*(w^Y>Fs9VSF{_nxdn;1fWku#tkE_6IWB3$dt1s zEjZ*T8OsPY1knscpdY3PZ-!xgfRVT(mT2&DmQGSO<^YYz#@k*Z+g}WL{&MB=L<)fl z6Fo^68w|+*u#(H9W66?=w@u83lKJh>;(2$L5dL$DU?BAbttgGk)AIVFmfoAJ*rAQCWZ7BWrQlYqHYBf6d2mDFGluLz9Xwr zyK~hp-uLK?tN2sW0>voV5`pGGqV=8-0j7J$sOzvlL-`G~{<-BI8_~lUaN!Ub5xdWc z%J#3%Z(v8|6Zl8@j_xxPYt2hV-_*9W{1yJYazF7E#e=LwPuD=>^hm9iCBjH*|MOJ4)cbTQHjDJ+-?5ARZ{VGaG0iUzK;KND(eFV zG3IpNnzVc|MlF|Sdlsefl09*;?Y8lqopyuM)yDk7x_CoN0&~0Fox8$Hc`7-kIy*WE zH+&wH?~yVa3|r(*J`*mdl;uQYNBi>+-A{rZnCM)pYPAi)0-H!;Y>EvV=oH$du$3q%Bagty)<`KFs>^hS9$JXsT3!c(QZG*Q9XH;FBsc+RsA%Yy$4V1KBYmD|Oh;pE^JGgK(wfChi0jXmAwuKB!Q=}22Lk>1uCUX+dz z`y+sY`*+KA^~4V#*od4nYv_n&wA4yDLn?Nt7`*FHnNt5$sHeOo*O;B1O35=@OrD#u zrp@-+_YhBDjDS6+H&IlZT+JH*)H%p>HxPqB*WyYgJZ#enOyY(Bp3$>CD5Il>rCK3f zEW*(RWdYud!BHm!wxU>#1n(+I7*2f zHn_rW`kG}eS5SdsaasuNOqFUe?JGIAzzz(z#rl<7;?K%o|$5vP|_U1 zJw(!+g{JNx;~1u~jpc-)G7sDhqTEbk-bY4hnXWlv#}y+ML&!-hIfIJa$$O)JgGuoj z>WIz?hc@3Vole%HvaK91FApvq5@IJh5!1zuDGl)-7WhpiOL>L(bBYh&v8M~{`X5dc z>0wKjft0NL+dR3cZ<)u~PuEO>gS!@WFF7GQWV3?s$~YCjfT<{fc%=x>xrW3_CdYVYl-C=XFom-^{OEkF;;lq z#QCb00mXj!HazlVZknVo{b~#>Jhle7?dzoYyPj1}9kocFIZ3B*SdO2yg!%e@Sjw49 z5Kz}uKT{W-PbcH6N#FI+U7Jak@ zrEM{Qh^9p;hK_}Z2#}h8lxCghH5^Jy~asL89#mvPJ znGt{aY!V&)6bK15D+`#|N0f@_pfa2db37;`fa)g?R424#x)qK=n-`r(iSLP>qo8+?*fr3rNS_v(t6&0?JJ(;>c@R;%!_$dYs6XpAtAe0)RqM zllT)?$g)pe%M}W(&a>Yk&-Znak*rMs%I5QIOo~`FQDY@fv05ltEtF#JuUAd}f~7!y zK1;z?Aj4viwVr+OLiYq6;6<3h**;c!oIv^M(9dF$z=EzlZy7P9;$|?B^Y~R9b?a!! zPfO@?`rp_m#D8I*F|^bn9MAv&%jo|r`0~G>A>t<1_Wv#AQS)$CUcvm?*g2RF&2qY5_GH%i*p8y6UXFj5_wpFQE?XhfAkFvs6i-amhELm=y?_6G` zqZ6sA!Q0Ah{kM^u+j?==^~99XPjIlze760*+wGs4@hR$MokTIb=>zjpF~P2{6gtc!W;bfi_7 z2)0X4y_Y(X!^A@{6vXrzzy4T{^C-@UH{xdeR*UU3V%~4W#6yRb8~-ggX&@ItDd(jS zszc->hvwS#5FN;ib)j5t6G6_-@;uxoR=8k4RC<4EUrCKAQHbZDE!pIY~3EhSBdYM@#&8o`@lwSnAr3~ZTzJ&RDIicl5ag^&zms$86s86D52!C_=`C3{`WCGfbl^VZ4I&~=0a*tBpJ zAm*fVxUvz0jh)-y!sV$y8#d&N z7^oDFGa8w!Xuz4eh5_j_&{NtxLRwJu3QkO(S#?S9m-N8r&O}ox#|{ zDxONdl__el%mj7Qh&w0E3 zPYeQB;>ebOUvG;Uj!ki(UvmLL=xrLZF2g<1#}0@7J~+quC_HR;Fh1rRqc4#c941G! z8SEDdeb+-|fZ9W5K;G1S=e1@eH0+lk9=$+UfL`P?n642bm%zj!t&`)4UbKe(zMA7; zoyl7a4E4$K-k}Vz-GL4JE@QoBsb3f|%mWZ>e}5N;;XW_s?${lyH^J5qf&8ZNTM@%9 z)nZs+;q^I=!OW`^Npkf3%!Y8NmDBeanM#2-ZM?^eJv;qLB@mRQy7kR8PzW=04VvQV zMdaAxK{$!^r-aEF#jTux-uyIbr?+?^rLv!;>jPCoV-eh0Yl7(+|I>b6?VUvHEw^l0yeP_n}%kV+hgrUIXnwlI8EGy85LjY)jo2 zMZZ7|QN`(c>!~wW#R3CUBymM|CmDL2Z3i73IjJhL!>FkSS1(7RbjeAJxS6Q!^J4Xh z2QwJG+e<_iErW6w1GbRkj>n<{)p3fHf?oF&DbCb4>)3OAZnz6HRWxoxwi~x94mUM# z=q-&Xm;IYAQEiko8Z3MW>VdiFW`gr}C5g(v!I?mILGcH=Q$SYqhnWJ=branTNU;oD zkqv*+we(@rf7SqSz7h3sN|o`6H9uL^erOi|rrMya5ZBuuEd24AT>sUKKpX>r z2Qyvj_e_2qI%JtHo^ayuLpyzB&pV|rxu7=xdf(=xv_eBW0{SBb6!j3N)DT=0!=HLb z1EVrCM~m*ZLs<57jf4$%m>fTJ#sQOOVmMxa?h{*W!6$YDAZgPMZv~=I^H))0yh4qJ zB32VxVuw(9^+xR7QWk9m>{Fou-pG4aD4jslXZDNv-Lr%i-#Z*%ogi5;u%dWlg@vbI zkQaQaeOK0kliCk_^-ysbf;EJ-9Wm`8$SQ}dC}JNC@kPWuKuQ19yd&tYH6A2klVYQ} z83sM6S5dpFA~Ajc+tlL=ffYijyHD~-32rW#~I z*ghOGuL%EWe3)UC^4?y1j!z$0vOYnb7~&ABlVdXcx}fI)hfFg;Xi*f7izSiGrY{DI zjsTxJyf_$<`W$DOP07g7(dPt#Ol1IdA(em(|7s0DR>>M}^tCYc5hP@Hpbvhi29A@( z+^qlXp7UaI=@U%v>`_=GEy{}gWLa9(yz+J=eft?j_8HdK@CHw`$3JhlUsbaqCc_nV z^azW|f%faGw|4Arv_I~!Ju~8tB$zGn;#LEc+hU(vLQ&Vm1aD>vsW307iZ=4L??=7L zQLR{l>7VYrafj63RnKwN4|$P?Xw2I$gKi64L~yTbl<#$`GMV2Nra zDNk7JR4B{B8mU}|p$ zf$j+EL-#$3I90gMH@%tTBt<^za83I5DIfc(!R^}k$m3t(9xm_>VS1oIW`Hksge*N( zCVsF)@(&WJE$iR|hV6)RyWjRjKy>K{q&2MO3b4DM>_NoU0(`@>r+B9|cf|&fwXQ@c z$J+>t?reju_e>DI^J1BuMq=>Us7g30*(E>hCc6Sxeb(2WcgL!%buC@+>imlW*phZg zI2&VtY^s9$U0WEpEBwo8P);JGt!5D0@!3F|Z9Rk=%rh&xNho&TAla1Cc{$-`hw8YQ zy|Yq#0QlGIN3~WRL;>I7b30`J*Pz$kP6AqpDkTLIxVe(NH#VgdODRvh?moQY#0O1Pb<@jhLM$Q!f)+`CfIF1M1 zF0rC*{9y~`$L&0e*!WO~>6tI;7<^q2-g-<-x{&`s_x5T;@8Y2EK*GE5yD=vdwvoQV z$SiWR#u;lak*H*3BISt|zD9(2N*S8d*6=c%d_=9wv3D~?s#Qlj4r#==>RhsL*VrOg ztjn`p&Kr4(bRXmv(MHXW4f6b)E+$`e92_JL<(^MRf9;(Ov)oD4bR3o`6P~+ z+Swtu4QjcgBM-`6j;c3$!xw4w)rC-Pc&v*MOp7KAD{dOWCqy8QO6;Y9YoLZJj`112 zkW#hMkoI|%MougdD`bf!)Z~h?E}ofwWu|P7@1sJLsEQn&seVId1lr_{C7WuMXp9eA z4KFrd%uYd(C&VWgv=<_=3L6P%KPc-GHLHBIXjNau53oC;5U*2Hlynl@)0q^!ijfL2(^_(-x92{qxBN1FoiG zl`&^rE6tb1lq;F~KT?aTP?ab?nIiWDdrfh80yVXSq}dtNvPLbObb)9@=A^$Fh4zq$ z%}XC})2eAm1C~VUNmr<0h|$e#TX-As3z_W1)mjGF-1ArWplXP9J6aFSZ~rrx^FM^Z zcv|v8*DoOu_Dcx--!(G-B_vSz&sF^YBLg7a|3e1Yna&(1m=MrN_#+TxOdCT)foiY@ z0|0OM|3R=hFnLUbku@Ehh6dTvtZDhQtrD~NaK4d8cGXn&7@|y0NuWAUFtM(Rf%&}WNf-x@_V)Wk>FY&-!6+9W-o8g zNek@NYfKy68PF~lsy;i13T|`l|GtENe8_A0hdPh$A}?_X`j|Ox7mf)g$ZpQSi3M4< zE8MJxd)d+a%KJCnN@*hfLH!B%nq@(FrjW+1$~StM=i5t4N*h{j$*oeQJ_S^1RakAVdT|r~+K)xaA$24UaS`w#oEs zVp@|DJ^mJiudZ+Hl#XaFx7Lr28X{XOP57~}qt$q-QP9czvYBVCI~#BF)YOqJ-OXN;U%QlWRyW6Rk1+iyZx%|{~u*5pY6d{h;qSj^Ri6Xq(kV8eRgM2xyI zetMH_lr7s8c~sUZGe7fLBBaHn$HVI9TdkqAnPqseMOzz!`l$- z3k8?4Gne+U_R0v$8^;x^WGx*{d=3ZMb<9f1>EeUYAUfS}%$+v@Huk4V?MLE0f_U3%v&{+|a@T8c!o^t5hQ;j+l0M7F)Qh&W1z`4m{ASJ$?ZTNkS zbcQ+Z_ed88?j6BH=?Z2AM%{}AG?ELOPEEgRho~SEJna!##JPFEVwHvUo|H{h#H#Nd={sO7A(rr7KW{UdLWNvC$Npk1(^ z_oh}@i;+7cK{*ZeZ^jw@fFBBIJ%8WkYfWIb1j(-d1FWpHoAu3F~u8KEit@Evrh?9U)XJT8kK4>J5DW?3q%OTFbETd zoFi%i`J;uRf`kSyuQ;Vrv`0Z=+pTqT(H^96*sOhXOm*5grW3Ex?ih2U=xr_prSYkG zK);s+6eS7H{!DH^2ZdXA(so83Uc)gMlz)C@Sr4#iq~R$0n7B`K6)&%5@TKBPdu-;0 z;i^VUq4x6na-);Y(yFNE2Pz3?O|0lpCRPE>PNRnvuF1uRf>-v(+Ul}h!Oph4=0TeW z5Fp+2i+&nb)dDhVOKM}E_a=)=^aBflnKVxk2D`bZTC)yci0H{ezd2Z=rCRioOmMAK zOk4Rewpm;9P)Q#H3Z!V4mol&L=|Q9(dX&S59fscqKC}E~;7+A+TlP}`)|ysf7E)an zt{E*|hU63nwZ;X8vlj8qvj)Bh;kf?~QHj1tDt!ktpyLJe%V}HRJd!fs&JSxx9v!XIwTwr3Nq;<(}2Y zG~CsK@F}3TxXEJeA|lF9vLd@wA4E2TCJ$Ta87;+AEsI`So83&&K3YcM2j9()fLJ=v(ALXyPaj}}-ed8sAW?o8oa6>Q`Vg&4x_b`mJt|`d_p(iRVM|y1 zvDe%rbvetk{z04nsr99)M_OutGU0&7%ZBIo8MrIlaY91MFO=Cd%54shCvFu;#c5EX zaU6DST%-th1wP@*WLC*tyX6JrCZxp+u4088B5k{hm$GaepMZ2!GR9+ZMqnO@g9*AY zC^V>S8D3d5qk#l&Uwl*j~HY#F{>jNZmcL;|+UI!xI>HcmtAUUh;~->_cH z(WPyjRGk76P~rO91<>Kp?hnTuc5qmW&-Oa(ESf_Z4J9o)gQ>u=2p`6rkMM=V3}?q6 zefzQ#CIN2Hg!AxmJ5o%Df+yj0f@e&edMMcjIU=LThQLqViOBfoiU>OSc3mjl%6S^O)YmV1ots6^I1~82!gJpidm?*N>T`?0Kn+!>58RT$6O4C z1jsT)-X-W7Cnq}E3~aCdY0y%AJ*G|eII&-F5-m(BLEL@<+8%9q?l?Vy>I}$dJ1UzI zoepP_>JQ2Khs=st|H}CKzLo$u)_um#eddr(@^u4U(c6^K2QADNM@P~p)%lGeatR(^ z+(Ciq+WLG%_kzgN8`~O9TsWVFDHv(1me?ZNR$SnK0Yl?`BbS4&F`B1DOEpqdQUw`J z3%ce-Xxu^0t~tTu399COBW&M!&b+zynIEKW&yASuEy59N?AOE+H2(4t%J3vUK?~zh znhZ}_H;#eMsrJ|Dkh;W+@9NnZOtbL{WHM3xOraT|4WW@3rL0YHvg#&6T5IWw)37nWzEQj?Ufzz@phG^M;T zk*+ros<3_D8(t_qhm~gmVgXWlUosqd_S-!S`}s=fx-ojsyY3IOWNg&mx&bqLhS|N5tJ^J8nMvD z?ZOeJ>fXe4qpYFvSeRvJjV(#su(67_k3*1Zz-JD|q=tcyUN|Qzyz+F_c%^&!p;SYv zQbRsL-9BPatAf*8>&AF077Wdlz2^`c)piZ02;Wpx>Xbd%>)_k!xO%A0EDFz9^VI9* z*4B20>G=-DgH4gG$NS)-(k2eCp`_@6R;i7r8wS#Z_6nsL%wx|Gb4+B*2<+BOwQ6-n z=aFj8MTAM{ymZSjB(d2hk6xX%gW1A*WBa`hE!Jw|LAv2BeP}ms5(4;BSO)Ca{dA?w zmFH?}2eT1o?UaS5(rBG>A2aRLID~TBc{;0HeR@h}iiXa3jEjqiMQ|j@1cRp_989DF zRYVWW(L~YTUy`8_u1z+8kf7dcYJ2J_^mSdYdwyh2xJ?m0^H%5cq}q?{Mi?V-BEqGT zvg6y%2P{!%$2`Pxhw_nADOtUwP#Z~Ea2m-tP702x=VVHf~(ic2+q z!2#{eS^5AOm$DeO`cfU3P(&&*Y>Zn5eeD4?_u>sp4a3maYoud@diw=#`kd#m?FjNx zw}k(6a@;TMNX^a~CFCcu@jBPL(WIQKeQX0!no9rOpczYTyy@4g;#NDC{n87&zd$8H8=`Z%$y@YX$fSzk&F3h8C-nDAVJO+B^N-*)S%bVCBt3p}Ion&B?hl7Nc6O3V%FKc7OMDt>+dd6FKe=;qOhY|?%QPs_QWAJD%#kpJN# z{Lk3fld(%I{11g7chvn?-5p2JiLP1MQdJ|%#@scp755np6-bf0iXy@@_Lbk;_KQdew719`$ zMc7(*$%~Y7C8{vHVkN;BB0LfxDcv1G8!vuL#(R(xI6_ZocQ7T$yzB+%QdZU}$GRIz zJjwIU58Fe~%{L zI-5{6TlD@um-RsYIG{Q>uGNL&%taIh(p6&T$SUiZleh5oJ3V>hjM_wg2@3f0U-6#k z?sAU!5U-T}G1ySNEz<3QV(!v`oYiLCu*w!Sh>r4OST5cHhZ#y=|7|_}fBEbB2q9wu z0D$ON004^r)!zS~o$l!Y_f}SU;qblfc{-i(dP$0PwwzjLYb=g_Ixr%~^2XG=9n9Cg+|Nf1 zBYtQ?Mt^2NuQ#D~;oTBJi>k|!lP4UPF$>mvHHUH(b&=Rx)^-K@%OWP;Q3?m#N?Zja8+5w4W=hf{$IGoBMna;(YP%04VCA=oSr;# zE9m9Vg<*Zi2Yw_hUlEsntM60Kz9MIJmtU-xuUx#l4ECvg@)t~=-4#!Lne~tkA#r^R z{%z(NZ5LbI&u?9`dw=g=dA{(2V_q*F012;zi5_EEHo}%~h&{cfrQaeZ_)qc{j+`!O z)ZPP4e-cf9A}jTlj<791$ypXzUk7(a;KbJ-$5rf(SC??#o53$jEBEU(l>0o33XOO6lq{=GlIOOUZT zb|2P{!w?J#BdUrp=)|xcBsUBei(Vd~K;~;ZdC>rJV~N2piqb~z9Wb@Vyh1%1cCSk( zAX_v_q$Be>5MvC%Q));{7ri=Fu;_%`dhcNwau8Qz1Wq6eUFdv&PM3(&XkPpVaRs#X zKmRE`7bg`&R8e}zT&|196TxHLB0inhc9LO~LqVREI-m0Pq{$x>^vqA)B0)pcK)W)8 z40v$%-+{L!Y+ z0s8GnIG-Lf`Q?et;gsBB zaBFKQjP~)=6m%500|Y!&x!IKD8;J0ujQsX`!D;pPGqEV)nZ+r~%i+*hRB9l^q$Jgp z4W%>%ieV(=BZK=pEuB|tYyV{awHotmr&rKu2o%`IcnP3hPnM>O3YD@N@=#%Ixq9FZ z>KF@*6}SnCs~bx3oaikXFRL1Q_7Q1s=1O()RynywB@dahge-3CG{1(xEjv6DPd+yX zrah?PG<|I0b>ePIGNtG5Xl2uED3l#Ipi6QhINH#Y8oaW6q8d^;xYPtQ!$FRJ_Q3U- zsECzvoz+HqY=Gp^iH=gMv!oy2q+~%2vK33m@v0&8AW!A7#s$N@@sWuWt;8w(j+?LJ z$j|X=$OO#Ln9jdWcd)X%UPp7OiB7FG%&&_{U0n{If*(m38mKrqNGWkiX%QJ|r7DfJ zW@Hi*vDPICJU=wK!Z2=aA*tNaG{(*zS4N)6ON%QSS}-@TMx8)JDwESvpVm@Ct5xt! zH5hvafsj%aBes%g*=M&Cagoun$@Yi9YM`>ERV;!LGtF{t^qLn{3$cm-h`@U7{=rAF z_zX`$;_fIcrBJLnrZ0^`mbXY2mW5MGtF9ARo}RW$BQt;U;y0sPv~3CRF~W@RZY=EN zL3D!N0-t3pl0uhC*yfl?7C%0&Ts)s}AYNe0hRlh8O_**vvR)vsnvr2+4lV1hg;J0! zt$j1^;@Y$h(o_=% zVv|N%{1gdrJ3Slu~lEVO6OV)ucQb9UN{hn%}TwZYnAC%K9)`W^K^f zv#i4zAiJ^P2%-AVA_8jS&{9W8Lyy(-oxBpM`lNo|CyQ9F%B6s*#feN^Czj!$*GExO zmld#44W~S*p-F8eG$vY}j3iVtc#^MFjq4xbz>t08mqZwc%V(C?Bc)_Wl%hhCq6^)G z$Xemt4aG%94x#=7Vj^@L_2xvi#RjLVm%*>Zz^Hc)3iVV!<@HAZHk#u$+m;n`l6wfEPDjBoZa<=z0;(O>s%7Ja7C) z=EbV57*2pGZHtZQ) zqs?5mb8az*Bx&hl-Pl3j6C#H17W?=QJv5`*kaE@Vf0ajpR&+F6V9!Z-CnREMi|lW-%~z>|cFw!6?aWygLTZWI@Ithp87vPkq@R1TRw3TsioXfvc{^=y!#h>7NCc29&cd%$My50>s`8i}x8p%@p}m0M@_v3j+r z{gBAWFk;w~E48EnpvZIiVzP&W7}eBGJ2-2bPJIkgA>Gt14!fJVeab+(wg%;zRhdG) zVf$Wtvyyu?jAAugrL~BnMTw27#MCGW|2LgWsdLN$hR883ip;PZ^Nn{R`+NsAv|3u4 z>Kd6P-?NQT3+Mr>!M5HR+Bb=}LL;8Uqm@~A?oOFMpmqXVY4!85tk0fGtsuo_7-T}qGk=v=|zx#&uvml6iAjP zYy^PM)LZR~Cs{0t-iI zZ<>wBx=&&m6eD{IJ28X`>xEzx%0Q*puxD3vO6tCwyyO^|lD$z{H zug+l*;i18ryNs$P+fY3*9H8?5F5E<4%ac?J1qsQC^Q@F_nHl_%vt&c6p{l7~|04jg ziObzUz-zOetJ5T}yrwLCsXREXqlA^BRrUfxIrZm@sKp3^WYo81p_8dayNu)T$;jh; zFSy9HHjmJ)(SqW$HAQNk8%q{nWYFB>h5K9nW?qgh$<*1EHzYB+XG@T}(87^LQ&NbF zR5~RtT3wU+$UZc%fVd&*7_Q|qeOXeIbM&xk!Yt#xOM_WMr2gp;P&dq_RhXQG_NVVn z{RVg_DztAyIuTob9w)A}ZPfI*%YeOWEWb#QW9^}VhE)=g*_lQ(7%tk96qctY!98A7 zBtw@#{7EYYdpkLYD0g@ti5&-@a&Y*lQ~GXBH)0T*ucQ{pYW=S}lt@YWbS+$!;>0FI zEn0;RZtUcoEmsT`WdROji^4>F2~Y+_gV*F&*p{nJd)h zmz7iS6L}k3xw-cu!o$T6fMJ0sX?d;rVY9@OGqa$SwpGnBW72>tua&@s6hvP8!4&f2;>@v z#xGDr2j@-m7=5Hv8(31x4ns&Q>V_rOA*4jx{gjz)sd^fix+hNVtmiiWp{*utze?H#C_}lRHzWCn6;9!~~gnH9I5aL#J{` zXGL)t=+5R%`2zPZJdT_DNZA@RFkaE8b9rnu945NIIHyWy>1d{@sVH05mkgUoXAACf zkb37b*u5-$6&PI+&KBFAgYBTrj?<1&=Q4O$=a9}Ko?ILPNa;|tXdDvS*ALM?+eqmM zL)(+_(hygm(>SaXyxnzi#rxczhUbUys&VMsFl30mk&){DXM0TlxZS0L8gd~O=zE?lKe&Wja3`0Xk8&YkwC^~ zbEG*|#2Js;a3SHznj$pF8yro|jZBTHr9QFgCmx>N1iH=ZQzWPKh$dZfk45twOY`~a zIx;dOk%!@zcX5Yusc%j08%TBGYP1iT?mLEe4X?BhV1&2KFaC7@3?tY_^jsd;qi#^_ zG_Gx3<3|3C_%^QVVYbE)2KUMI>>2&kzj3@&jf6HFpm~LT^hCkK9pXlPng?ZVkfy$M zaV#B@0j|~Y){-Th=}2{pAw9uA@D-Ny=#s^J^&eUs;yQj_>#rl>H=cwAGZaLgVt{>y z+z`7&(Hch4J|KR+5+1kEvuPX}JwPhj+iO3YBr_JVv|J6|X3qXg93#vXj75tVy^cqd`qIiSjnboez<<#D?M;6i z%M4H5TRZ~yJZ`v1eUo9)pxbZ4jJ6F+S{g;|4Y-kRGtghWHS*b3gjR!}=ww1_0mk9_ zt=^nWtBsV~tYs#24s1Zg{kJJz6I^!e_nXgjO*xT2-esL*Q+AwF^-t_M&0Y zbcfP|v3V}d4Vx0?d}-7@V$Hq!526wCZDU+2kWBX-B!dbf=R7OegsqolB#}#SDuxRbGaU(paHXOV}#;z8k?#jZ=j(}5~ zthC8$PSBK@G*q16_N&T^K&7q9G0}hBotK+XhpB)zxgc%bEde1^TzF+FM$pt0S@V|7 zJ?Xa61h&S)0i$2)jkg{qDkY9MIX4nce;RD7rsfL*bFf78z9|6J3ag|dU|7%+%-t)K zc&%AY!jtc8-LjWN*~){yJq|7-HOcpsf|eWXW^sIN9haw=#G*L2BI%XKt$y<#EuYGl zR?BXzb)RfnU~o8OcD%WRA;a2;XKh2Ycu*Uo2H{G_mkD#ya8_kSP*}0H`TEE;C<=mw|}SplJCctvZFtRZ!PNOT?qFi${b!sKFZ4 zwLh1N$gYLTWn73wM~>W28!t6k#JW3*=4DF8-XO`sd_SQiSj-x8%D9dQ=q6)P&!7GA`#KURMu{%=R=Pd$83#cG*9|N zo6DkNiCrXG4&0v$7puwHbF3Z3#(2H*z{(R(PcLMQHZYW{e~~^Xo}i&dV$^pc(;eTK z8y~gge&Zb;W5@bwNIEEd{*Fv+X<1DY%w{Y)w%so?h^(WQ! z_EW#){OIQ&o7pbnLyNe@V-x39VxtBce@OjnbaN#NKF4C~a`k+x`vNS+a$?zRJ;sFq zKaDpvUB)lQL4SsH+B~i8Vb0EOI;~x4*5kYJRyEFhgPt6}tO^`_&6w{s++CZw5 zH`}BMhttPQ(iAwUqyPeM>?Ew=z_LS!BP#Tcv1>pJV;dMPsIVvgw=)wu5n3>SH-3(-L(t(aX&B8{sF`v^6XT9Vumqsf55)1${A4NbqF@a+T9Yy12jq$!0t*TqvyA zyN21xtCdMW?HcBwn*AMU9kd&uJw8FAL-Gy=gk*7R&|sK|_iyn5^7xY6z}kBjqO(6h z7=Yl>0NCUM=TH@JsAEl#Y#7zZfdxi&mc@p(Q)h|J(<|Pac*nfz=Sx5_^RPcId%(OP zZ!91cV@H!?Lx%6IZfr=2 z_wQJ@cP`ft=-U^11^nHxgm2u5pE?-ecLUCE;IZETr$b>JkH8dRaVN88`?94%ncJiX z`I`d*tXbn^5@;2sNgF8IJ=%yO`;w@MBHHb{juF(bj4UZKO2M6a5AWgq1w6VKP3okicFkqNpJ{JjSX}+=>t|Z$fO`gUc7y1b8wm26hoP&z(t5*#_hI zG8=c2U55;e&k8MuvJEm^a?{vw@L?GU*ILm>56cxfvM$RMDeQY|Zl;Tlk8G-UvCY=T zv{@n7pE|ua?=UpjvrA99eEQsqre{}uK8vO|!tOS=$kmRqF5Y{PNU;qr*VKnmEs3{o z!^-4EB#^B<#s7KWTe>QsSBW)}-+LxaF_m{>&vvm|+Nw=31%|L38Fw}4)PSE*&WK0} zEv>0^t6lpIaLPxV_o1KGJYK3O*rKE8m&40*gGX@`XTK!8nqNWx;IZiO`M{$07Mo7lpE*Hg?$y$PNLc}e$#_mtN34R1a(Q?ydL`6ljmu{kaQVdDfhzo8+ zQDbjpki8~D5ZB*{?boclZnEZkxkyaVsn5GHh99zi_k})nh%$5JXG+Thzp!Cu%dEmw z|Hs~V?3eJ@R|NDM+gWH~$`Hpf-Cz4OkWxAb=rq7%8hT0{DOdx%+yIv_^5fia6|>fW zuN@Kg_@*P62{Eakv=&JeyS#Tq@TaZDqccWSkszXA4I#@a6`XLi@XtP$S+8Qq%s zGb3jzK&M~ln#i_++TF~Rbk2C~G2oi(_BV65RR!v`jN-9^0HKmHeCwYqB|7UmOe#Fq z;W=Bd3tHrxAw?qAG&KIfu7sF}{nt}9Kp)mU(qVo)Y5=y&DR+AnWjRc4NS*c2nC@`K z&EnCxo6|Y<7HE&d&r|=*u5)j1P>Z1|knJw!Mp$yBY$S25V?7Igfnoob+-h&GY)_Fgl^BbA{^AbXNvX61hxTR1tX;oD6EVgh-SKT zs4ViM8<$}jx)+H-$F8H8KljCCYQqUfPdEG#hNA(s*^jKcJ%ZvQ+HL3&Ixhq?R(}kw zmp-Bx2ArT65;s4mnC}*+Aa2(3U~yAf0k;i6<+N!%e3;m3noY)8&zgPoR>XB0Mj!1$n)wI+i%M13itFaU1;} zXvy*_j6Itpas66+ryapqZv@?q*7;+1kmEl*7?Zmp^B2U)ck=RezK{|M%o%KrQXXk| znq+OEW33sgWzlit#J{@!$(jL?n9?-KjOzh)j+I?Yo=TW1lzcOWj&OHCNA2*XkGBkAuc1i0 z;HmfjV%-)nMH?+I@XPv*PwGOLUO^z3sN&Z&r#}S z>YoUM_>!${HpT3c?{8sc;7!_R78T5&?-2TvBLzkD9#{wtv0YmHr&%< zR^eC1D}^JIoMj1M*9mB?fR-G{?#I<~;NMftyMw%XKovh}p3koB>#mV9xbcHpxuKl4 zC=OVZ13_9E-nv-#6tau+Bj=c}iKBC&@KXGVa0DqLPBFwGokt*60D}&KEQa4qCL-07 z+J#)b;`rciO)G$iwIxe*qjoN4cMMM3Rl3Tmm2+cNvY{B&?q?6!KNDd0C3Jj8JD;Hs zLFmH?eX25`=|d}h@Jt`63p4Zuj$C95BQjDDupt-%8Br(tvSh*uSE|U&sVrBXkxk+* zTfA7DhvdNA0WL%@+fstU_E--)ZI2O7LLKSA?P%q={j3#;V<%`qfA6!h`Eg^fZX$;K zYRqj`6&;jcI=GT(jjCboaup#Y6@KGOkwP?g@)id(xBO!cZc76T>P2WRUrsYPkNTFg zf9O_(unleDO&)y;PkeMI80G>`75QBs&mTH!g2Wg>$?c+Ph$m8M{|J=)nHrhHczFc!8BBNEz}qUVm?V z4{#0t+n-a=YUeLXlcNh?@o(RkgLi)u)QrH>c3^bbb9|(Axlo?idK=QrHVnlNV9M+! zun9Y#+egq~!sXqE&I@CtZE=crXd!E!e2gwDGTvlKhr{}*W*%~^jCgf!0F$i?BNP^v z0m>+=y0G=|C>|LhPf9u#ut~dubE^@kQ~$x|{t;dtgkKc#3+3Z+ZeXrY`0p2N^ueAW z-Vb8rn_T#VpAh8_JyzvjJ`|}_&wf4T9y&C zA8ESy3f#5!a3!?k{2Cv81ARUiATNH8Bf7ExyenWA!d7j6oz}b)vOVpa%CpyR87un4 zIr_t${O#|*fOmpU^e0ZrQ>XA;C6GB@aQ!sRo$OiM08V~IhA0}Uzwq?AJvvVf{$zQc zb=QATmnP)@VeFiGg<+z`dTiUaZQHhO+cutK+qP}nwr#6#+OIdgYBHIBFv*@|?X~*w z8W|^@sYMsd!mrGh!RWNNst_ae)fJG~m0=rH;IpauC@X(FK#Y^RGSHN6qGcSScjJjZ z1v<~cd4~Zo2*3neA^Is0gCdE*{~-$(Xv72@jaX>VjrLnH!Vwwqh>W1D6O;~+IpXM0 zLG5EHLa;{_g0%F_3~aNxQKqKTY@`=0no2+h^7!QpS3%F*mPlci41r!dRpjfq&?;8^ zEIHy#DBXq7Xa`{th+IHCIQ^(tD=q$imbIKzor z3Padr)?jTaTNylk(k@;pJZs>cNx!xSRv5>-2>*~n=>Ae*yOX+ZBCcTyRB+IXVxX3a z?LHhRh~?i6i(N{v1S;sErwI2t$FQ}PB#rmomcw4#e(s%s5i7yecBGRde8{jbgAfk@ z@^ElGIo{~cZPtK%)PBco$41aN_f;D|~7!l)1C_hD)Z&${t0 z1zejh62z2QW7x&L4%DB1&BR#yc%;Y%Qe8i_n9m3)EOY5dtB|UPJ=WxhMGDwUw|n$^ zMBcg`*tG=PbwYLNP`Q7|M64;)kV?9i^AjmRn6)bBCzl|AX|{`}2YeKwLKX0^j@I=? zEpayH_#3l?qOIGAX(ba%(-7*`4SCRBf>D{FOD)DNar}v4L+qm+Sti+C(3j9Zw&R)- zr$|?X5ur6I=U3#gJi!BW?RcSP+VyX|Ma^Fu56 zpB;?^$B#o2>TEL3uwg=L3L5)ZkmT)RZ&IC_4DfGmgtzRdP${d&E(ba{ zH8P-ud}*_+5K&fQqtpDKtat zaIXPc3?cdvFhn=0rxiQP$5aVRny==pxW?QY!B*!us9Whf402C*>yT}&<3Js1!Be5H zW2!j-=@$TIg+J%S=Ik57*M^6HtK)8*kUm=>|Im*d-`ZA$(N)UUP!d);anm}1g@+!_ z71m?lyMcKJuoX>7{O)#fLSXXa*IcQLu3Q*&un~>T3yK;by*lYadjDhJM_nOfTy+oD zLrf%uMoHYRqXWlcrT*gF1Mur0CJn1mxCSrnTEzkRi2+&N+>Un9#&=fbk{Lcp12b6* z6GeM$Lp(-|>wEG6xjN5r5t3g8vy`-OEE4jZc0vWVfhlXh6!q{0G=0Z4w}mG8Ch?M_ zM}4E^+FiS18^&@*oKcD_e#I;-CaB`b>!Z;2V7JCz+n&SYnL^o~D`t*qM2-j~)5mvP zQ$680&q41y^@8AP`3VQ~M9=peNUDL`aTiIv#MmsynYFCD99)oh!9tm{(ap{HuwmSR zrC|$q<-3pzB$NiEH+4fHW_L(D096v-So+m9`abh#f-T=Bi+fMT(Guy0@ZSnNbwU1|P-Go?*8D(CQ}Dv@< z!@uhQVJo8Yr6U061VUlx;1fLgK$KoFCuh*d2lfWp)!HlA^@jh};uCJYAj`P@05R*z zD&#X#tb*Xwbr@!x21?C@z-lpNm$(K*x3IL!U4gV&V%|fn<}G^lPic{LSG)wiHT&IX zutEHmfTowi8tKu7yDo%rjvjNJ6T_B(Wf^8iMfDB~WJqD5^hZwu^g<@BE0^m~QeU6* z(`;M|luRVzVt8lr7I8F5FhM;!ZVH=x!JSy!8U-=AbHkjv6))qe>u3~qP`>yE;Ho(L zSMm%c#WTR$hmx|%r;Mv801>}HQZ2ENtXDsN8Fwh=YWkA?=$Z5d*w#jmC*K@0d6VGg zlaO-9)^}yNFgl6+M=php#Hn1 z28v_p0^$D-_T)*T~oZSYZcg5G0S{O|I<8nFL@$DmJ=aZ6*FhL9|a!a7G##KRA}9#@lN zSB0&swC`*y!R80-;hSd*F3kx(=0aC$c^W9w1?Xv^Wsv9s3A0ca=ygM#Ua1W$*=$iL z(uKcj#@_e2A!`@u(zNpjvU8-18pbba3(0c5_oVzvg0U!nHpiT|a42}>@u?U4EF@u| zZ&F8TwO8dEXA#m66yjR92WK0$#Q6ORa?-YBnr`q$Wn=N(4oE1m;xtKH1h95Lq`Mo% z{RQl_cpCt)1qW#cH()8W<@vl;ZV|_sS_W-l9}wGSl)VuPj=Wao7BQ@ASVQfuT7k{1 zRjU6MjLEHi29H<910!D7@~PqtRp0^Ey8(zAZHl-$LyB=!2Y1$0EOs{W$*K(jI8XDA zsu`uS|K!%Pjxz{*<(yvR3lzFxUIx(@ z%6MfJX|^|vedW!r_<^2X@pEFihjBsvCDN>77|7wD6I}6h#EmA^9(xUe8Zr6FkLjVD z!$$8%V1+K*gCi43V%bu+ZGUok08mVEs~c9bZuHXQ-OkkzKkb&9u(M)l#%7xDF%Q{q z><2uLhR9Qb-vLh4px7aF_0RVfK(aUT34z}*E=REtT|I8!HcqD95}sj)cOYVKDyV8G zD7sFit_8x%lv6Sc%@ezozIRqDL|Oc$We-+i$Gw0)zgs0ZUNsEa3VE=De%zi=IKKsW z+QBuf;0B)D-r47Iw{KtO1*mm0AE344-@bwy^mB*fIl+UZZxcD=8V)rvdOzgc#yG17#6D`{7F40O*Hi%54KdK)VIpc8$#D_*pMZI+X;=>B^t4_ z5wYVrKcx!Z6^X7gLMnHzst#=~gea7vvbG-ke5~?oO_fK_wySV;i@NVd| z1S;zcH)y7YK|FE@#x$6Wvf*6#?nAr4I%xG0eauz3E5hM~P=rGq@!)wig24IW);S)+ zVtf0H5Rp!VNGC+39VF6$6X`&TWN<|y#5w`urGDBMSY(@>@X$Wcd1otO+8N?8LO4DLPH@-wPeIJI zyAwYkaKdiA4?5T4z^y&cddRyXiQJK8efd%1jwqar)L-I6emy7v1SEd2_8v7JM;j6>h|6A(i#t?@95PV}WnapxF( zB|iW1nb`DEUXAj*U(UmcJClZAwvm20W{|=~9Hlo1=YguYLqFK=c8&1d4;ZX#FJ$4i zZ@}b@JO0iO{j}o`FnR~S-|1~k;pi7;wW}{A_SXIY=?&hY=4)>p^)Ik%yKivlmdr!% z>^{+M@TwEke@%Jcxrf-Ns%&V^3*BO|i?bC5@?aQDCLvnN4Qnz8pEMjoBG_J~wGZ2; zy75QQL)UB64kN}8pHdXp{Tc8}!Et7UY8ID}EZ&x%ph$qX+NUT0C`2u%p5n0eGk8M>dnR_>AVMWH}x)VANiy8 zp%2W9;MY8$^ek9C4;1%#V_tU;;OC_SVNu$kk`KSs*tgY>hh`CdNXi#7yE+d7yWTdb z7l&?sYTt?%X6sqCURNL1f1WyDu`XonnaV>dj;LyNVCoag1N*D5E)NR-;4AO*0xtR& zFlEsEQAh*gHVx)1NYp}*&s=|BPpxq6m(-8c`ypote6QiZ^x8#@-$<_-IQrex75y;y zUcEmTjg|M*&}L@>1Fc?J68ME|o~`%7FItvc&d(}HXck8FSkc$r`kPfQr4=4B ztGi%yhsxT|)W_K7jNd zq~&MuysSS3ASN%)ym$E%Gqh65WP#|>csq++S-+r!q=tuh(1cup#MPzlJ&!KkOHt!U z51*q3lI&h^moG@hJEO^=Z+r=V=riX&MbatdL<`9IT=|9`Sllm_%c8#cs3$V!nLXsDZ9ed*KqxWX zkLjZp!O@G773TR}3B}E-bcthYgrj5ct%P~)qnqfa*=W#ZHfKLQ%Q+-6IUL1j>8iE zeknhY?jH#0sdI8VeL?gu>ho$}px>uE1uK8Q!jCvc(H}_Ca~`4oA1KtbzG1F-@ChES znrGqx3Vdfm?mve>a$Z19ZInh1FFvzep+i;;09}462llJ$^E>s}c~; z_!pj`{`;5!l(};dNGaELV$}*{I7%u=cpKs`Sz4DkrcvZ0&lq8O^8{)4p**M~@a9N$ z7oi7kx$w^hzh%7r446!FDiZHUf*odHFAp;z{5cwoW6BW1+zp0FX7Ew(Q_^|!!ldqT z)wC3^avw5r-c8}$4kX`9oP|0SjLSok0{4Nu8YS7$ zq~p%$;6^&BTIS3XtO-o{M|yQ?bBW{%M^;?5&>GQyg2} zN;rn_k+@b93^fu83GBnN!~3*v0D+$4(tgBcoVN%akA}; zdVn1|*Q%$4Ayw{hLY=mfFz@z)0PGT{8p&TVkD}Nm>bYGIO!+8z8UH0oS*Iqhzs$wz ze!ojm)aKflQAqL4T$egMG;rqYN&Ic+Fwu8OQmjG~lddoaLO5iitFe zPiXRr<&;X|U|U)*37UwPF@yO+ai&jhyef;YLFIG{*okRI=V(zl=Os$prwY4n?A@xz z+xnQbqrAd`^8Jzd4)1~tZbD|j#kZkt=oP~Ky7zL5^(E@8xJrojKM3|ei1xsU_I|_K z2%VT42uxx96vh}a>|sNWqY&w~F+rrG7{hxY5g5n^EXGJW#xkMUF+AkI7@&Z=fGaJ~ zqr(2VRQ8D?^XNtIL!f1pG)che9*(!n8Pd!7dWWgRc5_K*brGJqZYIc2Z)`F#fyoSJ zN4cj0VgvNGah;O{~;Y|t$mql5W8YOIU9v=#x|`Q08S#XaFE2x@x8ll=9GktuH# zkAS$f;HGdx5?=_^cGugFSbYs3f;v#C4KRx_O81zi^HUH*0LG{wu}~Oh*)i4Hph+g-lNOmH&Jo=mV*a!b{R;1m^-w5G5rF6dhX$}#> z;OsMPpA}*gBx@k4SCFhvKjGG`$wLkcadEVxK1o+8Ov11vlf zn*qIuHra_b=l=Tu1pOQ3oL}L<_rgXO(l>@K{587AP8&oxa>B6HfmDvIDj08vi;DHq zu+o92jsHE*$oLC z+eWbEfv!3v&am+gvoeJKk4hFeus;DF*+Hs94st+cD>KGuO?2dW31{olc@fsUl3{gE zt&_0lh9>yCq2_^j@CSMD$3Ems{oL-q?W-igR7#}fz&%A_Kk}jZy};5cXZRA%s%RoS z4xTD&En5>;RiyxT=fU)!OFwJC&zPx8LSWrd)7blmRkJr+48IQ$$uNCB%Mf{UIH_JY z>f&OUC=&gynhtfOA3F9M=9n|&9_|j;CgyW9^mD7v{I(5Lu#6qU#0_M#%nY~;F6k8k zzHNf@;jSmV_JIdEY@xI30s%c;QwC)!xUH)z%sIHIu9FmUmxF)tsGCuI1;*YK(HbJ2 z>|D8DIG}&gIy0<^ex#42vCqX_R~tK2S;JQ2>%O6vIexI;FM97_Uw=tTgNE(A?3d+JmMEEZ)Z=p5R*71zO2T@>^s`<%5jEx(lf>j zJX;oFVWnfiRJNW7|E!I##z<{;9yOhciWUBp;~pSZY*DVm{@7T0MEGmrB>e?zsp2gC zM&t!k)PHX9Bt6dQbq(t6?SUm~md%^83cz-+?X2EwD9%k}lTg+r-BwkG?oZV7@d1H* zG6u}X-*jN?&wr@FYWlc%zMx>lb8$g3F@sE)u@`4>##!3(%i#j!IZ?tgh77VfamX@> z3+8cPp{F0}m$Ly(PesaE$OpijnQYj~22D>{)(uYw@SMqTSj-2c%?P{AW&_`*J@2bJ z;sZNEF;9_FjdJ_BvZOWLoiV4F(wcafr_J`;I!>+Jf;^F^nW;CZm0cu%!j*S7m}ndS`gGR+(4r<*p`PR(9xJmJ0o$Nr4;hW%LE9O679lbfU!nCOB5 zyV37rGYz1h<4K{ZHiUM=-$W&M`X4twy74og*Y>e5I5F?>eEPqd>iSJ`4)pi{NN1r5 z-4ssEKt~Pa?*kWwVvM^~_1uZP)6ENh^7s5QW&~Av>Y@RUIZ~K*M!_j*T@tw1aRfZa z$y`6Iv0WPOoKLL$I;W(u(D?73+s217)C>JOpp>Sq3z|G}pP8--@;rS9>tK@F_4T?2 zKX7@O1Wb?1U9z5UUCu{}%@KoYwRHF8T)z2}W+9U=tw+3w4NXi|^RYOYNO@ZQ& zdBSmmm1-KfEFNCbmG=F>M-;jy+SVKDP227G0O*>NOFsylNVxb>K-gCI-34Y9?RfNSki_)W8hDPlc_lcZoHlt@3h3idj*J{D`xJ3 zq)$q*^Z8q?M9ZOeEPHO^*7r+m3tkP(a)t#(de;iX+h+%2x@Ap!L(@Ic8K3ZsPJM@` z-y$;L4U<0@t@7m+zI*_mrs)k6K2SyOwR1jztB2mmp2Wky#snLOqXg7@!eeY9%(HN_ zZOxDw?MSk1T^!hw;gz!=vj#O^5FJzPj;7&={t_d2EcM_=;BcPVnR;;7F=40!9yy|q zy+M!hIw#NNK?L^R3DwA@ z3^(-ECg{WTS(xOFAjpwvcYh<|0wdxCBjO02pUs3*-5FwD;X)~Q6BvfLM-QTYw#mNe&sy{s7M46Fy}aGTA3F28Bvy0Y`@$$me{OAVBcs+l>CmQaJ z8he3vqI(GidEX$1b4G&vLwnIx(PBdMGvFh-!usd}ZQ%WFV8U8b5KZAs*kply@h|jy zMTI?&Y!A1>kMk!=DoK$0M>ntOJgpf;HveCWCxv@N?xX$awb{hc5r5+{YUC)$vF$S+ z;HNC@Pxh)S^XCU4N-_#pie&&@D@ut{wo)+~2Z>rkg*&IiU5bH6ofuT%xo4Y@`rS+X z)ehLluC`(88(aEa4{)j%cK)_Exr#S_0M}h`{lFJP_Kj%MzAs4a10U3yH-7k5k37e6 z7VOT4$H&v;NBjV}fuy*-4P_q191!<_5TB&p&IOe7hl!`CF>vt%<)V{5JXl_(%Zgk0 zzpW1zS2LF`WbhMCar!h0-6T=<){_Nk;;Vq_8|QyUSelieJwVdj*X1i;{so?Bw?qWo%W$7dD4xsTW6aEvjz{=&;WblgkJzk-S~u&d}09np}o6v$iFmMaZCCQ zgl`nb0jP=oWnt@V!%wOPn1{>@GpOa|<_|!i`;kzdQg>v?O(+#~-%aXzg_@0%HKGNvdRoloH?3Wy^^%f5lQNS0{2 zz{CESk2w+WOrf#{nlOtrD)R5QmXKrHn&nW}{2MDiolD4LTees(%BQnKXAIlE(NmXQ zfi3fZ3^WgoTzS&|*&;ux0`Na;7RxB2RI&+S%J;aS-UFhq`dgs4zD^{jcp``0*Op^$ z?E{CTKE2mzVbn5?YWqHcK6EC!#j0*iFcKr@#n6wYR8NBFZa~?ysX=im2VL8y{c%LW z=AE#5aKOV-_dopqx3c6f0-JDUF@Cy$IGDssiL!j`HR=o zZRjDu1gQvQ!j6dnAzP>zIZp(Z0}%{MLS{8Gc8@`ZY36X6fY9O=S)-lQdK=j~N{b<@ zjfC7!>uA~1kY&B1rQK$QUgO4HcEj27bDJ|Z%@E+^#qqXt)A#rD`vW)U^F5Eat`OSS zt{80X`~Z7BK2ouMFe>M>6l;I5WhYmMoOiX;4#*xgC)>dR$zIhiIzorqwKG0e6LiSN z-Wz<^>Ckol*6t7v?cV8-2JIdl>J8G>6Z8;(p_>-%-7pvX<l6bq4-d5q4=IR;mK+zcP-OSWc{r-bLx#YY z8%=&+9EBe>5vRg)GCI+&IZBC)EN-=I9A&Ojz$GUcv zz>0ayVL$=HA<*E4UkWS{l}x+Hzz2Vor6>V!POOzJkb$RcUvzZUQo+3T2bv5DuiT zOoLZ>8>x%*PvqH3Fco5SsK?CJU!G)p3A=)-taZN{VAO`)!69 z+g}Uvj%ZWw$JOIU&IgBO677Zq0$=B!FgO4FmKwhK`c7Sn5#dF-BI^co%kC8Fsg zBO+F6iP^=iMCqeW0pYAZQi2W+d1&z=vz#E+UCMIv6_1KvOHdavSLMo>}RM~09_q~ooD`>snd z&g0mnNsgZ$0#K^QFKO~5Y349DpT+T-!xi(7BxD4+CogejsFyS-Mhqs?=^ZudQD;)k z;xQKE*QcfT!;D#ObuM&m3-%yCIj~+Kd<-lV7vDLtzKWRstFcLlOiAftf5%^#rI|nz zAIK40hDcGaHie9xD9Q4gKwggZ`UBnaNg=c85TjldUaBE#(d`p*am6R*G68Y_HA65O zfb!tTT(+rn>ltYdm79Ry0&V8>K=iVj>@%HJcy@(z_y`IqV;vsi}{<_!wvN9I_+ zf#$3{;O4A70AHRvpJ&R(j1Yz67Dtw>CqxEpGW8zCiNqx0nln2st8d}4dW0~622`w4%6>l!|Dt6se)+g)@hOYfzf?Frt4gqJrzYnbrRdDUZ(LwtEq$U`6# zM!$m!Z9CwF%@ghk`%j&U^-E#b1*5-wPi~kr)Gjshg~ivO$EpLOI}(n?hlG~#SMgh2 zfc=TVOqvrW>1?&3HIPWz*%s7E3DN}dC3z)xQf4f*7+pC#p7q??3?$Ytv+VhU_Gw5( z%6io!bDvbtp(~G36i==`@NWI+^(C@+#d=sMSCb)Sh?Un&KHKUkb8NZ#`xo~T(m}&M zzqq=)-bm*#iXktFXUK~!dogR!hF8a)l+hjNe00din>bFTTNFQsOqi{DgrkSG$=`7@ z+P9N#JYlgwKH1qC2PwGR-(BO_!=935<~cWovZhtmT}kjHE~~l8B-w5j0`nj=!D>v& zSBZHv8g-I1F6pT9;bw7>SsbzC!91!mWHxmDuYo94zJHECH!ud)ye-!PnVwKRj)#`& zGFzUG1clhj2G@0_sq|SYb1~R_mqg?$z3+pJVOZK=`8jRXCaHZl$Y<6xsJ#VCg-?%sIsfqbiHk;ji8aTVnWM*#S@b81>*ShJw z?O%rV^;Z2q>MPF6;9&oLN7UZQMxrlK~9h_K+kg>Ki>MME}RaHzzYt< zrgv$3V0AeeyfLwC@bQI@_JHY;b7&Qre>l1l5Nw=QXXCS~sQ}P}H`|VlZyVOqy6%RK zBMdkt|0y?;VFxsg(Q~wp?oqd*afuyt6N+HI-&$CzITb#5Q}(b>=9xsBWhqT{hg+b0 z)P$;uzkq<`f+&Otxe!Pql-lPdBj6q%2ls0MuB0Omh0%pTGKeSTk*W(d4Ze~Lkc|hB zP9U7DaYp_HJKTjj1IU)VN$QnF;aeV>BX14Hw5mLh{2NPX!yW;qKo+)ThXUL8#Q4At zS9E9&iWa6wPP~(m))VIxh*Q3>2OZWE(WfY?%Mrl8U!0YF&SLwV?D%e7+Qm(_Mvir6 zoUmC`}Kkq300Jc;O5 zkWSQyxjsZSreqTV5aJxOX_4w@53zik%JM)gK7(wlF`+e!2`DZ(L?ISDC*y67V_P5O z*pcen6hovhP^B9}eP?nr`mblkir3GIG1$TpgsbFeu4oDS{8|o!&rNCEoE+=I_N+DF zN@JR5e2ku)`_Eial(`w_!>KvEelaf=4kBmK=T3dKb2X$WOi145w_3GW8I z3J9H=0BCKDR!!BaYytof7$sbfD>MNi1)en2`0OC(#o-R}RDIynA@vU3cyLGf&7E<4 zTe|bgq`o($(H@7`%n#g~5M*Dx|5O$L`lo88xo+$X_6^;%AKi}rQk-C06QIHw6dJDR zM8Hcog)xVTOV1V4fqC@=uac|+cNF5Hr7?j-%5q*}UENQ3=@((?kS=;Dh?W_ij)q6L zQ-pF#p?l02_JIs@NM7RblvuAkXxkcsTqKt;SKWM?d6Ln7@^08fosi}e^BM$Deky+?NZZXWKAiL;MfRAUN=C2tKf zo|ESwd1WE&ae4D_d9!hOb8#7~piG2!t1*Sh&smf6#Ym~My=_iBKv<&_JCx>0wJ;g3 z$SXecZ(7PcL0QV*Gwi;phDCuM#};CWsw%9$TdamcExe&n19v)?n$@b|Xq;}E#%(>7 zKh$RdcR12J!JZML|H0_SF}oQW6xHY*Lk??H3JDfU6pfQswsg5I3?6RZck=~!bUR$- zNF3&^Z!zU>H2s5n=N-S={;xRw&uHb79rY1^wKlFnc4EM7Bn&qSw~az>yYyH})jdI( z7@t0^$*zKjmFv;~g-l#USt{edKCqdF=)c~ey2STZ3(=D4 zMWG*|9rZ)1sXnwxXM~Xh6SQz;Jb@FyiW3*r>f<*n%4gQU|3{4Grxl^thXnwz&I15I z|Nk{^%UBvo+B(?$j~`77(nn>b07f|2f}n!=SBHto6+b(V%;O@8Z2r;4q0joVu5<}0u7j!*ZW`)y7ZAsNX! zs9(1CZHM_s?_XQqLFk|Nx1^IIY2VEe%jKAZ*%J=FEJ`ccqmHH7RFr39tDM(U3Fn$Ps?L9J zn=_K14{HG0#I^Ss%j7L|QJbU+4f;d6SP_Ia!K~FsBXe*{$)m$X{oRAKE-^=a>I%zp zwe;SzapL3ADR93rd)Ymj zrykkN$)XNnu^#1&>Y@%Uw+=BrU)hsCV~H({C>C%*iEIK}lBI?(NoPYRYa=NJ6lf(q zj1E!+t7x$8!)3`Oq6JJwQbvqyO@Ziw1P{_4O?22>GsIF*jcviDD)eOo6?EOpfCi7H zsV2VKBvSP(B)Ha$hIamhjMm+qt*@{VqT6`8MyrGtZ)4j^v}s2*j2(=4p_y%Q%L>ex zu}pWEWj<@fPv*1+4aTkp`hTg-8`%c~k{C+O)w2}Zfp$^AR?Fzjhxb#_1p|(MAN>nh z<(f<3Obyyt8$&AxEdB@5g-CZDMT8nQV-x zZ>`u#}Fs>X3R;{C^o|m#>KqbK3H1-du(&-Bs<&7Xpy67qBhY^X_Qz@Su?PK zuL?etAaEPNV(J-KapGpfM+*kV-rFd)#$0voz1*Spl*7k(B{?KW+G)Bs3;E-1&T%Ci zeBFvH6eL1z2YUBR}sq|!yD7sti}PD?b^jAoO@_uBeVICbmxIOCxSnaKuMl2Ks~r z6LCw(ey5=Knh7D=mGT){X_&Ks7%kk8Xu}>SWdqre!5LTHq&6`T7hf?se#kxLo7P(~ zXZI{d%{9ZWWVCug?7VdFF>Xc&ow_#Q&9&<3T3I}1`h>e9B~H6ICRmtpZW`lm{VxR? z5AzUJeO13fR15xMvU416i;>t6E&|OQ#aH>}f2#PM&l`jVgGTvguvT)ypF`qbV*=43 zHh&r%G!sUl$FlisB{x?y`PH_)6qc>Un74JT7*5+KAM!*O;@>UE(9)ip-Q1L|4cu6; zB7*>Q1JwQvU^5M2AJLBM1T}B| z4*g-OUbsv|g_E9wmA;#EcD|vM)QTH9P(h5_u&Nq`CA-Q|5M&Iw{vpBqf)R6C>U~5{@t37@Q^z< z{fv+6F=3L!wTHTDES5qnA&ADNT&t5O{#czc5O!DaVnvI{Gqx+Gx&x$Pkue)1S6fVp2+ULc{0L88yoq54X8| z%p*k3CE)OIf-bYgig9RTS;nztI0q@^nz*gvsx}7BYQy%XD#w4lwc;=B&r-r7vOyv7K{mhJE(Z zJF22>8_mBo@9fhDseJO>Fr0%~_7cp*E^dpk6O-OmLi!qs zpxO(-so1Q5u#O<;+ACwzLYde(+B+9q;Z^d-}8Q(2H%~0!FXlnGQRuy_3wjwwhibTjvw&eGQ1P|t?$=8;03=u5`+B&=&_x9 z3f^<%0BF4)jHo?o>p-n3Xmt}J(bB<+N8ys|Ynjf|U#N5W@9f*(^9A=!^gp?J&E&J6 z%Yr!c4eT9`!FYxC+TZ)}8Qcr1*Q`RD!jmY<@uS<xR$hJE2Im!TrBlt4@L>2P$62r}lKn(wDe zNxAr~?w`GT=IArLcYX8b1dc_2GZ8>xd_(a-^i9@behX7D_08I2e3!C#e~5$qVLTq> z-Mf_*^ysnopSeERjH?r{QL9ege79DUVs$Kc4nGutXc~+f1;%<@sIS_3OkT}u*Y)pe zSl{HVV!*I-yW>24y0k2nT_weomSaX_HEC}hW~E5c+-~6(xb7^cb;E_LU^aY6+oDdujCO8wc1)50&P8QB(BXSAjh`Htc|_IgB$j|2 z>;O@1T~R7%Xc_Ds8Hn;EI(&mQx40^zXraW~n^~QUJ^WTcrxbISZeGol1 zpGt7c%+5X%Y-?85B!$4ZuEeyfI0$v#^OIUuIH~$sWMtQC8>vRaLWf9GsPP<81IB3$pRq%#p%DurVhc+kr z@l04ij;jil-K4&K6lx&M#P0wRd2xpoPu27xYi5i-n|2jb*)Bun>v=XA2-# zLoHv*&6Puk&y+jGlBp2T+URMWc{CTaa^=?YP+u4hHjay$ty3u!tFY16v`n=x*<7MH z1

    *nv4>|&YQc2&GM&oOLR^p+e~_M8?-ZP`pqb-9@z)vOT=w)3 zr*sK9IsJfJ*u1h=xD5AbbPRw=9jEYl`52tMprGj&z+}B0dOKOCBz4jsoV+3_gs4Ht zl?G)Am=dtB*o?qKU+CB@lE5^}71As7Mx`{m+67T0L0;E>I3_4eJ%}7K|%P zWso(`TTJby_W2V|;mv>Y9;a|?MX+eke^QXwx0$CLuj~;2c~>UXjjnme#ALt^3v$Z| z3^z}}^K@-am>c|n6LA(VrzQr3UxHr*J_hm0+$}V2;m+ zrimY29an@^{4yoQ&zE{v$iqYBrYJU2r1F8fNG+!zH9}a)MP-gtc!}k1TJVJs+nPF+ z3&#(OK&1#$XbsGdenbm(Y0U7CBSn#0b+LpclWjp{Q|4?Q?fl+UA%AM%h1CTyh6yGq zW(bEqTu=|#83m>l02JS(Is8>fv+@28@p*flIl5PF55VoLALwnt2w5$kg!xc8nP5@X1BU=>xP=qB7b%B&b_^VN z5*+#xJX|RRof(LZ45vjp1P=%zzr}N4=1+cVMgK(#C$EAecz@nE=lQuzuI(41wBVwM zAQl&eL4`h>=a@ z5;NeTq4qtZ`2RlI_cib4H3VKffC+BYs{^`?t1bbU?rA5KK z-LH6PLAWl_q{*Ko1~qi!C|-%f z979N&@Qs%#MI?l~fW9PNKtkVaA@3w19w;)tIg~ZRs*T2fwuWV+$ z!hQMri}n|5&wxK+d_s5l&v@3)|FvhlXN&o%L_K346H!cU5+`9s{0dQq3>4)9oF1?u z>(V%SL{&nWh#0I<6F4SbM313Z&)Nh;3JQa1Nz~r*FmLKsn>6+ zfBFmdiNk@)HH8Ehnov=A8+2fKT&d2N1O^_3@DFvrf1M;4WVfdTD|w+%vp8Mn<*@V* zxCENW+Ml*Hf4{~tj(g*z;1;fZJ@WkU3E9*H(w*fTcl_RqItl?4LKbp_Y6D{tC0v)r z0G{cSW&J^${ek2C!9)H6sy;%f&Pj4WqskbUXd;a0yek5glL<}%i!J|Q<3hZ>;FgE1 zA3KearE#-$=xA1lDVqU4XAKwuuiiD(ymO#TI2o85(;M=En9jBZY4nav@}Lf1l0?ij z(2V7w9E9{8nMnBaHEX%f);Rw6#gxYgXe>+44uTtOm!d~FiPv=*2x*cCk67dkcj8O~ zbL7W@8@oL7!5RW(3H$<%Bgz~CKG(sMiS~r3IYatSG;?(43}J^CB8Cqm3?z^EtJy6l zIEVGLWWZfK<2*WQUf6U6)8- zCeUmwnb_^VNW)EWMkBzH+91gZD`&vxH9060IzOlz`KDq`Jfc(3HSY}N{FG1>-Fe9a zS*axav3fzWCCeZg*@d zS(#L&G8o-Wu=L6a8R}RBg<<%%nbTmMlY9IF>2T*%?1tWBB7H+w!bSJq;^I9*VPdz6 zNy1OM&eQ`czhSE)HxTrQ9AeQ_-uuk~OTjM^jZGD&ELWmb!2&^!f7+g3h>VnC#_STe z29Vm4JbI=~rVn7Ts_3sLFU%oOvVBOx@za0n97Tb1hQL2bwj28MN|7h{s2n1@i_GR} z9^6VJianTZ^7};tbij0CD+rECf*7UFN|~`qwH!TMa}R1LbpRogAKTcG^Z0>86-1YM zZwBE64dO{^^NS_=q7q>i;q<;$FP*Xk%nSEpzV$4xFss{pN_-=I|3L+`US``o-nc+C zC6?yWvTy}(#)i<|qmKPkKzp;6V~htnL3GemV;rWv5k^(Y^(0_B$zCf_iue?xMQ*MfeIHU;%#e zAgt04KQwa}n6(GZ{s$pqM_M8+;0Y+Vcf{d18 zl`s=$6Yfs^n(Ac`esb@WGPDHkTCu{FlYLSIc0z;P+wVfPb}lhbo4SAvXj0t(nA*jz zGQX^9M^2~T$^&SI2xr|LUyl>OK^5o8s;7+_FXbfg zd_6bM;fIEK44FAGx4`3J4<4^qA}lK+ z>Jng#>VVgOq!e(;vT-rv<~5b07flPpE+r|AQHaHjgLv&AQV(2FVhY8b?A5W)@^sS@ z9AB<=rU%Dvebb2d5$y`LAb(D)EwGYKOT2}Ij?8K&klmG33E)^;Vo#kAWD4ykF|CH1 zzk-`wV5W{!%vzWQhE!+VjHXYuviK;~vP??Zt@Q_RGV#b$*Wy=|#x3_-3cPubQnN!j zMO||edMkGz19~uQpAfefw)BY^@&t$a)P*ozX9?989`U~zJI5YTfMs2eZQHhO+qP}n zwr$(CwPx1Xwr$^aZ%(pv?x&s9PpEWPx}SR9NAIdr{yC(dfR+1j7sNcrA7tGz|FYUI z#U!_Mg5N$g1sZXvS2iSO`myl2*(D4N_k!&cfo|B$k8Y?9+b8EI9SP?;fg3;C0i$=z zb+B36U40tlc%a#!j4bCqk5uRsEN>le=xuRo#1hhM(2~@ob-W^1Zp#esAo73saUZ%I z&up>S>TMFJHt)bm`%Q0M@5_u96x2A02n)Pt3yaiz&(Wd_)tpj=!sEOEZLm~}4ApXz zMNOKlatlsY`SF6!6T0PliwLz7!hJyg@RXTv#9hA_>48`+vw$IS1dTI-<_SR)OluUy zrobDMwJju7@@s=o)!Xa2dmNYMtJp1?sjlxaT@~FF)RugvsHQd^32xSb+coV}mLoqa zx@oOv0*_r!ZTIYZ(l?ypOpgth+7rQhRMYwMHVa+$PRlOejx2HWIsHnun-lxbmE5jubW`+oq_F*lEORsUgje;C0vyJShcxXJ1j#%|> zOE%aMi?**byXlFI0Dmuqd9iaqafKg%zy`uXYhg-VssPTgMFd-pm<2IGoD!EbwrDad zziw@;To;^ox?lZ`zVE{?(3QYlBkayLnuoMEKz)JsU6WXKXL8bs+79$Xb5$1*PZ0!F zNAw5qLh!4STbuOU1VBXM-&QLzH@AD1OXd3~`A1$rzqppky-%DwUQ{1>;N8W+SC~6p z=sxp#5?i*Jm6HXj+PD?V$8#)OK_oEuO^k#uatQ4}Hi6a=d|OF43@YIpQUj0NfPGh> zuy*NzJ2x;Go652P%2a3R7KcBgB1+#J;H@~8)r0$34jpJ?ZhWu{KrA}eB~-PMW0qvH z%WMlWwV-2YC7~OkEmF|)UbI4GD`M!DicwbAQHR)xXCwzf?b#iBt_MN?wygBX={yk8 zb>vW6Mj7X5;{xp*iw4oSu|y0nA}t*Hd^fy8JgoW4_!shRdN-r~@g!g;oxF4KBqOxq zs4|0C@J%H0$AVoA$f&N4^}1jxbp=;zuJ_)gx;g+$HnLLo|(>+Cib(J*9*CtFj zI*O)i>2{~;Y~(t;=oj(WlEbdJ%`05nVO4Gm`(5*46>rNQwt^d2!VjJE%P_ap&+FLM z4?E!f{Lp`kGAf-m=>4m5jRlq2q!|(uh7~Aun!Wn7NShxq|8~qD5PgzT=mMNdJ%z$4 zWqUc7UBW2VfM$;5244(K#9A7cQyr%ax@8G2)Nsq>=%Yn5G6~ln6Ld{daEm`6^~;?$ zL3Elzc{h6g0d%)c$5psON8UM1t>gtx@(Tdh6tIhNilHwkvU7Q5&MmhJwJ$Ww*5j6) zZbOl71WSh81$LzvFuCHt3h&l*Ndxj{zXKNl4Bki)9hGTd%+$`6;x{#wF@~H;(&%1X zj75F0pzvc{oQBfx$|zyUl;P8e2lZ>|AhG2|>?Q$!Qa8#SGNE*~E>W43QJ8}M0H;_2 zf_QLEBrDIUYU%}Q_Cd|~<4!%0r5uk>KuvgQNni5Z8u#*l#Yu$1S?u;hp5mHtYIXC z7EI&O@uihy5U#Rt-Jv;wYiF zS+RySZs!{OXl5DGdP7=x6*N?^O;-4sb~tS`KZy$0>QBK&M@W^E!AXioe!Yqe+fvg* zN^BUlIb8hcIpC$NxNoJYqiQRy&vf(AR<&}7F-#>~@hii{RpTUU9C!o;g_(v8F$i&* zDeP$s=7gz+9T)z+Qz@|JbUk!6%_m`sF`xM{V0;a1(?J(Z%fX#sp8nAX=v+$?KT&KJF)e`oY+*kMJqefG{51VraFF*uzvs zO)TQ~Qwp}u2=F3vEFOoRhdz6!kC=8x@O2kk2%hFbT7#fKCTI3W!DVN}O|aj0OK;yf zb{x&VA$URFD92+&o8I9PKjg(4$K8T`VD5OOcNK|-uV9wkegVCZ^K8zzd`PQMPwY5w zO?X=?znbA}KhRZzI4|gpcf3$$Suot=I%b_VhEnzi_}}e$ho3(pMD#DiO69*LBmdKn zz25(_-;bB?IB$F1+qP_wk&u!S8p3HpW&j8Qhw&f`p_^1qCBQIb%nqhO220gMb*fja zC_7eYTU)cVU?}WtYunUnTfeo^wOU)PYOP!S?3RCXUi+NQk;u$~b|3k9Ixj!-eEWwF z^|xLLEEGtA?0A4@p9Zcy(y$lqvwb)=BX=JH0#EN|I{ytUq24(jec(JD>G}G5Bhc?Y zi1>6bd!!zf;Qg`bop(-r`uiid9tIeB!{OArZ@PT?$3xZc$FFYZg(T6{XEggvW|%dkGKiP;t1iT3^j5cW>{Ghc6L>^o8Io(%`*q&{^Z89aeh)|Dc^ue&=&kRJ{k|fh`HvsX>ArGie~*XJ>AsTw0_gy~ z)945tHs2tD<>SgsS@$H76ftLoW-c!URc1pxU{L)>+g(UjK7c?uqh%u zhqk{LQ@35+wIc~8D*>3)+Lmx{r&& zhkrhM0hlCZB~e1q@-~1L8bzoO;_#!8k?2%u{|wr!qJ`A5v4#C?V?@4hw=UWjaKKI$ zQ9u|g3kXIt4*0=>B;YO6h1(FJN6@L=1irR4^hY41MYy_ZQoZKQA^?&9Hv%SNk)E@b z4(SE4`h=cjs)|b(y18zwFvT#`-dgCRz`2gdA{z>69*!)nt*iqhG_BSr+9L-pl>iuC zDSoa=4EwpUf)FFvJl+aTK!X(jILxi~ZR{d$oSR$G{w_z#9ZX}sxVIrUn>d)pR?f|2 zF9iK8V$_08B0?lRI!h2lP6P}%5d)^m%2;8wKpCD4tkJZsVVcRylvxA=K^0>s0|7id zT=zlDdS)*Pl~m_Shy)dYAG^h#C9EVuZMM(`U-iOoKT{$n zZ0YK@$cPyx5hSyu{^hRygkd`t(Q&Q(Ly;NAQiN-$Ce=em?)Ig=7vD`+oqk2TG10a& zw{l`n?AR_{oZ^*ixGJko?TaG1roz1}>XzNVjsJ{aZRjA;KrjaiS>G7zlC90=sLW*9 z@ikZn*Hui)DT!{Pfq)h|1pTGm)h79AXih4aHYtE@bAV9+Ui1U^z!c>StN2hxs~fX( zZEbC>n3tiQrjrF{WFXs-ih>85m;nK1YZW)j8Il_8WJjNuYvh0|Xw=T*+JK_slbicv zu;~-`j)R}nkc4H`PEVJ+EX;6}@>n}AHo%hxYgj&S<*2UM=0fpyR3}DVkSwWCHG(@* z?qg%Qv(2^pH&sFs)O|y%c^SkI7TJ(}y-fU5uY0@me7V!q-WW19|Mp-E*3%c zWUD*YibvP$gqi!cacH4QjhY3&AT`3&~=X6QrYs+WLaA+UrSuGM=(O10Hn70=o@k4&hTWRn#IVy?1G%5>&5Ay$*b zX$f(D1Vk&^yLcm8z4fIU|2Xmv;ssQ@6eJ57?Hi6xlvI9Xm_!02h@7TR&6*V60e>sC zfP0GtZ#(Rbf=f4lO_X%CEd(T-8;qgN2}d5>pR*T*Y*W>9Zlb1f zvsGwC7+t1<6XOK-GAX9wY?%uPknHbr+O1{GHYuM4#TrEH(u4GP7|ZT_TkGgu^ca;* zX)|r#g(2Pf2K&wuE;Cwa@KR@i`YYw#%UY$~T|AVnUwv0@8r;MPu#)IAHJ%P_V=NJl z!{4C95|uI{+4#~tQ9!trGAco`d#iE^wowU>xsc(ak&s}Ac*tG{i2V-ZtX%{Q7MTug zKe0XrfRI)c_BOB}on_#mv%&j}B9$1XQ47W}B6BN~Ob%S}j58GDT%(*wTB9Ci83s|z z9+5aL_Hh(sQO?rNqx)GD)S@J*kgf~Pmeh8S3lEARQ9#?;A=t8vkxz2uwuMEY`Rmd? z1B#Ar;w4nd*pIeUHxQExn$nPs*I3G`QIjBoG6jR`YB>NdRT<`e$7$lMeN1F>gG@;H z!QrwDx;SRV@KXwd5s%>AVP-i+<0#C#5anqWN3b4~12Y`6C{2w&jD69*dEw|XjOh`GqXtHlHA*3hKpk!zX3!_4f6C+SHEc>EG;LY>aQKLoklxdkok~Hl5&TsUQ zDc4V$9)D40?&PcPKD^OVWADXdkBT-Y81@)!1L!BiN1z&!3_lvDon>UkVM01-H@{0G zVYMq!wWZ{tL**kA*f!i31uLac?`%{USqY~T5e}}G5daz3U$ZiV-GV!9Jck+c;fE0} zFr9jMF_}y?zqL`6YmB@#Wj_MbN3oE{8HSK2vmA&H$<2i{1~lTWD8piW`asL<(V0vr zpg#l~yhw~Ipg5&$o{%OQB7Z9bZs-jWOiWo@Nzuml1%|9qHp@qxS1Q_ zQd>*nV?__kk4r1M98}%0K z^()#iIWltJ^Ng+3?_)M$^TkUeSkX#2S$V@CV9DxCUH!>On45#i{4`xF3CUQ4fW@44 zvQguygfp8!P}{%YARMRB(HRajLoUC9x`$QHiAeE+2K%Bhh)SmLRit%kf|MUpR;m50 zx!~(2Zn9M(K#Gyu*g#F$ZlGj?&X3e?NCiHhm4z`R&vY~*BmfzpA(kbTWS#%p5NY@Y=Jp1R+d6G zu+v+VOo`N&H!EXFlK%J>dA#>J( zw#j6bB!nCI8CrqM-x6`O9sLX{^ZoJ3uhpR1&&{I<*U0gS7z9pp+aN4%Ba3 z?j<5O_zBB$y)H-gJZ0;qWo?5^5X9zZs*jbwBb6LcCEsjmTS(_5<6537OVU3b^+7z} z+G4h`q=6wHcd9m_84j2pXAX(o*LjfTc%;CLexWL-dKlVe!Kqmw>s@L|Hcy z4Uafc2VjF!gVw(zbDt#2Mqx7G`G8b$L#5gaFckd$02e$`Xuhl zUE331rzKd-4nTU0iV6-0A4oCoEpQmD=LZr48$RF&&*4u6h*M~chvBjXXSW7{*#PN8 z06=UAzD2()sc;9t13^%a7ZeVONc`0qs=zYmM-K2;KB(bA@lNFjN9S|!+Lhh?kfQ7U zDx5JDKDeAMG3Oz8k7mxBuoivV?ky#)^fsKcg{F6wsdj9F70N|x3mTJs5W*T8*C|$S zqNLXw=IZC6)Q&^P6QjwCu)A~W@;WpJSiuD(3^75cZ>GA4|JH%)NyyLnN))i4fPr}F zkxEa|BY=XQ3uY9)(o_}87Vq5RG873+sR~V91vgBwm8+SdYvoM1k$6?nV1$A$6$QI9 zP7h-d+E@|>ZPpt{`t|pwf zUm5c=GT-Y5G<7dCzP`3|=!v3k$l<(1|txPJ)n4W~{N)=mKa3&45b3!ZN6=eOR?X%R;Fc!kr>>~|o1~T}sJ0@hrlJlF=EJffkT1Q5 z1!uCh6>YmMOKe83_=W`*kL+|a=r3NL;vRj0ckbUqsQSQ#p$9z-cjTjHC8)`OtaBqC zOQ)d+I|c_&Q+a;!cUlMd4C$6Qq5$JPe-gmOb6q;i3wW3M#59&Sohf)1OP*8a$g)Re*`l*c zNSkW(S~7hV8M_4;yUiq~;c``3214Z~h?waGkjEA~k(dp+%!cnXfd8ELfIS-Uc8<;0 z{FN|pjhwjv%U*_MtHwsDmgw@AY}5j!*tOh=bo}EYk&i{2n7LvN3b$|SA!_>__E5#c z^l3v%>CTy{JxGMprbFvlTWdHeB?fbaU zJbHpAjmx~M?--;JR#E8ZYI)8coZ+yJKuu9opaDRLjhbA#o285g-L z(2MW`k~r>fiL1UCan@#>%L#X8SK!S(MGpwmS7Ad=u}Wa(8Bk5zn#Wl^x1n0l3pSv4 z3`>ebBr2dbE6>{s*SW(YPr+&g?(FK%!Km!dv?{&;c|!9&z&sd1Haw_dhA2@Er}%n3BUc)>R6^U@IB&DE0Xw{546^&l-k_#l+1h8ucmB(QSA5> z$E#Hy7YSplyXrSm5G8QfMZqy=uIC2$N-aqaEtnzsx<3=!4DD+5NmX`as_LUE+cN6o z$vV||VTabSb`=J!JYbwm@lQg)=%7y?8Z!MW&4*U7rU{x?K_u^3pbd=hX)-Z zZzqUfRvK98sO#-f9O;_0Z99Y(z3Gg$OxL6+TjR1_$AN6%CcP|2y_BL|%avtXkLhHGpx3D4rE>`jdVtIsB31)Xv=Pu_yZK~Th_x!@q8>ioM{zB?2A;=5NKXlk1LfRjrN{k$jw9z4P zYS277@JbBV7U8==2=%C<7~3uad5uu&(TN$e9@Y3_%!QAF>XDa83X@h7hEyXKe~%DS z==FUjGDZJOi|3S{n&L94RSCz1$wvn4J~;Yxi|j;9jvDW-NcDr7YNM_MbBs&pbaQyj zMNSu_e8dHw-K*P!8wo1hr8JmOw{}nQZba`Rrp_g48(swZ7G32u=Bz4&QNN6?na0@E z6JgVtnPYgq-EhU`psMI$wLvW5NI(9}8f1yUJV0zFn3e%cEW(>I_s!whlZ)9zpbQEw zSc>{MB*(ksc5&aP>~Dy!&8=caQKZ5lv|gp|wdxcV_U8{Yyr6UcjRXy#G7V_GMG((C zOsG+5E>jQ5vA9a7y2&A}(u2?sQ_Y>8WCF&m%0ndTC!wr2fEt_Yutr$`y(AAR{0_)4 zRfVc%YvCC}jUKV+gPM>R-ehjt8i<@DkqHz&40pN2E5#+S2ZsCraz6&f0B`?1e zU=pb`59=+WzMKEMmQG*sB%9zBm~al<`GL#?qB)|vd2&oYXz7zp56A2YRd|-M^roFv zypfKq!VyMF2F{dJu3K-vOli?$e~ zlM|lfnuhEJyNS|M@~iTx881H|-WX<<)GNRdTa%dfVCgMEFi&zAWOqbm{(pIQs}aEp z^j?LUIAN^^d}}l}?W&pOC>4VYRL=_$qG=toW-H>Q&&W!t=NW|>Hi}i#>Celt34cwc zIYZ-Id3T<5j-G0bMh``nk&jyB$Pf~0 zE?PV$1`VNxm#3_%;srjy+6ILi96N0ViBmvTlOUgm$fWd@1nbFIiquqmq7UY|QKEN( zjqdqm3NESc3vDGwnZO%JO)DVkC4b`()oN)bOETWWNWFeK!-?*NOeIqxN!ZpKy*rK< zQIF`+kvp^@Z?2(}`pUG`i?kVYJ^xj~>(T%_*eK2UV#)WTL8NP@(NO zTout&y;TQ!DFdmhN0nVvQ=MSl^O96Vl}t}mrEHUkVsNf#K3Pk@m7d+hUyq7s)Un~|YGImMr$YAd z;JxC*REs8^G= zt|WHO1kP{hFtvka6wQQZZUAMJ(*_;8=m}r4S;+3KrVYc{f{L`LI-upwE^1wMuG&OF zhmyFG%M`jOk(6sNQ|h8U#ze;$K*gn$%JJ2<$gBZVr$D+V$QhHl^dS{P{~bc2Ar<_n zoWLPvZ42IuZDaYv?}b&h`3~;FeJ#>dmOPo|LlUlrA-#IMv107d-N+%Q*c!jmuqnHA zVLOb6IqTfp;L6|Oa>2a4FrY7Yc42C^$|Y!FNJK4_`zA+ZjUKb)Hca8gCdmCKPJ=Tc z@X&N*K^1r0jDNmuG?FR>YU)L875*!DqA<$tYM^LSnnh2ds5`@=Cq%@ZF!H9!7-4(F z80vWw4CZ-*kI04}(G3>GdNpb8ML5-McopjT*lm(sp=WL95SAnoou5Sg6LB<}J9!lP z$F~&7o2k}}2?}KmhB{UWvZ-Udn;3G>8}bg3DIpw*j1iO#9+YEis`%*&QT0uwH0&yc zWTJv*E|0)OzC6YziFd0@M{|RvcBkqUC@+?7$@uarT~0d{%2pcg#s#h&O*nCOi-X?I-Z z!%r^n3p6EBqRO?TPbZj5H@x%7rtqc>oX2u0R)*B6604!UiV(V7au`=Qk;tqg8nwFE zphwGmfG5Z99s5_$NkHu%KLD1g>T96Z8mPJKJTT`xSPLHx(+lAABt$VUZIHqjrGYD4 z6Gy5xj$DmwK*y_Hq5fjnI%d{NCaPu~XXM(IySOUh`$*7Cw=$%GpL~Hd@zSJvF&;Q) zj+pDKLIbd7bfS#lwoeY$F{HB|o!V|^9)hZ>C zmU~N&!x!GE7sY;+2D=lB=YtPvVmYDywmpg#p6j)QpRXBBWlVrG3fQ=dOAzri0>pd00**N^Hd-t+zF!b|_z zyEcl^ZW!VRH-nge`kHsV(A6h{=x+ea5B|d2c!SI@h}wDnx*=P%#?jxHazD}z0CXf| zWP=i~HW-|a2%KzMw`|%l+q<%*S*mxyOF7E0(O`J=zt{J9?k%(!Tpcjr9Zbg?B=6iRnEGinW$C3iBjQV}jL1y_1QGt#&b_CZ@my z(KC4ms`Cqj-)BL1x1o{_vZOkTl5Wi4_r?F-&KPWzFrZMwrZK{zDdIfn&2YYfav9?j zXaWq!kT48sWCc_#h^b0QEJS~g*LX0Bq%r18ClPANL})`ScnLQ+0E$pMl!&xKtHFhz zY{gtOnMAZ96tM|6`Ag)B6Tj%=cjBGYsD5i87B%y}@<>Q(Z9MLqoauOv&vLufmZZfx%wq&)>{ z_OM0FwN`?EA=s$2XQS3X)Vw<8uvBLE1zG)(u*Re9N_zD38Mdig!@N}=BtARZ6NSO^ zAbT_Bv}XvPgYKmf#)=b6zp$KQ$0e!c1v>9hB#$jC81n+b4&xbi-;iq<@<8+Nd0MdO z2h_Uk+4UNoFNmm!Yc%CxCof2>pTGsR{RDY5VM#WY1%&SW+f|f2RA8yKkrw&bkjK^W z6KD@(fD@cS`q~5OULCqhx#$c>){UGOiue*U8$f)UxF!NbJAmLCvG4xn4)JVT zeNV%eq27R}zh>Dn^sKIME%nd~|NT5_zh${~1&tea_!bULRR#45bi}ZWNTvbK91d^^ z2bRL6qi`-+=j@d)j<#(gJ)q{dOSNN#Z6DmN4Z~<(OuZUr4A_D!Q$}tL4(bGU;Q`%5 zo%~G2DpTe40ANCPnO82AtzE99m{E8_#^-H(1y#}AS*r(fHVNLp6KXTYIO23NY%%7D zaYk87njx0IO>iFUlVLbVLl&&oRtI@Jq7TUpZUN&zyWeqfd2vYz_@gLQ5+k>OMUWR| z2-+rTnn44)LOb|k(2xJgK?R{lYQjNA8qz?M9Z53^^6<;8l%P+Vc*oN*`q3I({l&2L zmGA)wHS5#6`ZVP7vwa9CQQmER9tSK~R~#gJfUvcotY@H5>S0}*9M@h;?J$M@D%1}6 zJ-w+2EH@6rfZI&4%7`t-bx|;-2;Yq3Y?x;ZNaIG6qEg>>7Kz>Ydh~Di$zD|5#*&*%Nqf|M)0o8-1=njIzpjTF+xkRWX-A{Yv^0Bu2-vayh|0&SC2Z}{hA z$P5_t9!PIrR6Kv+l7p-7E+7s>%zCELflp>o&t20qr|{p3F54=WDBVP`;Ls`y(Fu^Sk(v1 zvV5fltiyYUGs@74f?nS<=D(F7ObZ|kctnB^v#8HsC52}|Mu`@WUQDaltI?!o*y*4# ztmq1lFPogoaQ;AU?8wTn>p9)eC<%Xxy@}^FnWJO6Udy6WTp7E*=6g?3u-a=O0{^K- zp~nE)FDGdr&h%uHY)&vjTg_dwSqU}n9gmsR`MRo{itDO7)1rG!(pDp!*RxEqn9o-1 zQE1^PXBSdCIRUY;&v1*J%aYSrG;7W<-BgY(DK~F7W=Bn*4ijQ<*C>gDa)I1f(ot06 z8SAnU=DLsER2DVl=E0tINN1tO5<_9AF_+Lxo($6iYGIR7F2Sl1ql0S35Rn}P!{VAC zgvCIMnc|EEMno~w8wd`W>LxtE)kS-#4|#j&4}o=(9dYrY&Ya8xoeKN)$Hd<<;PdY+ zCilvj_=aKe_#0a+L+8jb8aH2AAn6GNB&EcqSuyRqVDEaa^#t9j5=@BVY5D_qhdBm8C-qVUJJWv8^( zpv!`FS&uL@eIl{cAp(VmMOudtt^Jsn^?{fyhE94aF1MbDEyfpQrKvOlCjBCk{{Ud* zpU#AS%ujrC*N1xEZH5TGx0dfhae^a^p>@iR#Cq$QL-94E#L0c>&c;1Q%Wpx5j_0{z zT$Z_sbT1>agUb6dwOl8)m}9SqX17u~&sCLALPmS4K8dCO@@T5vD&u}TxMxIWz~`0u zY0A7YuR@n;;~XQlo5-qOd_)Ja_aLgG7f#Wex5!h-B@e-pE&>E+tiaY~S}qJhK0w^! zerG>g12vG_6;1l-^B3sYr}N}k7;YLNjKM~XJ&3sN+H%uvtqJ!ncB(3B54c9RB{$?| zg;SG&JbiL)8H?O-Tyo9PDP^r8M~8^F4zo4KWlin_&tSVqH02H8k~Z8|)#Zh@^NJ`d z(E8|sYi0iR32m#us8dsUc0Q}7N#}9dS_SfpGLDm`>{`Ox7R@(a^U7=b#5ST&fA5j5 z(Q0|=^ynMf=vlgERGn4ul`GFXw;-O|^gjJs-Zug^1sFS7twf3ENd`5$tTrX}U~pJ9 z#J&fE*-h0Nj#cHsy0(kTXj=EZ0e$Y`y_yp1>f-&L-=zg}yO|VcgYlAbfc8?Z z9r99r<)WW3`AvFOvA)xRY(h!Nj znkr5bA*QU^feBDW?RHvEU1?eeYv zjrZdN5*YK_^XIYqZRcsv=U>j(9p~8xrg*=H0mH&bCC|L{x^nEEqJ)>SXtb_*Y4-UU zy%@XuxmvuBKy{A_>GDmCow`MM%$);N%a(ZZ?L;~E1>LRh3F*&sJ2STd>DRely{`B! z&nZE?=aR+mCjl^t>|j4sW&cc`n&`%SgFl7pfJ@Hn~UF zs-;S?a!jt{OBSVaMK0Q9%S<^^F4;xPGC5(Fsb$L!Ilo-L;zf;Iv@@03WchMbu9H7WwjXt{Kz!{^z+{o+s~>D|kIeFy7Nbey>q9ue{|i z59#8&_qSpL znw(0+;~t`Vmqd-`!ctpZqpi|ZSZypTbi{`Az2zLd9jvSw7I<3iE;$Rw-h7a>tUahB z4>l}nJgu~!f*h=^9jN3lEn-4950%~9TEjLsw9A83Z9S}6!#vCtylJrF$7b!}X>DQI zk_%)>n5wheSj32N?={Sgd9Z*Rv5>1XkYYwwLAAMsvk-zLObpE$Dk%|cpj}(Qu~9X% zV1ll%3ni3Qr8`<9E3qJhEAKsMdRm$5%(@1aB`*z%vP1qpAk&v+CZp)#T0&i$6ore3 z1z|voW|U}`SZHfgAgR|ZAeTt+V8l@*rH6*u##8cR^4bIo!dZ<25D=j<|sD! z@Wh2~6m1Io*3jjLsPkIdw^9_(G+#qxnj2g&3m_Q=Bd&Ca5GVV;{n# zp$HiWV^eVd#KivN1DpkkRWk0v8DH-OQgOa#G|nPIl3YZvm7YOa{}%(|)qIR^Efn|h z<2L%-if|iMQ63tMZ&7v1Vt{4Ao01GQXM*|s<&*@rn4@3h&7?1~p)xHjJIf4AR!7vl zfg~}TN5Uv}GKl!grN1D8!xU5)=@H6`?{zZw+yCB_vI{~yW{i)+*qMJebt+;&W~@>UC}u^HegXwT2nO zl9o`-z?uT%Ji|(U-{w0fj>_Dq@2lja+PjIF&tEy|GH=Oav2bQep@$S|GkL$Pk2I_| zjb>U4X9MlZhV>Ev2|4#vc^T{KOyckEGLjkfET17;T>$2d!;E)v+QH8J?SpUH&&_oi zpJk&0c#H8U-=D9V90+;C6j&KM{@Ctw2536ODsC&` zO#@ra!rbe5jh?1rvsfo!j)@>yDm=H4J%By`rnY^pW%8=vi?ZYpAQRc8h&Di2ou&?o zi^nu*yG-5ob4K~D?`2tOZepsjmw&QYj+}H4VQ%5rWm(lhHIs#H^6gAy4j2o6;Cx#s zWhK|Uq~!3TrNdk;f0~GAc)2X5GD7`zw6Jz(P~#a6V_1OO9P<;ceAPeClPwEto=zqb zyX)A{;_w)dkT)a4V4zWzK;&ACYjVLSC_e))ky1M>>9!f5#NK zu^|?^f6{s?oHyGPU}P-OUWQ6iW7lmaBAt+2c#`vT>=ejMJ&#O;(I$k1(I$oBY1m96 zX;_a?IG2gbF&|hsw~5U$oXT=c6|g)tTG#P7#}k}KXYe>@6HE`xf?cH8k9;)k64IGq zw8Zt9Ckh0^Y7F?GVLBD^>?Wkd&@h{#%rKoAb&MuToiYj2kxSH@%SOxhj6KG!U^;_# zvlFB$?I*N4k-DjX!CV*Iguet_FkJ#`9w)qlqbx%R)hCxH8gTTfVLQW`93X%%L5Xoa zlu(;d*bT=Ee1Ib-DfRsF`c@JykGy~_2c3lN60l)ABb#78$aHNcW)$+&lmbL1D}5Ll zk1!u(g5Borg!4$-F^-CDg1=bS3J6n-73g4DEijH9!Cg4)=hvAm<|OH_ zg2fgwgxMw&1dTl(II!#|Y@5~#AX(-MB)4S4z7+uFvZFev3zdS)=2U{q<}JZw$FW&} zbu7rPg3TT+;4Yca$3!1J8cl0OFj`jp_Ec@HtiF-uchukKm?n2$?4jA2!C8SBt*wm6dWr|;NomP;|PRd;1P z4<5(NrV5tlROL^P&B*F+V@8H^%6uezj;t0jWik4;sM#eC4Ux@gv}4N&Kw0@ zs9YH!`xi-DnlVLVa_@OV*amim(Mn&gfT0!3aZP@;auAvL=YU=qKI@a$)wjCQDW8;< z=sgUPP~+9g_#84v*YA@Xwi3Z8=8ah>TPTt@WqtAOrq(Pr7jvHeZ3`?#QJs$Li&N<7 zGH!g#-X@R}vWb^JXi=#W9tU@|POat&uHCoYS4gI$c*v)`R%-vLaS-p1J!yR*zJ8Pc z+9d)l_d4ijWAaR==JtXv6QuCHqT~pphwm|@gp^h+HF38rfX9C!&-_TC8!1z!^zr!~ zCBR^512Il@Y|g0y!sCKx3#-k_pQ0qAu2EHOBM7yMx~xlP!dNNaxqNi2A$gXH<%GQ% zro5-DVVGo8$@hSfN@wxd0Q({D+9}&nW3}d3z_7Izw~bfcOQne%)#ywuFW8ziqqDSu zrgHN+#6pz7DvGnuHvjeq;V}0+TStU$Q+Ga3+kE{)Zc%8K3T1MK!VNhg8k)}nIM*&} zY-@cms8RLn-nbQm2YFq=V!bp|S)wZ`eXNqiRm&Vkd zHHyU9T)(B9l6EmqR^oXuZ}nGP0!CI(`0=+gV+)~HbCLcKXW-h`?Pm{*SWBc3p-2Vh zG%DJEaNwBrS1E*=|3@>hLw1W!;w!=5oahCxe>iX#@{11qhj{N3_icLsp5x9tVE1z1 z7I^1+03PVpaqkt_e;^Pa=%)bqm+@{G?hE3s819R3kKb_*9{9Hs*dOGL5!?^wZT4RU z@?Q+#1OIdY|AO9;Lt}(+})F8TbYJx`q34-LvPo^9S%> z4D1K}vIYNvyK~2V^B&lB-@^y^oeTU$eiMiL(jWNU2G<9Y{?_mTnkp}-LCsR&|DmM1 zK~r&3m?%2<3~_6JC#L)vP4LnoTNw3;`4bswJgqK)BpkDZN+9Z-s4bDcSI^}`{)QbF zq&KB7S0D&wrj!=MH>EZwAB>74#0hn>pa2@KmXR^+HtlSDhg`#UXp)XlPttk7=een;YG= zUXpLSD5&=wd34lD@=s7x(Q#4ec-a)sE{nU8axLjRLHU&6Rgtg0kUA=;E=SCQNL*Pq?$;p>Xl{YQGx->ivOn*&gDc z0K+{e-xmuHVQdRwcLB?_?DZiP zDFsAB$4Ae@OVs@%6D8dh%CF$1^A_zrvd39hq_aA@c24MylIj+n!)=2&yj(3F0ylmg zKKwUy7!Q)1R}n|q$Q+9O&V?(w&7hocL{E`1S5~l8g>l)~7U}kMUd<|mYkf(CP`Vdy zuLHM;r_$^2vm#wPEiK#^_XD^PA7L0{efHzz*=~~L4Gyrpet7+J|H^s)NPMXA|Fm`` z05PrYe~Ofpgi1u(5q=sAhyGSdgo zdOFxB{KD&YwHr;Y$&XJ=KI?vF)1FM%Cqsr8ZJ?^2%($7-FjH&D307VbqfX}B)zW6I z8zBOl8^5f2x&NH;ygQO3hbWB}Gn-tV@GV^|*Nfyn$F*qLihs3>=C9DVKF|7h+54Hd z?xt7RDOzMeVCf z4mNXxCXbX?$=)_{(M$Ai4N|!Q=4~lg#xoW6$O&JQ!EBQE!FpO2LMveH66~O>$muDuX}m zi3;CCS_NL-_X7m5S>*+Y(r!oOq|N8n zy!bHVYmCy)y+<-NPid^0H~OP=e9-NM=9H|v2QyCJtWy!29we3W&ux#r4KFmcYrRC9 z1?8RZDQ)PGk=mkRG+A!G)TP}@aG(4wX<1$28@Hs)j)}QWu5&y|TuL(H4vU2CtoS~Z;5TB7uM=C?+{f;%2B z)YPxM9-aSj)FJbWrk#+YCFkYtp;TykaMsinf>+l>0VE z$cF6S_29Ux14)7QPU5~xrkw~&fl*ayTqxS)aXz7H_GZ#yUQ@$S&ijtLD(i&bbdG&~J)Qpmtp@tXTf83m- zRG&urzCLDIN$NV2mCfHW4P)F&^vAp!7n|FhQq$=t990_E{O(`rm(&o!i&Ybw2S2^k z`6QMu*CJj2xZ}qD7|#-SQk2;l;ZseeT^ToC#4k`VaFkR$N?Sj|R$5cp;PVK@b)l0y zRBQEO7MAFX1)S~vJZQG|kb+{v`fBxpM&}swlGM$YzWopqcs5tevqM{~a}v2FRV(7a z!@xu-^-Lo=Y@?eyu2#%?_*5fF%SA8d7}bwk?N0A-9}<;6=EE0l(azQ>d9_|rEu@d{ zGUy#Nlb}=OE!x9RD?Yw|)%jkra{bH1$M-Z;Jod)F$$2od^e*{g_8YbH!_RwICuILP zB(PW5wpDvr9_e#;#h}@P*2u-MO7w>eD)k!GVtdv2y&~Cq#x)Q5iu%jBvf{f>`^zkr z+BNm~cXh#!8?-(hE!L}7zf!O8^F}Ov@DQUiYU1?!tvW*lFP@qBOvLcC`-e|8LQyZ{ zydJ4&b<_w)&E8o25!ig~(-Qx*+yD7Wcj2h$t!5>qk!1^iOc(H))RKKc@pzbrSxKsR z>*}?avcx-w2&4-do_DutKQ*lLY;40f0693N{1aWIbDj6nPW>TKN;-GuZy6dx{gmnL z@Q+r_VWZ2Lt{XpWIz#`Qe^)!nr&n1=G)(qXr!)gdj7Vs&1|9Rw^ud=W;?6@WelxT8PukfzpuT*mYG|$ zYk0YOtC}i>bLJ{O}&y|?s<{zeRsBjTS%MBY76_MsyFkV zYF%A)Fm>c--O}iqLxBgil~&X|Oi(c#Z{g**yJ+o|h?_g=J6*f>y#0LFG_US7YoU(m zj9H0lb~C(lu1DVSG>shJWTe}vlSjLhGRZwoS5*9S{^}RY#ibIBFRE;9&bVm0CSB=? zkFwC}dYQ%~e=o~Iv8F=*ngewkLRD*5`OmS494sC^YK3&0+}Ky6dj7F~Al0h!s>0D+ zBJoyX*=e&E8#kF-mc1GD;-+NQnim?CDc=*W?A&B7{W{=^k=@qSD+{GN-A{hVpu}1W z$OyU#R8~oM$_%m-nmsCLYKuzjL4gW^1VJ~_vgco;j3rvC-9i)X@sp}f%!~T5Vf)YN$;~ll z)E_HF@4TNJ{LI+2TOxTPUC}mjm`qn-!TP5M==C=|?V4Y9#l)`op^()&=dD)P`hvI5 zn7iOjk!}ANDF_)UCH|PKazSHygjqr3s<(&jeaHSVoa+2;s{7%JsND*xR%Uj>hZY}? zT5!T-={F(9uAi%`3a)%EUwyOcnej_?m9i7_u3S8Dwti(mZJJ(_mtIrpU~%`m8OQcM zVN)LJ)*Tklq0UazyL?#u9Q9>j?U*#TfNIfzTCp^}TZeDuQbPhgQfz0{9nL&Wtq80g zo90HZ)_Z(jTracg@V|l8mDyBHz0A_X*^kc;3#_$EYoDIhPDu+rW?T61@DfUO)@kaq zTx!k3^J#&#o@qI^57#ZL{&FbyIzx3T6-jHflF)m zOKVq6TlQG~QM+YM_qMl(N1#g3`w5sz7#oKo#Gt3zdYulCdAL`B0RK1lg6COP@#<8U& zy-+vHeNRV2{)Ca5lP5TyPT2A)fAfZ&Q|;}>UejudkoJ$yDooZMDUxAYw61+p(Or@A zL;dHe1`iv&TxOb$!WUCXmHp}ajoc>B+!!j?WTne)X<52@HYt*Q`R?h<5}ntt```B; zcV}zCbuHbswqF(7OpYH_NV&IFZ~45A^TY03j1LuZ*Hj6oWm@j7)~wX5{%jZ?k?UV4 z;V=2Py<_)|^j)Ja?WIXJeY>~iNLTQ-C6}K~x%=5L|7~5ys^YJg!{5a(*wW~*Chy&> z@!NAc){ozi7ZS7YTg!xPPn9YY((OfdRi=;8crJ4^TxRE61NHr0r}JOsFWFEdW50j# zJ$L7{`>7+HiuaC*Qqk#LZd!Bd*pK1`neWRcJ`kF&CKfl+=3>^QD0tIrZs*~5+7_-S zhNK$o?9$wk@+?0`Yuh>@RRhm=ySfA2CV#bB68hrDi7z`3eV!ra)=*zIBkXg~$kY=% z>Z`PbJJj3Ll!~_h*qXP!cmrEr$~`oxIr;4pL2d8Mp~3FQ%JL+dhm7|)(VSV@dGmhK zv{q(Oc~n7JjQq6}$KwKD?Q%P53ujJcq_rAZWFEXPB`UDr>z3el?Js+-SbTK5@Yp5t zc7S2!rI*berKeoaWjS|$Iq6N^l1HASDn5hi_F(HgsYZ=6`$7z!r+ihE`RK!zQ@?sW z*!%EackzTp> z+|cXuHL)z);ehIE8es{n^}0$Y)J8*h*x80s?}6EGX`}FE$l92Ok1UvJ8`JU zjetj!6DqdKDWz=_UHjTFJnLk#Wd33c%7u;BSyQ$2E9`DQja%4I@%a_JRv~;_(fnxh zr^>}z66N%A;a4iHj$bvuj^1aeUaXnEBlWubE3L26%T{R=AIX1xzjk8yCcVWUtFGQy zku4bhubX1W@?o!RYn{T+e0ikj<#YBgIY zH0eFctW$|RANhJv?V8rD?atu~A{S4niq?$D=(d}kabe;X>ZuI1=cinf98?-jk61fc zzjaxC^;sd)_gz7k#csRl-fPVZ>!NGdTy;&gYu+HXV^V`aq1a~6)QVB|uMZ{azlvKc z_I2-<3lG%grFLWer%KDB?rs+nH4V#Ja0)VzTEn-@YDXhPZNSC`BlH_JatWMX^omdO}937 zOU@6$ZvUu3B$B5viKN5Vs;fJd>F?}A5Bjw)C&l$y$SBv*KWN+QY%jM9`wvf!vsQhxrss$`E`?7H14ZxFq5 z(c`I33nnmb=XdOrhfO*8X~jRjHc2QuuKTxaik9z`wGt_zRV9|oL##AY#W(tq>o<60 zjqO~p(B|kZcEQEN=k3L8WIJ6ZzRhRFWi$z&NZI-G!uxPL%B_Vf3pSNBtxegqvms}u zCndZxr!FGp9osnPL8FjKc3tu~!3?#nSyh#xg$ImhyRm8IQ)zdqs>@|b3z(lXieY~VxT-CA=mAB$`?-XS9}dgov#{q9K$5|3z$Dmy$_ zvKq%l1T6!KpNCo7)gSM!B&$U=h6>%#xfA_%orKKTXiK$y<5jl?K4=RN`yjZx(o<8| zHJ--w``(hYPi(@uTj4^p&OHB=RYRS5;7MV{Yj@F{4IZENwlAmTRt`C*b?#JKXxfMK zIUmD}hRCS1@1>lzIwM)&y!ItC`d&-|5O}rhHYX4k(4>M?IxGJ;e(A3dK zCm0;oSw>G!e78Set#lQAnXcFR>EjAiAD<8%))3n~{rY4<_s{nY7JBK8UDhEq#wU1; zT4%$vS7mAm8><7fx*n(RT>RswgQ#_03B7ho?C6opuN+mm_iFC;z)i{t>!)6SCbHSA zesH$%lOvODPq;)6CrjyX>zsae_I1{jvlqq2zcg5@9+o<5#p4M_S|*I3s->?#Uu|G! zf9S&P#Wy-MDw}+}5~JVw*1l89k53L%(LZo(ZNw-0G4?@c^Mrh|?pbzOiY+?CZd5uK zA0VG_@)B$$jHCFya|=jykm!cEVf$R}INB@;Q}^y?4SgHoaHfxAdrC z#%pGL_LfWX%x%?{x=x+4*E08JiTr?<4VfEu3r(uKOBp#{V@}Iy(w!jrg&OCM zN<2JG7wKLkegAp!zwAv(?-!IBo%ff$b3EzPr^y-mWs}AqG~d^zyKk{+oG;6qoa;JW z@6^22W8EASUk{#E=lANMhWNFqmz}=KI9Lk^jvgcmZc8HVSv6x?&o96JXK4Q)Mv$6J z&>w8gT}(8s>?|Mx^nFc)v>U$GVwEME41eJqd`6?c`RifFslsplU$Zr_v$8OEcG0r6 z_z!_Z3S;VH2oLW2ItdYOf;Go4?gki$ogd%L%M2$rIR}L1j{Yy*`zb<1@^zSh_fgR0*=3 zjN$mo9713^Erdy?F&*giU$2PbL=}k8WNif9c!4a?8>jjnc3ikE5vqBZ4<(36rPEx< z-T@SI8j}&uEo7v;NnU=r9st|~i4eU#w(nubIoT6|_vp-?(JNvn$}&!55@`*GvBIlq ze?7=C+8wdT%gLeS5FZ9Lh>5XQ#NOiB^G59fD+&a2pVWr|KiP5WPJ|#P3_n&Ng~klw zWUSX-Wi^X5O#`~^5w8iY?2=K3CX z95a*{5_zl{*~cFT6sg-_$rDct;PEqjruQMjPj*~dVck^&lW_KDF>$>XDNen1`{9`oyT*a%YGODa5lswB4-A6v#W1IZQW@aF z_#Er`PQ3FDq!F-@GuWoA833Bbq=fyt7xVXEfMjrY-tLV6M!E(cY_PqQ&kNCnzeIytA*Fy9t_9f#-Y6ZejBZb)(C~sIqL91IXlR@WiF5?=EH<2vvUeh~X$czf27uwDa7$Z(0z%#|Zb%V*1!*#|4QBV6xvb!J}z@Jz3s{PWHvK2_zBuqUe`8 zLrA0w$h+9^K1y-`^Z<$!*2qC6>oBnG`NL~ zY}ae`XsxR-YBHD@*6ZxY5n~Q4U4;9k{LvXdkggj@7n|Cb$Pwd)k^@+1`~!qbBwWK) zsV8M2%nu#P=@*jngy227-Gt`bo7@S)no?ck-`(o}CAx1;&CT z^nhV(Y>!js32BF0n<5!3eo|<(X%vaH7RoVf(0MV5Cv5K~YkZ3!l}wO33q$_~AE+bx zA9h^cOhRBw6dlP-iZ4&c&~1>MS`0iVxpEqDK165&Bert-6^Zd#E`E63_$V;y1X{z& zqR5vR)3>kcK{W+F@XO1l%5vasNg!x!0?nlG0X&eHwM^72wu_NSTgQ+{5HU#$wW$;XxEP@Er<)SueGg>j)S@B9(znW4&=u?Ui7z<_ zepS}N=R0QJbMqF+E#JA6`!kJiaD3>FoWdkwu$yWq?y83HQm`K-VoeDP!tu34bVAdy->a?Vv9v-u&z zjfzZBcl6GQ8Nm2RuykxKR-r0L7`Koq_NbIGm&_#NBfFC=G7Q1URRJBV&Rk7Gw(6yx^fF25h$ELXD(S+#MRHm{S)Yt)(Fl!3V zEF7_IxpD69FtF)1=5V}`mrt~m;cJ+3S-Ejzt5h*A};79)hbASv&Ogo4_ zp%fDagG?Y&ouN!eIf$XdfLpBNJ*?n?Y6`tFXq<3!i{f(*NkM}SxK$FIvn<1E9=P}= z4ic-CTgf-4X(UnvnG>|7mIo+=Gy=c15}1GV6cpz=Qk-&47(R%|7kcG7z+9!U(5Dm_J;1e~!5$n!;aeo6LNys-fPcDlMZB`6=XjGUvb~3ChrQ^cSdr~x2A360~-oxLik8v z-E{HO=sh6twO}fcN&6pmTum|$cv~{lpIeIv)XU+(_m|*>AHct{bK0CkJV5POD2L+1 z&S$I`E&{MMT(I@0dB75B4{^IrNo#o{M58=t)?>NVF605*o15{u&HGf{CIsiJNmdSu754X~eZaozQKU~K0eDa)VmBV0YRu5=jvZ3oBkrp}_+Q!G%Glg)E~p0`dG7t&nsY zPZ$EdEYb=1U?+|mk^>+!P5RRE0L3pVe3HsOY*U4FHw0=_6^tPEk0iv0h(J)Ip(WU^ z8E@>5g8j~fJcsRaiB22{(uHnCW7?8~l))gN;f0sx5WL2ZK#>E$vAry30VJTz4?MR9 zk%I^yFM5{-rQPvL|0<@x|(z+WqoJed7fyl|BR;AVp~ zCicq$g~SrDn1i>r}XU>99WolV;VVKZIgVAE=mq`p_RDUXsK7dFOaMSjn4O?LFb@0Jv zp2uN?z(i>m8I+ew>z6H%A1`vPww(y)0cg*#py7vGq^?WdD-NaumoMOhjgMvo~@QEUhlve56qX1#G=`KLmRA7OG~ zeH(O=e)@CHXC%J!jgPNVN+&5!4p`R**0I^oPE&}e6mX{auwaW&xEXX|8T0_yB7j#M zBKflqN8j59*5V1(23EQG+J6Ag%{wylRRu+g=YVe)h*Vf}Ow}a@52E-`$pM6+x?$$c z`-NaJ-e57wUd)2~TiVK-wt~EI6nJd&|q-`*ZQRzoS`l*L5CV|@BY)u(dU%cr&vi;IGA>G*kxgF-Q z*z|0vmN9xY$8PT`E6|{1hZQXL8|MNzLx~W=M9IT^&39y!QvMZ zg{{8DBTlR3=6ifU5yZDZG9ll-6mQn=J7Gn7M9{f-b7>1ew1N|0^<~HlYAymCU=?jb z^1UupP{HOUj*5L{3J)%Op#A<^JmwTb?=Hd(`i_@iDV{_I=lxxm>^S$Gd=nt5;E;>V zA`c0_1>C0q5p1pbGL$}0K6v#YbIO<(r-pk6grCO6sdIJ1URVMm4F&hWs%s@LC=935@Ul4)g|XAn z^*Jz2zQEO>v`FW{E0zFnQ7H7Q4|$#S5kh!6Yyl2Ld6!EZ6%TX7GXUl(e6Z8Q4gA2F z2GD(05J}>SCCzXvL}3d^>C^jJMd>2!C?Bl$Vq1`zJ-={Dqj%0IvHtGJ7HHRgROFn5 zEIP?A34G*X7i7DJ*}^@&$2iN?6j-t($aVk8*_7@Jm7g!g53e>sW}>LOZHW<>iJ&Cs zKFb!-A-wT>)+EqkCE9z6KZ5MBW2_4yr$)JPsy1dMKNJSy{?P$NN0`l!3L$M{Rl9B$ zAJ}Mh-y(p%(v-?{rr^vMkbstdrfWGsIFS{D&0rYoxoOM?3Hu;sU%QNW4l8uTI`k<7 zgAA@<5M;q04IWe3Nc+^wK_H`>5MQxzG2QBq2;i%j`fTC-y`Y9PD9EsC@O0r1e!ylW zQiEK#?_fHpU^i5|FuUr1*m1TC`6JOAc{m5a9oS)Q;MaqqndmY?bOv};SP)kz`}yhN z7PNr_mP|QhZNU?(&y$>)xQnz%5OIdS75@S}+O&Y}cZB=%VihfW;_qld$b%%3Z&g`B zi2`*BR>Vt}^Fr=jHFKh%eif&Pdqbq2bBo?xFu{+|$JXtWF#Kf4#hm>Ubo{Lbh<}%V zbU(nR9?~NaJT|2syugcslesCZ_JI}ptRNOpw)DH}xgdHL5W$v*<4SlFF!Luf2%}87 zZmUNIK(7F3Z2lX6nGfjR08B6ilQEDEL~^MIxnT7=>${U?HCML9(blm}5UEmtqjqon#jSD?fzX6=+9_7BV6wK~f&^5q{JLU#Y@E#-o z@2cb9_sbzOl#+<_Sq;K4f`Ev%lKQ8-u$@`ny~|6SJ_P9#pnntZZ%a!kOl3YF06K)u zV)#(7(=!B@cJTQ%)Z=I};&jOm{J_~#LPB7DJVYy~w@pu_g#0cGL?M3pl7}@=S>(gU zLF@!Ds+|vp`zUxVW8f0u4&Dm=B0^F*Dk4l&!ocDRbe5nN<%-{D*4eURL3d9fnHl!O zp+MEZ4_xmQ3eDE6XhAF{Q3nTEinz7h5!m`k`VQ7&jiGc&oDatTqh!xw_LEX}pwN6_ znc9XSHV84)n z!%Y2{$efPyjft8da01JnO7o?!#GB?ILKjA42F(IXdIPqLC8YlkzszF^P32UnNRN~@ zG{-pwK~yHesIY`8)c=mqG<-ri*Wcf;1F@X~ug2~?PS*Y_LfmAKU8zb`KI#C$-35=p zj%UUke#y+G2Ev}r9xdUgN<=8sv}?^H5ZcXAoa0F}{S!h!%!*)95RsYs&xkS!7!NFe zk!E8oE`R=?km;MZIQOIveA!97j&Uo6A?=0^AMDHRf7o%#wtqsamxdK>86BU_p6@T8 zUWZxOSuh7IojI<5M286#9zmN9$w5WvJB z=VBKWi=y}iH;2PkE)WY$U||5C%8YALEZA~H3J0}dC#>@m{)9?zw85uwB69anHe{|5 zKnFYFi%a?w8a>Cx@JWny3cVu?D^YqNEbK7CHt|aW9q6A&!9VVY6q4OwdEf|m%2V(Z zY=EiW^(QnO=s~O?TMCVZKNR!TGd8qA^C<%S9;^4Nv_By;u-@NGm#@o!n#F`mVB-$` z36+8L9`bTgEy^*DATX>ON}l4M2Ce_33{fttH>^wj2KIFy?904AsGy|DKJ!;}Z0W2J z$~-d77q?A?Y$5(xqswh*Fl-*jsU*Ske?yYn6i|G*U%ccfI`4KFgorJORWI>N#gauu zdriC{l5rD3L&>~x=fyN2uo1L`J)~B7nO`FFonglmg+U_+Kw1ld?d?RWdSAV5AMCv% zvB1D#9?}1><2=j$ni%)Eknn8I?>@dA#x)!g0akdAuJcREmQ1B750pLA_bZC|Ly)c= z%Q;&vx%nqVxQBpLBk<ZorXbs=!5NN!~INer6fUd9h%^1AK1!QF0 zuMFfla&P!2&@-`{3lk)|A6n#u>mcxlBQ*NZ)ajrRYpwuV@Ro0CbOxn2=7bR0SgUop zF$xEFU|@4GgR=PWH)ME6gEMNn$Jc`uxJYrD+QE;1K@neiE&zzu#JwR2fxH(xk4Rn7KKGsV%sD=e)(K~9NrS)nmRy;yUHjcuxli%>k8IV7y<( z`0ohyk;U&mA~V?Atv%EU+%g_|4OnYCY5G?*Ic3P*aQJUs1~nX9ZTTewEdg2py3@iJ z)5=1lI6E|NcN9qNIE=&!BRTfpz?*o7Frh=vG@}FrnEO(3w^1XqxvLcCwt;;=2hyP! zvI$OqF{=44eX*zKMi&=4`m-}70A4r;yDEE3=U0;I`S1PzWx#T8*0j6h+<-p{h=z>e zQ38(j@E5RtlRW=CavDN!PvvE9$>l^~=Nc67t{8S+E&Ttn(=R+;T2pcPQG;$_3ImC_ zV_2y7{2#L51no%*gQ%cjIxP<#41JiZP$QXOn9%qAe=&hCcJq)nzX@QeE$}hNklVBT zFUa-FdVqB7=Xm`LS{{@DQQKiijtlsIlN{h|IdaUE6sc=Jfi~>b<)FQS_CKRdkdVp_ zBu1eXE)7T**l|Ay`k&DzXe1geuGE zkd;)Xk3UybmzW;XrV4T5F)XZL3p!F5znExGhy$EvgDD;-XL zkVu?sOR5+?-&OM9lR?2-6h)xl>T_!aAx^A;eIVEtm-cPGLHiai305sRnFqoAdXSJ4 zYkANK@rMG8OU%yh%X6xL@k>y$VrP>#_yhda=oz@n$c}svj^YCHBW&mQ(;L3n{zawd z+ERQw|2XzvWi^0zggO8_J-XTW$0P_mb$fk;Mi2xXf7rB#4LI{Z@I~X-J&WjCPyA85 zGCSFp41zL&k^EQMqehGv^nwR0FnjgeyYT{VQiRN>NdLs%wO}`rkk7E&BbvYb0X#SF z2z>u(ks((g@E1eQ#7d_`b|^o*&vzc6YltY&wwwEea~;|{NbZ32Iv7)pYXmTIz+l|RH=8W z1VQD4Ltsgb)cRXe1X4S;D5GcrkU9gs94x6>aAuqjtL?cs0Xr(3q6{fWs7rtMT`;h% zFyFuygdeB3f8Y!bNM1PV1FD@_$GS7 zS{riX7g$=xZg09^$u|XV=8=>n7T%f(7etY+flFbVPv79^N*^gryl?iilz+QE%~Awe)L;}$W(-lVA>Zvf@wJt!x!k!0;g{;}s# z0&o|P5QXy8Jq@zhL*jNFL&e3s$GxFPXU% zp8#_2;cc8mg2wR7mcAWrgb)LI*xACoV|>wC(7TJzghr#oo^RY!;yv0pooME30!zA^ zInO7~J;4thd`a!4FNjqE9Wy}38vWLTeDmW6eo*oEVk3T|J=QxG!y4y9h*H={yQGsJ zWbl0a9kvKu{H@y&3-Ep+C{nO157bejL`4e3rXDZt2`eE?<^Lp(E{egIPm6r|6;nl! zx(la#M5Os8gpa&& 1: + outf = sys.stdout +else: + outf = file('PlotKit/PlotKit_Packed.js', 'w') +VERSION = re.search( + r"""(?mxs)PlotKit.PlotKit.VERSION\s*=\s*['"]([^'"]+)""", + mk +).group(1) +if len(sys.argv) > 1: + SUBMODULES = sys.argv[1:] +else: + SUBMODULES = map(str.strip, re.search( + r"""(?mxs)PlotKit.PlotKit.SUBMODULES\s*=\s*\[([^\]]+)""", + mk + ).group(1).replace(' ', '').replace('"', '').split(',')) + +alltext = '\n'.join( + [file('PlotKit/%s.js' % m).read() for m in SUBMODULES]) + +tf = file('_scratch.js', 'w') +tf.write(alltext) +tf.flush() + +p = subprocess.Popen( + ['java', '-jar', 'scripts/custom_rhino.jar', '-c', tf.name], + stdout=subprocess.PIPE, +) +print >>outf, """/*** + + PlotKit.PlotKit %(VERSION)s : PACKED VERSION + + THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please + diff against the source tree, not this file. + + For more information, . + + Copyright (c) 2006. Alastair Tse. + +***/ +""" % locals() +shutil.copyfileobj(p.stdout, outf) +outf.write('\n') +outf.flush() +outf.close() +tf.close() +os.remove(tf.name) diff --git a/plotkit_v091/tests/axis.html b/plotkit_v091/tests/axis.html new file mode 100644 index 0000000..b8fb420 --- /dev/null +++ b/plotkit_v091/tests/axis.html @@ -0,0 +1,31 @@ + + + + PlotKit: Axis Test + + + + + + + + + + +

    + + +
    + diff --git a/plotkit_v091/tests/basic.html b/plotkit_v091/tests/basic.html new file mode 100644 index 0000000..8c6d25c --- /dev/null +++ b/plotkit_v091/tests/basic.html @@ -0,0 +1,25 @@ + + + + PlotKit : Basic Unit Tests + + + + + + + + + + +
    +

    Basic Unit Tests for PlotKit

    + +
    +
    + + +
    + diff --git a/plotkit_v091/tests/basic.js b/plotkit_v091/tests/basic.js new file mode 100644 index 0000000..147c0eb --- /dev/null +++ b/plotkit_v091/tests/basic.js @@ -0,0 +1,143 @@ +/* actual tests */ + +var opts = { + "IECanvasHTC": "../plotkit/iecanvas.htc", + "enableEvents": true, + "strokeColor": null +}; + +function alert_val(e) { + alert("x:" + e.chart.xval + "y:" + e.chart.yval); +} + +function genericTest(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + var success = l.addDatasetFromTable("data" + num, $("test" + num)); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.CanvasRenderer(c, l, opts); + g.render(); + + // test events + MochiKit.Signal.connect(g, "onclick", alert_val); +} + +function genericTestAndClear(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + l.addDatasetFromTable("data" + num, $("test" + num)); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.CanvasRenderer(c, l, opts); + g.render(); + g.clear(); +} + +function dualDataSet(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + l.addDatasetFromTable("data1." + num, $("test" + num), 0, 1); + l.addDatasetFromTable("data2." + num, $("test" + num), 0, 2); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.CanvasRenderer(c, l, opts); + g.render(); +} + + +/* create HTML for tests */ + +function makeTableRow(list) { + return TR({}, map(partial(TD, null), list)); +} + +function generateTestTable(num, data) { + var tableid = "test" + num; + var tablehead = THEAD(null, map(makeTableRow, [["x", "y"]])); + var tablebody = TBODY(null, map(makeTableRow, data)); + + var table = TABLE({"class": "data", "id": tableid}, [tablehead, tablebody]); + return table; +} + +function generateCanvas(num) { + var canvasid = "test" + num + "canvas"; + var canvas = CANVAS({"id":canvasid, "width": "400", "height": "200"}, ""); + return canvas +} + +function generateUnitTest(num, func, data, type, desc) { + var table = DIV({"class": "data"}, generateTestTable(num, data)); + var canvas = DIV({"class": "canvas"}, generateCanvas(num)); + var ending = DIV({"class":"ending"}, desc); + + addLoadEvent(partial(func, num, type)); + + return DIV({"class": "unit"}, [table, canvas, ending]); +} + +function generateTests() { + var tests = $('tests'); + + // datasets + var simpleData1 = [[0, 0], [1, 1], [2, 2], [3, 3]]; + var simpleData2 = [[1, 2], [2, 3], [3, 4], [4, 5]]; + var singleData = [[1, 1]]; + + var ninety = [[1, 9], [2, 1]]; + + var floatData1 = [[0, 0.5], [1, 0.4], [2, 0.3]]; + var missingData = [[0, 1], [1, 4], [3, 16], [5, 17]]; + + var dualData = [[0,0,0], [1,2,1], [2,4,4], [3,8,9], [4,16,16], [5,32,25], [6, 64, 36], [7, 128, 49]]; + + tests.appendChild(H2(null, "Simple Tests")); + + tests.appendChild(generateUnitTest(1, genericTest, simpleData1, + "bar", "")); + + tests.appendChild(generateUnitTest(2, genericTest, simpleData1, + "line", "")); + + tests.appendChild(generateUnitTest(3, genericTest, simpleData2, + "pie", "")); + + tests.appendChild(H2(null, "One Value Set")); + + tests.appendChild(generateUnitTest(4, genericTest, singleData, + "bar", "")); + tests.appendChild(generateUnitTest(5, genericTest, singleData, + "line", "")); + tests.appendChild(generateUnitTest(6, genericTest, singleData, + "pie", "")); + + tests.appendChild(H2(null, "Float Values Set")); + tests.appendChild(generateUnitTest(7, genericTest, floatData1, + "bar", "")); + tests.appendChild(generateUnitTest(8, genericTest, floatData1, + "line", "")); + tests.appendChild(generateUnitTest(9, genericTest, floatData1, + "pie", "")); + + tests.appendChild(H2(null, "Dual Value Set")); + tests.appendChild(generateUnitTest(10, dualDataSet, dualData, + "bar", "")); + tests.appendChild(generateUnitTest(11, dualDataSet, dualData, + "line", "")); + + tests.appendChild(H2(null, "Drawing and Clearing")); + tests.appendChild(generateUnitTest(12, genericTest, floatData1, +"bar", "")); + tests.appendChild(generateUnitTest(13, genericTestAndClear, floatData1, +"bar", "")); + tests.appendChild(generateUnitTest(14, genericTest, floatData1, + "pie", "")); + tests.appendChild(generateUnitTest(15, genericTestAndClear, floatData1, + "pie", "")); + + tests.appendChild(H2(null, "Testing Circle Drawing")); + + tests.appendChild(generateUnitTest(16, genericTest, ninety, + "pie", "")); + +} + +addLoadEvent(generateTests); diff --git a/plotkit_v091/tests/debug.html b/plotkit_v091/tests/debug.html new file mode 100644 index 0000000..e1ecd8b --- /dev/null +++ b/plotkit_v091/tests/debug.html @@ -0,0 +1,56 @@ + + + + PlotKit: Debug + + + + + + + + + + + + + + +
    +

    Debug

    + +
    +
    + + +
    + + +
    + diff --git a/plotkit_v091/tests/demo-svg.html b/plotkit_v091/tests/demo-svg.html new file mode 100644 index 0000000..1b2c114 --- /dev/null +++ b/plotkit_v091/tests/demo-svg.html @@ -0,0 +1,58 @@ + + + + + + + PlotKit: SVGRenderer Test + + + + + + + + + + + + +
    +

    PlotKit Demo Page (SVG)

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    + diff --git a/plotkit_v091/tests/demo-svg.js b/plotkit_v091/tests/demo-svg.js new file mode 100644 index 0000000..2e58a46 --- /dev/null +++ b/plotkit_v091/tests/demo-svg.js @@ -0,0 +1,133 @@ +/* actual tests */ + +function drawDemo(element, layout, options) { + var renderer = new PlotKit.SVGRenderer(element, layout, options); + renderer.render(); +} + +function demoWithStyle(style) { + // datasets + var dataset = [ + [0,1], + [1,4], + [2,16], + [3,8], + [4,16], + [5,4], + [6,1] + ]; + + var dataset_rev = [ + [6,0], + [5,1], + [4,4], + [3,9], + [2,16], + [1,25], + [0,36] + ]; + + var options = { + "drawBackground": false, + "shouldFill": true, + "shouldStroke": true, + "drawXAxis": true, + "drawYAxis": true, + "padding": {left: 40, right: 10, top: 10, bottom: 20}, + "axisLabelUseDiv": false + }; + + if (style == "pie") { + options["padding"] = {left: 50, right: 50, top: 50, bottom: 50} + } + + var layout = new PlotKit.Layout(style, options); + layout.addDataset("noname", dataset); + layout.evaluate(); + + // stroke/fill toggle + drawDemo($('test1'), layout, options); + options["shouldFill"] = false; + drawDemo($('test2'), layout, options); + options["shouldStroke"] = false; + options["shouldFill"] = true; + drawDemo($('test3'), layout, options); + + // drawing axis + options["shouldFill"] = true; + options["shouldStroke"] = true; + options["drawXAxis"] = false; + options["drawYAxis"] = false; + drawDemo($('test4'), layout, options); + options["drawXAxis"] = true; + drawDemo($('test5'), layout, options); + options["drawYAxis"] = true; + options["drawXAxis"] = false; + drawDemo($('test6'), layout, options); + + // changing background color and axis color + options["drawXAxis"] = true; + options["colorScheme"] = PlotKit.Base.colorScheme().reverse() + drawDemo($('test7'), layout, options); + options["drawBackground"] = true; + options["backgroundColor"] = Color.blueColor().lighterColorWithLevel(0.45); + drawDemo($('test8'), layout, options); + options["drawBackground"] = false; + options["axisLineColor"] = Color.grayColor(); + options["axisLabelColor"] = Color.grayColor(); + options["axisLabelFontSize"] = 9; + drawDemo($('test9'), layout, options); + + // layout customisation + options["colorScheme"] = PlotKit.Base.colorScheme(); + options["axisLineColor"] = Color.blackColor(); + options["axisLabelColor"] = Color.blackColor(); + options["axisLabelFontSize"] = 9; + options["yNumberOfTicks"] = 3; + + layout.options.yNumberOfTicks = 3; + layout.evaluate(); + drawDemo($('test10'), layout, options); + + layout.options.xNumberOfTicks = 3; + layout.evaluate(); + drawDemo($('test11'), layout, options); + + layout.options.barWidthFillFraction = 0.5; + layout.evaluate(); + drawDemo($('test12'), layout, options); + + + // custom labels + layout.options.barWidthFillFraction = 0.75; + layout.options.yTicks = [{v:10}, {v:20}, {v:30}, {v:40}]; + layout.evaluate(); + drawDemo($('test13'), layout, options); + + layout.options.xTicks = [ + {v:1, label:"one"}, + {v:2, label:"two"}, + {v:3, label:"three"}, + {v:4, label:"four"}, + {v:5, label:"five"}, + {v:6, label:"six"}]; + layout.evaluate(); + drawDemo($('test14'), layout, options); + + layout.addDataset("reversed", dataset_rev); + layout.options.yTicks = null; + layout.options.xTicks = null; + layout.options.xNumberOfTicks = 10; + layout.options.yNumberOfTicks = 5; + layout.options.xTicks = null; + layout.options.yTicks = null; + layout.evaluate(); + drawDemo($('test15'), layout, options); + +} + +function demo() { + demoWithStyle("bar"); +} + +addLoadEvent(demo); diff --git a/plotkit_v091/tests/demo.html b/plotkit_v091/tests/demo.html new file mode 100644 index 0000000..dde591f --- /dev/null +++ b/plotkit_v091/tests/demo.html @@ -0,0 +1,57 @@ + + + + PlotKit : Demo + + + + + + + + + + + + +
    +

    PlotKit Demo Page

    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    + diff --git a/plotkit_v091/tests/demo.js b/plotkit_v091/tests/demo.js new file mode 100644 index 0000000..c43d542 --- /dev/null +++ b/plotkit_v091/tests/demo.js @@ -0,0 +1,136 @@ +/* actual tests */ + +function drawDemo(element, layout, options) { + var renderer = new PlotKit.CanvasRenderer(element, layout, options); + renderer.render(); +} + +function demoWithStyle(style) { + // datasets + var dataset = [ + [0,1], + [1,4], + [2,16], + [3,8], + [4,16], + [5,4], + [6,1] + ]; + + var dataset_rev = [ + [6,0], + [5,1], + [4,4], + [3,9], + [2,16], + [1,25], + [0,36] + ]; + + + var options = { + "IECanvasHTC": "../plotkit/iecanvas.htc", + "drawBackground": false, + "shouldFill": true, + "shouldStroke": true, + "drawXAxis": true, + "drawYAxis": true, + "padding": {left: 40, right: 10, top: 10, bottom: 20}, + "strokeColor": null, + "strokeColorTransform": "asStrokeColor" + }; + + if (style == "pie") { + options["padding"] = {left: 50, right: 50, top: 50, bottom: 50} + } + + var layout = new PlotKit.Layout(style, options); + layout.addDataset("noname", dataset); + layout.evaluate(); + + // stroke/fill toggle + drawDemo($('test1'), layout, options); + options["shouldFill"] = false; + drawDemo($('test2'), layout, options); + options["shouldStroke"] = false; + options["shouldFill"] = true; + drawDemo($('test3'), layout, options); + + // drawing axis + options["shouldFill"] = true; + options["shouldStroke"] = true; + options["drawXAxis"] = false; + options["drawYAxis"] = false; + drawDemo($('test4'), layout, options); + options["drawXAxis"] = true; + drawDemo($('test5'), layout, options); + options["drawYAxis"] = true; + options["drawXAxis"] = false; + drawDemo($('test6'), layout, options); + + // changing background color and axis color + options["drawXAxis"] = true; + options["colorScheme"] = PlotKit.Base.colorScheme().reverse() + drawDemo($('test7'), layout, options); + options["drawBackground"] = true; + options["backgroundColor"] = Color.blueColor().lighterColorWithLevel(0.4); + drawDemo($('test8'), layout, options); + options["drawBackground"] = false; + options["axisLineColor"] = Color.grayColor(); + options["axisLabelColor"] = Color.grayColor(); + options["axisLabelFontSize"] = 8; + drawDemo($('test9'), layout, options); + + // layout customisation + options["colorScheme"] = PlotKit.Base.colorScheme(); + options["axisLineColor"] = Color.blackColor(); + options["axisLabelColor"] = Color.blackColor(); + options["axisLabelFontSize"] = 9; + options["yNumberOfTicks"] = 3; + + layout.options.yNumberOfTicks = 3; + layout.evaluate(); + drawDemo($('test10'), layout, options); + + layout.options.xNumberOfTicks = 3; + layout.evaluate(); + drawDemo($('test11'), layout, options); + + layout.options.barWidthFillFraction = 0.5; + layout.evaluate(); + drawDemo($('test12'), layout, options); + + + // custom labels + layout.options.barWidthFillFraction = 0.75; + layout.options.yTicks = [{v:10}, {v:20}, {v:30}, {v:40}]; + layout.evaluate(); + drawDemo($('test13'), layout, options); + + layout.options.xTicks = [ + {v:1, label:"one"}, + {v:2, label:"two"}, + {v:3, label:"three"}, + {v:4, label:"four"}, + {v:5, label:"five"}, + {v:6, label:"six"}]; + layout.evaluate(); + drawDemo($('test14'), layout, options); + + layout.addDataset("reversed", dataset_rev); + layout.options.yTicks = null; + layout.options.xTicks = null; + layout.options.xNumberOfTicks = 10; + layout.options.yNumberOfTicks = 5; + layout.options.xTicks = null; + layout.options.yTicks = null; + layout.evaluate(); + drawDemo($('test15'), layout, options); + +} + +function demo() { + demoWithStyle("pie"); +} + +addLoadEvent(demo); diff --git a/plotkit_v091/tests/dynamic.html b/plotkit_v091/tests/dynamic.html new file mode 100644 index 0000000..8a5ad0e --- /dev/null +++ b/plotkit_v091/tests/dynamic.html @@ -0,0 +1,161 @@ + + + + PlotKit : Basic Unit Tests + + + + + + + + + + +
    +

    PlotKit Dynamic Test

    + +
    +
    + Chart Style: + + + Colors: + + + +
    +
    + +
    + + + + + + + + + + +
    XY
    + +
    +
    +
    +
    + +
     
    + + +
    + diff --git a/plotkit_v091/tests/img/firefox.png b/plotkit_v091/tests/img/firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..d7cc60339b72df47e71ce76a4bdfb1129bda8d80 GIT binary patch literal 1198 zcmXw(eNfW{7{|Z+?S+XyKtN?na46zSH+76CK|3}N74s!BO+8;A&7mD4Cw8GRe&9?o z#mFp34YAX-EF>)l>aod7;z{!b35tY)D6$QP%)KyvFU`FEc%JV)&)xIA&mZ4=4yG($ z6yX1gKY)P6$w@1GI_5=*MZPX`aPRwMR95oZY+!WAi{jmXm`D4Tf^_vVHSo)k+>v*_ z^v#i*lUFPQ_Cy2uI$)UdX&>;B0a4Dt?TsP%$CL9N^v{wU+svD z&&MWS@Rk`153PLg+nI3N{a-7zy(h+GG)mJiOf_aPCGxsYGPmtteKApa{pzi{O2saY z%A2UsN6)REyd`JX=Ca)C>$1pviF($YgtO+Ng0rU;&4>EQ!%Kf66O(ij%|zB{Je_GY zPM6;p?3MBBT2E1u`nUg#IdgnNy63jBw$d$koO|m1*aaTcsNsmnkk^7SY#~I>W`Iw_ z%byCa^9r8-QHHu}HE6Rs@n~om&%7+|$h9aoC4dhai(dBz&YDDQAqwM7YcIr^4t4gq z^`apr{zSrPS!q4l({@@ z4U>LUDE^N{5X^T(a|2yqcmgm(P7pMUKyfdQnF!R6Ujf?gfspUT6Cn?w{zAB&EIKU& z#)ooH$pzzxmp1)QhR@jSV1)qf;qbJ>g}kZ(+$3YcO!ozarZK`2u+uyYk1(LyTVR{Q z0CE8;?}_+CVV_kOR7-8-2Y6gXUG1wiBF%f_McNKM89pzUw3eMyu6%g@1G6Eow99TV zkf#is#;nyA-FUY@@h%fi{?koK@sfowTLj$>vjZ3!0!jKII4T?&aYEEi`W|zG`;ZlJ zAIc$B@O>MYkN503EMu8bBq#&Fc1a>famJL*bovo zo`s@cFc#x_?qJ)%c^rRh5aUv219k>`547NNqjMD@K3QBPY#Ops>&wg)PF+Fk{9<*= zk%*@~9GQ_?C1qLfoxvbU@lxATvMGU*wmlvzF=f(?=1cpmjV1bN5j;YifvBh`eR*+1 zNB8F?O&fOC#AN-bh#5S;Gj{N^>{!L67&J#r;73_0QD8MiUNdFIPTAf?dAtqVvdcS4 zz!Svg2bV@Cwbe(YPsr6ik-7RO>7E#5q-u$@twADfTeU{AvC^SzqF$}7WOVfnve|*3 z5-o|aFacv!X?zv7ic;crk)b8WW{f_yXXf2d?|P2i8LOnzJ-^p`t$tCrn<*;MVbEZSTJd+70Re literal 0 HcmV?d00001 diff --git a/plotkit_v091/tests/img/konqueror.png b/plotkit_v091/tests/img/konqueror.png new file mode 100644 index 0000000000000000000000000000000000000000..637751f61157dbd76767fa7c3d930fedf74d5e23 GIT binary patch literal 7776 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 literal 0 HcmV?d00001 diff --git a/plotkit_v091/tests/img/mozilla.ico b/plotkit_v091/tests/img/mozilla.ico new file mode 100644 index 0000000000000000000000000000000000000000..d44438903b751f4732f5365783eb0229b0501f9a GIT binary patch literal 1406 zcmZvcze^lJ6vy9y;f`fV)+?@Ze|W?Y>#3{^YAe`S+YM=~Z34NW`?g{0%{Gm#-zuW37pASug&9hEW%I5<8GkmQYMp$Ony#e@#BjuEiFmE-c}V zrd^0bcjyk?p*!@r%%gjB&%~p9bOs6N0X?7xgn+KhmAQuGZ0RljmPD3CR#cKborS@| zU}3N@BqSIt3>F3pgM}es!eC*rFjyEY3<(_u3xkEh!eC*riUx;;!$uC(Q~?ymczRl( zp~pvt#bNF+awK)Iq%v^Rap7Qbu%xoU;oxv^I5->}sZ?+{7#s`^hFCfWhl9bv5b#p^ zR6=~ZlX)s{tPWIod!kaQ@%AuzOg#o3CXcu0rYDKV+vAsduroh z@GyAl5Vwu0q^Cz=q>tN34FY}vwg5-KFKun)paubs5IK0TwB0NUumo5F5COyV3cwOr z7zhdo0TzBV@~|fXmJsWaSmN6dcL5Csg+XCZ7!(GDA-zs81Q-+sg(1K|8XEC1C=3dN z!a!;oIt&Vf!k_>s{()r5LM6zN!!dVoXv!U9oUF=cIXF0wqoX4^K0cO{lM^{VKbNz! zGr7FHl<9OTS65eZb8{oNx3_YCe=mzaDxXeI`5%v|Zu}3#fqZEe^Tw%4_Mf9?On&&F zi}beZwkZd!>yBC3w&vx-=SH%5uQV+Iv+k~DdEGL9UJhoPqdUoZxoMl$(3xtsdZBU89L3N8 literal 0 HcmV?d00001 diff --git a/plotkit_v091/tests/img/msie.gif b/plotkit_v091/tests/img/msie.gif new file mode 100644 index 0000000000000000000000000000000000000000..5101477f27162b48493c3d1438485878ff376305 GIT binary patch literal 1556 zcmV+v2J87pNk%w1VK)Fb0M!5han0`)cgrP<;3Avhgxm91inkPOxz*zBC57H_uFw4Z z{33*|C8Xt6smUUd-;(F~O4RWgh|*KK@2$q%C2_Mgt=7fb=D5=0QhSbKc(26F)0)NJXTsx}w9<#L+6qmXroGjhy3yU{?X9h?LY~2T zqQxkJ!7H!pWo2aa_xLlq?gDjXnx7AP01GDlrFu3ms-ZT1FNWG<-xVBMA)+EV((myb(D7g^WoDA;C~fG!{C! z4J6Lb8Xg`M3@oNtwSmyt64$^2`tS7=;#0t><}6<@YVwn0Szii7MfX0G0P1A z1Rgvf0AO7^ckirOV=%x$02eJ{b(_%Q$r29bNC*@NfP@DU2Q?&A$e`qad3X*ODIr1} zh+6>#5+H$Vjs|uj$paHn=9-5-I4l zLqtD-u)_isvp@kV{lG&YfxX~B0xBHfh^H%7=iJA#|9=4;IWofqJi4rV~RB zxIn>~Vo)GPngIlG<&FrvDZrN~(v`vqlT}CohHCYMRhxhY+NPWfW*4UbH{7rtkUz8# z!g?(%z(AiS5e65Dgccg-rZwC^!DQX2A%ajANK%bpR>7AbrkidmKn)+baAGTJc;&-) zlA>y5P*OlmTIV`O)PN!n7O(-Y*JT&L4nh@i+6Fpz25Zj*C18vZ98mCHXT4RaoeL-& z5CaV~@FjH4*41D(&j3Bpfg(wiU@)^H7Oh~M0T^Hd1tElB1Icds=78Bxrwu>{iXovu z2nI*s0tN=;xTBRG*KGjGWWRbg+5r)ez*b18U_$`(w4j33IzDdbuQ~(%0pFKB+YWdj`kdU_8BNX0t>=D>tlm#{zKd^y)jt(8TMgt5hpdY&dNz;Q5 zP%wiNpsZE%yByDaM-UPuKnKC_!TFegf!I;NC;_Vw3PLb4<;Cd+3Y35dogo48-Q!|R zNMD;Um?9x4U;++vff)Lhs6^c&0UemYT-JjH6Z~&0_fmifW{`milz;~TAI^hN1!(&R_ G0suQ=y`x$H literal 0 HcmV?d00001 diff --git a/plotkit_v091/tests/img/opera.ico b/plotkit_v091/tests/img/opera.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e69e4ca29e257113a4b1209592e941ea9670f47 GIT binary patch literal 3638 zcmeH}eNa?Y7{;HwsIV?y!m@jpW%<};R}|%IRWyiiqBarT70oX+)D)LNP{YxLaSdv_5P`@Fj zo|*Rpa`FzLU(`MX^Shx@??FV^O6at8$jkcz8|r>T(+qB3b|aamKa48(z~oz zI0-jG#%aThQpkGCRU!xujTB=hlgop|7n#n`mqI4OZv7qSIvz7|U5Y6SFI1|OeARM)3L9b|((Bn$Z#3k-(2R12H2cmMBLUMnEi z{tt$xTt-ZEDPWbxPK%ppsMwN+BtsSPAy~vyKH#Y4M@XfaZ z>fiYn))Gefr(ldc0-de_etxyIc0LNnjHVht2S&pI3?BLuQmubtO4&8McYxtY3&YGx zhGfg12nuX~UYkUBLNnbF$6!u6hwOqYs9b*?$4*?wnl~8IMqiy~`h>kvjQMOhrSlW)Q+b&{b{Y9*Q#fcYdE}?qOuc%&q9!r=1 z40};4Qc@1nocjGWk3@2 zp;lV+Gbnl|VNUTv49^;eG|PF69XT1+X}=>_Jrg0?8rY|`&|PHMoPAi5k02@9ar*TB^O1H{LEkIEIlU`WnanEKQi)V=;AN|*hO>`B*=WBHWs(&Lyg zpJ8qNb>x={D15pDE2}<2W=1pK*>eU7iES8`aS>IU1dPaSMoio}Bt7heW8Gh9KHQGh z)9q+%ynw}vzQ)KAhY;OwANof%AwBgZCQUkv-3{&d`qX8dIC%-1H@Bgw=^{SZcOIXA zasRIE_78iHg#W9vT~+9=-$qZh&zv=D&eL~Fq*9wTsBn64advj`yz<)}MEecOw3$^! zIVDz=F>>Xan;k?6Yt3r&m`4~Z)tM>-SJ&Jyh?L{JwQ5uPD8h`{pHU{fpr7nExUf%@ z*<{w_iJZJkR>a4S+aMWSm<#Ev;x*RCCCvFa4Al{FwOd`0=~^lK5-2H@HWDAwDVAzmu2Q=r}a_(*7imtdBnK0sSML zTp{xGx;Jm+GyjO#VF3?6<`xvi#Lb(!F!KwK8Jd_g)~!Tk(`nqaJ;r>)1}3IHB>j1i zXCZImGuF?)DW8Q77&2Hj#;wRHonL-4X1eIXDs#R|$}Cp#8S`&RXRJSc1N=165Td2; z`o-HY8B$Dq%8VzUoUPS7n^DpYGxlIM9ZIn+n^!GZdIwB1Kd3Q25t;hb+&fd(=I-W6 zHNe#vCkSn*5F7|&;Qg*5+0%)k9&IS)4q^)DpkERW2e3ry91c1>;Y1i1Dj+y+>jx`1 ep|iJDcnEFf9)dI3Q@9F0;Tpo|_eq6&RpCF}h-D-I literal 0 HcmV?d00001 diff --git a/plotkit_v091/tests/img/safari.gif b/plotkit_v091/tests/img/safari.gif new file mode 100644 index 0000000000000000000000000000000000000000..677f4236fa960ba90a487cceb5c7a8c09a2dcf57 GIT binary patch literal 1166 zcmV;91abRENk%w1VH5xq0QUg^s;H-^sHld9hlhuWd3t&}JUq9zxT&eCuCA}3prMS6 zjsO4uW@c!@!oq-ofuW(Ju&}Y5oSd<-vPH%JMa2KBvAJ}i&R%0>fQz7GWMrtPr#Cq| zVus9!iHK;||9zXhetv&%Z*Zfdr1Cf}uBtP9vxxVf62sJ7|<+0@ZXPf*s)$32kB%W!=$H&SmE-xjj`Nqb^sl47Bir%K!`A&buy}iEW z<>j5w@_L)gl#`Q-+x!e^$f&5Ph>fyai^D#s=ZcY^h>41dii+gx|AB#moTRsJp3G8I zRJ63Ve0+S6kda=J#f*%Mp}y#^udb4hi=LgEpPieaprfj)s%mO!>+0!NzV4=^p^J-* zE@ZhkZKFc8^+dk^Pqg>E&DgWEw9d1%K4z7m;s1}g>r}$;-`?IqLqm~4RG+roZlvfi zh0dAL>@t$t)M#RZgN0GX`B2LLS;6y+)cgDR_}k&=X~6P4KS5Hn{a3yG?&#!1&i}E& z)RegE;^5z#y5qz6|9X0THM##*f4owf*;$s_UY*#=$jYZO2E||D&(RiQoT^kBq^~>p7w4JbAc~kB}Qxt&fnIIE&%V%Ew?~ zVXdvLO|k#({{Mr6gPf?vldg@8jFrIja=qy}IyyQ#Jfx(hWrMPzprDYCjbGgVi=WMih>3}biC4b!tE;O= zcfzKor@6VhA^8LW00031EC2ui02BZe000R800RgdIOk5L0|OH(OekT%pgIU3ESwl1 z!L~448enOVzyQSn2u#FS0ifQ4Jif;9L%8q&7(hU5!FdMm+nQnTvOe&=|2o$728p5ddHqlTJo59mRApQAX(lpFi^i z_E8{+UK)0BEbx+oNfI^=Ij-E$Cs09$DXn{Wo$k5DRD z%z!cSQmL7lTRv6^Orhb|mtL-3!BA4D6FgjMx=_)>K;XI-VC-DVHKdjeVW0v%GBoYe zpA!Q8u&D7O3Zg_yv@{x}$-^NPCE{Ic4q$))fpErf?3+MA6t{b`I4#&w0KvcqavY4X zgu*`N{(5>NcFK?vti gBtixSgp!0h7l@ + + + PlotKit: Image Labels Example + + + + + + + + + + +
    +

    Image Labels Example.

    + +
    + + +
    + + +
    + diff --git a/plotkit_v091/tests/labels.html b/plotkit_v091/tests/labels.html new file mode 100644 index 0000000..fedaf6d --- /dev/null +++ b/plotkit_v091/tests/labels.html @@ -0,0 +1,43 @@ + + + + PlotKit: X Label Demo + + + + + + + + + + + + + + +
    +

    Label Demo

    + +
    +
    + + +
    + + +
    + diff --git a/plotkit_v091/tests/prototype_compat.html b/plotkit_v091/tests/prototype_compat.html new file mode 100644 index 0000000..7ce3e5a --- /dev/null +++ b/plotkit_v091/tests/prototype_compat.html @@ -0,0 +1,28 @@ + + + + PlotKit: SweetCanvasRenderer Test + + + + + + + + + + + + + + +
    +

    Sweet Canvas Renderer Tests

    + +
    +
    + + +
    + diff --git a/plotkit_v091/tests/quickstart-easy.html b/plotkit_v091/tests/quickstart-easy.html new file mode 100644 index 0000000..d4eab21 --- /dev/null +++ b/plotkit_v091/tests/quickstart-easy.html @@ -0,0 +1,29 @@ + + + + PlotKit: Quickstart Demo + + + + + + + + + + +
    +

    Quickstart EasyPlot Demo

    + +
    + + +
    + + +
    + diff --git a/plotkit_v091/tests/quickstart-horiz.html b/plotkit_v091/tests/quickstart-horiz.html new file mode 100644 index 0000000..76d67b0 --- /dev/null +++ b/plotkit_v091/tests/quickstart-horiz.html @@ -0,0 +1,53 @@ + + + + PlotKit: Quickstart Demo + + + + + + + + + + + +
    +

    Quickstart Demo

    + +
    +
    + +
    + + + + + + + + + + + + + + +
    xy1y2
    003
    11020
    2510
    367
    478
    567
    678
    + + +
    + + +
    + diff --git a/plotkit_v091/tests/quickstart-neg.html b/plotkit_v091/tests/quickstart-neg.html new file mode 100644 index 0000000..18b65b1 --- /dev/null +++ b/plotkit_v091/tests/quickstart-neg.html @@ -0,0 +1,29 @@ + + + + PlotKit: Quickstart Demo + + + + + + + + + + +
    +

    Quickstart EasyPlot Demo

    + +
    + + +
    + + +
    + diff --git a/plotkit_v091/tests/quickstart-svg.html b/plotkit_v091/tests/quickstart-svg.html new file mode 100644 index 0000000..1d742a0 --- /dev/null +++ b/plotkit_v091/tests/quickstart-svg.html @@ -0,0 +1,61 @@ + + + + + + + PlotKit: Quickstart SVG Demo + + + + + + + + + +
    +

    Quickstart SVG Demo

    + +
    +
    +
    + + + + + + + + + + + + + + +
    xy1y2
    003
    11020
    2510
    367
    478
    567
    678
    + +

    Note: With SVG, the most compatible way is NOT to put in SVG tags, but create the SVG element with Javascript. Therefore, instead of adding <svg> tag, we just have a <div> container and create the SVG element using SVGRenderer.SVG().

    + + +
    + + +
    + diff --git a/plotkit_v091/tests/quickstart.html b/plotkit_v091/tests/quickstart.html new file mode 100644 index 0000000..f0e6176 --- /dev/null +++ b/plotkit_v091/tests/quickstart.html @@ -0,0 +1,57 @@ + + + + PlotKit: Quickstart Demo + + + + + + + + + + + + + + +
    +

    Quickstart Demo

    + +
    +
    + +
    + + + + + + + + + + + + + + +
    xy1y2
    003
    11020
    2510
    367
    478
    567
    678
    + + +
    + + +
    + diff --git a/plotkit_v091/tests/sample.txt b/plotkit_v091/tests/sample.txt new file mode 100644 index 0000000..1703e81 --- /dev/null +++ b/plotkit_v091/tests/sample.txt @@ -0,0 +1,6 @@ +0,0 +1,1 +2,4 +3,8 +4,7 +5,8 diff --git a/plotkit_v091/tests/svg-sweet.html b/plotkit_v091/tests/svg-sweet.html new file mode 100644 index 0000000..46faa75 --- /dev/null +++ b/plotkit_v091/tests/svg-sweet.html @@ -0,0 +1,29 @@ + + + + +PlotKit: SVGRenderer Test + + + + + + + + + + + + + + + + + + +
    +

    SVG Renderer Tests

    +
    + +
    + diff --git a/plotkit_v091/tests/svg-sweet.js b/plotkit_v091/tests/svg-sweet.js new file mode 100644 index 0000000..f08f59e --- /dev/null +++ b/plotkit_v091/tests/svg-sweet.js @@ -0,0 +1,141 @@ +/* actual tests */ + +var options = { + "axisLabelUseDiv": false +}; +MochiKit.Base.update(options, PlotKit.Base.officeBlue()); + + +function genericTest(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + var success = l.addDatasetFromTable("data" + num, $("test" + num)); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.SweetSVGRenderer(c, l, options); + g.render(); +} + +function genericTestAndClear(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + l.addDatasetFromTable("data" + num, $("test" + num)); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.SweetSVGRenderer(c, l, options); + g.render(); + g.clear(); +} + +function dualDataSet(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + l.addDatasetFromTable("data1." + num, $("test" + num), 0, 1); + l.addDatasetFromTable("data2." + num, $("test" + num), 0, 2); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.SweetSVGRenderer(c, l, options); + g.render(); +} + + +/* create HTML for tests */ + +function makeTableRow(list) { + return TR({}, map(partial(TD, null), list)); +} + +function generateTestTable(num, data) { + var tableid = "test" + num; + var tablehead = THEAD(null, map(makeTableRow, [["x", "y"]])); + var tablebody = TBODY(null, map(makeTableRow, data)); + + var table = TABLE({"class": "data", "id": tableid}, [tablehead, tablebody]); + return table; +} + +function generateCanvas(num) { + var canvasid = "test" + num + "canvas"; + var canvasopts = { + "id": canvasid, + "width": 400, + "height": 200, + "version": "1.1", + "baseProfile": "full" + }; + + var canvas = PlotKit.SVGRenderer.SVG(canvasopts, ""); + return canvas +} + +function generateUnitTest(num, func, data, type, desc) { + var table = DIV({"class": "data"}, generateTestTable(num, data)); + var canvas = DIV({"class": "canvas"}, generateCanvas(num)); + var ending = DIV({"class":"ending"}, desc); + + addLoadEvent(partial(func, num, type)); + + return DIV({"class": "unit"}, [table, canvas, ending]); + return DIV({"class": "unit"}, [table, ending]); +} + +function generateTests() { + var tests = $('tests'); + + // datasets + var simpleData1 = [[0, 0], [1, 1], [2, 2], [3, 3]]; + var simpleData2 = [[1, 2], [2, 3], [3, 4], [4, 5]]; + var singleData = [[1, 1]]; + + var ninety = [[1, 9], [2, 1]]; + + var floatData1 = [[0, 0.5], [1, 0.4], [2, 0.3]]; + var missingData = [[0, 1], [1, 4], [3, 16], [5, 17]]; + + var dualData = [[0,0,0], [1,2,1], [2,4,4], [3,8,9], [4,16,16], [5,32,25], [6, 64, 36], [7, 128, 49]]; + + tests.appendChild(H2(null, "Simple Tests")); + + tests.appendChild(generateUnitTest(1, genericTest, simpleData1, "bar", "")); + tests.appendChild(generateUnitTest(2, genericTest, simpleData1, + "line", "")); + tests.appendChild(generateUnitTest(3, genericTest, simpleData2, + "pie", "")); + + tests.appendChild(H2(null, "One Value Set")); + + tests.appendChild(generateUnitTest(4, genericTest, singleData, + "bar", "")); + tests.appendChild(generateUnitTest(5, genericTest, singleData, + "line", "")); + tests.appendChild(generateUnitTest(6, genericTest, singleData, + "pie", "")); + + tests.appendChild(H2(null, "Float Values Set")); + tests.appendChild(generateUnitTest(7, genericTest, floatData1, + "bar", "")); + tests.appendChild(generateUnitTest(8, genericTest, floatData1, + "line", "")); + tests.appendChild(generateUnitTest(9, genericTest, floatData1, + "pie", "")); + + tests.appendChild(H2(null, "Dual Value Set")); + tests.appendChild(generateUnitTest(10, dualDataSet, dualData, + "bar", "")); + tests.appendChild(generateUnitTest(11, dualDataSet, dualData, + "line", "")); + + tests.appendChild(H2(null, "Drawing and Clearing")); + tests.appendChild(generateUnitTest(12, genericTest, floatData1, + "bar", "")); + tests.appendChild(generateUnitTest(13, genericTestAndClear, floatData1, + "bar", "")); + tests.appendChild(generateUnitTest(14, genericTest, floatData1, + "pie", "")); + tests.appendChild(generateUnitTest(15, genericTestAndClear, floatData1, + "pie", "")); + + tests.appendChild(H2(null, "Testing Circle Drawing")); + + tests.appendChild(generateUnitTest(16, genericTest, ninety, + "pie", "")); +} + +addLoadEvent(generateTests); diff --git a/plotkit_v091/tests/svg.html b/plotkit_v091/tests/svg.html new file mode 100644 index 0000000..cc8ac7a --- /dev/null +++ b/plotkit_v091/tests/svg.html @@ -0,0 +1,26 @@ + + + + +PlotKit: SVGRenderer Test + + + + + + + + + + + + + + + +
    +

    SVG Renderer Tests

    +
    + +
    + diff --git a/plotkit_v091/tests/svg.js b/plotkit_v091/tests/svg.js new file mode 100644 index 0000000..45dae8b --- /dev/null +++ b/plotkit_v091/tests/svg.js @@ -0,0 +1,147 @@ +/* actual tests */ + +var options = { + "axisLineWidth": 2.0, + "axisLabelColor": Color.grayColor(), + "axisLineColor": Color.blackColor(), + "padding": {top: 5, bottom: 20, left: 40, right: 10}, + "backgroundColor": Color.whiteColor(), + "strokeColor": null, + "axisLabelUseDiv": false +}; + +function genericTest(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + var success = l.addDatasetFromTable("data" + num, $("test" + num)); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.SVGRenderer(c, l, options); + g.render(); +} + +function genericTestAndClear(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + l.addDatasetFromTable("data" + num, $("test" + num)); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.SVGRenderer(c, l, {}); + g.render(); + g.clear(); +} + +function dualDataSet(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + l.addDatasetFromTable("data1." + num, $("test" + num), 0, 1); + l.addDatasetFromTable("data2." + num, $("test" + num), 0, 2); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.SVGRenderer(c, l, options); + g.render(); +} + + +/* create HTML for tests */ + +function makeTableRow(list) { + return TR({}, map(partial(TD, null), list)); +} + +function generateTestTable(num, data) { + var tableid = "test" + num; + var tablehead = THEAD(null, map(makeTableRow, [["x", "y"]])); + var tablebody = TBODY(null, map(makeTableRow, data)); + + var table = TABLE({"class": "data", "id": tableid}, [tablehead, tablebody]); + return table; +} + +function generateCanvas(num) { + var canvasid = "test" + num + "canvas"; + var canvasopts = { + "id": canvasid, + "width": 400, + "height": 200, + "version": "1.1", + "baseProfile": "full" + }; + + var canvas = PlotKit.SVGRenderer.SVG(canvasopts, ""); + return canvas +} + +function generateUnitTest(num, func, data, type, desc) { + var table = DIV({"class": "data"}, generateTestTable(num, data)); + var canvas = DIV({"class": "canvas"}, generateCanvas(num)); + var ending = DIV({"class":"ending"}, desc); + + addLoadEvent(partial(func, num, type)); + + return DIV({"class": "unit"}, [table, canvas, ending]); + return DIV({"class": "unit"}, [table, ending]); +} + +function generateTests() { + var tests = $('tests'); + + // datasets + var simpleData1 = [[0, 0], [1, 1], [2, 2], [3, 3]]; + var simpleData2 = [[1, 2], [2, 3], [3, 4], [4, 5]]; + var singleData = [[1, 1]]; + + var ninety = [[1, 9], [2, 1]]; + + var floatData1 = [[0, 0.5], [1, 0.4], [2, 0.3]]; + var missingData = [[0, 1], [1, 4], [3, 16], [5, 17]]; + + var dualData = [[0,0,0], [1,2,1], [2,4,4], [3,8,9], [4,16,16], [5,32,25], [6, 64, 36], [7, 128, 49]]; + + tests.appendChild(H2(null, "Simple Tests")); + + tests.appendChild(generateUnitTest(1, genericTest, simpleData1, "bar", "")); + + tests.appendChild(generateUnitTest(2, genericTest, simpleData1, + "line", "")); + tests.appendChild(generateUnitTest(3, genericTest, simpleData2, + "pie", "")); + + tests.appendChild(H2(null, "One Value Set")); + + tests.appendChild(generateUnitTest(4, genericTest, singleData, + "bar", "")); + tests.appendChild(generateUnitTest(5, genericTest, singleData, + "line", "")); + tests.appendChild(generateUnitTest(6, genericTest, singleData, + "pie", "")); + + tests.appendChild(H2(null, "Float Values Set")); + tests.appendChild(generateUnitTest(7, genericTest, floatData1, + "bar", "")); + tests.appendChild(generateUnitTest(8, genericTest, floatData1, + "line", "")); + tests.appendChild(generateUnitTest(9, genericTest, floatData1, + "pie", "")); + + tests.appendChild(H2(null, "Dual Value Set")); + tests.appendChild(generateUnitTest(10, dualDataSet, dualData, + "bar", "")); + tests.appendChild(generateUnitTest(11, dualDataSet, dualData, + "line", "")); + + tests.appendChild(H2(null, "Drawing and Clearing")); + tests.appendChild(generateUnitTest(12, genericTest, floatData1, + "bar", "")); + tests.appendChild(generateUnitTest(13, genericTestAndClear, floatData1, + "bar", "")); + tests.appendChild(generateUnitTest(14, genericTest, floatData1, + "pie", "")); + tests.appendChild(generateUnitTest(15, genericTestAndClear, floatData1, + "pie", "")); + + tests.appendChild(H2(null, "Testing Circle Drawing")); + + tests.appendChild(generateUnitTest(16, genericTest, ninety, + "pie", "")); + +} + +addLoadEvent(generateTests); diff --git a/plotkit_v091/tests/sweet.html b/plotkit_v091/tests/sweet.html new file mode 100644 index 0000000..9e7685b --- /dev/null +++ b/plotkit_v091/tests/sweet.html @@ -0,0 +1,24 @@ + + + + PlotKit: SweetCanvasRenderer Test + + + + + + + + + + +
    +

    Sweet Canvas Renderer Tests

    + +
    +
    + + +
    + diff --git a/plotkit_v091/tests/sweet.js b/plotkit_v091/tests/sweet.js new file mode 100644 index 0000000..44e174c --- /dev/null +++ b/plotkit_v091/tests/sweet.js @@ -0,0 +1,89 @@ +/* actual tests */ + +var opts = { + "enableEvents": false +}; + +function genericTest(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + var success = l.addDatasetFromTable("data" + num, $("test" + num)); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.SweetCanvasRenderer(c, l, opts); + g.render(); +} + +function dualDataSet(num, plotStyle) { + var l = new PlotKit.Layout(plotStyle, {}); + l.addDatasetFromTable("data1." + num, $("test" + num), 0, 1); + l.addDatasetFromTable("data2." + num, $("test" + num), 0, 2); + l.evaluate(); + var c = $("test" + num + "canvas"); + var g = new PlotKit.SweetCanvasRenderer(c, l, opts); + g.render(); +} + + +/* create HTML for tests */ + +function makeTableRow(list) { + return TR({}, map(partial(TD, null), list)); +} + +function generateTestTable(num, data) { + var tableid = "test" + num; + var tablehead = THEAD(null, map(makeTableRow, [["x", "y"]])); + var tablebody = TBODY(null, map(makeTableRow, data)); + + var table = TABLE({"class": "data", "id": tableid}, [tablehead, tablebody]); + return table; +} + +function generateCanvas(num) { + var canvasid = "test" + num + "canvas"; + var canvas = CANVAS({"id":canvasid, "width": "400", "height": "200"}, ""); + return canvas +} + +function generateUnitTest(num, func, data, type, desc) { + var table = DIV({"class": "data"}, generateTestTable(num, data)); + var canvas = DIV({"class": "canvas"}, generateCanvas(num)); + var ending = DIV({"class":"ending"}, desc); + + addLoadEvent(partial(func, num, type)); + + return DIV({"class": "unit"}, [table, canvas, ending]); + +} + +function generateTests() { + var tests = $('tests'); + + // datasets + var simpleData1 = [[0, 0], [1, 1], [2, 2], [3, 3]]; + var simpleData2 = [[1, 2], [2, 3], [3, 4], [4, 5]]; + var singleData = [[1, 1]]; + + var floatData1 = [[0, 0.5], [1, 0.4], [2, 0.3]]; + var missingData = [[0, 1], [1, 4], [3, 16], [5, 17]]; + + var dualData = [[0,0,0], [1,2,1], [2,4,4], [3,8,9], [4,16,16], [5,32,25], [6, 64, 36], [7, 128, 49]]; + + tests.appendChild(H2(null, "Simple Tests")); + + tests.appendChild(generateUnitTest(1, genericTest, simpleData1, + "bar", "")); + tests.appendChild(generateUnitTest(2, dualDataSet, dualData, + "bar", "")); + + tests.appendChild(generateUnitTest(3, genericTest, simpleData1, + "line", "")); + tests.appendChild(generateUnitTest(4, dualDataSet, dualData, + "line", "")); + + tests.appendChild(generateUnitTest(5, genericTest, simpleData1, + "pie", "")); + +} + +addLoadEvent(generateTests); diff --git a/plotkit_v091/tests/tests.css b/plotkit_v091/tests/tests.css new file mode 100644 index 0000000..2816106 --- /dev/null +++ b/plotkit_v091/tests/tests.css @@ -0,0 +1,66 @@ +table#dynamicTable { + margin: 10px auto 10px auto; +} + +table.data td { + margin: 5px; + padding: 5px; + width: 50px; +} + +table.data thead td { + background-color: #eee; +} + +table.data thead th { + background-color: #eee; + border-bottom: 1px solid #ddd; + padding: 5px; + text-align: left; +} + +table.data tbody td { + padding: 5px; + vertical-align: top; + text-align: left; + border-bottom: 1px solid #eee; +} + +table.data { + width: 200px; +} + +.center { + margin-left: auto; + margin-right: auto; +} + +h3 { + font-size: large; + color: #666; + background-color: #eee; + border-bottom: 1px solid #ddd; + padding: 3px; +} + +h4 { + font-size: medium; + margin: 5px; +} + +div.data, div.canvas { + float: left; + margin: 5px; +} + +div.ending { + clear: both; + margin: 10px; +} + +div.unit { + border: 1px solid #eee; + margin: 10px; + padding: 10px; +} + diff --git a/plotkit_v091/tests/testsvg.html b/plotkit_v091/tests/testsvg.html new file mode 100644 index 0000000..008d669 --- /dev/null +++ b/plotkit_v091/tests/testsvg.html @@ -0,0 +1,20 @@ + + + + + + + SVG Test + + + + + + + + + + + diff --git a/plotkit_v091/tests/testsvg.js b/plotkit_v091/tests/testsvg.js new file mode 100644 index 0000000..3bcd3ef --- /dev/null +++ b/plotkit_v091/tests/testsvg.js @@ -0,0 +1,31 @@ +function testsvg() { + var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + var ieVersion = navigator.appVersion.match(/MSIE (\d\.\d)/); + var safariVersion = navigator.userAgent.match(/AppleWebKit\/(\d+)/); + var operaVersion = navigator.userAgent.match(/Opera\/(\d*\.\d*)/); + var mozillaVersion = navigator.userAgent.match(/rv:(\d*\.\d*).*Gecko/); + + + if (ieVersion && (ieVersion[1] >= 6) && !isOpera) { + var dummysvg = document.createElement(''); + try { + dummysvg.getSVGDocument(); + dummysvg = null; + return true; + } + catch (e) { + return false; + } + } + + if (safariVersion && (safariVersion[1] > 419)) + return true; + + if (operaVersion && (operaVersion[1] > 8.9)) + return true + + if (mozillaVersion && (mozillaVersion > 1.7)) + return true; + + return false; +} \ No newline at end of file diff --git a/test.html b/test.html new file mode 100644 index 0000000..a7cfde1 --- /dev/null +++ b/test.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + +

    Sample graph with multiple series/error bars. Mouse over to see specific +points and change the "7" in the text to adjust the averaging period. Click and +drag to zoom in on a region, or double-click to zoom out.

    + +
    +
    + +

    Another chart without error bars:

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

    Fraction graph

    +
    + + + +
    loading time
    + + + -- 2.7.4