From 0e3267b8cb60387e79beea6962c9868e681b9023 Mon Sep 17 00:00:00 2001 From: Banana Date: Fri, 29 Jul 2011 20:45:46 +0200 Subject: [PATCH] simpleTree is working --- javascript/mif-tree/Demos/SimpleTree/demo.css | 279 + javascript/mif-tree/Demos/SimpleTree/demo.js | 64 + .../mif-tree/Demos/SimpleTree/index.html | 20 + .../mif-tree/Demos/assets/files/bigTree.json | 12512 ++++++++++++++++ .../mif-tree/Demos/assets/files/empty.json | 3 + .../mif-tree/Demos/assets/files/forest.json | 130 + .../Demos/assets/files/mediumTree.json | 709 + .../Demos/assets/files/simpleTree.json | 41 + javascript/mif-tree/Demos/assets/images/1.gif | Bin 0 -> 49 bytes .../mif-tree/Demos/assets/images/Thumbs.db | Bin 0 -> 40960 bytes .../mif-tree/Demos/assets/images/aro.gif | Bin 0 -> 338 bytes .../Demos/assets/images/arrow_gadjets.gif | Bin 0 -> 105 bytes .../Demos/assets/images/bin_close_icon.gif | Bin 0 -> 966 bytes .../Demos/assets/images/bin_middle_icon.gif | Bin 0 -> 1024 bytes .../Demos/assets/images/bin_open_icon.gif | Bin 0 -> 1035 bytes .../mif-tree/Demos/assets/images/blank.gif | Bin 0 -> 49 bytes .../Demos/assets/images/book_icon.gif | Bin 0 -> 1049 bytes .../Demos/assets/images/checkboxes.gif | Bin 0 -> 1019 bytes .../mif-tree/Demos/assets/images/checked.gif | Bin 0 -> 206 bytes .../Demos/assets/images/checked_selected.gif | Bin 0 -> 333 bytes .../Demos/assets/images/closeicon.gif | Bin 0 -> 97 bytes .../assets/images/disclosureDownPressed.png | Bin 0 -> 212 bytes .../assets/images/disclosureRightDown.png | Bin 0 -> 261 bytes .../assets/images/disclosureRightPressed.png | Bin 0 -> 233 bytes .../mif-tree/Demos/assets/images/drop-add.gif | Bin 0 -> 1001 bytes .../Demos/assets/images/drop-between.gif | Bin 0 -> 907 bytes .../mif-tree/Demos/assets/images/drop-no.gif | Bin 0 -> 949 bytes .../Demos/assets/images/drop-over.gif | Bin 0 -> 911 bytes .../Demos/assets/images/drop-under.gif | Bin 0 -> 911 bytes .../mif-tree/Demos/assets/images/dropzone.gif | Bin 0 -> 1415 bytes .../mif-tree/Demos/assets/images/file.gif | Bin 0 -> 549 bytes .../Demos/assets/images/gadjets-hover.gif | Bin 0 -> 138 bytes .../mif-tree/Demos/assets/images/gadjets.gif | Bin 0 -> 227 bytes .../Demos/assets/images/horizontal-line.gif | Bin 0 -> 55 bytes .../mif-tree/Demos/assets/images/line.gif | Bin 0 -> 45 bytes .../Demos/assets/images/lineSelected.gif | Bin 0 -> 459 bytes .../Demos/assets/images/mootree_loader.gif | Bin 0 -> 584 bytes .../mif-tree/Demos/assets/images/openicon.gif | Bin 0 -> 97 bytes .../Demos/assets/images/twistyGadjets.gif | Bin 0 -> 367 bytes .../Demos/assets/images/unchecked.gif | Bin 0 -> 116 bytes .../assets/images/unchecked_selected.gif | Bin 0 -> 201 bytes .../mif-tree/Demos/assets/scripts/Builder.js | 96 + .../mif-tree/Demos/assets/scripts/demos.js | 154 + .../mif-tree/Demos/assets/scripts/docs.js | 151 + .../Demos/assets/scripts/mootools-1.2.1.js | 5438 +++++++ .../mif-tree/Demos/assets/scripts/mootools.js | 4919 ++++++ .../mif-tree/Demos/assets/scripts/showdown.js | 1296 ++ .../mif-tree/Demos/assets/styles/demos.css | 308 + .../mif-tree/Demos/assets/styles/docs.css | 320 + .../mif-tree/Demos/assets/styles/mif-tree.css | 287 + .../mif-tree/Demos/assets/styles/specs.css | 297 + javascript/mif-tree/Demos/index.html | 32 + 52 files changed, 27056 insertions(+) create mode 100755 javascript/mif-tree/Demos/SimpleTree/demo.css create mode 100755 javascript/mif-tree/Demos/SimpleTree/demo.js create mode 100755 javascript/mif-tree/Demos/SimpleTree/index.html create mode 100755 javascript/mif-tree/Demos/assets/files/bigTree.json create mode 100755 javascript/mif-tree/Demos/assets/files/empty.json create mode 100755 javascript/mif-tree/Demos/assets/files/forest.json create mode 100755 javascript/mif-tree/Demos/assets/files/mediumTree.json create mode 100755 javascript/mif-tree/Demos/assets/files/simpleTree.json create mode 100755 javascript/mif-tree/Demos/assets/images/1.gif create mode 100755 javascript/mif-tree/Demos/assets/images/Thumbs.db create mode 100755 javascript/mif-tree/Demos/assets/images/aro.gif create mode 100755 javascript/mif-tree/Demos/assets/images/arrow_gadjets.gif create mode 100755 javascript/mif-tree/Demos/assets/images/bin_close_icon.gif create mode 100755 javascript/mif-tree/Demos/assets/images/bin_middle_icon.gif create mode 100755 javascript/mif-tree/Demos/assets/images/bin_open_icon.gif create mode 100755 javascript/mif-tree/Demos/assets/images/blank.gif create mode 100755 javascript/mif-tree/Demos/assets/images/book_icon.gif create mode 100755 javascript/mif-tree/Demos/assets/images/checkboxes.gif create mode 100755 javascript/mif-tree/Demos/assets/images/checked.gif create mode 100755 javascript/mif-tree/Demos/assets/images/checked_selected.gif create mode 100755 javascript/mif-tree/Demos/assets/images/closeicon.gif create mode 100755 javascript/mif-tree/Demos/assets/images/disclosureDownPressed.png create mode 100755 javascript/mif-tree/Demos/assets/images/disclosureRightDown.png create mode 100755 javascript/mif-tree/Demos/assets/images/disclosureRightPressed.png create mode 100755 javascript/mif-tree/Demos/assets/images/drop-add.gif create mode 100755 javascript/mif-tree/Demos/assets/images/drop-between.gif create mode 100755 javascript/mif-tree/Demos/assets/images/drop-no.gif create mode 100755 javascript/mif-tree/Demos/assets/images/drop-over.gif create mode 100755 javascript/mif-tree/Demos/assets/images/drop-under.gif create mode 100755 javascript/mif-tree/Demos/assets/images/dropzone.gif create mode 100755 javascript/mif-tree/Demos/assets/images/file.gif create mode 100755 javascript/mif-tree/Demos/assets/images/gadjets-hover.gif create mode 100755 javascript/mif-tree/Demos/assets/images/gadjets.gif create mode 100755 javascript/mif-tree/Demos/assets/images/horizontal-line.gif create mode 100755 javascript/mif-tree/Demos/assets/images/line.gif create mode 100755 javascript/mif-tree/Demos/assets/images/lineSelected.gif create mode 100755 javascript/mif-tree/Demos/assets/images/mootree_loader.gif create mode 100755 javascript/mif-tree/Demos/assets/images/openicon.gif create mode 100755 javascript/mif-tree/Demos/assets/images/twistyGadjets.gif create mode 100755 javascript/mif-tree/Demos/assets/images/unchecked.gif create mode 100755 javascript/mif-tree/Demos/assets/images/unchecked_selected.gif create mode 100755 javascript/mif-tree/Demos/assets/scripts/Builder.js create mode 100755 javascript/mif-tree/Demos/assets/scripts/demos.js create mode 100755 javascript/mif-tree/Demos/assets/scripts/docs.js create mode 100755 javascript/mif-tree/Demos/assets/scripts/mootools-1.2.1.js create mode 100755 javascript/mif-tree/Demos/assets/scripts/mootools.js create mode 100755 javascript/mif-tree/Demos/assets/scripts/showdown.js create mode 100755 javascript/mif-tree/Demos/assets/styles/demos.css create mode 100755 javascript/mif-tree/Demos/assets/styles/docs.css create mode 100755 javascript/mif-tree/Demos/assets/styles/mif-tree.css create mode 100755 javascript/mif-tree/Demos/assets/styles/specs.css create mode 100755 javascript/mif-tree/Demos/index.html diff --git a/javascript/mif-tree/Demos/SimpleTree/demo.css b/javascript/mif-tree/Demos/SimpleTree/demo.css new file mode 100755 index 0000000..446c72d --- /dev/null +++ b/javascript/mif-tree/Demos/SimpleTree/demo.css @@ -0,0 +1,279 @@ +#tree_container{ +height:200px; +width:200px; +position:relative; +border:solid 1px #b7b7b7; +} + + +/*@global*/ + +.mif-tree-wrapper{ +position: absolute; +width: 100%; +height:100%; +margin:0; +padding:0; +overflow:auto; +font-family:sans-serif; +font-size:11px; +line-height:18px;/******Tree node height******/ +white-space:nowrap; +cursor:default; +} + +.mif-tree-bg{ +width:100%; +height:100%; +position:absolute; +overflow:hidden; +} + +.mif-tree-bg-container{ +width:100%; +display:none; +} + +.mif-tree-bg-node{ +width:100%; +height:18px; +} + +.mif-tree-bg-selected{ +background-color:#dcd7ab; +} + +.mif-tree-wrapper:focus{ +outline:0; +} + +.mif-tree-wrapper span{ +padding-bottom:2px; +padding-top:2px; +cursor:inherit; +} + +.mif-tree-children{ +padding-left:18px; +width:18px; +} + +.mif-tree-node{ +width:18px; +background:url('../assets/images/line.gif') repeat-y 8px 0px; +} + +.mif-tree-node-last{ +background:url('../assets/images/line.gif') no-repeat 8px 0px; +} + +.mif-tree-name{ +cursor: default; +overflow:hidden; +margin-left:4px; +} + +.mif-tree-name a{ +color:red; +} + +.mif-tree-name a:hover{ +color:blue; +} + + +.mif-tree-node-wrapper{ +background:url('../assets/images/horizontal-line.gif') no-repeat 9px center; +} + +/*@gadjets*/ + +.mif-tree-gadjet{ +background-image:url('../assets/images/gadjets.gif'); +padding-right: 16px; +z-index:1; +overflow:hidden; +background-repeat:no-repeat; +cursor:default; +} + +.mif-tree-gadjet-none{ +background:none; +} + +.mif-tree-gadjet-minus{ +background-position: 0px 50%; +} + +.mif-tree-gadjet-plus{ +background-position: -18px 50%; +} + + +.mif-tree-gadjet-hover .mif-tree-gadjet-minus{ +background-position: -54px 50%; +} + +.mif-tree-gadjet-hover .mif-tree-gadjet-plus{ +background-position: -72px 50%; +} + + + +/*.mif-tree-gadjet-hover{ +background-image:url('../../Source/assets/images/gadjets-hover.gif'); +}*/ + + + + +/*@icons*/ +.mif-tree-icon{ +padding-right:18px; +background-position:0 50%; +background-repeat:no-repeat; +cursor:inherit; +} + +.mif-tree-open-icon{ +background-image:url('../assets/images/openicon.gif') +} + +.mif-tree-close-icon{ +background-image:url('../assets/images/closeicon.gif') +} + +.mif-tree-loader-open-icon,.mif-tree-loader-close-icon{ +background-image:url('../assets/images/mootree_loader.gif'); +} + +.mif-tree-book-icon{ +background-image:url('../assets/images/book_icon.gif'); +} + +.mif-tree-bin-open-icon{ +background-image:url('../assets/images/bin_open_icon.gif'); +} + +.mif-tree-bin-close-icon{ +background-image:url('../assets/images/bin_close_icon.gif'); +} + + + +/*@selection*/ + +.mif-tree-node-selected .mif-tree-name{ +background-color: #010161; +color:#fff; +text-transform:italic; +} + +.mif-tree-hover-node .mif-tree-name{ +text-decoration:underline +} + + + +/*@d'n'd*/ +.mif-tree-pointer{ +height:1px; +overflow: hidden; +position: absolute; +background-image:url('../assets/images/1.gif'); +background-repeat:repeat-x; +background-color:#292fef; +} + + +.mif-tree-ghost{ +background-color:#fff; +border:solid 2px #e8e8f7; +padding-left:2px; +} + +.mif-tree-ghost span{ +padding-top:2px; +padding-bottom:2px; +} + +.mif-tree-ghost .mif-tree-node-wrapper{ +background:none; +} + +.mif-tree-ghost span.mif-tree-text{ +padding-top:1px; +padding-bottom:1px; +} + +.mif-tree-ghost-icon{ +padding-left:16px; +background-color:#fff; +background-repeat:no-repeat; +background-image:url('../assets/images/dropzone.gif'); +} + +.mif-tree-ghost-after{ +background-position:-64px 2px; +} + +.mif-tree-ghost-before{ +background-position:-48px 2px; +} + +.mif-tree-ghost-between{ +background-position:-16px 2px; +} + +.mif-tree-ghost-inside{ +background-position:-0px 2px; +} + +.mif-tree-ghost-notAllowed{ +background-position:-32px 2px; +} + +.mif-tree-drag-current{ +background-color:#cfcfd8; +} + +.mif-tree-replace{ +background-color:#99c8fb; +} + + +/*@checkbox*/ +.mif-tree-checkbox{ +padding-left:18px; +} + +.mif-tree-node-checked, .mif-tree-node-checked .mif-tree-checkbox{ +background:url('../assets/images/checked.gif') center 2px no-repeat; +} + +.mif-tree-node-unchecked, .mif-tree-node-unchecked .mif-tree-checkbox{ +background:url('../assets/images/unchecked.gif') center 2px no-repeat; +} + +.mif-tree-node-checked-selected{ +background:url('../assets/images/checked_selected.gif') center 2px no-repeat; +} + +.mif-tree-node-unchecked-selected{ +background:url('../assets/images/unchecked_selected.gif') center 2px no-repeat; +} + + + +/*@rename*/ +.mif-tree-rename{ +display: inline; +line-height: 14px; +height:14px; +cursor: default; +overflow:hidden; +font-family:sans-serif; +font-size:11px; +padding:1px 0; +border:solid 1px black; +} diff --git a/javascript/mif-tree/Demos/SimpleTree/demo.js b/javascript/mif-tree/Demos/SimpleTree/demo.js new file mode 100755 index 0000000..2e31bc9 --- /dev/null +++ b/javascript/mif-tree/Demos/SimpleTree/demo.js @@ -0,0 +1,64 @@ +window.addEvent('domready',function(){ + tree = new Mif.Tree({ + container: $('tree_container'),// tree container + types: {// node types + folder:{ + openIcon: 'mif-tree-open-icon',//css class open icon + closeIcon: 'mif-tree-close-icon'// css class close icon + } + }, + dfltType:'folder',//default node type + height: 18//node height + }); + + var json = [ + { + "property": { + "name": "root" + }, + "children": [ + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "state": { + "open": true + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node3" + } + } + ] + } + ]; + + // load tree from json. + tree.load({ + json: json + }); + +}); diff --git a/javascript/mif-tree/Demos/SimpleTree/index.html b/javascript/mif-tree/Demos/SimpleTree/index.html new file mode 100755 index 0000000..f874293 --- /dev/null +++ b/javascript/mif-tree/Demos/SimpleTree/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + + Mif.Tree Demo + + +

Simple Tree example

+
+

+ Back +

+ + diff --git a/javascript/mif-tree/Demos/assets/files/bigTree.json b/javascript/mif-tree/Demos/assets/files/bigTree.json new file mode 100755 index 0000000..60a5f81 --- /dev/null +++ b/javascript/mif-tree/Demos/assets/files/bigTree.json @@ -0,0 +1,12512 @@ +[ + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + } +] \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/files/empty.json b/javascript/mif-tree/Demos/assets/files/empty.json new file mode 100755 index 0000000..a066311 --- /dev/null +++ b/javascript/mif-tree/Demos/assets/files/empty.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/files/forest.json b/javascript/mif-tree/Demos/assets/files/forest.json new file mode 100755 index 0000000..27dd727 --- /dev/null +++ b/javascript/mif-tree/Demos/assets/files/forest.json @@ -0,0 +1,130 @@ +[ + { + "property": { + "name": "node1.1" + }, + "type": "book" + }, + { + "property": { + "name": "drag me! sorry imposible", + "hasCheckbox": false + }, + "type": "disabled", + "children":[ + { + "property": { + "name": "anode1.3.1", + "hasCheckbox": false + }, + "type": "folder" + }, + { + "property": { + "name": "node1.3.0", + "hasCheckbox": false + }, + "type": "folder" + } + ] + }, + { + "property": { + "name": "node1.2", + "loadable":true + }, + "type": "folder" + }, + { + "property": { + "name": "node1.3" + }, + "data": { + "a": "aaa" + }, + "type": "folder", + "children":[ + { + "property": { + "name": "node1.3.1" + }, + "type": "folder" + }, + { + "property": { + "name": "node1.3.2" + }, + "type": "folder" + } + ] + }, + { + "property": { + "name": "node1.4" + }, + "data":{ + "data1": "rtfm", + "data2": "xyz" + }, + "children":[ + { + "property": { + "name": "empty", + "loadable": "true" + }, + "type": "folder" + }, + { + "property": { + "name": "node1.4.2" + }, + "type": "folder" + } + ] + }, + { + "property": { + "name": "books" + }, + "type": "folder", + "children":[ + { + "property": { + "name": "node1.5.1" + }, + "type": "book" + }, + { + "property": { + "name": "node1.5.2" + }, + "type": "book" + } + ] + }, + { + "property": { + "name": "node1.6" + }, + "type": "bin", + "children":[ + { + "property": { + "name": "node1.6.1", + "hasCheckbox": false + }, + "type": "folder" + }, + { + "property": { + "name": "node1.6.2" + }, + "data":{ + "test": "acd", + "arrrrr": ["a","b","c"] + }, + "type": "folder" + } + ] + } +] \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/files/mediumTree.json b/javascript/mif-tree/Demos/assets/files/mediumTree.json new file mode 100755 index 0000000..add2940 --- /dev/null +++ b/javascript/mif-tree/Demos/assets/files/mediumTree.json @@ -0,0 +1,709 @@ +[ + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + } +] \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/files/simpleTree.json b/javascript/mif-tree/Demos/assets/files/simpleTree.json new file mode 100755 index 0000000..38e70af --- /dev/null +++ b/javascript/mif-tree/Demos/assets/files/simpleTree.json @@ -0,0 +1,41 @@ +[ + { + "property": { + "name": "root" + }, + "children": [ + { + "property": { + "name": "node1" + } + }, + { + "property": { + "name": "node2" + }, + "children":[ + { + "property": { + "name": "node2.1" + } + }, + { + "property": { + "name": "node2.2" + } + } + ] + }, + { + "property": { + "name": "node3" + } + }, + { + "property": { + "name": "node4" + } + } + ] + } +] \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/images/1.gif b/javascript/mif-tree/Demos/assets/images/1.gif new file mode 100755 index 0000000000000000000000000000000000000000..2b0c1fc0664f144f0c5113f4e1fab870f509baaf GIT binary patch literal 49 tcmZ?wbhEHbWMW`sn8*ME|G@yrQ2fcl$iTqFpaT*G$ulr9g>W%g0{}Ru3M2pk literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/Thumbs.db b/javascript/mif-tree/Demos/assets/images/Thumbs.db new file mode 100755 index 0000000000000000000000000000000000000000..8c5a9764dcc016f0f63555fbd221c4146707295b GIT binary patch literal 40960 zcmeI52_ThA|M-u{n(VUgm8>O{J(abToyeACIU(71ZPpM%n^g8}*|TI{LQ>W&S&k6G zQ4!hx-=~}VcJJ-JZ?}7Y|NC}dqmMZqGxL4snfZQadFGjU)=V*QH;Z8q^(!Zh!bPpD z5~1+F_#Ov7BYbk?DAWe{un|~UU0wa@OB4z|uDc)T4lKj95=H~=ny7uX7H z1GWP@011Ex-~&Veen0>a1a<CZ@sfgG|6?3n2vqLNpfHYKq)fcM+C~{?aC3zGMR4QZS0#|!LMQ}H4 zK>mTlgMS+dH*Unk+el16fKRxIc+(~lViFS4&6MP%n<+MvkdV`oQ&3UU(9mom+d@Z6 zO-D&hLyaVYg9~x+HWF>zNJLFaLQ4II-D)|Cf)LstQd}Gk)CLM1Tne1kYNQ>(*$7vQ zT<~XyvjMIVpMa2vm;?gkfrjGX;%>mhMXnk`d&1vQcoZ8c*>}m}Q>mE{aM)1`oeR55 z$hkkOf=2y0mTUKkv*(G3X}8ePGi=?qoqGq5u!!iMy<*}A4$8?ZC@LvyXliNe=pNHE zJ!y8z+``hz-oeqy*~QiE!o^Fze*OW0;SpCOqoS`}zi}@vJ|QtFIpuzKPHtX)!NbC$ z%Bt#`+PcT}4K1y0?H!#jy1EB3L$8KMMqiJO&%Ay2es=D|{K7{hUpOe-pR)CH&VH3I z3dq+6JUm=H0wiBJ8=L`L3cQW%yYMMx)d)=Ns5peq5mN6DyPH)(#JO7?OLOAvb7ER9 z;lZslNY*~(?AtPS{=0JabH@IauWr;PTpTDoTncEUKPC;5RkEVyFAQ!uKb29kWpHe2 z`1xr=_vjYuZl#l=Gf_?_F6K}walKW_yjErtitplG;Z}BOGM9PF(H4r8_K{`Zmc5&< z=@P!olD8|&x_woTm-h4%*dJ(VjbEIU;7T>HC;C7T6AR9@`7Wo}~^5%`WQ zl$B-s{IGMv@!m0`t{mNkLfhN`k0#8nXBXkfUyP$`uu-?a5EOK= z<+;kEUazOOwIzE`?Z)BTsO&H)hE;bIsPu_ zE&c1S9FRIFI&`6aO5NmV{da~)KZ5>4?OE6VPj>Bx*Z*aWdx6}z->W!CEe5yNe)&Lu z>PM)*bInYj1g_2D}Xqp zzxZd|_v9ZLTQYw#!#|Bz|D^n%$Lrske=QKm_F4XV|K)dkX8)=GvP?C%1zyZ=R+a#Sp`=VxQa&YwTikJOS>dEQ&sNf9JIuqoDmn-mr1~A zc3$=aCQ>{;(1phBIL19%U*tquVZR zD8q2Ht7py$oAjm?`?0@@WlMp;n}bEZDdM5IR#Zdy#|W1q6^QpT*SEfW^{#9{JL;W? zmzalU=s;{`lYMRYn8pM;kT#3sscUMT$xG!L8GpSs*i?wmw zRLGSLleLO6H|k!jV9i~gDzF{sk#fYp5|-Cqn_$d-am#iqf=%V6_)fERBI7GUSet+u zlFIH_-zB9){Rsw^1fqiC>>`7D9@aMUGqQASKC*bYx~nK6X-XHP0dJr8(}XSuju`Aw z$Tq}xR+99aZseVHrF*Np45mtJun~=(_cq$i&p%?niemA$2qj&4`q3~r+2ux^PElUF z%}N#C4TI!Jb?ZW{u=s%!KCa_Z*1Cq+fYF=hcyYbyIowmCNWm(Ls4F_ zUgx8aeSPu;mpx4Hc}QbRlQ1$A<4zx?{Sqr}1g33nS{=MlmcliF5>jGADQ$R2)|EQv z*WzuNi86F4KG-TKoG#9H~W^O6DA2-EY=UI7mUBDe%&lG!BI}~esV2^OO0%{re~0KnWdwdS!1KQr>%Qmhjw0O zrtSB2WY+pGrqCY!2>lmIl<0p||7E@X`u_HdWd7w$tHM0V-La3gj}pcUx*dn>bEzx? zNEXy5`R+GzC3~6auqAW8606k_Gr}#i3?=jME^WVq9SKeEu1Qp2?0spaR>5R-{EGjE z!%vRoi!DCH*{rx#_Dv~|hg9}_I`*9*HfC`_)yk=M>&;Cb*JVkmix2Fu4(Ac=_31g| zvaPVJt8w6o_lD9fy7P7;ffE|8Ebr8dE_g@tR}C=V4SlJp`;2_c8I>B@6WqA16IC7( zizZ7lZIX7GE(*s>p;gt;ZOLPdk$KYgf|BuoC6zg| zSO*`OWA+4;=nr}BH?VY6(VqH9%FuL!kW=Z@^{a>2I25ci89jV=rp23ehU3g`buFti z3MplsCmopU5b<49dA}Ifnwxx!uQS_cFSFCVSF~pdRTVZ~*Ls9sS=pnURgj%s5cu?I zw}>x^3ptk^$7LR#5So3+lLwvVe&#Y$X0jn~|2#5^W=t^He)AAI>!sR5H+eNx?%dnI z|AEH4d^{i9u$#B8?2{Um?RZn7a(Aq|_U4{$hspij62+GJLat$ocf;}@;F&4zWn$qxg6Fauzy%c(ewA>2zFT6}9f(OviO$NdlC$wwsvbTSk>+2L40$Tjp2k1x-XuCQ+oSh9chr>Fc?0_OX7Y!THr>$D00-uj|j>qCd!U(m&(AXa4I12xNltMjWz6RKh6pY#oxoN<2=8^S?|C9L;CN3<@3Ak>+S#F(*B7>03Z+u0xko=KnM^DTmiy>a3BJ>3Pb`?Ks0a-xDMO^ZUVP}7~nP#3)}$^ zIrqRHgGCSV;3oiy08C<|l7ST9K9CBe0qH;nkO@2hkoei)=K#4t9*_?d01tsepa>`i zN`OZ|DS*T)2fqTS1gd~)pa!S~>VU^UJ9<;r4%Sn%rg2p&9QGNqy&(t(RsOC$#fY+k{@jl+f4BL+Z2iOf^Mmhxez4d$B;$W12;;f44_)LNaIYpw zMXK?|6H~_EniA!yeNPFl*}oc z{BetXyytT+WnAZO^z#z*0B=7PTDvGXD#84edIOp$eLDA@Gt=|OkL%9ym`<6N$|gIM z;h=X}d9g;TcI1vZEYoV==xaXOqSqOLcLnF+(*f>d`aTky(MP?nOFK52C*+kr^3K#~ zjud}dAT;mITDs_wc{bFqL_#J=K%}R!j2wMM*e$QU#7@shSS{XSQF9}1OLm@q)1gW? zf*RfQyx{%AxsSMB9#e7MbCZjb@fagdwYRHmMpS=A-?kQkSf9+f0=xoH~8m{SfDd^4l8ngat%j*f`unX#Y$?6(u`5SEWd>Toxtf6kBqH34AQyYX3djP5@_JA*;Y#L!R_jJbKbl?KEPIBGV$$5?D7W85#7yGfk&ixmSQ)S9OCR%EEUQM zMEge(C59g0P%@>j-0d01MOqi?*4|c1)_Zio2>&&$I5wvU+jH=_k&^icQD9F!&J&YP zdP=Gf59{0(o(S7z1shq-qF=T@I=yV&x|A!fNf|jZRanH8&Y0@hK5ZX7Lu|D|)8-*z zXN!rkvXjnB>XF>DMeg}f_&Ap%+w8_;enZ+T>@ML_d+NFi=E?#^q{x&mS)2I1DcHsx z)+cs6s(jqZRQe(FgyIrKXJ(!hkEcd$fV;J+x3%Y-L(3DhC%d`s9-zNT&yBNJQb!hJ zB=YNI~BJ~HZ(k+$kgJ< zA||a1GuWCDfOhqY5?e)G5>JeC#<=g;TG(;P_ijROZyh?Vm!6eK@(|NQ&f(sSBT|GJ z#62~OB_fF>w|Qo^P6uZ4-;LtuXqmk5Qi*$SS1k>W#>4k&muKlekdjpD)f5DD>UB8Y zRFT(B>w8L<_I@s3OUJ?K)V5(e8?;Jcl>hs#wC$laZoL(_Vv`S~Xtq~zEE=u&>u`nxy?s|V$UIHA8lJ|cGur1h=x zvmmU=XZgGTy!=mc$^L-+G6<{sS-$X}mybgS>CyiI`AraZ(`WhX{h#md|9l9=C%a%s zHg7#>JFmRNdnfaMb4@WINxy(*j#p*%rMnj`T?||0vF4R8 zRXivXT&OhLz4Nvfw&wQio$NBDlzqiljN+>l#hXI;o?6g}gcXB}_7-k?d?hIot-OiT z^BS9px_he3yhSr;q7(;pOKOaAVhXz%ExGWC-R^}|dbO41aW5w*_@c0NOPt;>Vy#wD z*ZjImrX}iEQHe?gEIOsmPIWSJ=PFJKza!8qUhd1+neI0VFKBMWptUcK)!QfCQ{v8R z7wwtK*B%>r|EpmJ)R?ckweg1*)TbX|{PEvrf7kWz`}J=XMVM5G1X@lb9{!qJeD6w%9zECv7m~M;*a$awoON^pwopa zyVxy;`YFztb>knGZ#c4#Eyp9ZA&7->IhXCZ_#`043H(Z@? z_a@zJNjJP2DYC=hoqUH~WJY0+&D4&q%z0i$68_byw;8hMX1vB#120FE3F})w>>k?| z8QbsqpC1CO>EFR0ME^FSDA(uz{~7cDA362HKh%|xOYYN=&+hb)P3kw=*(O4ggXWLP z-4m^*pPn1Qm}^Gce)H9f10Dl8#SE`)mh5LD1|LUM>rM7DJPk_VYc;aW8K;e#B+PnR ztaYz7Eb>CNF4Mq*i{wrbOc|pzFPatCOJ=_32zE(3qH2eFvp1vSDr#)Qp%j9KhFzr} z&6v*Il{jA)G;?&)cF2~_LOd!gS>F=BQ#DXAahJaM1G15m7e>z53;QLCjg@CU(9}|_ zIh(}D|6##N8VAEn-;|=HJZ+sj-Mg%KFOYYrx$Hly+ix1dHT^?gLRoMB*59A~>Wjhu zH|u{s+Rr5~C#`HZkuT)$adzq?<)kSOqf2Wjz8dz-!Pp)1C}+-n zCOT+^eQ9@ViP8`+zl6%8wj8Ov{21!6b2eT>JDp9Vm@cziWLYwrufp2zpKl+W;NNZ# ztgnuZb?1vJH*-!umB*fY%#&$)t2Q}d$b{ZE@*uwB@&7 ztm)6&4eR>zcf5Zt@)wLhH$$;f0N*{Jr-tkk16^G5-Pi$Rv%%XZiob&;LHk%sp97&yXblAiWXmkhwW` zqCmBM|A77u)^W`C)GMwgAKb`pPA!vS8EaE#2nNY6&1UVmVfiNR*o*w3k>u_L>Ed(g zt0<~@f~woXx#2y>pYu5?o}@Fe-%#pJDRoH}yExbpfGyka$yn7fZJtQqH^_fu{{+=e z#`B|Bgm#Cj|Fpn(&HhcU+rPhM{louq{inhdOy0~~qFRnyQX8C@pv!9}D(|?-f7O4q zpdU?DEWf<@SU`8L8$~#JyxFf$vUP=PUa#4xWuUYmr%<(?<*vot+s!zOY0@Umed?NX z+X{7-V?3zbXO3#lpGz6DOr7|UPO`mcUpS*ZlM=(#1GR71#Kh|8>NLh4eeu@+TKz}X zL;eW;=k@nb*7nu;;rE|d?5vUA)wXm1qvR00Bcmkmp=b)tU6-d?)n`@s!p=`H6!N|e zdlv3ST#22ownkU<$rLiM^`4?li_QDVEn{WuI`zA^jGGKTQAysb|O5vJMSo7}oY z4#SIHrm|Gj_Ly8Zm; z*v~4A^Tm=wGprSQj(&bq4ymuJT^@!^sG?7WdS-956*Dc`S{^QsN4_tNPK<|ccu8{p zO6MIh!&WdqbjQDnX9Fn|bcKAxXNxW8_7Go@Ji5bS5 z&_zZi=wR!tR@-gS1NOFwP05jtKGywAJI?etmmV3xTR41o#d!4S;9R6+_u$M`md!a> zc>lQdjd}YG_b$^?1;t}wTl05rd`FRJ@gkalc=w0>?aw30EOlb97xP-ZxgFD+TXuh|HS@+@h27B2NnQK%{M*&Ck4A>^?Cfc z^V9CF$esK?2k*b&5JOZ};9KQ0g8a4pKX?6k`Jdz>vJv+!x!3{n*Pj0i{SET>fc$t^ zFN!$0Z|nOf{+RnGF0$36csRE&8D*ev3$>N7V#}&J3&b5CWrTUo;g^VZ>8GaNOklsr z-m#Bb=<>Fq=@HhArGhRIiZf62`pyZIrF!7B+#V$JIF-GZ~OPn(TenaxuQU80Lvq!t;-su+3&@@F~e4~dMM+X>~i8`MUeMj46 z_Ks^)pcnRa1&g4@xjey;qE*y|+;q;0qRWTr(f4COnO_vu0*T18dVUsh(=498Ht6q~fMl5h}d7`W**-lr`nJ4n!C7Yu3jt3j8UjW7%Ca^3<|eOkYTZ`o>~2ZBBb| zIu16ID%rGHie@JCH{E;EOp}spv_o$;ESiHk*?!0NsaLmomFZIUCnzg7SvsOiKh7-( zZC6s>74c|gdfxu`^y{Zq;`e{A>EDmC{$O4I{xSNu=seVvk?M_YJrpIeEaFf_lKa;1 zWut8t>D_Hc;(KjgM9QA&Gv>5lzYu;dG+|z2-wYG28-J(2q>`QeeFZb(aZypbo@HPC zFv4TUhC=I zPlrtl3utW_=C`N0gjQ>3nwnv|hZH+XL@`T5rfBJXNpGq7J=%btwtoGh$*}=kE*peAXfx$?m%ckFuntM!BG92-j zx$K66#;=l1qp|OXoB~o@CYN?(EXn)0!`bQkv5gy6uqa_fm7gdCZWo@Z$aW3)v%D?!i5+a zzi!QUXun!j7xCt*?D^EAS+Uxd(`F$H%kPary0yawUMf_Sku2?Uw@p!!&OE`# zGI!_3QjnU@nzj)JT@(sGMVWHPtAyhf{$|EhTdsqscMzW*Pq|=xN2D=7!m0z zGK!upE1qECo)1m(ki^D>q+|%c6~1C)F+?(&|01aHMWs;PaP6~mK|;y$n95#o;{uh*yHdPWMGQpSTm)VOv*dCYwSp+LVY5 zrto*GY-@jCypVhBIwnsvXqeY9TjaeaYr zY=^v%bJS^Z}+U}6JG>eGtb47~MO=4Gb)$lQcHv4^4H*a?4Wo~+y}1R=-bI4 zpEsCE-t}4u!>=rXUzp#T9{%ibflyAs$=mw2!Zv{%7mwW3#d%1*bC#zqMe1I9YV=C? z+=4-wYK&s#E(4?Ji52sI-=?j#U&wldAL02QC5qx7)qd^%8|I(XVgAYJ^ZcLi-yq)@ z+_Se_{ib)|co}y%8eJ}>z>)=)XeEyKv9-Ptp)CzDwY78dA7DImCTWuk z0ZsWhD^;!_vxnxq9ZN*USohVj^j#KwQ{md0i(BisHYn29$tcf_Jxdoj=$SRbd1o`xqTmKuN)b$Cgn5nXSvQ17b@3^2{Yj14{P()*3~3; zC%2QM#&HVdzC-r!P4B1LwPt^Df0*&Zf7kg5>+kP;_xn4`yE;6SJk2xe62`jK$9Icl z6*{?x5o*0GU`nZPQX1^1FtF$%Ng3f76Qo%+r5 z3pD$Vw4rdqUtz^ZJAA0>VkvaWpBwe6oC?>qEIQepH``mlqNm?e7e48erjMgkPLIj+ zkihV!>#d^HvPxThV;oO%oYJ~=IE`r+9y!4W6}vL}l}*Q%OjJjJ9XRmSwAfG=SaN!WvE;_q+yZxZ^p-Y(OhG~I4n`Nv!Ry!0!Ga8~0Tj=upNE`ds?oUU zp6)ZP8EF>}H{=9FUhri*k6Iba(8m;1O0Wj**Hf3|cW?s%6-{70`sT*W)#ieZGq zO!&rhCcbA0MN+X7<(2~{OMLsP6rR6f<_PIgc{W+vY;BWL5|fO=-C953*qn|scWJ~N zDTc8@Ph}r7_MVIH?EBV~My~D~UGa7crMkG>JpnSxS=e_NmK02rd$r!Sg28s|R7xC) zxyw+Qes1J89i9Vt$0>$yUDn~9aUOVjcc`DC2TfsVNDk$;e0`4Sedd-Id2JHaeJ7Mt z&kG4Da6YnFqM6r9_K;{>l5=*o9Bkt0Q4MJ!QQ@teOSiQ|GjSXrBt+3#Dh=Q)Jj0pM z8Pb}rN&H_zQJhhTI=k!m_DP&YnZ6~Hc7eya*uIqb{@3cSJ4J6S zk#X*S@}|)amz#a7YExcTq-5ahQsO0^HfiQ@FOK4pTB`$ckP1Qybub3 zGZ#@L!tq$t((4U%)iObD(HEA~9jtd(brjvJh*wHC>^B;p8JnBSf4xYuyJ%;51?+84 zAQJaYcam|YY(T5OMv#&*v1N%D!^|+MV9hgeXhyCin|s@SjBdl(5Zs-cb~fHRPkQ>> zZzjPvv=_hblB~5KQ_!FJG5YW8``7<;F5XY`Pv@X7cpkU_Tm&uwzJMR#4+H>#KoD>l zK-Lq5fFBB60m6WAAOg4wL;_JjG=PM?4*m_`CU6Ug0d51az#ZT&a1TJj#)F>#Bmzl5 zGLQn?2U3AFARWj6G65t`7Wmmf4v-7v0r@}y@DL~jihyFE1VG}Hf?o!d0~J6ePz6*2 zH9##;2RsJqfd&AH_XPYV;3?1yJOiEsEkG;K2DAemKqv45=mNR{Bz`aWFM&Rw9~b}z z0Sqt%yaI-S5nvQ}4IuHx!Jh!$0F%HJFb!aV8Q?AO4tNjD0&~CzU>;ZiJ_3ut60i)c zAV9i^`+?67g!6a&W~`S;G3f+VPAr>e2rkd2pJ@1?8rZYnoo?wGzhSqSp?q=CIj`AQ zY#aHG==*Hc#75V;$9UJxd69Q`vChX;xJ6D~cfQ|!D7`VUanp?cA#3Ue(u7y9cA_62 zq2p$|#j@*oW?d`^T0FG6jBtFelx#*JNSM1sCe2c(s*<6XL2EWQ=jGV$@=EhZxsK|5 zr|@dFd0+DF5Nnv%8YDf%8q9#7#OkwTH)u;{d7HH(J*i}-F2K0sRMhy?sFKA{z$z-& zb}LDCt-5C9K3Ar~#{`*6N9HftV#_Ki(VYy2cj4`V#4bzhShrEcTu{K&)L`x<@+L03 z%Z=hEi<5D;OX|dyO$tgyzOoySB`Gn9?-s~2xzlIZ=y|tyTdbq2NQo-n7)-D6yn5M_ zg+qcDsZYn&DZ6;!wcFD&Y&Z9NQkJ1=hRA4tVP;Ls{0Ld<)*8#yu9t_CTkDzJOOj8r z?M~*xxs4t**gY^+W|n5v-^EH=%B^3IA)}vn*L9Djp3iQXYd)HjThem!RzrIF@!YqQ zttTCCHV9n`GhyWjL@jEUXjFRV+T;zz62I=_dM-`0wC~Y##~^M;62{m(3yOtj%I6jP z(c|Z$dCCWUI3<11-4mG1OR*%5-o#x?{Oz;N7gkYptTiiS*rwZld~Qa;xv$?Bas@JO zJ$r@Ja!UjMiR+hn6a+A*Lga~6aVL!YN=35fBL~PxUCIszVo3KGwesib>t?iTpA2+~ z($pb-g1hkyA>QRtyxDt&tEjGt%I>6dr8pkK*uDbv96wqC`}BHJzrJhG_6SMstU3;x z{aOzigZ3x>^Ze7^zd?Q+$Y=aK|0wq7<$pSV9LWySp8mRj{I&l-0Qn-HBzh=L#{UG*>7`48C^q2kjAGrVaF=>T@^<&g3>TUlj3hNg5VHGv6 zxk9*#y1S z4dW-xHO3xZ0+`VyA_)fht8=|)vSWM)t8Q92j%N|voz zEdmY(Mux3JC4my=8XU_H#0-yLrs6!m>$(5?y3QhH2TZR5s8-EG%Wk?GB_uA55&w_GL&C1FU-t>tSs1}FRb!@itryfR4f)W^Cc-`GEUPG`qHrPsjxE->L=^Ni*b|Xh*)Z`TG1zLo z-op$Vm4rEWB43o@(sE(m!~9#8;w3i>o|q-%htZn{TEweeBa~n|$waOhrt6I_&4Om3 zoZ)S9OhVJTx#{(Cd)im;o}dyAmntLS`aq?4ACF+Tmzq+M{sh{9FY{ zqR6WUjb|hu-&Hj3DOCuU3#PVVJNq<_%V&3ehEosbG*#bG+ijtq1YMbTTQgoQs$4BQ z`S9vN(-5t|!I!#e*nH8^(}6F#Wz)(089e6_1_L--tyel-Y1-2pWFM*441TQ&PP z-+Wp~D^ROO(DfK+?c4@yIIZC%{G9&XlN*q8A_$OFe-+afbq3-fXFq)HyoYTNf$$fx zPNPg9H2N2(LI^+zqF;ovg_9%Dzmw)p2#M?xdCm@y!eE#KG z6+94>1PTB7%KsJK408PCsTPtD2(eFJ4`~GHnti%Mrf?p{uj3+lK>AewihCNa28r>t z`yvkkkzE+qLZ5_C_CKGV;Rq*in4u0rd}p{PR^tdprI%q%Fz`(mnf&&`4dP`D$oKxPp_v z36JCx={^5CbvL*Q8wma7m2g2YEk@zklKiqJPMl5nm6< z4<-Dy{E0&ZWVg+=SV*X|a2-EguLG3MX(*%9@Xgn*9@(RFE#}w4ASH?HW%=tc8jwpQ zr(e?(J*}14k%ZY!l%@~cBTzdbJ)I!h17uGw-tYv{4d82>!1Jk?!f;8q0nL0 literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/aro.gif b/javascript/mif-tree/Demos/assets/images/aro.gif new file mode 100755 index 0000000000000000000000000000000000000000..c75a097636cf27a780474810151fb4fccc75d235 GIT binary patch literal 338 zcmZ?wbhEHb%wZ5>IKsg2Ln+0DDaDB?(Sa%6ktyB@#7?$hieYBvWnmFuVc}dg*lNsh1q}&=Bd?77pE;CVE@6;-l1d5vC&{JOP^( zx*8TL2-pM{G{n`%r(V{J%uQ!v;my|Ms%p>YU}0v-(-PpQo}?Ag%8|}pHCu<9m6@Ht zLw#=5(tJMlp4ANNw8GdX@alwBZ`0voW8qt--o>zAPhi#2<65DNrAtCMs~Pyy8K>u5 w%Qrlr<}4tv|F-ho`}cgg9;$`CaDNl?TGj3Cr_W!$e*6C8=da&?^b{Ga0g$p`xc~qF literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/arrow_gadjets.gif b/javascript/mif-tree/Demos/assets/images/arrow_gadjets.gif new file mode 100755 index 0000000000000000000000000000000000000000..2f57caeb8e3290a9c0cd505be60058350d9a574e GIT binary patch literal 105 zcmZ?wbhEHbG-D8AXkcIn2?_cC|G(l-7DfgJMg|=QAOOiQFgf(}uRQ&hfAO3xx4Jho z&opOfQ#1*Cpge7b#m4woYc*f)TV-?m`=raZ{GYdGSt%K)nY^tKd2)1Rr`Pf;tG;%f JRpMf>1^{J`DWL!W literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/bin_close_icon.gif b/javascript/mif-tree/Demos/assets/images/bin_close_icon.gif new file mode 100755 index 0000000000000000000000000000000000000000..9aab3130ece02da7ec4f7b168e0fb7e5590453b0 GIT binary patch literal 966 zcmV;%13COhNk%w1VGsZi0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui01yBW000Q90RIUbNU)&6d(UvuvUN+Bt!DQO?ke_d)F@Q2o)yz& z&=t3DqrQE+^^IFAgQ48DGZ!wLxpwYC8BAo#8M=D)&^a?j$e<%xl?3h4GpG@%K{LUL z)b`DoDO-LFHahq1*tcoWB-P3@ld9Ee(;CsDW6)5!s#m8WiuJ~zAf;cU5qh=8ARb_6 owP7{%$%{cuq>7a*N6woqMw<-&^K(WH95!gO6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui01yBW000Q(0RIX6m+W6Uf#krw8;Ee&wPdkE!CHncUNl+U29gW* z&fUCmxsK86r;gX3g0gyv<5q56JX@)l*@KsERil5n%>9Datz1W2%-rSc=Iv&-ZRl=Q z)AlZ%p?2@0no9KVRjqQ{VwS6i=hrS_x{MJLSZm%kZD`~CYNpJXEn9vBnmUzk965My zq+weIty8T$0+;pChV6_kNz$%0n|6s79fpDg87lYf*tcoZ5XE}KP@o`il`lsl^lDA# ue|UgV);0~Ap-)~;V6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui01yBW000Q^0RIUbIFKB;cLWpu^H$3gx_HrKaZ~t@Ss`86==D>_ z>rXO;l!$#>ht3|nbgLREH1!UixpwaIb@Qh3pFeu*(!pBx?p?c{?@T2UC@)#8RH1Sm z^Yv?&FkQw7{o6O}n!9=9Y^7q>OqnrTw*34f7wlcRb@AM3#kLGur&@Xb^%BPoTeouW z(iyteY}zGSbpFXQ_X}DzZRP6WG1fOytT+E~Z9{i!tG0S^el3f}=+&Bk*=o@%w@sTi zcy690gZ3zw8G)~A%}Y0qoGnS^$a$j%O3px2r?g?4c18{yHfYe)nMZJ0A4H9YQT!JW F06Q_w{|5j7 literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/blank.gif b/javascript/mif-tree/Demos/assets/images/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..75b945d2553848b8b6f41fe5e24599c0687b8472 GIT binary patch literal 49 zcmZ?wbhEHbWMp7unE0RJ|Ns9C3=9Vj8~~DvKUo+V7?>DzfNY>Fh|Ltj$Y2csQN9XW literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/book_icon.gif b/javascript/mif-tree/Demos/assets/images/book_icon.gif new file mode 100755 index 0000000000000000000000000000000000000000..4b484a0670ecf55467eba0e49206faa99131a382 GIT binary patch literal 1049 zcmZ?wbhEHb6krfw_|Cxa^!e+ZM{iua^UO4|&n&9nJi6Z^W`bqxM60+-*71{U5+>Uw zOtDJ@qRIA2Qyr40Ii^f=NSfl9JjFS6x>L$jm$VtK=`&r^XSk$Jb55D;mNC;KYqopl zEYIvYo>{ZKvgdf`%=O8g>zy;lD|^<(8;>qre|Y`gi)(kEn@06n#7@S>oymao#^7*H$7M?AbxV2*X?uzNV zf;;y`_ZSH9?zb4B5UsP z=+;%a^G@W>Kan^8WZr_43Ek@p7o93ya;9YQ>5?UR5BS zW9{ko)h8xwz0$Yg+_W9nCT+PeZTqF!yRRxCze-h7#||{~3laQ2fcl$iT3TK?meTP@Z7m_{NZX zlgp5~rH4<>tl&a{BC|jvbGpgThl|_$WL)xEG7d65;!$VxnIn*}grif4A&aw7qe*14 ztWCv(4UUW5*g3RW>oQzVPhAK=1NIy(zXnpZ@wJhq@} zt7q^+PlLW94pHq(%KmM;esGFBI~vG4EkW1H<;8h9n=+}L7Fi30mOD26da;sOoll9! zT{~bAbI19)mU)-fY;=0~g2glc)0NE4$9QJyhN#H2KG5irG0QjwbYQAi%VPcmJb}e+ xKGU@Q`&1$YSr#$7#S2wF401gsr0OBHqTxhBV-pJp-x7m>28J$10cIu!YXFL(su=(P literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/checkboxes.gif b/javascript/mif-tree/Demos/assets/images/checkboxes.gif new file mode 100755 index 0000000000000000000000000000000000000000..490a314c587057117d4cd7904f1e7098b3fa00d3 GIT binary patch literal 1019 zcmZ?wbhEHbtYZ*jc*Xz%|NsB5t8b7AY*1XN_~_BySFfHufByLC(}#~A-+%x9&6_tb zzkmPw?c0~HUq65T{PE+*_kaHU{`KqU&!0bj{P_O;`?oJ&KL5SZ`S)hezx#9kJzn|m z$(n!9xBh>*>;J30|6cC-_vXm|x5xf}IR9gt+0UJJKX*I-+~f9hug9+ge!mWd{5l%- z>uB`v6Uo0$r2jsZ_4`cr?=uB|E|mN}SN`Wx)$a>ce=gVjzEJ)9Qp4YCEq|`H|GqKl z@9n97?@a%5d*W3$1JEyh2$ zTmAd@@9*Eg2M!zndK2v3!9^(kWMO1r@MF*cISUjg4DA0K{F<6uTHD$?I=i}idi(k( zOq?`%%G7C1%rj@rp4B>M{>*s`<}6w~w`JMvr7Kr2o5#9=lY^a&n@fP7c^>1Qz58~~ zQ&N`n9zS{dfgiK)tJiOQpWnQ_ zdFyt5zW4inFn*hN`0)uRmzoO|*Y$60$+G$F!7Pn;bdN0#2BepZ!-daa_n4X&|a4>J*xp^iM zj<3R-`o!KFJW!~4;L>@T?O2zrx44Pc#bi|jv))_5w@cq=Dayvp?o6*aX8TveXpTv% znA$zhX7#@r_HYUxzH)Da>a$m3{|&v1rJp1+hgp^r}@!!Dyvt|2R_p^sXzLfdQE>U zP#6B!BGx9=_x-l@j)Ez2`U2lRo#WQKaDiE1`B`%(A>&OBlM}C|o>;7|tEKv=W5tCG z<%qruoRK#J-d{;hspmVi!#g-^(WA#)1}82&>GRn0cyai;hwN!n^yE5K%%aPFrV1sl x%81lne1WrT?)(RyTv{tz4yDhpT2*v%L5o<{i-jF(t6nVXF?+Q_p^<^X8URkN-)8^- literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/checked.gif b/javascript/mif-tree/Demos/assets/images/checked.gif new file mode 100755 index 0000000000000000000000000000000000000000..bd048912e44ab8220edc24b2cb4d3329a372e660 GIT binary patch literal 206 zcmZ?wbhEHbb1_Kd5@h1x-1A{Pw4oEG?P6k$Q1%*Bp z%{gw4JSR44D6QJGZqkvLxAYu8by!O2e<UBO<*xs)_Wpah=ii$n|KA?_|Ka?PZDv3BxcxdB_3LQ#?-R+tPNe@nmG%2f z_U|(Vzt5Hbxm5N00uWXIzSQvNTKn%Clm6bG`uEQCKeuQ8y|?J!gT;RztoZwI_20*9 z{ytv!_u008FZcg@efZy-<3BbV{McgrbGz05|Nj|?0E$0Z7#SFh8FWBuL4IOj%W`Na z@KEtm>UCu*l$huwsTg!pW@Ut0|AmhNJUq=ziW`_Xua+lM4ZCPvY17ToMaV~O0wCEgq@@$-F3D{m<;f z@rygGkMd0Jd&8K0C6&We&Ytbv#9*~YGQQpmIpgE3lIOR^7nVP)pOVn&eW?4vYLh9` z^HywHs`cfXP)=dbe~~@nZV?H8&dO|=vQ8qYIsN`pzdekX6=kab+Ag~WbPfk^QGaDY;-lisO)J-)tv~et(EmmM4jj-r1I3J$dm!`K>kK4UEfv9274*>bf@Rknp=g@eebCHI6G+6~0># z+RDaxLw)bRcn#JGtZ$M!$|Pft%IA4a-n=5(QNqE%_0&dGupOSoD~zVD09=36*E5cMCQZ(pR7wa$^QMfOy)Gu3k;sFelF{r G5}E*SZfRTq literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/disclosureRightPressed.png b/javascript/mif-tree/Demos/assets/images/disclosureRightPressed.png new file mode 100755 index 0000000000000000000000000000000000000000..41c9b20a725a5234415e2185c73ef1f64a4a2b65 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@)1s;*b3=G`DAk4@xYmNj^aJHw5 zV~EDYrI!r(7#$^!e!So2W>U4+t+VTp?wo@wU6wx((BfO**5RfsXri)urmtGc^bfPX ze@gu~^Sf`G{ncOJ5;RXamux(^lS9jWr{tbK)nz;Cc4Z3e>0Oa|dA7r3{IueUzxwP?>#j@LO8*q2%)HdThL=CEp$GPYbV?yP;s@R;55gR}Sj d6SRNHXA)jmQU~$dc{RCEH^Pc0?BK zj4s|4Q@Ag_Y)yK_x{UHY2^CvX>NjQ8>`JNKlUBPgy>f3}?ar*)o!Rv}a|;e8R~}5M zI+k5?IJ@p(X5I1prmcC+Tl3ns7k2C@@7Z0}wX?EwUq$b}>dE`-8_$%sovdm*S<`y9 zvg=S~|DoE>6ZKu^Yp3pS>N(xmcc!K9QuCyv4O0&^O+Vf`{Y>lRvmG-|x6L@yKI2T+ z?1R&1ADl7ea@VxWol~!LO}o-P{c88ji`{c?Oj>eo%Chs*mR*>(;O5i?H>WMVJ$u!a zxvQ_tS$1N<@{-~Tgx`xUa|S^%B{CoY`?W?%iUF5@2}Z*cg>Eg z>v!B;zx&SmUDr15xw>=vgZ29!ZQJ`~+mSmvj^5pQ^4^hC_l_QYap3f`!)G2GJNw}H zxtAxeygq;Z-KCo^FW&ihj$;hsoH8C8796zp$T+b>@c4oQ4ptl9{CxcUY?nYS7uzPr^nkf~ zF-KnfWK`sLl+9v^jSOlzC8As$;v$iu&bdH0ut_86$zxX@GwwqiGMCbLCdz4)g$X=7 zcxoaWQ~HIKhmx0vy2>O}Xevx#ky5l?_wGr-qtgtHrgJ}!+;FF#5#6#i2*%nh> zyAFx!#AZoGf3_x%!Zyuz9to2P8w(l~c~334oIij5|Ns9CqhK@yhFS=VTXXjp>_!!i-ZjhjBP9&d=d&P1P-@w z2*?REbZj`-z{teJvFE@96*ex`7^N1;;s=LXIk{il(fr(WZkkH%E}e=3)qp;}RJS=1 ZACr#t%8J+VSOzWgoT4>ViN zU%dGJ;lrOVU;h61@&EsShEXsY0)sdN6o0Y+UH6|s2joUjo?zgZ#9+@MbEA=|m5*7N zuP1?_;V=Wcmd2kAjEoFSyb3l63JeWQEzG)l4<-aOJF{^!n#_11;LyO$#4EyJxnXG= zBd1*n!vlvz??xWBngt9APKV|*$upc#SeW74&N(&d!GU0fOO1}n=k{oQNISc~334!T+I5ReJa7x*DTyS#YWmWQ8@*yChwS&o6 zrsT(mM-FYgx*h@@4;QobG08Hm@c7Wg%*HKZQ}Uv~iG_ooBg3QNK|^B;FB^}5K!V!o j#pc~334eSRT}sa)VS__s8w&@Y zgu;q|!z~;Fasmw<8xA%wGBG*Ccx+O2Y*vXZDtTe_=t!5iao(F9ACgZ@)bm{w(wUgh k*e9SZBf7&RvvH|ppWc*{Usi^4=^EOswG7BU)WBd303hyMjsO4v literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/dropzone.gif b/javascript/mif-tree/Demos/assets/images/dropzone.gif new file mode 100755 index 0000000000000000000000000000000000000000..97dbb18d0fdb47431824dbc36b6aa6d434862773 GIT binary patch literal 1415 zcmdVZ|2xwO0KoB&FYCs0*?cLv);*is718Ob6s5b&HWWRSF<)}hM82h3vD$pwW^9I& zZOkxhBxELI#B8x}CYOBKhKyF}yY+MzclC5n_g~!WKY0J}_7B8*d7lmepuk53aKd-* z#Kgp>4XPU%y*aL0>-tL0pF<`a1_lOHmX>M9DZOzPNWv$O zYjjp8fv2GpyQ5``tqpV41*2C-9}kfSQ}jtm%zLDqj^vOkUy_QD+8mXwI;Sz*=S{P? zQ!MVIqQ(*7SrNWk#Vfr>A@!#hkLAGwgw?l{N&xusAK?EFv2JMw01CkUYs%Lr0Pq)p zVg(Cm7fNEmwr}-xc>N#)3@U^o01<{}Mm!ZZvKsH}!V?*#?{64>V(fsV25D6m5}s4I z5?>U`!&Z3VqF^J-=#p*0cH8)SjE{~mAkKLFZlR;4IcU3Ag(;86wsqMb;-VTut7CT{ z^spAU`-9?R)jzYDA#j#E>+gA2&u3PfaWV%hAJU`}v|;1U)K)%|=4a#K+By_xUvJGO zUt0&cZxJc&FN2*($biidB*uueT?sJ<0BgHAvNmrPTOn2oHEFG_op+qCC!s-3(n|B+EF^*p7MDIPVYyi6)e}^|HAJVG2M*rg zaB{O}#9R(!z2hjtci%;!U2Kqf9meVD%rR@b6Cca{9Aj;DggkE$CoD0oX{IDCR5a`^ zNR?WmY`k_Cx)kibXTUglqfrzvuCgo}@`fA5kS*aO3oj9u1Ks$vT;ujsFFVFAw~L+I zG9eiM#bU;(S$I}&O;GOUL{#y@2fT+xP5cJ8Zrai} z_GEJCOA+NW=Lse(lFkW_A%Se0gA+2JQxi-_p}VT)+p)+DhcJF^zvoN4pgl_!?gz5mc*4SS5}_;-?RGW|LfV| z5gmKy8UBA)USKzI*S&>N}6`Uc12Y e=Iy)t&D@_pfBAIOk^Sed-#^>_wKXy@SOWlaB+1GE literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/gadjets-hover.gif b/javascript/mif-tree/Demos/assets/images/gadjets-hover.gif new file mode 100755 index 0000000000000000000000000000000000000000..deac1827ea39352d6d6d2de6bfbc078c11d4e394 GIT binary patch literal 138 zcmZ?wbhEHbG-D8An8?8J|Nnmm7^(P^g^_`Qi9rV_!T^$IV2Ym7zw-23{>5{)-0I$Z zZejKPnk0=TABH7b0xhd=&C8e4e-Wc?&b@ob|5K`EE(w8ZNjoPwv2=09nDQT)*ORvO l?38dh-C0+2m$%Io`C~iPYDwwtEuE*If7$i-o(2PhH2`eMI4l4F literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/gadjets.gif b/javascript/mif-tree/Demos/assets/images/gadjets.gif new file mode 100755 index 0000000000000000000000000000000000000000..72a6f40a9c128bf3e7589fdbffe282e18d7216ef GIT binary patch literal 227 zcmV<90382ENk%w1VQc^r0FeLy|NsAhfPer10RR90A^8LW00093EC2ui0Bisf0008C zoR6u??GK}zwAzca-n{z{hT=$4!HJ?x%C4-+2=Y8P^ljfY69E1X2&{lVA&=-YE(Az` zz}9@mqC=!o(ep8rRpK?VB}$jS@K_NBo)cMbH~dAk;ZWonVJ_F5`r|D)^cQ!~BM9|( zcff>rNaNH6G-xna^j0}#w`Zo=x6l@8$#rD4r^cyO+KJU9Iq-Su$(o9aDK`7a^K#;% d%lnd}lV}hu1FTbmoUFXe-0b`e9eq&%06T6xYij@i literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/horizontal-line.gif b/javascript/mif-tree/Demos/assets/images/horizontal-line.gif new file mode 100755 index 0000000000000000000000000000000000000000..731935d4d35a29e64d61783dc1a768a3f80f90a7 GIT binary patch literal 55 zcmZ?wbhEHb5whpEMWZ2LIia%Kx85kTHbU@Ar z#R&tuMuTHhvm;|mdq-zids}y3e@pL#$z7ACOmChxWBRPwljqLsU$C%y@sdUcYXGYn BR$%}D literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/mootree_loader.gif b/javascript/mif-tree/Demos/assets/images/mootree_loader.gif new file mode 100755 index 0000000000000000000000000000000000000000..e9549528651ddb032ca12b9f41efe211076075c1 GIT binary patch literal 584 zcmZ?wbhEHb6k-r!Sj51vZr!?R)26+6@nYY;eHSiV=;`UHsj2z@|G(mYZa>$MU}whw zS0g?t=(@5iwrKK(ia#DmhBGrT zGVm}601bDo&~p3rK}6Uknj)U0lD@&bqQP50mhFYOwi7#!n{P~=24 zmly0}TTpPMvm_r1aFhvLVSaQ;DeFQ3Syi3{888Q|VH9L&Q;3qs1wP^=RpF)xsvm zIl>=f+CO_N`YT{0*1~h&ar0{q2DWR73mii=R32zFY)VNp@Omt`Pz5Pyk&WGzES7xI z_=Ms)QN@j~TLX0*(-?v!WSgEBaEp1o-=HU-=d*2sw(99a(-jX$DRUk$32xzXat&1C P@Z~g*J2@c~Xsk5=(#ONH literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/openicon.gif b/javascript/mif-tree/Demos/assets/images/openicon.gif new file mode 100755 index 0000000000000000000000000000000000000000..54e0016cb465cf4184a414c1b5c86fa5bacc61db GIT binary patch literal 97 zcmZ?wbhEHb6k_0En8?7OlhZZ-^6UR#p!k!8k%57kL5BedK=KSsMspeyPV+D}XT5cu w5wuq(e@^QO!N|ELksSgX^u#6vdGEjUN#U#Aq-(#c9+ar}JF7&AFfdpH0F;^}8UO$Q literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/twistyGadjets.gif b/javascript/mif-tree/Demos/assets/images/twistyGadjets.gif new file mode 100755 index 0000000000000000000000000000000000000000..e32470a02b30c2f2ea7ea28e9430550e0c6425ef GIT binary patch literal 367 zcmZ?wbhEHbRACTexXQp#F=Ok7Lzmyaeg5_9$4{T$efaR^`}Z$@|Nj2-=hye|U%!3( z^5@U*S1%ub{P6nC>t|0M-u(XU^QANUuU|TT?c%XJH_qR`ed+Ooo5%L8yL9Hj?Q3Ul zTt0bl$MOT)mmS`<>imh_Paobov}48p|Nj{n7$78&L0zEulZBCiL771ZWGu)}3~W6I zCKh<;NcEpsQgkxMYW{^4TO=7G);Bn8>e`w$v0*}m43o;?l#P;mEOv-*vp(KmPgi``53ZKY#xC{{7qk|NsB}`}gVPs(7V$cBzgUn!HQ4~1g`EsWP_srj%bJ`^rR){S1SaR<`*~!_8MPbR`L*E9o HFjxZsvph0z literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/images/unchecked_selected.gif b/javascript/mif-tree/Demos/assets/images/unchecked_selected.gif new file mode 100755 index 0000000000000000000000000000000000000000..4340003f19903a9e0481b97623586fb96b35e25e GIT binary patch literal 201 zcmZ?wbhEHbLy#l6q6~z(gsu|9V14*kRdZ#Uxc`?$#Aw kLsVSWr5{qNveo6dxK`q>lGdW*`I)TY8cTm@urOEy0NKG)?*IS* literal 0 HcmV?d00001 diff --git a/javascript/mif-tree/Demos/assets/scripts/Builder.js b/javascript/mif-tree/Demos/assets/scripts/Builder.js new file mode 100755 index 0000000..90a694c --- /dev/null +++ b/javascript/mif-tree/Demos/assets/scripts/Builder.js @@ -0,0 +1,96 @@ +/* +Script: Builder.js + Automatically includes MooTools files right from the project folder. + +License: + MIT-style license. + +Note: + If you use this script in your own page, you must be out of your mind. +*/ + +var Builder = { + + root: '../', + + paths: { + source: 'Source', + docs: 'Source' + }, + + included: { + source: {}, + docs: {} + }, + + scripts: { + source: { + 'Core' : ['Mif.Tree', 'Mif.Tree.Node', 'Mif.Tree.Hover', 'Mif.Tree.Selection', 'Mif.Tree.Load', 'Mif.Tree.Draw'], + 'More' : ['Mif.Tree.KeyNav', 'Mif.Tree.Sort', 'Mif.Tree.Transform', 'Mif.Tree.Drag', 'Mif.Tree.Drag.Element', 'Mif.Tree.Checkbox', 'Mif.Tree.Rename', 'Mif.Tree.CookieStorage'] + }, + + docs: { + 'Core' : ['Mif.Tree', 'Mif.Tree.Node', 'Mif.Tree.Hover', 'Mif.Tree.Selection', 'Mif.Tree.Load', 'Mif.Tree.Draw'], + 'More' : ['Mif.Tree.KeyNav', 'Mif.Tree.Sort', 'Mif.Tree.Transform', 'Mif.Tree.Drag', 'Mif.Tree.Checkbox', 'Mif.Tree.Rename', 'Mif.Tree.CookieStorage'] + } + }, + + initialize: function(root){ + if (root) this.root = root; + this.includeType('source'); + return this; + }, + + getFolder: function(type, file){ + var scripts = this.scripts[type]; + for (var folder in scripts){ + for (var i = 0; i < scripts[folder].length; i++){ + var script = scripts[folder][i]; + if (script == file) return folder; + } + } + return false; + }, + + getRequest: function(){ + var pairs = window.location.search.substring(1).split('&'); + var obj = {}; + for (var i = 0, l = pairs.length; i < l; i++){ + var pair = pairs[i].split('='); + obj[pair[0]] = pair[1]; + } + return obj; + }, + + includeFile: function(type, folder, file){ + folder = folder || this.getFolder(type, file); + if (!folder) return false; + this.included[type][folder] = this.included[type][folder] || []; + var files = this.included[type][folder]; + for (var i = 0; i < files.length; i++){ + if (files[i] == file) return false; + } + this.included[type][folder].push(file); + return document.writeln('\t'); + }, + + includeFolder: function(type, folder){ + var scripts = this.scripts[type][folder]; + for (var i = 0, l = scripts.length; i < l; i++) this.includeFile(type, folder, scripts[i]); + }, + + includeType: function(type){ + for (var folder in this.scripts[type]) this.includeFolder(type, folder); + }, + + includeRequest: function(type){ + var req = this.getRequest(); + if (!req.files && !req.folders) return false; + var files = (req.files) ? req.files.split('+') : []; + var folders = (req.folders) ? req.folders.split('+') : []; + for (var j = 0; j < files.length; j++) this.includeFile(type, null, files[j]); + for (var i = 0; i < folders.length; i++) this.includeFolder(type, folders[i]); + return true; + } + +}; \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/scripts/demos.js b/javascript/mif-tree/Demos/assets/scripts/demos.js new file mode 100755 index 0000000..88ffb3f --- /dev/null +++ b/javascript/mif-tree/Demos/assets/scripts/demos.js @@ -0,0 +1,154 @@ +Request.implement({ + + processScripts: function(text){ + if (this.options.evalResponse && (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text); + return text.stripScripts(this.options.evalScripts); + } + +}); + +var Demos = { + + start: function() { + if (location.protocol == 'file:') Demos.local(); + Demos.getList(); + var hash=document.location.hash; + if(hash){ + var demo=hash.replace('#',''); + this.demo=demo; + Demos.load(demo) + } + }, + + categories: function(json) { + var menu = $('menu-wrapper'), list = new Hash(json); + list.getKeys().each(function(group) { + var demos = new Hash(list[group]); + + var category = new Element('h2', {'text': group}).inject(menu); + var ul = new Element('ul', {'class': 'folder'}).inject(category, 'after'); + + demos.each(function(value, key) { + new Element('li').adopt(new Element('h3').adopt(new Element('a', { + 'href': '#', + 'text': value.title, + 'events': { + 'click': function(e) { + e.preventDefault(); + document.location.hash=key; + Demos.load(key); + } + } + }))).inject(ul); + }); + }); + }, + + load: function(folder) { + window.demo_path = folder + '/'; + var wrapper = $('demos-wrapper'); + var demo = new Request.HTML({ + url: folder + '/index.html', + onSuccess: function(tree) { + wrapper.empty().adopt(Demos.parse(tree, folder)); + var assets = $(document.head).getElements('#demo-css, #demo-js'); + if (assets) assets.dispose(); + new Element('link', {'id': 'demo-css', 'type': 'text/css', 'rel': 'stylesheet', 'href': folder + '/demo.css'}).inject(document.head); + new Element('script', {'id': 'demo-js', 'type': 'text/javascript', 'src': folder + '/demo.js'}).inject(document.head); + Demos.setInformer(folder); + } + }).GET(); + }, + + parse: function(tree, folder) { + var temp = new Element('div').adopt(tree), dir = folder; + var fixes = temp.getElements('a[href!="#"], img'); + + fixes.each(function(fix) { + var type = (fix.get('src')) ? 'src' : 'href'; + + if (Browser.Engine.trident && type == 'src') { + var split = window.location.pathname.split('/').slice(0, -1).join('/') + '/'; + dir = fix.get(type).replace(split, split + folder + '/'); + fix.set(type, dir); + } + else fix.set(type, dir + '/' + fix.get(type)); + }); + + return temp; + }, + + getList: function() { + var request = new Request.JSON({url: 'demos.json', onComplete: Demos.categories}).GET(); + }, + + local: function() { + Browser.Request = function(){ + return $try(function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }, function(){ + return new XMLHttpRequest(); + }); + }; + Request.implement({ + isSuccess: function() { + return (!this.status || (this.status >= 200) && (this.status < 300)); + } + }); + }, + + setInformer: function(folder){ + + var info=new Element('div', {'class': 'info'}).injectTop($('demos-wrapper')); + + var informer={}; + ['html', 'js', 'css'].each( function(type){ + informer[type]=new Element('pre', {'class': 'informer '+type,styles:{display:'none'}}).injectAfter(info); + }); + + new Request({ + url: folder+'/index.html', + onComplete: function(text){ + var body=''; + text.replace(/]*>([\s\S]*?)<\/body>/gi, function(){ + body += arguments[1] + '\n'; + return ''; + }); + informer.html.innerHTML=body.replace(//g,'>'); + + } + }).get(); + new Request({ + url: folder+'/demo.css', + onComplete: function(text){ + informer.css.innerHTML=text; + } + }).get(); + + new Request({ + url: folder+'/demo.js', + onComplete: function(text){ + informer.js.innerHTML=text.replace(//g,'>'); + } + }).get(); + ['html', 'js', 'css'].each( function(type){ + new Element('a', {href: '#'+type, text: type}).addEvent('click', function(event){ + event.preventDefault(); + for(var item in informer){ + if(item!=type){ + informer[item].style.display='none'; + }else{ + if(informer[type].style.display=='none'){ + informer[type].style.display='block'; + }else{ + informer[type].style.display='none'; + } + } + + }; + }).injectInside(info); + }); + } +}; + +window.addEvent('load', Demos.start); \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/scripts/docs.js b/javascript/mif-tree/Demos/assets/scripts/docs.js new file mode 100755 index 0000000..db7594b --- /dev/null +++ b/javascript/mif-tree/Demos/assets/scripts/docs.js @@ -0,0 +1,151 @@ +var Docs = { + + anchorsPath: '../Docs/index.html', + scriptsJson: '../scripts.json', + + start: function(){ + if (location.protocol == 'file:') Docs.local(); + Docs.loadScripts(); + }, + + loadScripts: function(){ + Docs.Scripts = new Hash(); + new Request({ link: 'cancel', onSuccess: function(json){ + var scripts = JSON.decode(json); + $each(scripts, function(files, dir) { + Docs.Scripts.set(dir, $H(files).getKeys()); + }); + Docs.process(); + } + }).get(Docs.scriptsJson); + }, + + process: function(){ + var menu = $('menu-wrapper'), elements = [], files; + var request = new Request({ link: 'cancel', onSuccess: Docs.update }); + // selectors buggy, hack varible current + var current; + //// + Docs.Scripts.each(function(scripts, folder){ + var head = new Element('h2', { 'text': folder }); + var list = new Element('ul', { 'class': 'folder' }); + + list.adopt(scripts.map(function(script){ + var file = new Element('h3').adopt(new Element('a', { + 'text': script, + 'href': '#' + folder + '/' + script, + 'events': { + 'click': function(){ + $('docs-wrapper').empty().set('html', '

Loading...

'); + files.removeClass('selected'); + file.addClass('selected'); + request.get(this.get('href').split('#')[1] + '.md'); + } + } + })); + ///// + if(('#' + folder + '/' + script) == window.location.hash){ + current=file.getFirst(); + } + ///// + return new Element('li').adopt(file); + })); + + elements.push(head); + elements.push(list); + }); + files = menu.adopt(elements).getElements('h3'); + //// + (current || document.getElement('#menu a[href=' + window.location.hash + ']') || document.getElement('#menu a')).fireEvent('click'); + }, + + local: function() { + Request.implement({ + getXHR: function(){ + return (window.ActiveXObject) ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest(); + }, + isSuccess: function() { + return (!this.status || (this.status >= 200) && (this.status < 300)); + } + }); + }, + + update: function(markdown){ + var wrapper = $('docs-wrapper'), submenu = $('submenu'); + if (!submenu) submenu = new Element('div').set('id', 'submenu'); + + var parse = Docs.parse(markdown); + wrapper.set('html', parse.innerHTML); + document.getElement('#menu-wrapper h3.selected').getParent().grab(submenu.empty()); + + var methods = Docs.methods(parse, submenu); + Docs.scroll(); + }, + + parse: function(markdown){ + var html = ShowDown(markdown); + var temp = new Element('div').set('html', html); + var anchor = (/\{#(.*)\}/); + + temp.getElements('h1, h2, h3, h4, h5, h6').each(function(h){ + var matches = h.innerHTML.match(anchor); + if (matches) h.set('id', matches[1]); + h.innerHTML = h.innerHTML.replace(anchor, ''); + }); + + var heading = temp.getElement('h1'); + if (heading) heading.set('class', 'first'); + return temp; + }, + + methods: function(parse, wrapper) { + var headers = parse.getElements('h1'); + var anchors = parse.getElements('h2[id]'); + + headers.each(function(header, i) { + var group = new Element('ul').inject(wrapper); + var head = header.get('text').split(':'); + head = (head.length == 1) ? head[0] : head[1]; + var section = header.id.split(':')[0]; + + var lnk = '' + head + ''; + new Element('li').set('html', lnk).inject(group); + var subgroup = new Element('ul', {'class': 'subgroup'}).inject(group); + + anchors.each(function(anchor) { + var sep = anchor.id.match(':'); + var subSection = anchor.id.split(':')[0]; + if (section == subSection || (!i && !sep)) { + var method = anchor.get('text').replace(section, ''); + lnk = '' + method + ''; + new Element('li').set('html', lnk).inject(subgroup); + } + }); + }); + }, + + scroll: function() { + if (!Docs.scrolling) Docs.scrolling = new Fx.Scroll('docs', {'offset': {x: 0, y: -4}}); + + $$('#submenu a').each(function(anchor) { + anchor.addEvent('click', function(e) { + e.stop(); + var lnk = $(anchor.href.split('#')[1]); + Docs.scrolling.toElement(lnk); + }); + }); + } + +}; + + + + + + + +var ShowDown = function(text){ + return new Showdown.converter().makeHtml(text); +}; + +window.addEvent('domready', Docs.start); \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/scripts/mootools-1.2.1.js b/javascript/mif-tree/Demos/assets/scripts/mootools-1.2.1.js new file mode 100755 index 0000000..e781c8b --- /dev/null +++ b/javascript/mif-tree/Demos/assets/scripts/mootools-1.2.1.js @@ -0,0 +1,5438 @@ +/* +Script: Core.js + MooTools - My Object Oriented JavaScript Tools. + +License: + MIT-style license. + +Copyright: + Copyright (c) 2006-2008 [Valerio Proietti](http://mad4milk.net/). + +Code & Documentation: + [The MooTools production team](http://mootools.net/developers/). + +Inspiration: + - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php) + - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) +*/ + +var MooTools = { + 'version': '1.2.1', + 'build': '0d4845aab3d9a4fdee2f0d4a6dd59210e4b697cf' +}; + +var Native = function(options){ + options = options || {}; + var name = options.name; + var legacy = options.legacy; + var protect = options.protect; + var methods = options.implement; + var generics = options.generics; + var initialize = options.initialize; + var afterImplement = options.afterImplement || function(){}; + var object = initialize || legacy; + generics = generics !== false; + + object.constructor = Native; + object.$family = {name: 'native'}; + if (legacy && initialize) object.prototype = legacy.prototype; + object.prototype.constructor = object; + + if (name){ + var family = name.toLowerCase(); + object.prototype.$family = {name: family}; + Native.typize(object, family); + } + + var add = function(obj, name, method, force){ + if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method; + if (generics) Native.genericize(obj, name, protect); + afterImplement.call(obj, name, method); + return obj; + }; + + object.alias = function(a1, a2, a3){ + if (typeof a1 == 'string'){ + if ((a1 = this.prototype[a1])) return add(this, a2, a1, a3); + } + for (var a in a1) this.alias(a, a1[a], a2); + return this; + }; + + object.implement = function(a1, a2, a3){ + if (typeof a1 == 'string') return add(this, a1, a2, a3); + for (var p in a1) add(this, p, a1[p], a2); + return this; + }; + + if (methods) object.implement(methods); + + return object; +}; + +Native.genericize = function(object, property, check){ + if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){ + var args = Array.prototype.slice.call(arguments); + return object.prototype[property].apply(args.shift(), args); + }; +}; + +Native.implement = function(objects, properties){ + for (var i = 0, l = objects.length; i < l; i++) objects[i].implement(properties); +}; + +Native.typize = function(object, family){ + if (!object.type) object.type = function(item){ + return ($type(item) === family); + }; +}; + +(function(){ + var natives = {'Array': Array, 'Date': Date, 'Function': Function, 'Number': Number, 'RegExp': RegExp, 'String': String}; + for (var n in natives) new Native({name: n, initialize: natives[n], protect: true}); + + var types = {'boolean': Boolean, 'native': Native, 'object': Object}; + for (var t in types) Native.typize(types[t], t); + + var generics = { + 'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"], + 'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"] + }; + for (var g in generics){ + for (var i = generics[g].length; i--;) Native.genericize(window[g], generics[g][i], true); + }; +})(); + +var Hash = new Native({ + + name: 'Hash', + + initialize: function(object){ + if ($type(object) == 'hash') object = $unlink(object.getClean()); + for (var key in object) this[key] = object[key]; + return this; + } + +}); + +Hash.implement({ + + forEach: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this); + } + }, + + getClean: function(){ + var clean = {}; + for (var key in this){ + if (this.hasOwnProperty(key)) clean[key] = this[key]; + } + return clean; + }, + + getLength: function(){ + var length = 0; + for (var key in this){ + if (this.hasOwnProperty(key)) length++; + } + return length; + } + +}); + +Hash.alias('forEach', 'each'); + +Array.implement({ + + forEach: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++) fn.call(bind, this[i], i, this); + } + +}); + +Array.alias('forEach', 'each'); + +function $A(iterable){ + if (iterable.item){ + var array = []; + for (var i = 0, l = iterable.length; i < l; i++) array[i] = iterable[i]; + return array; + } + return Array.prototype.slice.call(iterable); +}; + +function $arguments(i){ + return function(){ + return arguments[i]; + }; +}; + +function $chk(obj){ + return !!(obj || obj === 0); +}; + +function $clear(timer){ + clearTimeout(timer); + clearInterval(timer); + return null; +}; + +function $defined(obj){ + return (obj != undefined); +}; + +function $each(iterable, fn, bind){ + var type = $type(iterable); + ((type == 'arguments' || type == 'collection' || type == 'array') ? Array : Hash).each(iterable, fn, bind); +}; + +function $empty(){}; + +function $extend(original, extended){ + for (var key in (extended || {})) original[key] = extended[key]; + return original; +}; + +function $H(object){ + return new Hash(object); +}; + +function $lambda(value){ + return (typeof value == 'function') ? value : function(){ + return value; + }; +}; + +function $merge(){ + var mix = {}; + for (var i = 0, l = arguments.length; i < l; i++){ + var object = arguments[i]; + if ($type(object) != 'object') continue; + for (var key in object){ + var op = object[key], mp = mix[key]; + mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $merge(mp, op) : $unlink(op); + } + } + return mix; +}; + +function $pick(){ + for (var i = 0, l = arguments.length; i < l; i++){ + if (arguments[i] != undefined) return arguments[i]; + } + return null; +}; + +function $random(min, max){ + return Math.floor(Math.random() * (max - min + 1) + min); +}; + +function $splat(obj){ + var type = $type(obj); + return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : []; +}; + +var $time = Date.now || function(){ + return +new Date; +}; + +function $try(){ + for (var i = 0, l = arguments.length; i < l; i++){ + try { + return arguments[i](); + } catch(e){} + } + return null; +}; + +function $type(obj){ + if (obj == undefined) return false; + if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name; + if (obj.nodeName){ + switch (obj.nodeType){ + case 1: return 'element'; + case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace'; + } + } else if (typeof obj.length == 'number'){ + if (obj.callee) return 'arguments'; + else if (obj.item) return 'collection'; + } + return typeof obj; +}; + +function $unlink(object){ + var unlinked; + switch ($type(object)){ + case 'object': + unlinked = {}; + for (var p in object) unlinked[p] = $unlink(object[p]); + break; + case 'hash': + unlinked = new Hash(object); + break; + case 'array': + unlinked = []; + for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]); + break; + default: return object; + } + return unlinked; +}; + + +/* +Script: Browser.js + The Browser Core. Contains Browser initialization, Window and Document, and the Browser Hash. + +License: + MIT-style license. +*/ + +var Browser = $merge({ + + Engine: {name: 'unknown', version: 0}, + + Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()}, + + Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)}, + + Plugins: {}, + + Engines: { + + presto: function(){ + return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); + }, + + trident: function(){ + return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? 5 : 4); + }, + + webkit: function(){ + return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419); + }, + + gecko: function(){ + return (document.getBoxObjectFor == undefined) ? false : ((document.getElementsByClassName) ? 19 : 18); + } + + } + +}, Browser || {}); + +Browser.Platform[Browser.Platform.name] = true; + +Browser.detect = function(){ + + for (var engine in this.Engines){ + var version = this.Engines[engine](); + if (version){ + this.Engine = {name: engine, version: version}; + this.Engine[engine] = this.Engine[engine + version] = true; + break; + } + } + + return {name: engine, version: version}; + +}; + +Browser.detect(); + +Browser.Request = function(){ + return $try(function(){ + return new XMLHttpRequest(); + }, function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }); +}; + +Browser.Features.xhr = !!(Browser.Request()); + +Browser.Plugins.Flash = (function(){ + var version = ($try(function(){ + return navigator.plugins['Shockwave Flash'].description; + }, function(){ + return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); + }) || '0 r0').match(/\d+/g); + return {version: parseInt(version[0] || 0 + '.' + version[1] || 0), build: parseInt(version[2] || 0)}; +})(); + +function $exec(text){ + if (!text) return text; + if (window.execScript){ + window.execScript(text); + } else { + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text; + document.head.appendChild(script); + document.head.removeChild(script); + } + return text; +}; + +Native.UID = 1; + +var $uid = (Browser.Engine.trident) ? function(item){ + return (item.uid || (item.uid = [Native.UID++]))[0]; +} : function(item){ + return item.uid || (item.uid = Native.UID++); +}; + +var Window = new Native({ + + name: 'Window', + + legacy: (Browser.Engine.trident) ? null: window.Window, + + initialize: function(win){ + $uid(win); + if (!win.Element){ + win.Element = $empty; + if (Browser.Engine.webkit) win.document.createElement("iframe"); //fixes safari 2 + win.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {}; + } + win.document.window = win; + return $extend(win, Window.Prototype); + }, + + afterImplement: function(property, value){ + window[property] = Window.Prototype[property] = value; + } + +}); + +Window.Prototype = {$family: {name: 'window'}}; + +new Window(window); + +var Document = new Native({ + + name: 'Document', + + legacy: (Browser.Engine.trident) ? null: window.Document, + + initialize: function(doc){ + $uid(doc); + doc.head = doc.getElementsByTagName('head')[0]; + doc.html = doc.getElementsByTagName('html')[0]; + if (Browser.Engine.trident && Browser.Engine.version <= 4) $try(function(){ + doc.execCommand("BackgroundImageCache", false, true); + }); + if (Browser.Engine.trident) doc.window.attachEvent('onunload', function() { + doc.window.detachEvent('onunload', arguments.callee); + doc.head = doc.html = doc.window = null; + }); + return $extend(doc, Document.Prototype); + }, + + afterImplement: function(property, value){ + document[property] = Document.Prototype[property] = value; + } + +}); + +Document.Prototype = {$family: {name: 'document'}}; + +new Document(document); + + +/* +Script: Array.js + Contains Array Prototypes like each, contains, and erase. + +License: + MIT-style license. +*/ + +Array.implement({ + + every: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (!fn.call(bind, this[i], i, this)) return false; + } + return true; + }, + + filter: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if (fn.call(bind, this[i], i, this)) results.push(this[i]); + } + return results; + }, + + clean: function() { + return this.filter($defined); + }, + + indexOf: function(item, from){ + var len = this.length; + for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){ + if (this[i] === item) return i; + } + return -1; + }, + + map: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++) results[i] = fn.call(bind, this[i], i, this); + return results; + }, + + some: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (fn.call(bind, this[i], i, this)) return true; + } + return false; + }, + + associate: function(keys){ + var obj = {}, length = Math.min(this.length, keys.length); + for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; + return obj; + }, + + link: function(object){ + var result = {}; + for (var i = 0, l = this.length; i < l; i++){ + for (var key in object){ + if (object[key](this[i])){ + result[key] = this[i]; + delete object[key]; + break; + } + } + } + return result; + }, + + contains: function(item, from){ + return this.indexOf(item, from) != -1; + }, + + extend: function(array){ + for (var i = 0, j = array.length; i < j; i++) this.push(array[i]); + return this; + }, + + getLast: function(){ + return (this.length) ? this[this.length - 1] : null; + }, + + getRandom: function(){ + return (this.length) ? this[$random(0, this.length - 1)] : null; + }, + + include: function(item){ + if (!this.contains(item)) this.push(item); + return this; + }, + + combine: function(array){ + for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); + return this; + }, + + erase: function(item){ + for (var i = this.length; i--; i){ + if (this[i] === item) this.splice(i, 1); + } + return this; + }, + + empty: function(){ + this.length = 0; + return this; + }, + + flatten: function(){ + var array = []; + for (var i = 0, l = this.length; i < l; i++){ + var type = $type(this[i]); + if (!type) continue; + array = array.concat((type == 'array' || type == 'collection' || type == 'arguments') ? Array.flatten(this[i]) : this[i]); + } + return array; + }, + + hexToRgb: function(array){ + if (this.length != 3) return null; + var rgb = this.map(function(value){ + if (value.length == 1) value += value; + return value.toInt(16); + }); + return (array) ? rgb : 'rgb(' + rgb + ')'; + }, + + rgbToHex: function(array){ + if (this.length < 3) return null; + if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; + var hex = []; + for (var i = 0; i < 3; i++){ + var bit = (this[i] - 0).toString(16); + hex.push((bit.length == 1) ? '0' + bit : bit); + } + return (array) ? hex : '#' + hex.join(''); + } + +}); + + +/* +Script: Function.js + Contains Function Prototypes like create, bind, pass, and delay. + +License: + MIT-style license. +*/ + +Function.implement({ + + extend: function(properties){ + for (var property in properties) this[property] = properties[property]; + return this; + }, + + create: function(options){ + var self = this; + options = options || {}; + return function(event){ + var args = options.arguments; + args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0); + if (options.event) args = [event || window.event].extend(args); + var returns = function(){ + return self.apply(options.bind || null, args); + }; + if (options.delay) return setTimeout(returns, options.delay); + if (options.periodical) return setInterval(returns, options.periodical); + if (options.attempt) return $try(returns); + return returns(); + }; + }, + + run: function(args, bind){ + return this.apply(bind, $splat(args)); + }, + + pass: function(args, bind){ + return this.create({bind: bind, arguments: args}); + }, + + bind: function(bind, args){ + return this.create({bind: bind, arguments: args}); + }, + + bindWithEvent: function(bind, args){ + return this.create({bind: bind, arguments: args, event: true}); + }, + + attempt: function(args, bind){ + return this.create({bind: bind, arguments: args, attempt: true})(); + }, + + delay: function(delay, bind, args){ + return this.create({bind: bind, arguments: args, delay: delay})(); + }, + + periodical: function(periodical, bind, args){ + return this.create({bind: bind, arguments: args, periodical: periodical})(); + } + +}); + + +/* +Script: Number.js + Contains Number Prototypes like limit, round, times, and ceil. + +License: + MIT-style license. +*/ + +Number.implement({ + + limit: function(min, max){ + return Math.min(max, Math.max(min, this)); + }, + + round: function(precision){ + precision = Math.pow(10, precision || 0); + return Math.round(this * precision) / precision; + }, + + times: function(fn, bind){ + for (var i = 0; i < this; i++) fn.call(bind, i, this); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + } + +}); + +Number.alias('times', 'each'); + +(function(math){ + var methods = {}; + math.each(function(name){ + if (!Number[name]) methods[name] = function(){ + return Math[name].apply(null, [this].concat($A(arguments))); + }; + }); + Number.implement(methods); +})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); + + +/* +Script: String.js + Contains String Prototypes like camelCase, capitalize, test, and toInt. + +License: + MIT-style license. +*/ + +String.implement({ + + test: function(regex, params){ + return ((typeof regex == 'string') ? new RegExp(regex, params) : regex).test(this); + }, + + contains: function(string, separator){ + return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1; + }, + + trim: function(){ + return this.replace(/^\s+|\s+$/g, ''); + }, + + clean: function(){ + return this.replace(/\s+/g, ' ').trim(); + }, + + camelCase: function(){ + return this.replace(/-\D/g, function(match){ + return match.charAt(1).toUpperCase(); + }); + }, + + hyphenate: function(){ + return this.replace(/[A-Z]/g, function(match){ + return ('-' + match.charAt(0).toLowerCase()); + }); + }, + + capitalize: function(){ + return this.replace(/\b[a-z]/g, function(match){ + return match.toUpperCase(); + }); + }, + + escapeRegExp: function(){ + return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + hexToRgb: function(array){ + var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); + return (hex) ? hex.slice(1).hexToRgb(array) : null; + }, + + rgbToHex: function(array){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHex(array) : null; + }, + + stripScripts: function(option){ + var scripts = ''; + var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(){ + scripts += arguments[1] + '\n'; + return ''; + }); + if (option === true) $exec(scripts); + else if ($type(option) == 'function') option(scripts, text); + return text; + }, + + substitute: function(object, regexp){ + return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ + if (match.charAt(0) == '\\') return match.slice(1); + return (object[name] != undefined) ? object[name] : ''; + }); + } + +}); + + +/* +Script: Hash.js + Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects. + +License: + MIT-style license. +*/ + +Hash.implement({ + + has: Object.prototype.hasOwnProperty, + + keyOf: function(value){ + for (var key in this){ + if (this.hasOwnProperty(key) && this[key] === value) return key; + } + return null; + }, + + hasValue: function(value){ + return (Hash.keyOf(this, value) !== null); + }, + + extend: function(properties){ + Hash.each(properties, function(value, key){ + Hash.set(this, key, value); + }, this); + return this; + }, + + combine: function(properties){ + Hash.each(properties, function(value, key){ + Hash.include(this, key, value); + }, this); + return this; + }, + + erase: function(key){ + if (this.hasOwnProperty(key)) delete this[key]; + return this; + }, + + get: function(key){ + return (this.hasOwnProperty(key)) ? this[key] : null; + }, + + set: function(key, value){ + if (!this[key] || this.hasOwnProperty(key)) this[key] = value; + return this; + }, + + empty: function(){ + Hash.each(this, function(value, key){ + delete this[key]; + }, this); + return this; + }, + + include: function(key, value){ + var k = this[key]; + if (k == undefined) this[key] = value; + return this; + }, + + map: function(fn, bind){ + var results = new Hash; + Hash.each(this, function(value, key){ + results.set(key, fn.call(bind, value, key, this)); + }, this); + return results; + }, + + filter: function(fn, bind){ + var results = new Hash; + Hash.each(this, function(value, key){ + if (fn.call(bind, value, key, this)) results.set(key, value); + }, this); + return results; + }, + + every: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key) && !fn.call(bind, this[key], key)) return false; + } + return true; + }, + + some: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key) && fn.call(bind, this[key], key)) return true; + } + return false; + }, + + getKeys: function(){ + var keys = []; + Hash.each(this, function(value, key){ + keys.push(key); + }); + return keys; + }, + + getValues: function(){ + var values = []; + Hash.each(this, function(value){ + values.push(value); + }); + return values; + }, + + toQueryString: function(base){ + var queryString = []; + Hash.each(this, function(value, key){ + if (base) key = base + '[' + key + ']'; + var result; + switch ($type(value)){ + case 'object': result = Hash.toQueryString(value, key); break; + case 'array': + var qs = {}; + value.each(function(val, i){ + qs[i] = val; + }); + result = Hash.toQueryString(qs, key); + break; + default: result = key + '=' + encodeURIComponent(value); + } + if (value != undefined) queryString.push(result); + }); + + return queryString.join('&'); + } + +}); + +Hash.alias({keyOf: 'indexOf', hasValue: 'contains'}); + + +/* +Script: Event.js + Contains the Event Native, to make the event object completely crossbrowser. + +License: + MIT-style license. +*/ + +var Event = new Native({ + + name: 'Event', + + initialize: function(event, win){ + win = win || window; + var doc = win.document; + event = event || win.event; + if (event.$extended) return event; + this.$extended = true; + var type = event.type; + var target = event.target || event.srcElement; + while (target && target.nodeType == 3) target = target.parentNode; + + if (type.test(/key/)){ + var code = event.which || event.keyCode; + var key = Event.Keys.keyOf(code); + if (type == 'keydown'){ + var fKey = code - 111; + if (fKey > 0 && fKey < 13) key = 'f' + fKey; + } + key = key || String.fromCharCode(code).toLowerCase(); + } else if (type.match(/(click|mouse|menu)/i)){ + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + var page = { + x: event.pageX || event.clientX + doc.scrollLeft, + y: event.pageY || event.clientY + doc.scrollTop + }; + var client = { + x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX, + y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY + }; + if (type.match(/DOMMouseScroll|mousewheel/)){ + var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; + } + var rightClick = (event.which == 3) || (event.button == 2); + var related = null; + if (type.match(/over|out/)){ + switch (type){ + case 'mouseover': related = event.relatedTarget || event.fromElement; break; + case 'mouseout': related = event.relatedTarget || event.toElement; + } + if (!(function(){ + while (related && related.nodeType == 3) related = related.parentNode; + return true; + }).create({attempt: Browser.Engine.gecko})()) related = false; + } + } + + return $extend(this, { + event: event, + type: type, + + page: page, + client: client, + rightClick: rightClick, + + wheel: wheel, + + relatedTarget: related, + target: target, + + code: code, + key: key, + + shift: event.shiftKey, + control: event.ctrlKey, + alt: event.altKey, + meta: event.metaKey + }); + } + +}); + +Event.Keys = new Hash({ + 'enter': 13, + 'up': 38, + 'down': 40, + 'left': 37, + 'right': 39, + 'esc': 27, + 'space': 32, + 'backspace': 8, + 'tab': 9, + 'delete': 46 +}); + +Event.implement({ + + stop: function(){ + return this.stopPropagation().preventDefault(); + }, + + stopPropagation: function(){ + if (this.event.stopPropagation) this.event.stopPropagation(); + else this.event.cancelBubble = true; + return this; + }, + + preventDefault: function(){ + if (this.event.preventDefault) this.event.preventDefault(); + else this.event.returnValue = false; + return this; + } + +}); + + +/* +Script: Class.js + Contains the Class Function for easily creating, extending, and implementing reusable Classes. + +License: + MIT-style license. +*/ + +var Class = new Native({ + + name: 'Class', + + initialize: function(properties){ + properties = properties || {}; + var klass = function(){ + for (var key in this){ + if ($type(this[key]) != 'function') this[key] = $unlink(this[key]); + } + this.constructor = klass; + if (Class.prototyping) return this; + var instance = (this.initialize) ? this.initialize.apply(this, arguments) : this; + if (this.options && this.options.initialize) this.options.initialize.call(this); + return instance; + }; + + for (var mutator in Class.Mutators){ + if (!properties[mutator]) continue; + properties = Class.Mutators[mutator](properties, properties[mutator]); + delete properties[mutator]; + } + + $extend(klass, this); + klass.constructor = Class; + klass.prototype = properties; + return klass; + } + +}); + +Class.Mutators = { + + Extends: function(self, klass){ + Class.prototyping = klass.prototype; + var subclass = new klass; + delete subclass.parent; + subclass = Class.inherit(subclass, self); + delete Class.prototyping; + return subclass; + }, + + Implements: function(self, klasses){ + $splat(klasses).each(function(klass){ + Class.prototying = klass; + $extend(self, ($type(klass) == 'class') ? new klass : klass); + delete Class.prototyping; + }); + return self; + } + +}; + +Class.extend({ + + inherit: function(object, properties){ + var caller = arguments.callee.caller; + for (var key in properties){ + var override = properties[key]; + var previous = object[key]; + var type = $type(override); + if (previous && type == 'function'){ + if (override != previous){ + if (caller){ + override.__parent = previous; + object[key] = override; + } else { + Class.override(object, key, override); + } + } + } else if(type == 'object'){ + object[key] = $merge(previous, override); + } else { + object[key] = override; + } + } + + if (caller) object.parent = function(){ + return arguments.callee.caller.__parent.apply(this, arguments); + }; + + return object; + }, + + override: function(object, name, method){ + var parent = Class.prototyping; + if (parent && object[name] != parent[name]) parent = null; + var override = function(){ + var previous = this.parent; + this.parent = parent ? parent[name] : object[name]; + var value = method.apply(this, arguments); + this.parent = previous; + return value; + }; + object[name] = override; + } + +}); + +Class.implement({ + + implement: function(){ + var proto = this.prototype; + $each(arguments, function(properties){ + Class.inherit(proto, properties); + }); + return this; + } + +}); + + +/* +Script: Class.Extras.js + Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. + +License: + MIT-style license. +*/ + +var Chain = new Class({ + + $chain: [], + + chain: function(){ + this.$chain.extend(Array.flatten(arguments)); + return this; + }, + + callChain: function(){ + return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; + }, + + clearChain: function(){ + this.$chain.empty(); + return this; + } + +}); + +var Events = new Class({ + + $events: {}, + + addEvent: function(type, fn, internal){ + type = Events.removeOn(type); + if (fn != $empty){ + this.$events[type] = this.$events[type] || []; + this.$events[type].include(fn); + if (internal) fn.internal = true; + } + return this; + }, + + addEvents: function(events){ + for (var type in events) this.addEvent(type, events[type]); + return this; + }, + + fireEvent: function(type, args, delay){ + type = Events.removeOn(type); + if (!this.$events || !this.$events[type]) return this; + this.$events[type].each(function(fn){ + fn.create({'bind': this, 'delay': delay, 'arguments': args})(); + }, this); + return this; + }, + + removeEvent: function(type, fn){ + type = Events.removeOn(type); + if (!this.$events[type]) return this; + if (!fn.internal) this.$events[type].erase(fn); + return this; + }, + + removeEvents: function(events){ + if ($type(events) == 'object'){ + for (var type in events) this.removeEvent(type, events[type]); + return this; + } + if (events) events = Events.removeOn(events); + for (var type in this.$events){ + if (events && events != type) continue; + var fns = this.$events[type]; + for (var i = fns.length; i--; i) this.removeEvent(type, fns[i]); + } + return this; + } + +}); + +Events.removeOn = function(string){ + return string.replace(/^on([A-Z])/, function(full, first) { + return first.toLowerCase(); + }); +}; + +var Options = new Class({ + + setOptions: function(){ + this.options = $merge.run([this.options].extend(arguments)); + if (!this.addEvent) return this; + for (var option in this.options){ + if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; + this.addEvent(option, this.options[option]); + delete this.options[option]; + } + return this; + } + +}); + + +/* +Script: Element.js + One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, + time-saver methods to let you easily work with HTML Elements. + +License: + MIT-style license. +*/ + +var Element = new Native({ + + name: 'Element', + + legacy: window.Element, + + initialize: function(tag, props){ + var konstructor = Element.Constructors.get(tag); + if (konstructor) return konstructor(props); + if (typeof tag == 'string') return document.newElement(tag, props); + return $(tag).set(props); + }, + + afterImplement: function(key, value){ + Element.Prototype[key] = value; + if (Array[key]) return; + Elements.implement(key, function(){ + var items = [], elements = true; + for (var i = 0, j = this.length; i < j; i++){ + var returns = this[i][key].apply(this[i], arguments); + items.push(returns); + if (elements) elements = ($type(returns) == 'element'); + } + return (elements) ? new Elements(items) : items; + }); + } + +}); + +Element.Prototype = {$family: {name: 'element'}}; + +Element.Constructors = new Hash; + +var IFrame = new Native({ + + name: 'IFrame', + + generics: false, + + initialize: function(){ + var params = Array.link(arguments, {properties: Object.type, iframe: $defined}); + var props = params.properties || {}; + var iframe = $(params.iframe) || false; + var onload = props.onload || $empty; + delete props.onload; + props.id = props.name = $pick(props.id, props.name, iframe.id, iframe.name, 'IFrame_' + $time()); + iframe = new Element(iframe || 'iframe', props); + var onFrameLoad = function(){ + var host = $try(function(){ + return iframe.contentWindow.location.host; + }); + if (host && host == window.location.host){ + var win = new Window(iframe.contentWindow); + new Document(iframe.contentWindow.document); + $extend(win.Element.prototype, Element.Prototype); + } + onload.call(iframe.contentWindow, iframe.contentWindow.document); + }; + (window.frames[props.id]) ? onFrameLoad() : iframe.addListener('load', onFrameLoad); + return iframe; + } + +}); + +var Elements = new Native({ + + initialize: function(elements, options){ + options = $extend({ddup: true, cash: true}, options); + elements = elements || []; + if (options.ddup || options.cash){ + var uniques = {}, returned = []; + for (var i = 0, l = elements.length; i < l; i++){ + var el = $.element(elements[i], !options.cash); + if (options.ddup){ + if (uniques[el.uid]) continue; + uniques[el.uid] = true; + } + returned.push(el); + } + elements = returned; + } + return (options.cash) ? $extend(elements, this) : elements; + } + +}); + +Elements.implement({ + + filter: function(filter, bind){ + if (!filter) return this; + return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){ + return item.match(filter); + } : filter, bind)); + } + +}); + +Document.implement({ + + newElement: function(tag, props){ + if (Browser.Engine.trident && props){ + ['name', 'type', 'checked'].each(function(attribute){ + if (!props[attribute]) return; + tag += ' ' + attribute + '="' + props[attribute] + '"'; + if (attribute != 'checked') delete props[attribute]; + }); + tag = '<' + tag + '>'; + } + return $.element(this.createElement(tag)).set(props); + }, + + newTextNode: function(text){ + return this.createTextNode(text); + }, + + getDocument: function(){ + return this; + }, + + getWindow: function(){ + return this.window; + } + +}); + +Window.implement({ + + $: function(el, nocash){ + if (el && el.$family && el.uid) return el; + var type = $type(el); + return ($[type]) ? $[type](el, nocash, this.document) : null; + }, + + $$: function(selector){ + if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector); + var elements = []; + var args = Array.flatten(arguments); + for (var i = 0, l = args.length; i < l; i++){ + var item = args[i]; + switch ($type(item)){ + case 'element': elements.push(item); break; + case 'string': elements.extend(this.document.getElements(item, true)); + } + } + return new Elements(elements); + }, + + getDocument: function(){ + return this.document; + }, + + getWindow: function(){ + return this; + } + +}); + +$.string = function(id, nocash, doc){ + id = doc.getElementById(id); + return (id) ? $.element(id, nocash) : null; +}; + +$.element = function(el, nocash){ + $uid(el); + if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){ + var proto = Element.Prototype; + for (var p in proto) el[p] = proto[p]; + }; + return el; +}; + +$.object = function(obj, nocash, doc){ + if (obj.toElement) return $.element(obj.toElement(doc), nocash); + return null; +}; + +$.textnode = $.whitespace = $.window = $.document = $arguments(0); + +Native.implement([Element, Document], { + + getElement: function(selector, nocash){ + return $(this.getElements(selector, true)[0] || null, nocash); + }, + + getElements: function(tags, nocash){ + tags = tags.split(','); + var elements = []; + var ddup = (tags.length > 1); + tags.each(function(tag){ + var partial = this.getElementsByTagName(tag.trim()); + (ddup) ? elements.extend(partial) : elements = partial; + }, this); + return new Elements(elements, {ddup: ddup, cash: !nocash}); + } + +}); + +(function(){ + +var collected = {}, storage = {}; +var props = {input: 'checked', option: 'selected', textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerHTML' : 'value'}; + +var get = function(uid){ + return (storage[uid] || (storage[uid] = {})); +}; + +var clean = function(item, retain){ + if (!item) return; + var uid = item.uid; + if (Browser.Engine.trident){ + if (item.clearAttributes){ + var clone = retain && item.cloneNode(false); + item.clearAttributes(); + if (clone) item.mergeAttributes(clone); + } else if (item.removeEvents){ + item.removeEvents(); + } + if ((/object/i).test(item.tagName)){ + for (var p in item){ + if (typeof item[p] == 'function') item[p] = $empty; + } + Element.dispose(item); + } + } + if (!uid) return; + collected[uid] = storage[uid] = null; +}; + +var purge = function(){ + Hash.each(collected, clean); + if (Browser.Engine.trident) $A(document.getElementsByTagName('object')).each(clean); + if (window.CollectGarbage) CollectGarbage(); + collected = storage = null; +}; + +var walk = function(element, walk, start, match, all, nocash){ + var el = element[start || walk]; + var elements = []; + while (el){ + if (el.nodeType == 1 && (!match || Element.match(el, match))){ + if (!all) return $(el, nocash); + elements.push(el); + } + el = el[walk]; + } + return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : null; +}; + +var attributes = { + 'html': 'innerHTML', + 'class': 'className', + 'for': 'htmlFor', + 'text': (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? 'innerText' : 'textContent' +}; +var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer']; +var camels = ['value', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap']; + +Hash.extend(attributes, bools.associate(bools)); +Hash.extend(attributes, camels.associate(camels.map(String.toLowerCase))); + +var inserters = { + + before: function(context, element){ + if (element.parentNode) element.parentNode.insertBefore(context, element); + }, + + after: function(context, element){ + if (!element.parentNode) return; + var next = element.nextSibling; + (next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context); + }, + + bottom: function(context, element){ + element.appendChild(context); + }, + + top: function(context, element){ + var first = element.firstChild; + (first) ? element.insertBefore(context, first) : element.appendChild(context); + } + +}; + +inserters.inside = inserters.bottom; + +Hash.each(inserters, function(inserter, where){ + + where = where.capitalize(); + + Element.implement('inject' + where, function(el){ + inserter(this, $(el, true)); + return this; + }); + + Element.implement('grab' + where, function(el){ + inserter($(el, true), this); + return this; + }); + +}); + +Element.implement({ + + set: function(prop, value){ + switch ($type(prop)){ + case 'object': + for (var p in prop) this.set(p, prop[p]); + break; + case 'string': + var property = Element.Properties.get(prop); + (property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value); + } + return this; + }, + + get: function(prop){ + var property = Element.Properties.get(prop); + return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop); + }, + + erase: function(prop){ + var property = Element.Properties.get(prop); + (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); + return this; + }, + + setProperty: function(attribute, value){ + var key = attributes[attribute]; + if (value == undefined) return this.removeProperty(attribute); + if (key && bools[attribute]) value = !!value; + (key) ? this[key] = value : this.setAttribute(attribute, '' + value); + return this; + }, + + setProperties: function(attributes){ + for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); + return this; + }, + + getProperty: function(attribute){ + var key = attributes[attribute]; + var value = (key) ? this[key] : this.getAttribute(attribute, 2); + return (bools[attribute]) ? !!value : (key) ? value : value || null; + }, + + getProperties: function(){ + var args = $A(arguments); + return args.map(this.getProperty, this).associate(args); + }, + + removeProperty: function(attribute){ + var key = attributes[attribute]; + (key) ? this[key] = (key && bools[attribute]) ? false : '' : this.removeAttribute(attribute); + return this; + }, + + removeProperties: function(){ + Array.each(arguments, this.removeProperty, this); + return this; + }, + + hasClass: function(className){ + return this.className.contains(className, ' '); + }, + + addClass: function(className){ + if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean(); + return this; + }, + + removeClass: function(className){ + this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1'); + return this; + }, + + toggleClass: function(className){ + return this.hasClass(className) ? this.removeClass(className) : this.addClass(className); + }, + + adopt: function(){ + Array.flatten(arguments).each(function(element){ + element = $(element, true); + if (element) this.appendChild(element); + }, this); + return this; + }, + + appendText: function(text, where){ + return this.grab(this.getDocument().newTextNode(text), where); + }, + + grab: function(el, where){ + inserters[where || 'bottom']($(el, true), this); + return this; + }, + + inject: function(el, where){ + inserters[where || 'bottom'](this, $(el, true)); + return this; + }, + + replaces: function(el){ + el = $(el, true); + el.parentNode.replaceChild(this, el); + return this; + }, + + wraps: function(el, where){ + el = $(el, true); + return this.replaces(el).grab(el, where); + }, + + getPrevious: function(match, nocash){ + return walk(this, 'previousSibling', null, match, false, nocash); + }, + + getAllPrevious: function(match, nocash){ + return walk(this, 'previousSibling', null, match, true, nocash); + }, + + getNext: function(match, nocash){ + return walk(this, 'nextSibling', null, match, false, nocash); + }, + + getAllNext: function(match, nocash){ + return walk(this, 'nextSibling', null, match, true, nocash); + }, + + getFirst: function(match, nocash){ + return walk(this, 'nextSibling', 'firstChild', match, false, nocash); + }, + + getLast: function(match, nocash){ + return walk(this, 'previousSibling', 'lastChild', match, false, nocash); + }, + + getParent: function(match, nocash){ + return walk(this, 'parentNode', null, match, false, nocash); + }, + + getParents: function(match, nocash){ + return walk(this, 'parentNode', null, match, true, nocash); + }, + + getChildren: function(match, nocash){ + return walk(this, 'nextSibling', 'firstChild', match, true, nocash); + }, + + getWindow: function(){ + return this.ownerDocument.window; + }, + + getDocument: function(){ + return this.ownerDocument; + }, + + getElementById: function(id, nocash){ + var el = this.ownerDocument.getElementById(id); + if (!el) return null; + for (var parent = el.parentNode; parent != this; parent = parent.parentNode){ + if (!parent) return null; + } + return $.element(el, nocash); + }, + + getSelected: function(){ + return new Elements($A(this.options).filter(function(option){ + return option.selected; + })); + }, + + getComputedStyle: function(property){ + if (this.currentStyle) return this.currentStyle[property.camelCase()]; + var computed = this.getDocument().defaultView.getComputedStyle(this, null); + return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null; + }, + + toQueryString: function(){ + var queryString = []; + this.getElements('input, select, textarea', true).each(function(el){ + if (!el.name || el.disabled) return; + var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){ + return opt.value; + }) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value; + $splat(value).each(function(val){ + if (typeof val != 'undefined') queryString.push(el.name + '=' + encodeURIComponent(val)); + }); + }); + return queryString.join('&'); + }, + + clone: function(contents, keepid){ + contents = contents !== false; + var clone = this.cloneNode(contents); + var clean = function(node, element){ + if (!keepid) node.removeAttribute('id'); + if (Browser.Engine.trident){ + node.clearAttributes(); + node.mergeAttributes(element); + node.removeAttribute('uid'); + if (node.options){ + var no = node.options, eo = element.options; + for (var j = no.length; j--;) no[j].selected = eo[j].selected; + } + } + var prop = props[element.tagName.toLowerCase()]; + if (prop && element[prop]) node[prop] = element[prop]; + }; + + if (contents){ + var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*'); + for (var i = ce.length; i--;) clean(ce[i], te[i]); + } + + clean(clone, this); + return $(clone); + }, + + destroy: function(){ + Element.empty(this); + Element.dispose(this); + clean(this, true); + return null; + }, + + empty: function(){ + $A(this.childNodes).each(function(node){ + Element.destroy(node); + }); + return this; + }, + + dispose: function(){ + return (this.parentNode) ? this.parentNode.removeChild(this) : this; + }, + + hasChild: function(el){ + el = $(el, true); + if (!el) return false; + if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el); + return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16); + }, + + match: function(tag){ + return (!tag || (tag == this) || (Element.get(this, 'tag') == tag)); + } + +}); + +Native.implement([Element, Window, Document], { + + addListener: function(type, fn){ + if (type == 'unload'){ + var old = fn, self = this; + fn = function(){ + self.removeListener('unload', fn); + old(); + }; + } else { + collected[this.uid] = this; + } + if (this.addEventListener) this.addEventListener(type, fn, false); + else this.attachEvent('on' + type, fn); + return this; + }, + + removeListener: function(type, fn){ + if (this.removeEventListener) this.removeEventListener(type, fn, false); + else this.detachEvent('on' + type, fn); + return this; + }, + + retrieve: function(property, dflt){ + var storage = get(this.uid), prop = storage[property]; + if (dflt != undefined && prop == undefined) prop = storage[property] = dflt; + return $pick(prop); + }, + + store: function(property, value){ + var storage = get(this.uid); + storage[property] = value; + return this; + }, + + eliminate: function(property){ + var storage = get(this.uid); + delete storage[property]; + return this; + } + +}); + +window.addListener('unload', purge); + +})(); + +Element.Properties = new Hash; + +Element.Properties.style = { + + set: function(style){ + this.style.cssText = style; + }, + + get: function(){ + return this.style.cssText; + }, + + erase: function(){ + this.style.cssText = ''; + } + +}; + +Element.Properties.tag = { + + get: function(){ + return this.tagName.toLowerCase(); + } + +}; + +Element.Properties.html = (function(){ + var wrapper = document.createElement('div'); + + var translations = { + table: [1, '', '
'], + select: [1, ''], + tbody: [2, '', '
'], + tr: [3, '', '
'] + }; + translations.thead = translations.tfoot = translations.tbody; + + var html = { + set: function(){ + var html = Array.flatten(arguments).join(''); + var wrap = Browser.Engine.trident && translations[this.get('tag')]; + if (wrap){ + var first = wrapper; + first.innerHTML = wrap[1] + html + wrap[2]; + for (var i = wrap[0]; i--;) first = first.firstChild; + this.empty().adopt(first.childNodes); + } else { + this.innerHTML = html; + } + } + }; + + html.erase = html.set; + + return html; +})(); + +if (Browser.Engine.webkit && Browser.Engine.version < 420) Element.Properties.text = { + get: function(){ + if (this.innerText) return this.innerText; + var temp = this.ownerDocument.newElement('div', {html: this.innerHTML}).inject(this.ownerDocument.body); + var text = temp.innerText; + temp.destroy(); + return text; + } +}; + + +/* +Script: Element.Event.js + Contains Element methods for dealing with events, and custom Events. + +License: + MIT-style license. +*/ + +Element.Properties.events = {set: function(events){ + this.addEvents(events); +}}; + +Native.implement([Element, Window, Document], { + + addEvent: function(type, fn){ + var events = this.retrieve('events', {}); + events[type] = events[type] || {'keys': [], 'values': []}; + if (events[type].keys.contains(fn)) return this; + events[type].keys.push(fn); + var realType = type, custom = Element.Events.get(type), condition = fn, self = this; + if (custom){ + if (custom.onAdd) custom.onAdd.call(this, fn); + if (custom.condition){ + condition = function(event){ + if (custom.condition.call(this, event)) return fn.call(this, event); + return true; + }; + } + realType = custom.base || realType; + } + var defn = function(){ + return fn.call(self); + }; + var nativeEvent = Element.NativeEvents[realType]; + if (nativeEvent){ + if (nativeEvent == 2){ + defn = function(event){ + event = new Event(event, self.getWindow()); + if (condition.call(self, event) === false) event.stop(); + }; + } + this.addListener(realType, defn); + } + events[type].values.push(defn); + return this; + }, + + removeEvent: function(type, fn){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + var pos = events[type].keys.indexOf(fn); + if (pos == -1) return this; + events[type].keys.splice(pos, 1); + var value = events[type].values.splice(pos, 1)[0]; + var custom = Element.Events.get(type); + if (custom){ + if (custom.onRemove) custom.onRemove.call(this, fn); + type = custom.base || type; + } + return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this; + }, + + addEvents: function(events){ + for (var event in events) this.addEvent(event, events[event]); + return this; + }, + + removeEvents: function(events){ + if ($type(events) == 'object'){ + for (var type in events) this.removeEvent(type, events[type]); + return this; + } + var attached = this.retrieve('events'); + if (!attached) return this; + if (!events){ + for (var type in attached) this.removeEvents(type); + this.eliminate('events'); + } else if (attached[events]){ + while (attached[events].keys[0]) this.removeEvent(events, attached[events].keys[0]); + attached[events] = null; + } + return this; + }, + + fireEvent: function(type, args, delay){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + events[type].keys.each(function(fn){ + fn.create({'bind': this, 'delay': delay, 'arguments': args})(); + }, this); + return this; + }, + + cloneEvents: function(from, type){ + from = $(from); + var fevents = from.retrieve('events'); + if (!fevents) return this; + if (!type){ + for (var evType in fevents) this.cloneEvents(from, evType); + } else if (fevents[type]){ + fevents[type].keys.each(function(fn){ + this.addEvent(type, fn); + }, this); + } + return this; + } + +}); + +Element.NativeEvents = { + click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons + mousewheel: 2, DOMMouseScroll: 2, //mouse wheel + mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement + keydown: 2, keypress: 2, keyup: 2, //keyboard + focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements + load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window + error: 1, abort: 1, scroll: 1 //misc +}; + +(function(){ + +var $check = function(event){ + var related = event.relatedTarget; + if (related == undefined) return true; + if (related === false) return false; + return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related)); +}; + +Element.Events = new Hash({ + + mouseenter: { + base: 'mouseover', + condition: $check + }, + + mouseleave: { + base: 'mouseout', + condition: $check + }, + + mousewheel: { + base: (Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel' + } + +}); + +})(); + + +/* +Script: Element.Style.js + Contains methods for interacting with the styles of Elements in a fashionable way. + +License: + MIT-style license. +*/ + +Element.Properties.styles = {set: function(styles){ + this.setStyles(styles); +}}; + +Element.Properties.opacity = { + + set: function(opacity, novisibility){ + if (!novisibility){ + if (opacity == 0){ + if (this.style.visibility != 'hidden') this.style.visibility = 'hidden'; + } else { + if (this.style.visibility != 'visible') this.style.visibility = 'visible'; + } + } + if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1; + if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')'; + this.style.opacity = opacity; + this.store('opacity', opacity); + }, + + get: function(){ + return this.retrieve('opacity', 1); + } + +}; + +Element.implement({ + + setOpacity: function(value){ + return this.set('opacity', value, true); + }, + + getOpacity: function(){ + return this.get('opacity'); + }, + + setStyle: function(property, value){ + switch (property){ + case 'opacity': return this.set('opacity', parseFloat(value)); + case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat'; + } + property = property.camelCase(); + if ($type(value) != 'string'){ + var map = (Element.Styles.get(property) || '@').split(' '); + value = $splat(value).map(function(val, i){ + if (!map[i]) return ''; + return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; + }).join(' '); + } else if (value == String(Number(value))){ + value = Math.round(value); + } + this.style[property] = value; + return this; + }, + + getStyle: function(property){ + switch (property){ + case 'opacity': return this.get('opacity'); + case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat'; + } + property = property.camelCase(); + var result = this.style[property]; + if (!$chk(result)){ + result = []; + for (var style in Element.ShortStyles){ + if (property != style) continue; + for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s)); + return result.join(' '); + } + result = this.getComputedStyle(property); + } + if (result){ + result = String(result); + var color = result.match(/rgba?\([\d\s,]+\)/); + if (color) result = result.replace(color[0], color[0].rgbToHex()); + } + if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result)))){ + if (property.test(/^(height|width)$/)){ + var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; + values.each(function(value){ + size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); + }, this); + return this['offset' + property.capitalize()] - size + 'px'; + } + if ((Browser.Engine.presto) && String(result).test('px')) return result; + if (property.test(/(border(.+)Width|margin|padding)/)) return '0px'; + } + return result; + }, + + setStyles: function(styles){ + for (var style in styles) this.setStyle(style, styles[style]); + return this; + }, + + getStyles: function(){ + var result = {}; + Array.each(arguments, function(key){ + result[key] = this.getStyle(key); + }, this); + return result; + } + +}); + +Element.Styles = new Hash({ + left: '@px', top: '@px', bottom: '@px', right: '@px', + width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px', + backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)', + fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)', + margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)', + borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)', + zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@' +}); + +Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; + +['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ + var Short = Element.ShortStyles; + var All = Element.Styles; + ['margin', 'padding'].each(function(style){ + var sd = style + direction; + Short[style][sd] = All[sd] = '@px'; + }); + var bd = 'border' + direction; + Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; + var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; + Short[bd] = {}; + Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; + Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; + Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; +}); + + +/* +Script: Element.Dimensions.js + Contains methods to work with size, scroll, or positioning of Elements and the window object. + +License: + MIT-style license. + +Credits: + - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). + - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). +*/ + +(function(){ + +Element.implement({ + + scrollTo: function(x, y){ + if (isBody(this)){ + this.getWindow().scrollTo(x, y); + } else { + this.scrollLeft = x; + this.scrollTop = y; + } + return this; + }, + + getSize: function(){ + if (isBody(this)) return this.getWindow().getSize(); + return {x: this.offsetWidth, y: this.offsetHeight}; + }, + + getScrollSize: function(){ + if (isBody(this)) return this.getWindow().getScrollSize(); + return {x: this.scrollWidth, y: this.scrollHeight}; + }, + + getScroll: function(){ + if (isBody(this)) return this.getWindow().getScroll(); + return {x: this.scrollLeft, y: this.scrollTop}; + }, + + getScrolls: function(){ + var element = this, position = {x: 0, y: 0}; + while (element && !isBody(element)){ + position.x += element.scrollLeft; + position.y += element.scrollTop; + element = element.parentNode; + } + return position; + }, + + getOffsetParent: function(){ + var element = this; + if (isBody(element)) return null; + if (!Browser.Engine.trident) return element.offsetParent; + while ((element = element.parentNode) && !isBody(element)){ + if (styleString(element, 'position') != 'static') return element; + } + return null; + }, + + getOffsets: function(){ + if (Browser.Engine.trident){ + var bound = this.getBoundingClientRect(), html = this.getDocument().documentElement; + return { + x: bound.left + html.scrollLeft - html.clientLeft, + y: bound.top + html.scrollTop - html.clientTop + }; + } + + var element = this, position = {x: 0, y: 0}; + if (isBody(this)) return position; + + while (element && !isBody(element)){ + position.x += element.offsetLeft; + position.y += element.offsetTop; + + if (Browser.Engine.gecko){ + if (!borderBox(element)){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + var parent = element.parentNode; + if (parent && styleString(parent, 'overflow') != 'visible'){ + position.x += leftBorder(parent); + position.y += topBorder(parent); + } + } else if (element != this && Browser.Engine.webkit){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + + element = element.offsetParent; + } + if (Browser.Engine.gecko && !borderBox(this)){ + position.x -= leftBorder(this); + position.y -= topBorder(this); + } + return position; + }, + + getPosition: function(relative){ + if (isBody(this)) return {x: 0, y: 0}; + var offset = this.getOffsets(), scroll = this.getScrolls(); + var position = {x: offset.x - scroll.x, y: offset.y - scroll.y}; + var relativePosition = (relative && (relative = $(relative))) ? relative.getPosition() : {x: 0, y: 0}; + return {x: position.x - relativePosition.x, y: position.y - relativePosition.y}; + }, + + getCoordinates: function(element){ + if (isBody(this)) return this.getWindow().getCoordinates(); + var position = this.getPosition(element), size = this.getSize(); + var obj = {left: position.x, top: position.y, width: size.x, height: size.y}; + obj.right = obj.left + obj.width; + obj.bottom = obj.top + obj.height; + return obj; + }, + + computePosition: function(obj){ + return {left: obj.x - styleNumber(this, 'margin-left'), top: obj.y - styleNumber(this, 'margin-top')}; + }, + + position: function(obj){ + return this.setStyles(this.computePosition(obj)); + } + +}); + +Native.implement([Document, Window], { + + getSize: function(){ + var win = this.getWindow(); + if (Browser.Engine.presto || Browser.Engine.webkit) return {x: win.innerWidth, y: win.innerHeight}; + var doc = getCompatElement(this); + return {x: doc.clientWidth, y: doc.clientHeight}; + }, + + getScroll: function(){ + var win = this.getWindow(); + var doc = getCompatElement(this); + return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; + }, + + getScrollSize: function(){ + var doc = getCompatElement(this); + var min = this.getSize(); + return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)}; + }, + + getPosition: function(){ + return {x: 0, y: 0}; + }, + + getCoordinates: function(){ + var size = this.getSize(); + return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; + } + +}); + +// private methods + +var styleString = Element.getComputedStyle; + +function styleNumber(element, style){ + return styleString(element, style).toInt() || 0; +}; + +function borderBox(element){ + return styleString(element, '-moz-box-sizing') == 'border-box'; +}; + +function topBorder(element){ + return styleNumber(element, 'border-top-width'); +}; + +function leftBorder(element){ + return styleNumber(element, 'border-left-width'); +}; + +function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); +}; + +function getCompatElement(element){ + var doc = element.getDocument(); + return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; +}; + +})(); + +//aliases + +Native.implement([Window, Document, Element], { + + getHeight: function(){ + return this.getSize().y; + }, + + getWidth: function(){ + return this.getSize().x; + }, + + getScrollTop: function(){ + return this.getScroll().y; + }, + + getScrollLeft: function(){ + return this.getScroll().x; + }, + + getScrollHeight: function(){ + return this.getScrollSize().y; + }, + + getScrollWidth: function(){ + return this.getScrollSize().x; + }, + + getTop: function(){ + return this.getPosition().y; + }, + + getLeft: function(){ + return this.getPosition().x; + } + +}); + + +/* +Script: Selectors.js + Adds advanced CSS Querying capabilities for targeting elements. Also includes pseudoselectors support. + +License: + MIT-style license. +*/ + +Native.implement([Document, Element], { + + getElements: function(expression, nocash){ + expression = expression.split(','); + var items, local = {}; + for (var i = 0, l = expression.length; i < l; i++){ + var selector = expression[i], elements = Selectors.Utils.search(this, selector, local); + if (i != 0 && elements.item) elements = $A(elements); + items = (i == 0) ? elements : (items.item) ? $A(items).concat(elements) : items.concat(elements); + } + return new Elements(items, {ddup: (expression.length > 1), cash: !nocash}); + } + +}); + +Element.implement({ + + match: function(selector){ + if (!selector || (selector == this)) return true; + var tagid = Selectors.Utils.parseTagAndID(selector); + var tag = tagid[0], id = tagid[1]; + if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false; + var parsed = Selectors.Utils.parseSelector(selector); + return (parsed) ? Selectors.Utils.filter(this, parsed, {}) : true; + } + +}); + +var Selectors = {Cache: {nth: {}, parsed: {}}}; + +Selectors.RegExps = { + id: (/#([\w-]+)/), + tag: (/^(\w+|\*)/), + quick: (/^(\w+|\*)$/), + splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g), + combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g) +}; + +Selectors.Utils = { + + chk: function(item, uniques){ + if (!uniques) return true; + var uid = $uid(item); + if (!uniques[uid]) return uniques[uid] = true; + return false; + }, + + parseNthArgument: function(argument){ + if (Selectors.Cache.nth[argument]) return Selectors.Cache.nth[argument]; + var parsed = argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/); + if (!parsed) return false; + var inta = parseInt(parsed[1]); + var a = (inta || inta === 0) ? inta : 1; + var special = parsed[2] || false; + var b = parseInt(parsed[3]) || 0; + if (a != 0){ + b--; + while (b < 1) b += a; + while (b >= a) b -= a; + } else { + a = b; + special = 'index'; + } + switch (special){ + case 'n': parsed = {a: a, b: b, special: 'n'}; break; + case 'odd': parsed = {a: 2, b: 0, special: 'n'}; break; + case 'even': parsed = {a: 2, b: 1, special: 'n'}; break; + case 'first': parsed = {a: 0, special: 'index'}; break; + case 'last': parsed = {special: 'last-child'}; break; + case 'only': parsed = {special: 'only-child'}; break; + default: parsed = {a: (a - 1), special: 'index'}; + } + + return Selectors.Cache.nth[argument] = parsed; + }, + + parseSelector: function(selector){ + if (Selectors.Cache.parsed[selector]) return Selectors.Cache.parsed[selector]; + var m, parsed = {classes: [], pseudos: [], attributes: []}; + while ((m = Selectors.RegExps.combined.exec(selector))){ + var cn = m[1], an = m[2], ao = m[3], av = m[5], pn = m[6], pa = m[7]; + if (cn){ + parsed.classes.push(cn); + } else if (pn){ + var parser = Selectors.Pseudo.get(pn); + if (parser) parsed.pseudos.push({parser: parser, argument: pa}); + else parsed.attributes.push({name: pn, operator: '=', value: pa}); + } else if (an){ + parsed.attributes.push({name: an, operator: ao, value: av}); + } + } + if (!parsed.classes.length) delete parsed.classes; + if (!parsed.attributes.length) delete parsed.attributes; + if (!parsed.pseudos.length) delete parsed.pseudos; + if (!parsed.classes && !parsed.attributes && !parsed.pseudos) parsed = null; + return Selectors.Cache.parsed[selector] = parsed; + }, + + parseTagAndID: function(selector){ + var tag = selector.match(Selectors.RegExps.tag); + var id = selector.match(Selectors.RegExps.id); + return [(tag) ? tag[1] : '*', (id) ? id[1] : false]; + }, + + filter: function(item, parsed, local){ + var i; + if (parsed.classes){ + for (i = parsed.classes.length; i--; i){ + var cn = parsed.classes[i]; + if (!Selectors.Filters.byClass(item, cn)) return false; + } + } + if (parsed.attributes){ + for (i = parsed.attributes.length; i--; i){ + var att = parsed.attributes[i]; + if (!Selectors.Filters.byAttribute(item, att.name, att.operator, att.value)) return false; + } + } + if (parsed.pseudos){ + for (i = parsed.pseudos.length; i--; i){ + var psd = parsed.pseudos[i]; + if (!Selectors.Filters.byPseudo(item, psd.parser, psd.argument, local)) return false; + } + } + return true; + }, + + getByTagAndID: function(ctx, tag, id){ + if (id){ + var item = (ctx.getElementById) ? ctx.getElementById(id, true) : Element.getElementById(ctx, id, true); + return (item && Selectors.Filters.byTag(item, tag)) ? [item] : []; + } else { + return ctx.getElementsByTagName(tag); + } + }, + + search: function(self, expression, local){ + var splitters = []; + + var selectors = expression.trim().replace(Selectors.RegExps.splitter, function(m0, m1, m2){ + splitters.push(m1); + return ':)' + m2; + }).split(':)'); + + var items, filtered, item; + + for (var i = 0, l = selectors.length; i < l; i++){ + + var selector = selectors[i]; + + if (i == 0 && Selectors.RegExps.quick.test(selector)){ + items = self.getElementsByTagName(selector); + continue; + } + + var splitter = splitters[i - 1]; + + var tagid = Selectors.Utils.parseTagAndID(selector); + var tag = tagid[0], id = tagid[1]; + + if (i == 0){ + items = Selectors.Utils.getByTagAndID(self, tag, id); + } else { + var uniques = {}, found = []; + for (var j = 0, k = items.length; j < k; j++) found = Selectors.Getters[splitter](found, items[j], tag, id, uniques); + items = found; + } + + var parsed = Selectors.Utils.parseSelector(selector); + + if (parsed){ + filtered = []; + for (var m = 0, n = items.length; m < n; m++){ + item = items[m]; + if (Selectors.Utils.filter(item, parsed, local)) filtered.push(item); + } + items = filtered; + } + + } + + return items; + + } + +}; + +Selectors.Getters = { + + ' ': function(found, self, tag, id, uniques){ + var items = Selectors.Utils.getByTagAndID(self, tag, id); + for (var i = 0, l = items.length; i < l; i++){ + var item = items[i]; + if (Selectors.Utils.chk(item, uniques)) found.push(item); + } + return found; + }, + + '>': function(found, self, tag, id, uniques){ + var children = Selectors.Utils.getByTagAndID(self, tag, id); + for (var i = 0, l = children.length; i < l; i++){ + var child = children[i]; + if (child.parentNode == self && Selectors.Utils.chk(child, uniques)) found.push(child); + } + return found; + }, + + '+': function(found, self, tag, id, uniques){ + while ((self = self.nextSibling)){ + if (self.nodeType == 1){ + if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self); + break; + } + } + return found; + }, + + '~': function(found, self, tag, id, uniques){ + while ((self = self.nextSibling)){ + if (self.nodeType == 1){ + if (!Selectors.Utils.chk(self, uniques)) break; + if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self); + } + } + return found; + } + +}; + +Selectors.Filters = { + + byTag: function(self, tag){ + return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag)); + }, + + byID: function(self, id){ + return (!id || (self.id && self.id == id)); + }, + + byClass: function(self, klass){ + return (self.className && self.className.contains(klass, ' ')); + }, + + byPseudo: function(self, parser, argument, local){ + return parser.call(self, argument, local); + }, + + byAttribute: function(self, name, operator, value){ + var result = Element.prototype.getProperty.call(self, name); + if (!result) return (operator == '!='); + if (!operator || value == undefined) return true; + switch (operator){ + case '=': return (result == value); + case '*=': return (result.contains(value)); + case '^=': return (result.substr(0, value.length) == value); + case '$=': return (result.substr(result.length - value.length) == value); + case '!=': return (result != value); + case '~=': return result.contains(value, ' '); + case '|=': return result.contains(value, '-'); + } + return false; + } + +}; + +Selectors.Pseudo = new Hash({ + + // w3c pseudo selectors + + checked: function(){ + return this.checked; + }, + + empty: function(){ + return !(this.innerText || this.textContent || '').length; + }, + + not: function(selector){ + return !Element.match(this, selector); + }, + + contains: function(text){ + return (this.innerText || this.textContent || '').contains(text); + }, + + 'first-child': function(){ + return Selectors.Pseudo.index.call(this, 0); + }, + + 'last-child': function(){ + var element = this; + while ((element = element.nextSibling)){ + if (element.nodeType == 1) return false; + } + return true; + }, + + 'only-child': function(){ + var prev = this; + while ((prev = prev.previousSibling)){ + if (prev.nodeType == 1) return false; + } + var next = this; + while ((next = next.nextSibling)){ + if (next.nodeType == 1) return false; + } + return true; + }, + + 'nth-child': function(argument, local){ + argument = (argument == undefined) ? 'n' : argument; + var parsed = Selectors.Utils.parseNthArgument(argument); + if (parsed.special != 'n') return Selectors.Pseudo[parsed.special].call(this, parsed.a, local); + var count = 0; + local.positions = local.positions || {}; + var uid = $uid(this); + if (!local.positions[uid]){ + var self = this; + while ((self = self.previousSibling)){ + if (self.nodeType != 1) continue; + count ++; + var position = local.positions[$uid(self)]; + if (position != undefined){ + count = position + count; + break; + } + } + local.positions[uid] = count; + } + return (local.positions[uid] % parsed.a == parsed.b); + }, + + // custom pseudo selectors + + index: function(index){ + var element = this, count = 0; + while ((element = element.previousSibling)){ + if (element.nodeType == 1 && ++count > index) return false; + } + return (count == index); + }, + + even: function(argument, local){ + return Selectors.Pseudo['nth-child'].call(this, '2n+1', local); + }, + + odd: function(argument, local){ + return Selectors.Pseudo['nth-child'].call(this, '2n', local); + } + +}); + + +/* +Script: Domready.js + Contains the domready custom event. + +License: + MIT-style license. +*/ + +Element.Events.domready = { + + onAdd: function(fn){ + if (Browser.loaded) fn.call(this); + } + +}; + +(function(){ + + var domready = function(){ + if (Browser.loaded) return; + Browser.loaded = true; + window.fireEvent('domready'); + document.fireEvent('domready'); + }; + + if (Browser.Engine.trident){ + var temp = document.createElement('div'); + (function(){ + ($try(function(){ + temp.doScroll('left'); + return $(temp).inject(document.body).set('html', 'temp').dispose(); + })) ? domready() : arguments.callee.delay(50); + })(); + } else if (Browser.Engine.webkit && Browser.Engine.version < 525){ + (function(){ + (['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50); + })(); + } else { + window.addEvent('load', domready); + document.addEvent('DOMContentLoaded', domready); + } + +})(); + + +/* +Script: JSON.js + JSON encoder and decoder. + +License: + MIT-style license. + +See Also: + +*/ + +var JSON = new Hash({ + + $specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}, + + $replaceChars: function(chr){ + return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16); + }, + + encode: function(obj){ + switch ($type(obj)){ + case 'string': + return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"'; + case 'array': + return '[' + String(obj.map(JSON.encode).filter($defined)) + ']'; + case 'object': case 'hash': + var string = []; + Hash.each(obj, function(value, key){ + var json = JSON.encode(value); + if (json) string.push(JSON.encode(key) + ':' + json); + }); + return '{' + string + '}'; + case 'number': case 'boolean': return String(obj); + case false: return 'null'; + } + return null; + }, + + decode: function(string, secure){ + if ($type(string) != 'string' || !string.length) return null; + if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null; + return eval('(' + string + ')'); + } + +}); + +Native.implement([Hash, Array, String, Number], { + + toJSON: function(){ + return JSON.encode(this); + } + +}); + + +/* +Script: Cookie.js + Class for creating, loading, and saving browser Cookies. + +License: + MIT-style license. + +Credits: + Based on the functions by Peter-Paul Koch (http://quirksmode.org). +*/ + +var Cookie = new Class({ + + Implements: Options, + + options: { + path: false, + domain: false, + duration: false, + secure: false, + document: document + }, + + initialize: function(key, options){ + this.key = key; + this.setOptions(options); + }, + + write: function(value){ + value = encodeURIComponent(value); + if (this.options.domain) value += '; domain=' + this.options.domain; + if (this.options.path) value += '; path=' + this.options.path; + if (this.options.duration){ + var date = new Date(); + date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (this.options.secure) value += '; secure'; + this.options.document.cookie = this.key + '=' + value; + return this; + }, + + read: function(){ + var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); + return (value) ? decodeURIComponent(value[1]) : null; + }, + + dispose: function(){ + new Cookie(this.key, $merge(this.options, {duration: -1})).write(''); + return this; + } + +}); + +Cookie.write = function(key, value, options){ + return new Cookie(key, options).write(value); +}; + +Cookie.read = function(key){ + return new Cookie(key).read(); +}; + +Cookie.dispose = function(key, options){ + return new Cookie(key, options).dispose(); +}; + + +/* +Script: Swiff.js + Wrapper for embedding SWF movies. Supports (and fixes) External Interface Communication. + +License: + MIT-style license. + +Credits: + Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject. +*/ + +var Swiff = new Class({ + + Implements: [Options], + + options: { + id: null, + height: 1, + width: 1, + container: null, + properties: {}, + params: { + quality: 'high', + allowScriptAccess: 'always', + wMode: 'transparent', + swLiveConnect: true + }, + callBacks: {}, + vars: {} + }, + + toElement: function(){ + return this.object; + }, + + initialize: function(path, options){ + this.instance = 'Swiff_' + $time(); + + this.setOptions(options); + options = this.options; + var id = this.id = options.id || this.instance; + var container = $(options.container); + + Swiff.CallBacks[this.instance] = {}; + + var params = options.params, vars = options.vars, callBacks = options.callBacks; + var properties = $extend({height: options.height, width: options.width}, options.properties); + + var self = this; + + for (var callBack in callBacks){ + Swiff.CallBacks[this.instance][callBack] = (function(option){ + return function(){ + return option.apply(self.object, arguments); + }; + })(callBacks[callBack]); + vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack; + } + + params.flashVars = Hash.toQueryString(vars); + if (Browser.Engine.trident){ + properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + params.movie = path; + } else { + properties.type = 'application/x-shockwave-flash'; + properties.data = path; + } + var build = ''; + } + build += ''; + this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild; + }, + + replaces: function(element){ + element = $(element, true); + element.parentNode.replaceChild(this.toElement(), element); + return this; + }, + + inject: function(element){ + $(element, true).appendChild(this.toElement()); + return this; + }, + + remote: function(){ + return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments)); + } + +}); + +Swiff.CallBacks = {}; + +Swiff.remote = function(obj, fn){ + var rs = obj.CallFunction('' + __flash__argumentsToXML(arguments, 2) + ''); + return eval(rs); +}; + + +/* +Script: Fx.js + Contains the basic animation logic to be extended by all other Fx Classes. + +License: + MIT-style license. +*/ + +var Fx = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onStart: $empty, + onCancel: $empty, + onComplete: $empty, + */ + fps: 50, + unit: false, + duration: 500, + link: 'ignore' + }, + + initialize: function(options){ + this.subject = this.subject || this; + this.setOptions(options); + this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt(); + var wait = this.options.wait; + if (wait === false) this.options.link = 'cancel'; + }, + + getTransition: function(){ + return function(p){ + return -(Math.cos(Math.PI * p) - 1) / 2; + }; + }, + + step: function(){ + var time = $time(); + if (time < this.time + this.options.duration){ + var delta = this.transition((time - this.time) / this.options.duration); + this.set(this.compute(this.from, this.to, delta)); + } else { + this.set(this.compute(this.from, this.to, 1)); + this.complete(); + } + }, + + set: function(now){ + return now; + }, + + compute: function(from, to, delta){ + return Fx.compute(from, to, delta); + }, + + check: function(caller){ + if (!this.timer) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(caller.bind(this, Array.slice(arguments, 1))); return false; + } + return false; + }, + + start: function(from, to){ + if (!this.check(arguments.callee, from, to)) return this; + this.from = from; + this.to = to; + this.time = 0; + this.transition = this.getTransition(); + this.startTimer(); + this.onStart(); + return this; + }, + + complete: function(){ + if (this.stopTimer()) this.onComplete(); + return this; + }, + + cancel: function(){ + if (this.stopTimer()) this.onCancel(); + return this; + }, + + onStart: function(){ + this.fireEvent('start', this.subject); + }, + + onComplete: function(){ + this.fireEvent('complete', this.subject); + if (!this.callChain()) this.fireEvent('chainComplete', this.subject); + }, + + onCancel: function(){ + this.fireEvent('cancel', this.subject).clearChain(); + }, + + pause: function(){ + this.stopTimer(); + return this; + }, + + resume: function(){ + this.startTimer(); + return this; + }, + + stopTimer: function(){ + if (!this.timer) return false; + this.time = $time() - this.time; + this.timer = $clear(this.timer); + return true; + }, + + startTimer: function(){ + if (this.timer) return false; + this.time = $time() - this.time; + this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this); + return true; + } + +}); + +Fx.compute = function(from, to, delta){ + return (to - from) * delta + from; +}; + +Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; + + +/* +Script: Fx.CSS.js + Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. + +License: + MIT-style license. +*/ + +Fx.CSS = new Class({ + + Extends: Fx, + + //prepares the base from/to object + + prepare: function(element, property, values){ + values = $splat(values); + var values1 = values[1]; + if (!$chk(values1)){ + values[1] = values[0]; + values[0] = element.getStyle(property); + } + var parsed = values.map(this.parse); + return {from: parsed[0], to: parsed[1]}; + }, + + //parses a value into an array + + parse: function(value){ + value = $lambda(value)(); + value = (typeof value == 'string') ? value.split(' ') : $splat(value); + return value.map(function(val){ + val = String(val); + var found = false; + Fx.CSS.Parsers.each(function(parser, key){ + if (found) return; + var parsed = parser.parse(val); + if ($chk(parsed)) found = {value: parsed, parser: parser}; + }); + found = found || {value: val, parser: Fx.CSS.Parsers.String}; + return found; + }); + }, + + //computes by a from and to prepared objects, using their parsers. + + compute: function(from, to, delta){ + var computed = []; + (Math.min(from.length, to.length)).times(function(i){ + computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); + }); + computed.$family = {name: 'fx:css:value'}; + return computed; + }, + + //serves the value as settable + + serve: function(value, unit){ + if ($type(value) != 'fx:css:value') value = this.parse(value); + var returned = []; + value.each(function(bit){ + returned = returned.concat(bit.parser.serve(bit.value, unit)); + }); + return returned; + }, + + //renders the change to an element + + render: function(element, property, value, unit){ + element.setStyle(property, this.serve(value, unit)); + }, + + //searches inside the page css to find the values for a selector + + search: function(selector){ + if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; + var to = {}; + Array.each(document.styleSheets, function(sheet, j){ + var href = sheet.href; + if (href && href.contains('://') && !href.contains(document.domain)) return; + var rules = sheet.rules || sheet.cssRules; + Array.each(rules, function(rule, i){ + if (!rule.style) return; + var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ + return m.toLowerCase(); + }) : null; + if (!selectorText || !selectorText.test('^' + selector + '$')) return; + Element.Styles.each(function(value, style){ + if (!rule.style[style] || Element.ShortStyles[style]) return; + value = String(rule.style[style]); + to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value; + }); + }); + }); + return Fx.CSS.Cache[selector] = to; + } + +}); + +Fx.CSS.Cache = {}; + +Fx.CSS.Parsers = new Hash({ + + Color: { + parse: function(value){ + if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); + return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; + }, + compute: function(from, to, delta){ + return from.map(function(value, i){ + return Math.round(Fx.compute(from[i], to[i], delta)); + }); + }, + serve: function(value){ + return value.map(Number); + } + }, + + Number: { + parse: parseFloat, + compute: Fx.compute, + serve: function(value, unit){ + return (unit) ? value + unit : value; + } + }, + + String: { + parse: $lambda(false), + compute: $arguments(1), + serve: $arguments(0) + } + +}); + + +/* +Script: Fx.Tween.js + Formerly Fx.Style, effect to transition any CSS property for an element. + +License: + MIT-style license. +*/ + +Fx.Tween = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = $(element); + this.parent(options); + }, + + set: function(property, now){ + if (arguments.length == 1){ + now = property; + property = this.property || this.options.property; + } + this.render(this.element, property, now, this.options.unit); + return this; + }, + + start: function(property, from, to){ + if (!this.check(arguments.callee, property, from, to)) return this; + var args = Array.flatten(arguments); + this.property = this.options.property || args.shift(); + var parsed = this.prepare(this.element, this.property, args); + return this.parent(parsed.from, parsed.to); + } + +}); + +Element.Properties.tween = { + + set: function(options){ + var tween = this.retrieve('tween'); + if (tween) tween.cancel(); + return this.eliminate('tween').store('tween:options', $extend({link: 'cancel'}, options)); + }, + + get: function(options){ + if (options || !this.retrieve('tween')){ + if (options || !this.retrieve('tween:options')) this.set('tween', options); + this.store('tween', new Fx.Tween(this, this.retrieve('tween:options'))); + } + return this.retrieve('tween'); + } + +}; + +Element.implement({ + + tween: function(property, from, to){ + this.get('tween').start(arguments); + return this; + }, + + fade: function(how){ + var fade = this.get('tween'), o = 'opacity', toggle; + how = $pick(how, 'toggle'); + switch (how){ + case 'in': fade.start(o, 1); break; + case 'out': fade.start(o, 0); break; + case 'show': fade.set(o, 1); break; + case 'hide': fade.set(o, 0); break; + case 'toggle': + var flag = this.retrieve('fade:flag', this.get('opacity') == 1); + fade.start(o, (flag) ? 0 : 1); + this.store('fade:flag', !flag); + toggle = true; + break; + default: fade.start(o, arguments); + } + if (!toggle) this.eliminate('fade:flag'); + return this; + }, + + highlight: function(start, end){ + if (!end){ + end = this.retrieve('highlight:original', this.getStyle('background-color')); + end = (end == 'transparent') ? '#fff' : end; + } + var tween = this.get('tween'); + tween.start('background-color', start || '#ffff88', end).chain(function(){ + this.setStyle('background-color', this.retrieve('highlight:original')); + tween.callChain(); + }.bind(this)); + return this; + } + +}); + + +/* +Script: Fx.Morph.js + Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules. + +License: + MIT-style license. +*/ + +Fx.Morph = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = $(element); + this.parent(options); + }, + + set: function(now){ + if (typeof now == 'string') now = this.search(now); + for (var p in now) this.render(this.element, p, now[p], this.options.unit); + return this; + }, + + compute: function(from, to, delta){ + var now = {}; + for (var p in from) now[p] = this.parent(from[p], to[p], delta); + return now; + }, + + start: function(properties){ + if (!this.check(arguments.callee, properties)) return this; + if (typeof properties == 'string') properties = this.search(properties); + var from = {}, to = {}; + for (var p in properties){ + var parsed = this.prepare(this.element, p, properties[p]); + from[p] = parsed.from; + to[p] = parsed.to; + } + return this.parent(from, to); + } + +}); + +Element.Properties.morph = { + + set: function(options){ + var morph = this.retrieve('morph'); + if (morph) morph.cancel(); + return this.eliminate('morph').store('morph:options', $extend({link: 'cancel'}, options)); + }, + + get: function(options){ + if (options || !this.retrieve('morph')){ + if (options || !this.retrieve('morph:options')) this.set('morph', options); + this.store('morph', new Fx.Morph(this, this.retrieve('morph:options'))); + } + return this.retrieve('morph'); + } + +}; + +Element.implement({ + + morph: function(props){ + this.get('morph').start(props); + return this; + } + +}); + + +/* +Script: Fx.Transitions.js + Contains a set of advanced transitions to be used with any of the Fx Classes. + +License: + MIT-style license. + +Credits: + Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. +*/ + +Fx.implement({ + + getTransition: function(){ + var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; + if (typeof trans == 'string'){ + var data = trans.split(':'); + trans = Fx.Transitions; + trans = trans[data[0]] || trans[data[0].capitalize()]; + if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; + } + return trans; + } + +}); + +Fx.Transition = function(transition, params){ + params = $splat(params); + return $extend(transition, { + easeIn: function(pos){ + return transition(pos, params); + }, + easeOut: function(pos){ + return 1 - transition(1 - pos, params); + }, + easeInOut: function(pos){ + return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2; + } + }); +}; + +Fx.Transitions = new Hash({ + + linear: $arguments(0) + +}); + +Fx.Transitions.extend = function(transitions){ + for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); +}; + +Fx.Transitions.extend({ + + Pow: function(p, x){ + return Math.pow(p, x[0] || 6); + }, + + Expo: function(p){ + return Math.pow(2, 8 * (p - 1)); + }, + + Circ: function(p){ + return 1 - Math.sin(Math.acos(p)); + }, + + Sine: function(p){ + return 1 - Math.sin((1 - p) * Math.PI / 2); + }, + + Back: function(p, x){ + x = x[0] || 1.618; + return Math.pow(p, 2) * ((x + 1) * p - x); + }, + + Bounce: function(p){ + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2){ + if (p >= (7 - 4 * a) / 11){ + value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + Elastic: function(p, x){ + return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3); + } + +}); + +['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ + Fx.Transitions[transition] = new Fx.Transition(function(p){ + return Math.pow(p, [i + 2]); + }); +}); + + +/* +Script: Request.js + Powerful all purpose Request Class. Uses XMLHTTPRequest. + +License: + MIT-style license. +*/ + +var Request = new Class({ + + Implements: [Chain, Events, Options], + + options: {/* + onRequest: $empty, + onComplete: $empty, + onCancel: $empty, + onSuccess: $empty, + onFailure: $empty, + onException: $empty,*/ + url: '', + data: '', + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }, + async: true, + format: false, + method: 'post', + link: 'ignore', + isSuccess: null, + emulation: true, + urlEncoded: true, + encoding: 'utf-8', + evalScripts: false, + evalResponse: false + }, + + initialize: function(options){ + this.xhr = new Browser.Request(); + this.setOptions(options); + this.options.isSuccess = this.options.isSuccess || this.isSuccess; + this.headers = new Hash(this.options.headers); + }, + + onStateChange: function(){ + if (this.xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + $try(function(){ + this.status = this.xhr.status; + }.bind(this)); + if (this.options.isSuccess.call(this, this.status)){ + this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML}; + this.success(this.response.text, this.response.xml); + } else { + this.response = {text: null, xml: null}; + this.failure(); + } + this.xhr.onreadystatechange = $empty; + }, + + isSuccess: function(){ + return ((this.status >= 200) && (this.status < 300)); + }, + + processScripts: function(text){ + if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text); + return text.stripScripts(this.options.evalScripts); + }, + + success: function(text, xml){ + this.onSuccess(this.processScripts(text), xml); + }, + + onSuccess: function(){ + this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); + }, + + failure: function(){ + this.onFailure(); + }, + + onFailure: function(){ + this.fireEvent('complete').fireEvent('failure', this.xhr); + }, + + setHeader: function(name, value){ + this.headers.set(name, value); + return this; + }, + + getHeader: function(name){ + return $try(function(){ + return this.xhr.getResponseHeader(name); + }.bind(this)); + }, + + check: function(caller){ + if (!this.running) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(caller.bind(this, Array.slice(arguments, 1))); return false; + } + return false; + }, + + send: function(options){ + if (!this.check(arguments.callee, options)) return this; + this.running = true; + + var type = $type(options); + if (type == 'string' || type == 'element') options = {data: options}; + + var old = this.options; + options = $extend({data: old.data, url: old.url, method: old.method}, options); + var data = options.data, url = options.url, method = options.method; + + switch ($type(data)){ + case 'element': data = $(data).toQueryString(); break; + case 'object': case 'hash': data = Hash.toQueryString(data); + } + + if (this.options.format){ + var format = 'format=' + this.options.format; + data = (data) ? format + '&' + data : format; + } + + if (this.options.emulation && ['put', 'delete'].contains(method)){ + var _method = '_method=' + method; + data = (data) ? _method + '&' + data : _method; + method = 'post'; + } + + if (this.options.urlEncoded && method == 'post'){ + var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; + this.headers.set('Content-type', 'application/x-www-form-urlencoded' + encoding); + } + + if (data && method == 'get'){ + url = url + (url.contains('?') ? '&' : '?') + data; + data = null; + } + + this.xhr.open(method.toUpperCase(), url, this.options.async); + + this.xhr.onreadystatechange = this.onStateChange.bind(this); + + this.headers.each(function(value, key){ + try { + this.xhr.setRequestHeader(key, value); + } catch (e){ + this.fireEvent('exception', [key, value]); + } + }, this); + + this.fireEvent('request'); + this.xhr.send(data); + if (!this.options.async) this.onStateChange(); + return this; + }, + + cancel: function(){ + if (!this.running) return this; + this.running = false; + this.xhr.abort(); + this.xhr.onreadystatechange = $empty; + this.xhr = new Browser.Request(); + this.fireEvent('cancel'); + return this; + } + +}); + +(function(){ + +var methods = {}; +['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ + methods[method] = function(){ + var params = Array.link(arguments, {url: String.type, data: $defined}); + return this.send($extend(params, {method: method.toLowerCase()})); + }; +}); + +Request.implement(methods); + +})(); + +Element.Properties.send = { + + set: function(options){ + var send = this.retrieve('send'); + if (send) send.cancel(); + return this.eliminate('send').store('send:options', $extend({ + data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') + }, options)); + }, + + get: function(options){ + if (options || !this.retrieve('send')){ + if (options || !this.retrieve('send:options')) this.set('send', options); + this.store('send', new Request(this.retrieve('send:options'))); + } + return this.retrieve('send'); + } + +}; + +Element.implement({ + + send: function(url){ + var sender = this.get('send'); + sender.send({data: this, url: url || sender.options.url}); + return this; + } + +}); + + +/* +Script: Request.HTML.js + Extends the basic Request Class with additional methods for interacting with HTML responses. + +License: + MIT-style license. +*/ + +Request.HTML = new Class({ + + Extends: Request, + + options: { + update: false, + evalScripts: true, + filter: false + }, + + processHTML: function(text){ + var match = text.match(/]*>([\s\S]*?)<\/body>/i); + text = (match) ? match[1] : text; + + var container = new Element('div'); + + return $try(function(){ + var root = '' + text + '', doc; + if (Browser.Engine.trident){ + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = false; + doc.loadXML(root); + } else { + doc = new DOMParser().parseFromString(root, 'text/xml'); + } + root = doc.getElementsByTagName('root')[0]; + for (var i = 0, k = root.childNodes.length; i < k; i++){ + var child = Element.clone(root.childNodes[i], true, true); + if (child) container.grab(child); + } + return container; + }) || container.set('html', text); + }, + + success: function(text){ + var options = this.options, response = this.response; + + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + + var temp = this.processHTML(response.html); + + response.tree = temp.childNodes; + response.elements = temp.getElements('*'); + + if (options.filter) response.tree = response.elements.filter(options.filter); + if (options.update) $(options.update).empty().set('html', response.html); + if (options.evalScripts) $exec(response.javascript); + + this.onSuccess(response.tree, response.elements, response.html, response.javascript); + } + +}); + +Element.Properties.load = { + + set: function(options){ + var load = this.retrieve('load'); + if (load) load.cancel(); + return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options)); + }, + + get: function(options){ + if (options || ! this.retrieve('load')){ + if (options || !this.retrieve('load:options')) this.set('load', options); + this.store('load', new Request.HTML(this.retrieve('load:options'))); + } + return this.retrieve('load'); + } + +}; + +Element.implement({ + + load: function(){ + this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type})); + return this; + } + +}); + + +/* +Script: Request.JSON.js + Extends the basic Request Class with additional methods for sending and receiving JSON data. + +License: + MIT-style license. +*/ + +Request.JSON = new Class({ + + Extends: Request, + + options: { + secure: true + }, + + initialize: function(options){ + this.parent(options); + this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'}); + }, + + success: function(text){ + this.response.json = JSON.decode(text, this.options.secure); + this.onSuccess(this.response.json, text); + } + +}); + +//MooTools More, . Copyright (c) 2006-2008 Valerio Proietti, , MIT Style License. + +/* +Script: Fx.Slide.js + Effect to slide an element in and out of view. + +License: + MIT-style license. +*/ + +Fx.Slide = new Class({ + + Extends: Fx, + + options: { + mode: 'vertical' + }, + + initialize: function(element, options){ + this.addEvent('complete', function(){ + this.open = (this.wrapper['offset' + this.layout.capitalize()] != 0); + if (this.open && Browser.Engine.webkit419) this.element.dispose().inject(this.wrapper); + }, true); + this.element = this.subject = $(element); + this.parent(options); + var wrapper = this.element.retrieve('wrapper'); + this.wrapper = wrapper || new Element('div', { + styles: $extend(this.element.getStyles('margin', 'position'), {'overflow': 'hidden'}) + }).wraps(this.element); + this.element.store('wrapper', this.wrapper).setStyle('margin', 0); + this.now = []; + this.open = true; + }, + + vertical: function(){ + this.margin = 'margin-top'; + this.layout = 'height'; + this.offset = this.element.offsetHeight; + }, + + horizontal: function(){ + this.margin = 'margin-left'; + this.layout = 'width'; + this.offset = this.element.offsetWidth; + }, + + set: function(now){ + this.element.setStyle(this.margin, now[0]); + this.wrapper.setStyle(this.layout, now[1]); + return this; + }, + + compute: function(from, to, delta){ + var now = []; + var x = 2; + x.times(function(i){ + now[i] = Fx.compute(from[i], to[i], delta); + }); + return now; + }, + + start: function(how, mode){ + if (!this.check(arguments.callee, how, mode)) return this; + this[mode || this.options.mode](); + var margin = this.element.getStyle(this.margin).toInt(); + var layout = this.wrapper.getStyle(this.layout).toInt(); + var caseIn = [[margin, layout], [0, this.offset]]; + var caseOut = [[margin, layout], [-this.offset, 0]]; + var start; + switch (how){ + case 'in': start = caseIn; break; + case 'out': start = caseOut; break; + case 'toggle': start = (this.wrapper['offset' + this.layout.capitalize()] == 0) ? caseIn : caseOut; + } + return this.parent(start[0], start[1]); + }, + + slideIn: function(mode){ + return this.start('in', mode); + }, + + slideOut: function(mode){ + return this.start('out', mode); + }, + + hide: function(mode){ + this[mode || this.options.mode](); + this.open = false; + return this.set([-this.offset, 0]); + }, + + show: function(mode){ + this[mode || this.options.mode](); + this.open = true; + return this.set([0, this.offset]); + }, + + toggle: function(mode){ + return this.start('toggle', mode); + } + +}); + +Element.Properties.slide = { + + set: function(options){ + var slide = this.retrieve('slide'); + if (slide) slide.cancel(); + return this.eliminate('slide').store('slide:options', $extend({link: 'cancel'}, options)); + }, + + get: function(options){ + if (options || !this.retrieve('slide')){ + if (options || !this.retrieve('slide:options')) this.set('slide', options); + this.store('slide', new Fx.Slide(this, this.retrieve('slide:options'))); + } + return this.retrieve('slide'); + } + +}; + +Element.implement({ + + slide: function(how, mode){ + how = how || 'toggle'; + var slide = this.get('slide'), toggle; + switch (how){ + case 'hide': slide.hide(mode); break; + case 'show': slide.show(mode); break; + case 'toggle': + var flag = this.retrieve('slide:flag', slide.open); + slide[(flag) ? 'slideOut' : 'slideIn'](mode); + this.store('slide:flag', !flag); + toggle = true; + break; + default: slide.start(how, mode); + } + if (!toggle) this.eliminate('slide:flag'); + return this; + } + +}); + + +/* +Script: Fx.Scroll.js + Effect to smoothly scroll any element, including the window. + +License: + MIT-style license. +*/ + +Fx.Scroll = new Class({ + + Extends: Fx, + + options: { + offset: {'x': 0, 'y': 0}, + wheelStops: true + }, + + initialize: function(element, options){ + this.element = this.subject = $(element); + this.parent(options); + var cancel = this.cancel.bind(this, false); + + if ($type(this.element) != 'element') this.element = $(this.element.getDocument().body); + + var stopper = this.element; + + if (this.options.wheelStops){ + this.addEvent('start', function(){ + stopper.addEvent('mousewheel', cancel); + }, true); + this.addEvent('complete', function(){ + stopper.removeEvent('mousewheel', cancel); + }, true); + } + }, + + set: function(){ + var now = Array.flatten(arguments); + this.element.scrollTo(now[0], now[1]); + }, + + compute: function(from, to, delta){ + var now = []; + var x = 2; + x.times(function(i){ + now.push(Fx.compute(from[i], to[i], delta)); + }); + return now; + }, + + start: function(x, y){ + if (!this.check(arguments.callee, x, y)) return this; + var offsetSize = this.element.getSize(), scrollSize = this.element.getScrollSize(); + var scroll = this.element.getScroll(), values = {x: x, y: y}; + for (var z in values){ + var max = scrollSize[z] - offsetSize[z]; + if ($chk(values[z])) values[z] = ($type(values[z]) == 'number') ? values[z].limit(0, max) : max; + else values[z] = scroll[z]; + values[z] += this.options.offset[z]; + } + return this.parent([scroll.x, scroll.y], [values.x, values.y]); + }, + + toTop: function(){ + return this.start(false, 0); + }, + + toLeft: function(){ + return this.start(0, false); + }, + + toRight: function(){ + return this.start('right', false); + }, + + toBottom: function(){ + return this.start(false, 'bottom'); + }, + + toElement: function(el){ + var position = $(el).getPosition(this.element); + return this.start(position.x, position.y); + } + +}); + + +/* +Script: Fx.Elements.js + Effect to change any number of CSS properties of any number of Elements. + +License: + MIT-style license. +*/ + +Fx.Elements = new Class({ + + Extends: Fx.CSS, + + initialize: function(elements, options){ + this.elements = this.subject = $$(elements); + this.parent(options); + }, + + compute: function(from, to, delta){ + var now = {}; + for (var i in from){ + var iFrom = from[i], iTo = to[i], iNow = now[i] = {}; + for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta); + } + return now; + }, + + set: function(now){ + for (var i in now){ + var iNow = now[i]; + for (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit); + } + return this; + }, + + start: function(obj){ + if (!this.check(arguments.callee, obj)) return this; + var from = {}, to = {}; + for (var i in obj){ + var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {}; + for (var p in iProps){ + var parsed = this.prepare(this.elements[i], p, iProps[p]); + iFrom[p] = parsed.from; + iTo[p] = parsed.to; + } + } + return this.parent(from, to); + } + +}); + +/* +Script: Drag.js + The base Drag Class. Can be used to drag and resize Elements using mouse events. + +License: + MIT-style license. +*/ + +var Drag = new Class({ + + Implements: [Events, Options], + + options: {/* + onBeforeStart: $empty, + onStart: $empty, + onDrag: $empty, + onCancel: $empty, + onComplete: $empty,*/ + snap: 6, + unit: 'px', + grid: false, + style: true, + limit: false, + handle: false, + invert: false, + preventDefault: false, + modifiers: {x: 'left', y: 'top'} + }, + + initialize: function(){ + var params = Array.link(arguments, {'options': Object.type, 'element': $defined}); + this.element = $(params.element); + this.document = this.element.getDocument(); + this.setOptions(params.options || {}); + var htype = $type(this.options.handle); + this.handles = (htype == 'array' || htype == 'collection') ? $$(this.options.handle) : $(this.options.handle) || this.element; + this.mouse = {'now': {}, 'pos': {}}; + this.value = {'start': {}, 'now': {}}; + + this.selection = (Browser.Engine.trident) ? 'selectstart' : 'mousedown'; + + this.bound = { + start: this.start.bind(this), + check: this.check.bind(this), + drag: this.drag.bind(this), + stop: this.stop.bind(this), + cancel: this.cancel.bind(this), + eventStop: $lambda(false) + }; + this.attach(); + }, + + attach: function(){ + this.handles.addEvent('mousedown', this.bound.start); + return this; + }, + + detach: function(){ + this.handles.removeEvent('mousedown', this.bound.start); + return this; + }, + + start: function(event){ + if (this.options.preventDefault) event.preventDefault(); + this.fireEvent('beforeStart', this.element); + this.mouse.start = event.page; + var limit = this.options.limit; + this.limit = {'x': [], 'y': []}; + for (var z in this.options.modifiers){ + if (!this.options.modifiers[z]) continue; + if (this.options.style) this.value.now[z] = this.element.getStyle(this.options.modifiers[z]).toInt(); + else this.value.now[z] = this.element[this.options.modifiers[z]]; + if (this.options.invert) this.value.now[z] *= -1; + this.mouse.pos[z] = event.page[z] - this.value.now[z]; + if (limit && limit[z]){ + for (var i = 2; i--; i){ + if ($chk(limit[z][i])) this.limit[z][i] = $lambda(limit[z][i])(); + } + } + } + if ($type(this.options.grid) == 'number') this.options.grid = {'x': this.options.grid, 'y': this.options.grid}; + this.document.addEvents({mousemove: this.bound.check, mouseup: this.bound.cancel}); + this.document.addEvent(this.selection, this.bound.eventStop); + }, + + check: function(event){ + if (this.options.preventDefault) event.preventDefault(); + var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2))); + if (distance > this.options.snap){ + this.cancel(); + this.document.addEvents({ + mousemove: this.bound.drag, + mouseup: this.bound.stop + }); + this.fireEvent('start', this.element).fireEvent('snap', this.element); + } + }, + + drag: function(event){ + if (this.options.preventDefault) event.preventDefault(); + this.mouse.now = event.page; + for (var z in this.options.modifiers){ + if (!this.options.modifiers[z]) continue; + this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z]; + if (this.options.invert) this.value.now[z] *= -1; + if (this.options.limit && this.limit[z]){ + if ($chk(this.limit[z][1]) && (this.value.now[z] > this.limit[z][1])){ + this.value.now[z] = this.limit[z][1]; + } else if ($chk(this.limit[z][0]) && (this.value.now[z] < this.limit[z][0])){ + this.value.now[z] = this.limit[z][0]; + } + } + if (this.options.grid[z]) this.value.now[z] -= (this.value.now[z] % this.options.grid[z]); + if (this.options.style) this.element.setStyle(this.options.modifiers[z], this.value.now[z] + this.options.unit); + else this.element[this.options.modifiers[z]] = this.value.now[z]; + } + this.fireEvent('drag', this.element); + }, + + cancel: function(event){ + this.document.removeEvent('mousemove', this.bound.check); + this.document.removeEvent('mouseup', this.bound.cancel); + if (event){ + this.document.removeEvent(this.selection, this.bound.eventStop); + this.fireEvent('cancel', this.element); + } + }, + + stop: function(event){ + this.document.removeEvent(this.selection, this.bound.eventStop); + this.document.removeEvent('mousemove', this.bound.drag); + this.document.removeEvent('mouseup', this.bound.stop); + if (event) this.fireEvent('complete', this.element); + } + +}); + +Element.implement({ + + makeResizable: function(options){ + return new Drag(this, $merge({modifiers: {'x': 'width', 'y': 'height'}}, options)); + } + +}); + +/* +Script: Drag.Move.js + A Drag extension that provides support for the constraining of draggables to containers and droppables. + +License: + MIT-style license. +*/ + +Drag.Move = new Class({ + + Extends: Drag, + + options: { + droppables: [], + container: false + }, + + initialize: function(element, options){ + this.parent(element, options); + this.droppables = $$(this.options.droppables); + this.container = $(this.options.container); + if (this.container && $type(this.container) != 'element') this.container = $(this.container.getDocument().body); + element = this.element; + + var current = element.getStyle('position'); + var position = (current != 'static') ? current : 'absolute'; + if (element.getStyle('left') == 'auto' || element.getStyle('top') == 'auto') element.position(element.getPosition(element.offsetParent)); + + element.setStyle('position', position); + + this.addEvent('start', function(){ + this.checkDroppables(); + }, true); + }, + + start: function(event){ + if (this.container){ + var el = this.element, cont = this.container, ccoo = cont.getCoordinates(el.offsetParent), cps = {}, ems = {}; + + ['top', 'right', 'bottom', 'left'].each(function(pad){ + cps[pad] = cont.getStyle('padding-' + pad).toInt(); + ems[pad] = el.getStyle('margin-' + pad).toInt(); + }, this); + + var width = el.offsetWidth + ems.left + ems.right, height = el.offsetHeight + ems.top + ems.bottom; + var x = [ccoo.left + cps.left, ccoo.right - cps.right - width]; + var y = [ccoo.top + cps.top, ccoo.bottom - cps.bottom - height]; + + this.options.limit = {x: x, y: y}; + } + this.parent(event); + }, + + checkAgainst: function(el){ + el = el.getCoordinates(); + var now = this.mouse.now; + return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top); + }, + + checkDroppables: function(){ + var overed = this.droppables.filter(this.checkAgainst, this).getLast(); + if (this.overed != overed){ + if (this.overed) this.fireEvent('leave', [this.element, this.overed]); + if (overed){ + this.overed = overed; + this.fireEvent('enter', [this.element, overed]); + } else { + this.overed = null; + } + } + }, + + drag: function(event){ + this.parent(event); + if (this.droppables.length) this.checkDroppables(); + }, + + stop: function(event){ + this.checkDroppables(); + this.fireEvent('drop', [this.element, this.overed]); + this.overed = null; + return this.parent(event); + } + +}); + +Element.implement({ + + makeDraggable: function(options){ + return new Drag.Move(this, options); + } + +}); + + +/* +Script: Hash.Cookie.js + Class for creating, reading, and deleting Cookies in JSON format. + +License: + MIT-style license. +*/ + +Hash.Cookie = new Class({ + + Extends: Cookie, + + options: { + autoSave: true + }, + + initialize: function(name, options){ + this.parent(name, options); + this.load(); + }, + + save: function(){ + var value = JSON.encode(this.hash); + if (!value || value.length > 4096) return false; //cookie would be truncated! + if (value == '{}') this.dispose(); + else this.write(value); + return true; + }, + + load: function(){ + this.hash = new Hash(JSON.decode(this.read(), true)); + return this; + } + +}); + +Hash.Cookie.implement((function(){ + + var methods = {}; + + Hash.each(Hash.prototype, function(method, name){ + methods[name] = function(){ + var value = method.apply(this.hash, arguments); + if (this.options.autoSave) this.save(); + return value; + }; + }); + + return methods; + +})()); + +/* +Script: Color.js + Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa. + +License: + MIT-style license. +*/ + +var Color = new Native({ + + initialize: function(color, type){ + if (arguments.length >= 3){ + type = "rgb"; color = Array.slice(arguments, 0, 3); + } else if (typeof color == 'string'){ + if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true); + else if (color.match(/hsb/)) color = color.hsbToRgb(); + else color = color.hexToRgb(true); + } + type = type || 'rgb'; + switch (type){ + case 'hsb': + var old = color; + color = color.hsbToRgb(); + color.hsb = old; + break; + case 'hex': color = color.hexToRgb(true); break; + } + color.rgb = color.slice(0, 3); + color.hsb = color.hsb || color.rgbToHsb(); + color.hex = color.rgbToHex(); + return $extend(color, this); + } + +}); + +Color.implement({ + + mix: function(){ + var colors = Array.slice(arguments); + var alpha = ($type(colors.getLast()) == 'number') ? colors.pop() : 50; + var rgb = this.slice(); + colors.each(function(color){ + color = new Color(color); + for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha)); + }); + return new Color(rgb, 'rgb'); + }, + + invert: function(){ + return new Color(this.map(function(value){ + return 255 - value; + })); + }, + + setHue: function(value){ + return new Color([value, this.hsb[1], this.hsb[2]], 'hsb'); + }, + + setSaturation: function(percent){ + return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb'); + }, + + setBrightness: function(percent){ + return new Color([this.hsb[0], this.hsb[1], percent], 'hsb'); + } + +}); + +function $RGB(r, g, b){ + return new Color([r, g, b], 'rgb'); +}; + +function $HSB(h, s, b){ + return new Color([h, s, b], 'hsb'); +}; + +function $HEX(hex){ + return new Color(hex, 'hex'); +}; + +Array.implement({ + + rgbToHsb: function(){ + var red = this[0], green = this[1], blue = this[2]; + var hue, saturation, brightness; + var max = Math.max(red, green, blue), min = Math.min(red, green, blue); + var delta = max - min; + brightness = max / 255; + saturation = (max != 0) ? delta / max : 0; + if (saturation == 0){ + hue = 0; + } else { + var rr = (max - red) / delta; + var gr = (max - green) / delta; + var br = (max - blue) / delta; + if (red == max) hue = br - gr; + else if (green == max) hue = 2 + rr - br; + else hue = 4 + gr - rr; + hue /= 6; + if (hue < 0) hue++; + } + return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)]; + }, + + hsbToRgb: function(){ + var br = Math.round(this[2] / 100 * 255); + if (this[1] == 0){ + return [br, br, br]; + } else { + var hue = this[0] % 360; + var f = hue % 60; + var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255); + var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255); + var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255); + switch (Math.floor(hue / 60)){ + case 0: return [br, t, p]; + case 1: return [q, br, p]; + case 2: return [p, br, t]; + case 3: return [p, q, br]; + case 4: return [t, p, br]; + case 5: return [br, p, q]; + } + } + return false; + } + +}); + +String.implement({ + + rgbToHsb: function(){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? hsb.rgbToHsb() : null; + }, + + hsbToRgb: function(){ + var hsb = this.match(/\d{1,3}/g); + return (hsb) ? hsb.hsbToRgb() : null; + } + +}); + + +/* +Script: Group.js + Class for monitoring collections of events + +License: + MIT-style license. +*/ + +var Group = new Class({ + + initialize: function(){ + this.instances = Array.flatten(arguments); + this.events = {}; + this.checker = {}; + }, + + addEvent: function(type, fn){ + this.checker[type] = this.checker[type] || {}; + this.events[type] = this.events[type] || []; + if (this.events[type].contains(fn)) return false; + else this.events[type].push(fn); + this.instances.each(function(instance, i){ + instance.addEvent(type, this.check.bind(this, [type, instance, i])); + }, this); + return this; + }, + + check: function(type, instance, i){ + this.checker[type][i] = true; + var every = this.instances.every(function(current, j){ + return this.checker[type][j] || false; + }, this); + if (!every) return; + this.checker[type] = {}; + this.events[type].each(function(event){ + event.call(this, this.instances, instance); + }, this); + } + +}); + + +/* +Script: Assets.js + Provides methods to dynamically load JavaScript, CSS, and Image files into the document. + +License: + MIT-style license. +*/ + +var Asset = new Hash({ + + javascript: function(source, properties){ + properties = $extend({ + onload: $empty, + document: document, + check: $lambda(true) + }, properties); + + var script = new Element('script', {'src': source, 'type': 'text/javascript'}); + + var load = properties.onload.bind(script), check = properties.check, doc = properties.document; + delete properties.onload; delete properties.check; delete properties.document; + + script.addEvents({ + load: load, + readystatechange: function(){ + if (['loaded', 'complete'].contains(this.readyState)) load(); + } + }).setProperties(properties); + + + if (Browser.Engine.webkit419) var checker = (function(){ + if (!$try(check)) return; + $clear(checker); + load(); + }).periodical(50); + + return script.inject(doc.head); + }, + + css: function(source, properties){ + return new Element('link', $merge({ + 'rel': 'stylesheet', 'media': 'screen', 'type': 'text/css', 'href': source + }, properties)).inject(document.head); + }, + + image: function(source, properties){ + properties = $merge({ + 'onload': $empty, + 'onabort': $empty, + 'onerror': $empty + }, properties); + var image = new Image(); + var element = $(image) || new Element('img'); + ['load', 'abort', 'error'].each(function(name){ + var type = 'on' + name; + var event = properties[type]; + delete properties[type]; + image[type] = function(){ + if (!image) return; + if (!element.parentNode){ + element.width = image.width; + element.height = image.height; + } + image = image.onload = image.onabort = image.onerror = null; + event.delay(1, element, element); + element.fireEvent(name, element, 1); + }; + }); + image.src = element.src = source; + if (image && image.complete) image.onload.delay(1); + return element.setProperties(properties); + }, + + images: function(sources, options){ + options = $merge({ + onComplete: $empty, + onProgress: $empty + }, options); + if (!sources.push) sources = [sources]; + var images = []; + var counter = 0; + sources.each(function(source){ + var img = new Asset.image(source, { + 'onload': function(){ + options.onProgress.call(this, counter, sources.indexOf(source)); + counter++; + if (counter == sources.length) options.onComplete(); + } + }); + images.push(img); + }); + return new Elements(images); + } + +}); + +/* +Script: Sortables.js + Class for creating a drag and drop sorting interface for lists of items. + +License: + MIT-style license. +*/ + +var Sortables = new Class({ + + Implements: [Events, Options], + + options: {/* + onSort: $empty, + onStart: $empty, + onComplete: $empty,*/ + snap: 4, + opacity: 1, + clone: false, + revert: false, + handle: false, + constrain: false + }, + + initialize: function(lists, options){ + this.setOptions(options); + this.elements = []; + this.lists = []; + this.idle = true; + + this.addLists($$($(lists) || lists)); + if (!this.options.clone) this.options.revert = false; + if (this.options.revert) this.effect = new Fx.Morph(null, $merge({duration: 250, link: 'cancel'}, this.options.revert)); + }, + + attach: function(){ + this.addLists(this.lists); + return this; + }, + + detach: function(){ + this.lists = this.removeLists(this.lists); + return this; + }, + + addItems: function(){ + Array.flatten(arguments).each(function(element){ + this.elements.push(element); + var start = element.retrieve('sortables:start', this.start.bindWithEvent(this, element)); + (this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start); + }, this); + return this; + }, + + addLists: function(){ + Array.flatten(arguments).each(function(list){ + this.lists.push(list); + this.addItems(list.getChildren()); + }, this); + return this; + }, + + removeItems: function(){ + var elements = []; + Array.flatten(arguments).each(function(element){ + elements.push(element); + this.elements.erase(element); + var start = element.retrieve('sortables:start'); + (this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start); + }, this); + return $$(elements); + }, + + removeLists: function(){ + var lists = []; + Array.flatten(arguments).each(function(list){ + lists.push(list); + this.lists.erase(list); + this.removeItems(list.getChildren()); + }, this); + return $$(lists); + }, + + getClone: function(event, element){ + if (!this.options.clone) return new Element('div').inject(document.body); + if ($type(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list); + return element.clone(true).setStyles({ + 'margin': '0px', + 'position': 'absolute', + 'visibility': 'hidden', + 'width': element.getStyle('width') + }).inject(this.list).position(element.getPosition(element.getOffsetParent())); + }, + + getDroppables: function(){ + var droppables = this.list.getChildren(); + if (!this.options.constrain) droppables = this.lists.concat(droppables).erase(this.list); + return droppables.erase(this.clone).erase(this.element); + }, + + insert: function(dragging, element){ + var where = 'inside'; + if (this.lists.contains(element)){ + this.list = element; + this.drag.droppables = this.getDroppables(); + } else { + where = this.element.getAllPrevious().contains(element) ? 'before' : 'after'; + } + this.element.inject(element, where); + this.fireEvent('sort', [this.element, this.clone]); + }, + + start: function(event, element){ + if (!this.idle) return; + this.idle = false; + this.element = element; + this.opacity = element.get('opacity'); + this.list = element.getParent(); + this.clone = this.getClone(event, element); + + this.drag = new Drag.Move(this.clone, { + snap: this.options.snap, + container: this.options.constrain && this.element.getParent(), + droppables: this.getDroppables(), + onSnap: function(){ + event.stop(); + this.clone.setStyle('visibility', 'visible'); + this.element.set('opacity', this.options.opacity || 0); + this.fireEvent('start', [this.element, this.clone]); + }.bind(this), + onEnter: this.insert.bind(this), + onCancel: this.reset.bind(this), + onComplete: this.end.bind(this) + }); + + this.clone.inject(this.element, 'before'); + this.drag.start(event); + }, + + end: function(){ + this.drag.detach(); + this.element.set('opacity', this.opacity); + if (this.effect){ + var dim = this.element.getStyles('width', 'height'); + var pos = this.clone.computePosition(this.element.getPosition(this.clone.offsetParent)); + this.effect.element = this.clone; + this.effect.start({ + top: pos.top, + left: pos.left, + width: dim.width, + height: dim.height, + opacity: 0.25 + }).chain(this.reset.bind(this)); + } else { + this.reset(); + } + }, + + reset: function(){ + this.idle = true; + this.clone.destroy(); + this.fireEvent('complete', this.element); + }, + + serialize: function(){ + var params = Array.link(arguments, {modifier: Function.type, index: $defined}); + var serial = this.lists.map(function(list){ + return list.getChildren().map(params.modifier || function(element){ + return element.get('id'); + }, this); + }, this); + + var index = params.index; + if (this.lists.length == 1) index = 0; + return $chk(index) && index >= 0 && index < this.lists.length ? serial[index] : serial; + } + +}); + +/* +Script: Tips.js + Class for creating nice tips that follow the mouse cursor when hovering an element. + +License: + MIT-style license. +*/ + +var Tips = new Class({ + + Implements: [Events, Options], + + options: { + onShow: function(tip){ + tip.setStyle('visibility', 'visible'); + }, + onHide: function(tip){ + tip.setStyle('visibility', 'hidden'); + }, + showDelay: 100, + hideDelay: 100, + className: null, + offsets: {x: 16, y: 16}, + fixed: false + }, + + initialize: function(){ + var params = Array.link(arguments, {options: Object.type, elements: $defined}); + this.setOptions(params.options || null); + + this.tip = new Element('div').inject(document.body); + + if (this.options.className) this.tip.addClass(this.options.className); + + var top = new Element('div', {'class': 'tip-top'}).inject(this.tip); + this.container = new Element('div', {'class': 'tip'}).inject(this.tip); + var bottom = new Element('div', {'class': 'tip-bottom'}).inject(this.tip); + + this.tip.setStyles({position: 'absolute', top: 0, left: 0, visibility: 'hidden'}); + + if (params.elements) this.attach(params.elements); + }, + + attach: function(elements){ + $$(elements).each(function(element){ + var title = element.retrieve('tip:title', element.get('title')); + var text = element.retrieve('tip:text', element.get('rel') || element.get('href')); + var enter = element.retrieve('tip:enter', this.elementEnter.bindWithEvent(this, element)); + var leave = element.retrieve('tip:leave', this.elementLeave.bindWithEvent(this, element)); + element.addEvents({mouseenter: enter, mouseleave: leave}); + if (!this.options.fixed){ + var move = element.retrieve('tip:move', this.elementMove.bindWithEvent(this, element)); + element.addEvent('mousemove', move); + } + element.store('tip:native', element.get('title')); + element.erase('title'); + }, this); + return this; + }, + + detach: function(elements){ + $$(elements).each(function(element){ + element.removeEvent('mouseenter', element.retrieve('tip:enter') || $empty); + element.removeEvent('mouseleave', element.retrieve('tip:leave') || $empty); + element.removeEvent('mousemove', element.retrieve('tip:move') || $empty); + element.eliminate('tip:enter').eliminate('tip:leave').eliminate('tip:move'); + var original = element.retrieve('tip:native'); + if (original) element.set('title', original); + }); + return this; + }, + + elementEnter: function(event, element){ + + $A(this.container.childNodes).each(Element.dispose); + + var title = element.retrieve('tip:title'); + + if (title){ + this.titleElement = new Element('div', {'class': 'tip-title'}).inject(this.container); + this.fill(this.titleElement, title); + } + + var text = element.retrieve('tip:text'); + if (text){ + this.textElement = new Element('div', {'class': 'tip-text'}).inject(this.container); + this.fill(this.textElement, text); + } + + this.timer = $clear(this.timer); + this.timer = this.show.delay(this.options.showDelay, this); + + this.position((!this.options.fixed) ? event : {page: element.getPosition()}); + }, + + elementLeave: function(event){ + $clear(this.timer); + this.timer = this.hide.delay(this.options.hideDelay, this); + }, + + elementMove: function(event){ + this.position(event); + }, + + position: function(event){ + var size = window.getSize(), scroll = window.getScroll(); + var tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight}; + var props = {x: 'left', y: 'top'}; + for (var z in props){ + var pos = event.page[z] + this.options.offsets[z]; + if ((pos + tip[z] - scroll[z]) > size[z]) pos = event.page[z] - this.options.offsets[z] - tip[z]; + this.tip.setStyle(props[z], pos); + } + }, + + fill: function(element, contents){ + (typeof contents == 'string') ? element.set('html', contents) : element.adopt(contents); + }, + + show: function(){ + this.fireEvent('show', this.tip); + }, + + hide: function(){ + this.fireEvent('hide', this.tip); + } + +}); + +/* +Script: SmoothScroll.js + Class for creating a smooth scrolling effect to all internal links on the page. + +License: + MIT-style license. +*/ + +var SmoothScroll = new Class({ + + Extends: Fx.Scroll, + + initialize: function(options, context){ + context = context || document; + var doc = context.getDocument(), win = context.getWindow(); + this.parent(doc, options); + this.links = (this.options.links) ? $$(this.options.links) : $$(doc.links); + var location = win.location.href.match(/^[^#]*/)[0] + '#'; + this.links.each(function(link){ + if (link.href.indexOf(location) != 0) return; + var anchor = link.href.substr(location.length); + if (anchor && $(anchor)) this.useLink(link, anchor); + }, this); + if (!Browser.Engine.webkit419) this.addEvent('complete', function(){ + win.location.hash = this.anchor; + }, true); + }, + + useLink: function(link, anchor){ + link.addEvent('click', function(event){ + this.anchor = anchor; + this.toElement(anchor); + event.stop(); + }.bind(this)); + } + +}); + +/* +Script: Slider.js + Class for creating horizontal and vertical slider controls. + +License: + MIT-style license. +*/ + +var Slider = new Class({ + + Implements: [Events, Options], + + options: {/* + onChange: $empty, + onComplete: $empty,*/ + onTick: function(position){ + if(this.options.snap) position = this.toPosition(this.step); + this.knob.setStyle(this.property, position); + }, + snap: false, + offset: 0, + range: false, + wheel: false, + steps: 100, + mode: 'horizontal' + }, + + initialize: function(element, knob, options){ + this.setOptions(options); + this.element = $(element); + this.knob = $(knob); + this.previousChange = this.previousEnd = this.step = -1; + this.element.addEvent('mousedown', this.clickedElement.bind(this)); + if (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement.bindWithEvent(this)); + var offset, limit = {}, modifiers = {'x': false, 'y': false}; + switch (this.options.mode){ + case 'vertical': + this.axis = 'y'; + this.property = 'top'; + offset = 'offsetHeight'; + break; + case 'horizontal': + this.axis = 'x'; + this.property = 'left'; + offset = 'offsetWidth'; + } + this.half = this.knob[offset] / 2; + this.full = this.element[offset] - this.knob[offset] + (this.options.offset * 2); + this.min = $chk(this.options.range[0]) ? this.options.range[0] : 0; + this.max = $chk(this.options.range[1]) ? this.options.range[1] : this.options.steps; + this.range = this.max - this.min; + this.steps = this.options.steps || this.full; + this.stepSize = Math.abs(this.range) / this.steps; + this.stepWidth = this.stepSize * this.full / Math.abs(this.range) ; + + this.knob.setStyle('position', 'relative').setStyle(this.property, - this.options.offset); + modifiers[this.axis] = this.property; + limit[this.axis] = [- this.options.offset, this.full - this.options.offset]; + this.drag = new Drag(this.knob, { + snap: 0, + limit: limit, + modifiers: modifiers, + onDrag: this.draggedKnob.bind(this), + onStart: this.draggedKnob.bind(this), + onComplete: function(){ + this.draggedKnob(); + this.end(); + }.bind(this) + }); + if (this.options.snap) { + this.drag.options.grid = Math.ceil(this.stepWidth); + this.drag.options.limit[this.axis][1] = this.full; + } + }, + + set: function(step){ + if (!((this.range > 0) ^ (step < this.min))) step = this.min; + if (!((this.range > 0) ^ (step > this.max))) step = this.max; + + this.step = Math.round(step); + this.checkStep(); + this.end(); + this.fireEvent('tick', this.toPosition(this.step)); + return this; + }, + + clickedElement: function(event){ + var dir = this.range < 0 ? -1 : 1; + var position = event.page[this.axis] - this.element.getPosition()[this.axis] - this.half; + position = position.limit(-this.options.offset, this.full -this.options.offset); + + this.step = Math.round(this.min + dir * this.toStep(position)); + this.checkStep(); + this.end(); + this.fireEvent('tick', position); + }, + + scrolledElement: function(event){ + var mode = (this.options.mode == 'horizontal') ? (event.wheel < 0) : (event.wheel > 0); + this.set(mode ? this.step - this.stepSize : this.step + this.stepSize); + event.stop(); + }, + + draggedKnob: function(){ + var dir = this.range < 0 ? -1 : 1; + var position = this.drag.value.now[this.axis]; + position = position.limit(-this.options.offset, this.full -this.options.offset); + this.step = Math.round(this.min + dir * this.toStep(position)); + this.checkStep(); + }, + + checkStep: function(){ + if (this.previousChange != this.step){ + this.previousChange = this.step; + this.fireEvent('change', this.step); + } + }, + + end: function(){ + if (this.previousEnd !== this.step){ + this.previousEnd = this.step; + this.fireEvent('complete', this.step + ''); + } + }, + + toStep: function(position){ + var step = (position + this.options.offset) * this.stepSize / this.full * this.steps; + return this.options.steps ? Math.round(step -= step % this.stepSize) : step; + }, + + toPosition: function(step){ + return (this.full * Math.abs(this.min - step)) / (this.steps * this.stepSize) - this.options.offset; + } + +}); + +/* +Script: Scroller.js + Class which scrolls the contents of any Element (including the window) when the mouse reaches the Element's boundaries. + +License: + MIT-style license. +*/ + +var Scroller = new Class({ + + Implements: [Events, Options], + + options: { + area: 20, + velocity: 1, + onChange: function(x, y){ + this.element.scrollTo(x, y); + } + }, + + initialize: function(element, options){ + this.setOptions(options); + this.element = $(element); + this.listener = ($type(this.element) != 'element') ? $(this.element.getDocument().body) : this.element; + this.timer = null; + this.coord = this.getCoords.bind(this); + }, + + start: function(){ + this.listener.addEvent('mousemove', this.coord); + }, + + stop: function(){ + this.listener.removeEvent('mousemove', this.coord); + this.timer = $clear(this.timer); + }, + + getCoords: function(event){ + this.page = (this.listener.get('tag') == 'body') ? event.client : event.page; + if (!this.timer) this.timer = this.scroll.periodical(50, this); + }, + + scroll: function(){ + var size = this.element.getSize(), scroll = this.element.getScroll(), pos = this.element.getPosition(), change = {'x': 0, 'y': 0}; + for (var z in this.page){ + if (this.page[z] < (this.options.area + pos[z]) && scroll[z] != 0) + change[z] = (this.page[z] - this.options.area - pos[z]) * this.options.velocity; + else if (this.page[z] + this.options.area > (size[z] + pos[z]) && size[z] + size[z] != scroll[z]) + change[z] = (this.page[z] - size[z] + this.options.area - pos[z]) * this.options.velocity; + } + if (change.y || change.x) this.fireEvent('change', [scroll.x + change.x, scroll.y + change.y]); + } + +}); + +/* +Script: Accordion.js + An Fx.Elements extension which allows you to easily create accordion type controls. + +License: + MIT-style license. +*/ + +var Accordion = new Class({ + + Extends: Fx.Elements, + + options: {/* + onActive: $empty, + onBackground: $empty,*/ + display: 0, + show: false, + height: true, + width: false, + opacity: true, + fixedHeight: false, + fixedWidth: false, + wait: false, + alwaysHide: false + }, + + initialize: function(){ + var params = Array.link(arguments, {'container': Element.type, 'options': Object.type, 'togglers': $defined, 'elements': $defined}); + this.parent(params.elements, params.options); + this.togglers = $$(params.togglers); + this.container = $(params.container); + this.previous = -1; + if (this.options.alwaysHide) this.options.wait = true; + if ($chk(this.options.show)){ + this.options.display = false; + this.previous = this.options.show; + } + if (this.options.start){ + this.options.display = false; + this.options.show = false; + } + this.effects = {}; + if (this.options.opacity) this.effects.opacity = 'fullOpacity'; + if (this.options.width) this.effects.width = this.options.fixedWidth ? 'fullWidth' : 'offsetWidth'; + if (this.options.height) this.effects.height = this.options.fixedHeight ? 'fullHeight' : 'scrollHeight'; + for (var i = 0, l = this.togglers.length; i < l; i++) this.addSection(this.togglers[i], this.elements[i]); + this.elements.each(function(el, i){ + if (this.options.show === i){ + this.fireEvent('active', [this.togglers[i], el]); + } else { + for (var fx in this.effects) el.setStyle(fx, 0); + } + }, this); + if ($chk(this.options.display)) this.display(this.options.display); + }, + + addSection: function(toggler, element, pos){ + toggler = $(toggler); + element = $(element); + var test = this.togglers.contains(toggler); + var len = this.togglers.length; + this.togglers.include(toggler); + this.elements.include(element); + if (len && (!test || pos)){ + pos = $pick(pos, len - 1); + toggler.inject(this.togglers[pos], 'before'); + element.inject(toggler, 'after'); + } else if (this.container && !test){ + toggler.inject(this.container); + element.inject(this.container); + } + var idx = this.togglers.indexOf(toggler); + toggler.addEvent('click', this.display.bind(this, idx)); + if (this.options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'}); + if (this.options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'}); + element.fullOpacity = 1; + if (this.options.fixedWidth) element.fullWidth = this.options.fixedWidth; + if (this.options.fixedHeight) element.fullHeight = this.options.fixedHeight; + element.setStyle('overflow', 'hidden'); + if (!test){ + for (var fx in this.effects) element.setStyle(fx, 0); + } + return this; + }, + + display: function(index){ + index = ($type(index) == 'element') ? this.elements.indexOf(index) : index; + if ((this.timer && this.options.wait) || (index === this.previous && !this.options.alwaysHide)) return this; + this.previous = index; + var obj = {}; + this.elements.each(function(el, i){ + obj[i] = {}; + var hide = (i != index) || (this.options.alwaysHide && (el.offsetHeight > 0)); + this.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]); + for (var fx in this.effects) obj[i][fx] = hide ? 0 : el[this.effects[fx]]; + }, this); + return this.start(obj); + } + +}); \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/scripts/mootools.js b/javascript/mif-tree/Demos/assets/scripts/mootools.js new file mode 100755 index 0000000..57c94a7 --- /dev/null +++ b/javascript/mif-tree/Demos/assets/scripts/mootools.js @@ -0,0 +1,4919 @@ +/* +--- + +script: Core.js + +description: The core of MooTools, contains all the base functions and the Native and Hash implementations. Required by all the other scripts. + +license: MIT-style license. + +copyright: Copyright (c) 2006-2008 [Valerio Proietti](http://mad4milk.net/). + +authors: The MooTools production team (http://mootools.net/developers/) + +inspiration: +- Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php) +- Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) + +provides: [Mootools, Native, Hash.base, Array.each, $util] + +... +*/ + +var MooTools = { + 'version': '1.2.4', + 'build': '0d9113241a90b9cd5643b926795852a2026710d4' +}; + +var Native = function(options){ + options = options || {}; + var name = options.name; + var legacy = options.legacy; + var protect = options.protect; + var methods = options.implement; + var generics = options.generics; + var initialize = options.initialize; + var afterImplement = options.afterImplement || function(){}; + var object = initialize || legacy; + generics = generics !== false; + + object.constructor = Native; + object.$family = {name: 'native'}; + if (legacy && initialize) object.prototype = legacy.prototype; + object.prototype.constructor = object; + + if (name){ + var family = name.toLowerCase(); + object.prototype.$family = {name: family}; + Native.typize(object, family); + } + + var add = function(obj, name, method, force){ + if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method; + if (generics) Native.genericize(obj, name, protect); + afterImplement.call(obj, name, method); + return obj; + }; + + object.alias = function(a1, a2, a3){ + if (typeof a1 == 'string'){ + var pa1 = this.prototype[a1]; + if ((a1 = pa1)) return add(this, a2, a1, a3); + } + for (var a in a1) this.alias(a, a1[a], a2); + return this; + }; + + object.implement = function(a1, a2, a3){ + if (typeof a1 == 'string') return add(this, a1, a2, a3); + for (var p in a1) add(this, p, a1[p], a2); + return this; + }; + + if (methods) object.implement(methods); + + return object; +}; + +Native.genericize = function(object, property, check){ + if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){ + var args = Array.prototype.slice.call(arguments); + return object.prototype[property].apply(args.shift(), args); + }; +}; + +Native.implement = function(objects, properties){ + for (var i = 0, l = objects.length; i < l; i++) objects[i].implement(properties); +}; + +Native.typize = function(object, family){ + if (!object.type) object.type = function(item){ + return ($type(item) === family); + }; +}; + +(function(){ + var natives = {'Array': Array, 'Date': Date, 'Function': Function, 'Number': Number, 'RegExp': RegExp, 'String': String}; + for (var n in natives) new Native({name: n, initialize: natives[n], protect: true}); + + var types = {'boolean': Boolean, 'native': Native, 'object': Object}; + for (var t in types) Native.typize(types[t], t); + + var generics = { + 'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"], + 'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"] + }; + for (var g in generics){ + for (var i = generics[g].length; i--;) Native.genericize(natives[g], generics[g][i], true); + } +})(); + +var Hash = new Native({ + + name: 'Hash', + + initialize: function(object){ + if ($type(object) == 'hash') object = $unlink(object.getClean()); + for (var key in object) this[key] = object[key]; + return this; + } + +}); + +Hash.implement({ + + forEach: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this); + } + }, + + getClean: function(){ + var clean = {}; + for (var key in this){ + if (this.hasOwnProperty(key)) clean[key] = this[key]; + } + return clean; + }, + + getLength: function(){ + var length = 0; + for (var key in this){ + if (this.hasOwnProperty(key)) length++; + } + return length; + } + +}); + +Hash.alias('forEach', 'each'); + +Array.implement({ + + forEach: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++) fn.call(bind, this[i], i, this); + } + +}); + +Array.alias('forEach', 'each'); + +function $A(iterable){ + if (iterable.item){ + var l = iterable.length, array = new Array(l); + while (l--) array[l] = iterable[l]; + return array; + } + return Array.prototype.slice.call(iterable); +}; + +function $arguments(i){ + return function(){ + return arguments[i]; + }; +}; + +function $chk(obj){ + return !!(obj || obj === 0); +}; + +function $clear(timer){ + clearTimeout(timer); + clearInterval(timer); + return null; +}; + +function $defined(obj){ + return (obj != undefined); +}; + +function $each(iterable, fn, bind){ + var type = $type(iterable); + ((type == 'arguments' || type == 'collection' || type == 'array') ? Array : Hash).each(iterable, fn, bind); +}; + +function $empty(){}; + +function $extend(original, extended){ + for (var key in (extended || {})) original[key] = extended[key]; + return original; +}; + +function $H(object){ + return new Hash(object); +}; + +function $lambda(value){ + return ($type(value) == 'function') ? value : function(){ + return value; + }; +}; + +function $merge(){ + var args = Array.slice(arguments); + args.unshift({}); + return $mixin.apply(null, args); +}; + +function $mixin(mix){ + for (var i = 1, l = arguments.length; i < l; i++){ + var object = arguments[i]; + if ($type(object) != 'object') continue; + for (var key in object){ + var op = object[key], mp = mix[key]; + mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $mixin(mp, op) : $unlink(op); + } + } + return mix; +}; + +function $pick(){ + for (var i = 0, l = arguments.length; i < l; i++){ + if (arguments[i] != undefined) return arguments[i]; + } + return null; +}; + +function $random(min, max){ + return Math.floor(Math.random() * (max - min + 1) + min); +}; + +function $splat(obj){ + var type = $type(obj); + return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : []; +}; + +var $time = Date.now || function(){ + return +new Date; +}; + +function $try(){ + for (var i = 0, l = arguments.length; i < l; i++){ + try { + return arguments[i](); + } catch(e){} + } + return null; +}; + +function $type(obj){ + if (obj == undefined) return false; + if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name; + if (obj.nodeName){ + switch (obj.nodeType){ + case 1: return 'element'; + case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace'; + } + } else if (typeof obj.length == 'number'){ + if (obj.callee) return 'arguments'; + else if (obj.item) return 'collection'; + } + return typeof obj; +}; + +function $unlink(object){ + var unlinked; + switch ($type(object)){ + case 'object': + unlinked = {}; + for (var p in object) unlinked[p] = $unlink(object[p]); + break; + case 'hash': + unlinked = new Hash(object); + break; + case 'array': + unlinked = []; + for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]); + break; + default: return object; + } + return unlinked; +}; + + +/* +--- + +script: Browser.js + +description: The Browser Core. Contains Browser initialization, Window and Document, and the Browser Hash. + +license: MIT-style license. + +requires: +- /Native +- /$util + +provides: [Browser, Window, Document, $exec] + +... +*/ + +var Browser = $merge({ + + Engine: {name: 'unknown', version: 0}, + + Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()}, + + Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)}, + + Plugins: {}, + + Engines: { + + presto: function(){ + return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); + }, + + trident: function(){ + return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4); + }, + + webkit: function(){ + return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419); + }, + + gecko: function(){ + return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18); + } + + } + +}, Browser || {}); + +Browser.Platform[Browser.Platform.name] = true; + +Browser.detect = function(){ + + for (var engine in this.Engines){ + var version = this.Engines[engine](); + if (version){ + this.Engine = {name: engine, version: version}; + this.Engine[engine] = this.Engine[engine + version] = true; + break; + } + } + + return {name: engine, version: version}; + +}; + +Browser.detect(); + +Browser.Request = function(){ + return $try(function(){ + return new XMLHttpRequest(); + }, function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }, function(){ + return new ActiveXObject('Microsoft.XMLHTTP'); + }); +}; + +Browser.Features.xhr = !!(Browser.Request()); + +Browser.Plugins.Flash = (function(){ + var version = ($try(function(){ + return navigator.plugins['Shockwave Flash'].description; + }, function(){ + return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); + }) || '0 r0').match(/\d+/g); + return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0}; +})(); + +function $exec(text){ + if (!text) return text; + if (window.execScript){ + window.execScript(text); + } else { + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text; + document.head.appendChild(script); + document.head.removeChild(script); + } + return text; +}; + +Native.UID = 1; + +var $uid = (Browser.Engine.trident) ? function(item){ + return (item.uid || (item.uid = [Native.UID++]))[0]; +} : function(item){ + return item.uid || (item.uid = Native.UID++); +}; + +var Window = new Native({ + + name: 'Window', + + legacy: (Browser.Engine.trident) ? null: window.Window, + + initialize: function(win){ + $uid(win); + if (!win.Element){ + win.Element = $empty; + if (Browser.Engine.webkit) win.document.createElement("iframe"); //fixes safari 2 + win.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {}; + } + win.document.window = win; + return $extend(win, Window.Prototype); + }, + + afterImplement: function(property, value){ + window[property] = Window.Prototype[property] = value; + } + +}); + +Window.Prototype = {$family: {name: 'window'}}; + +new Window(window); + +var Document = new Native({ + + name: 'Document', + + legacy: (Browser.Engine.trident) ? null: window.Document, + + initialize: function(doc){ + $uid(doc); + doc.head = doc.getElementsByTagName('head')[0]; + doc.html = doc.getElementsByTagName('html')[0]; + if (Browser.Engine.trident && Browser.Engine.version <= 4) $try(function(){ + doc.execCommand("BackgroundImageCache", false, true); + }); + if (Browser.Engine.trident) doc.window.attachEvent('onunload', function(){ + doc.window.detachEvent('onunload', arguments.callee); + doc.head = doc.html = doc.window = null; + }); + return $extend(doc, Document.Prototype); + }, + + afterImplement: function(property, value){ + document[property] = Document.Prototype[property] = value; + } + +}); + +Document.Prototype = {$family: {name: 'document'}}; + +new Document(document); + + +/* +--- + +script: Array.js + +description: Contains Array Prototypes like each, contains, and erase. + +license: MIT-style license. + +requires: +- /$util +- /Array.each + +provides: [Array] + +... +*/ + +Array.implement({ + + every: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (!fn.call(bind, this[i], i, this)) return false; + } + return true; + }, + + filter: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if (fn.call(bind, this[i], i, this)) results.push(this[i]); + } + return results; + }, + + clean: function(){ + return this.filter($defined); + }, + + indexOf: function(item, from){ + var len = this.length; + for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){ + if (this[i] === item) return i; + } + return -1; + }, + + map: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++) results[i] = fn.call(bind, this[i], i, this); + return results; + }, + + some: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (fn.call(bind, this[i], i, this)) return true; + } + return false; + }, + + associate: function(keys){ + var obj = {}, length = Math.min(this.length, keys.length); + for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; + return obj; + }, + + link: function(object){ + var result = {}; + for (var i = 0, l = this.length; i < l; i++){ + for (var key in object){ + if (object[key](this[i])){ + result[key] = this[i]; + delete object[key]; + break; + } + } + } + return result; + }, + + contains: function(item, from){ + return this.indexOf(item, from) != -1; + }, + + extend: function(array){ + for (var i = 0, j = array.length; i < j; i++) this.push(array[i]); + return this; + }, + + getLast: function(){ + return (this.length) ? this[this.length - 1] : null; + }, + + getRandom: function(){ + return (this.length) ? this[$random(0, this.length - 1)] : null; + }, + + include: function(item){ + if (!this.contains(item)) this.push(item); + return this; + }, + + combine: function(array){ + for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); + return this; + }, + + erase: function(item){ + for (var i = this.length; i--; i){ + if (this[i] === item) this.splice(i, 1); + } + return this; + }, + + empty: function(){ + this.length = 0; + return this; + }, + + flatten: function(){ + var array = []; + for (var i = 0, l = this.length; i < l; i++){ + var type = $type(this[i]); + if (!type) continue; + array = array.concat((type == 'array' || type == 'collection' || type == 'arguments') ? Array.flatten(this[i]) : this[i]); + } + return array; + }, + + hexToRgb: function(array){ + if (this.length != 3) return null; + var rgb = this.map(function(value){ + if (value.length == 1) value += value; + return value.toInt(16); + }); + return (array) ? rgb : 'rgb(' + rgb + ')'; + }, + + rgbToHex: function(array){ + if (this.length < 3) return null; + if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; + var hex = []; + for (var i = 0; i < 3; i++){ + var bit = (this[i] - 0).toString(16); + hex.push((bit.length == 1) ? '0' + bit : bit); + } + return (array) ? hex : '#' + hex.join(''); + } + +}); + + +/* +--- + +script: Function.js + +description: Contains Function Prototypes like create, bind, pass, and delay. + +license: MIT-style license. + +requires: +- /Native +- /$util + +provides: [Function] + +... +*/ + +Function.implement({ + + extend: function(properties){ + for (var property in properties) this[property] = properties[property]; + return this; + }, + + create: function(options){ + var self = this; + options = options || {}; + return function(event){ + var args = options.arguments; + args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0); + if (options.event) args = [event || window.event].extend(args); + var returns = function(){ + return self.apply(options.bind || null, args); + }; + if (options.delay) return setTimeout(returns, options.delay); + if (options.periodical) return setInterval(returns, options.periodical); + if (options.attempt) return $try(returns); + return returns(); + }; + }, + + run: function(args, bind){ + return this.apply(bind, $splat(args)); + }, + + pass: function(args, bind){ + return this.create({bind: bind, arguments: args}); + }, + + bind: function(bind, args){ + return this.create({bind: bind, arguments: args}); + }, + + bindWithEvent: function(bind, args){ + return this.create({bind: bind, arguments: args, event: true}); + }, + + attempt: function(args, bind){ + return this.create({bind: bind, arguments: args, attempt: true})(); + }, + + delay: function(delay, bind, args){ + return this.create({bind: bind, arguments: args, delay: delay})(); + }, + + periodical: function(periodical, bind, args){ + return this.create({bind: bind, arguments: args, periodical: periodical})(); + } + +}); + + +/* +--- + +script: Number.js + +description: Contains Number Prototypes like limit, round, times, and ceil. + +license: MIT-style license. + +requires: +- /Native +- /$util + +provides: [Number] + +... +*/ + +Number.implement({ + + limit: function(min, max){ + return Math.min(max, Math.max(min, this)); + }, + + round: function(precision){ + precision = Math.pow(10, precision || 0); + return Math.round(this * precision) / precision; + }, + + times: function(fn, bind){ + for (var i = 0; i < this; i++) fn.call(bind, i, this); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + } + +}); + +Number.alias('times', 'each'); + +(function(math){ + var methods = {}; + math.each(function(name){ + if (!Number[name]) methods[name] = function(){ + return Math[name].apply(null, [this].concat($A(arguments))); + }; + }); + Number.implement(methods); +})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); + + +/* +--- + +script: String.js + +description: Contains String Prototypes like camelCase, capitalize, test, and toInt. + +license: MIT-style license. + +requires: +- /Native + +provides: [String] + +... +*/ + +String.implement({ + + test: function(regex, params){ + return ((typeof regex == 'string') ? new RegExp(regex, params) : regex).test(this); + }, + + contains: function(string, separator){ + return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1; + }, + + trim: function(){ + return this.replace(/^\s+|\s+$/g, ''); + }, + + clean: function(){ + return this.replace(/\s+/g, ' ').trim(); + }, + + camelCase: function(){ + return this.replace(/-\D/g, function(match){ + return match.charAt(1).toUpperCase(); + }); + }, + + hyphenate: function(){ + return this.replace(/[A-Z]/g, function(match){ + return ('-' + match.charAt(0).toLowerCase()); + }); + }, + + capitalize: function(){ + return this.replace(/\b[a-z]/g, function(match){ + return match.toUpperCase(); + }); + }, + + escapeRegExp: function(){ + return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + hexToRgb: function(array){ + var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); + return (hex) ? hex.slice(1).hexToRgb(array) : null; + }, + + rgbToHex: function(array){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHex(array) : null; + }, + + stripScripts: function(option){ + var scripts = ''; + var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(){ + scripts += arguments[1] + '\n'; + return ''; + }); + if (option === true) $exec(scripts); + else if ($type(option) == 'function') option(scripts, text); + return text; + }, + + substitute: function(object, regexp){ + return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ + if (match.charAt(0) == '\\') return match.slice(1); + return (object[name] != undefined) ? object[name] : ''; + }); + } + +}); + + +/* +--- + +script: Hash.js + +description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects. + +license: MIT-style license. + +requires: +- /Hash.base + +provides: [Hash] + +... +*/ + +Hash.implement({ + + has: Object.prototype.hasOwnProperty, + + keyOf: function(value){ + for (var key in this){ + if (this.hasOwnProperty(key) && this[key] === value) return key; + } + return null; + }, + + hasValue: function(value){ + return (Hash.keyOf(this, value) !== null); + }, + + extend: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.set(this, key, value); + }, this); + return this; + }, + + combine: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.include(this, key, value); + }, this); + return this; + }, + + erase: function(key){ + if (this.hasOwnProperty(key)) delete this[key]; + return this; + }, + + get: function(key){ + return (this.hasOwnProperty(key)) ? this[key] : null; + }, + + set: function(key, value){ + if (!this[key] || this.hasOwnProperty(key)) this[key] = value; + return this; + }, + + empty: function(){ + Hash.each(this, function(value, key){ + delete this[key]; + }, this); + return this; + }, + + include: function(key, value){ + if (this[key] == undefined) this[key] = value; + return this; + }, + + map: function(fn, bind){ + var results = new Hash; + Hash.each(this, function(value, key){ + results.set(key, fn.call(bind, value, key, this)); + }, this); + return results; + }, + + filter: function(fn, bind){ + var results = new Hash; + Hash.each(this, function(value, key){ + if (fn.call(bind, value, key, this)) results.set(key, value); + }, this); + return results; + }, + + every: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key) && !fn.call(bind, this[key], key)) return false; + } + return true; + }, + + some: function(fn, bind){ + for (var key in this){ + if (this.hasOwnProperty(key) && fn.call(bind, this[key], key)) return true; + } + return false; + }, + + getKeys: function(){ + var keys = []; + Hash.each(this, function(value, key){ + keys.push(key); + }); + return keys; + }, + + getValues: function(){ + var values = []; + Hash.each(this, function(value){ + values.push(value); + }); + return values; + }, + + toQueryString: function(base){ + var queryString = []; + Hash.each(this, function(value, key){ + if (base) key = base + '[' + key + ']'; + var result; + switch ($type(value)){ + case 'object': result = Hash.toQueryString(value, key); break; + case 'array': + var qs = {}; + value.each(function(val, i){ + qs[i] = val; + }); + result = Hash.toQueryString(qs, key); + break; + default: result = key + '=' + encodeURIComponent(value); + } + if (value != undefined) queryString.push(result); + }); + + return queryString.join('&'); + } + +}); + +Hash.alias({keyOf: 'indexOf', hasValue: 'contains'}); + + +/* +--- + +script: Event.js + +description: Contains the Event Class, to make the event object cross-browser. + +license: MIT-style license. + +requires: +- /Window +- /Document +- /Hash +- /Array +- /Function +- /String + +provides: [Event] + +... +*/ + +var Event = new Native({ + + name: 'Event', + + initialize: function(event, win){ + win = win || window; + var doc = win.document; + event = event || win.event; + if (event.$extended) return event; + this.$extended = true; + var type = event.type; + var target = event.target || event.srcElement; + while (target && target.nodeType == 3) target = target.parentNode; + + if (type.test(/key/)){ + var code = event.which || event.keyCode; + var key = Event.Keys.keyOf(code); + if (type == 'keydown'){ + var fKey = code - 111; + if (fKey > 0 && fKey < 13) key = 'f' + fKey; + } + key = key || String.fromCharCode(code).toLowerCase(); + } else if (type.match(/(click|mouse|menu)/i)){ + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + var page = { + x: event.pageX || event.clientX + doc.scrollLeft, + y: event.pageY || event.clientY + doc.scrollTop + }; + var client = { + x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX, + y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY + }; + if (type.match(/DOMMouseScroll|mousewheel/)){ + var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; + } + var rightClick = (event.which == 3) || (event.button == 2); + var related = null; + if (type.match(/over|out/)){ + switch (type){ + case 'mouseover': related = event.relatedTarget || event.fromElement; break; + case 'mouseout': related = event.relatedTarget || event.toElement; + } + if (!(function(){ + while (related && related.nodeType == 3) related = related.parentNode; + return true; + }).create({attempt: Browser.Engine.gecko})()) related = false; + } + } + + return $extend(this, { + event: event, + type: type, + + page: page, + client: client, + rightClick: rightClick, + + wheel: wheel, + + relatedTarget: related, + target: target, + + code: code, + key: key, + + shift: event.shiftKey, + control: event.ctrlKey, + alt: event.altKey, + meta: event.metaKey + }); + } + +}); + +Event.Keys = new Hash({ + 'enter': 13, + 'up': 38, + 'down': 40, + 'left': 37, + 'right': 39, + 'esc': 27, + 'space': 32, + 'backspace': 8, + 'tab': 9, + 'delete': 46 +}); + +Event.implement({ + + stop: function(){ + return this.stopPropagation().preventDefault(); + }, + + stopPropagation: function(){ + if (this.event.stopPropagation) this.event.stopPropagation(); + else this.event.cancelBubble = true; + return this; + }, + + preventDefault: function(){ + if (this.event.preventDefault) this.event.preventDefault(); + else this.event.returnValue = false; + return this; + } + +}); + + +/* +--- + +script: Class.js + +description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. + +license: MIT-style license. + +requires: +- /$util +- /Native +- /Array +- /String +- /Function +- /Number +- /Hash + +provides: [Class] + +... +*/ + +function Class(params){ + + if (params instanceof Function) params = {initialize: params}; + + var newClass = function(){ + Object.reset(this); + if (newClass._prototyping) return this; + this._current = $empty; + var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; + delete this._current; delete this.caller; + return value; + }.extend(this); + + newClass.implement(params); + + newClass.constructor = Class; + newClass.prototype.constructor = newClass; + + return newClass; + +}; + +Function.prototype.protect = function(){ + this._protected = true; + return this; +}; + +Object.reset = function(object, key){ + + if (key == null){ + for (var p in object) Object.reset(object, p); + return object; + } + + delete object[key]; + + switch ($type(object[key])){ + case 'object': + var F = function(){}; + F.prototype = object[key]; + var i = new F; + object[key] = Object.reset(i); + break; + case 'array': object[key] = $unlink(object[key]); break; + } + + return object; + +}; + +new Native({name: 'Class', initialize: Class}).extend({ + + instantiate: function(F){ + F._prototyping = true; + var proto = new F; + delete F._prototyping; + return proto; + }, + + wrap: function(self, key, method){ + if (method._origin) method = method._origin; + + return function(){ + if (method._protected && this._current == null) throw new Error('The method "' + key + '" cannot be called.'); + var caller = this.caller, current = this._current; + this.caller = current; this._current = arguments.callee; + var result = method.apply(this, arguments); + this._current = current; this.caller = caller; + return result; + }.extend({_owner: self, _origin: method, _name: key}); + + } + +}); + +Class.implement({ + + implement: function(key, value){ + + if ($type(key) == 'object'){ + for (var p in key) this.implement(p, key[p]); + return this; + } + + var mutator = Class.Mutators[key]; + + if (mutator){ + value = mutator.call(this, value); + if (value == null) return this; + } + + var proto = this.prototype; + + switch ($type(value)){ + + case 'function': + if (value._hidden) return this; + proto[key] = Class.wrap(this, key, value); + break; + + case 'object': + var previous = proto[key]; + if ($type(previous) == 'object') $mixin(previous, value); + else proto[key] = $unlink(value); + break; + + case 'array': + proto[key] = $unlink(value); + break; + + default: proto[key] = value; + + } + + return this; + + } + +}); + +Class.Mutators = { + + Extends: function(parent){ + + this.parent = parent; + this.prototype = Class.instantiate(parent); + + this.implement('parent', function(){ + var name = this.caller._name, previous = this.caller._owner.parent.prototype[name]; + if (!previous) throw new Error('The method "' + name + '" has no parent.'); + return previous.apply(this, arguments); + }.protect()); + + }, + + Implements: function(items){ + $splat(items).each(function(item){ + if (item instanceof Function) item = Class.instantiate(item); + this.implement(item); + }, this); + + } + +}; + + +/* +--- + +script: Class.Extras.js + +description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. + +license: MIT-style license. + +requires: +- /Class + +provides: [Chain, Events, Options] + +... +*/ + +var Chain = new Class({ + + $chain: [], + + chain: function(){ + this.$chain.extend(Array.flatten(arguments)); + return this; + }, + + callChain: function(){ + return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; + }, + + clearChain: function(){ + this.$chain.empty(); + return this; + } + +}); + +var Events = new Class({ + + $events: {}, + + addEvent: function(type, fn, internal){ + type = Events.removeOn(type); + if (fn != $empty){ + this.$events[type] = this.$events[type] || []; + this.$events[type].include(fn); + if (internal) fn.internal = true; + } + return this; + }, + + addEvents: function(events){ + for (var type in events) this.addEvent(type, events[type]); + return this; + }, + + fireEvent: function(type, args, delay){ + type = Events.removeOn(type); + if (!this.$events || !this.$events[type]) return this; + this.$events[type].each(function(fn){ + fn.create({'bind': this, 'delay': delay, 'arguments': args})(); + }, this); + return this; + }, + + removeEvent: function(type, fn){ + type = Events.removeOn(type); + if (!this.$events[type]) return this; + if (!fn.internal) this.$events[type].erase(fn); + return this; + }, + + removeEvents: function(events){ + var type; + if ($type(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + if (events) events = Events.removeOn(events); + for (type in this.$events){ + if (events && events != type) continue; + var fns = this.$events[type]; + for (var i = fns.length; i--; i) this.removeEvent(type, fns[i]); + } + return this; + } + +}); + +Events.removeOn = function(string){ + return string.replace(/^on([A-Z])/, function(full, first){ + return first.toLowerCase(); + }); +}; + +var Options = new Class({ + + setOptions: function(){ + this.options = $merge.run([this.options].extend(arguments)); + if (!this.addEvent) return this; + for (var option in this.options){ + if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; + this.addEvent(option, this.options[option]); + delete this.options[option]; + } + return this; + } + +}); + + +/* +--- + +script: Element.js + +description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements. + +license: MIT-style license. + +requires: +- /Window +- /Document +- /Array +- /String +- /Function +- /Number +- /Hash + +provides: [Element, Elements, $, $$, Iframe] + +... +*/ + +var Element = new Native({ + + name: 'Element', + + legacy: window.Element, + + initialize: function(tag, props){ + var konstructor = Element.Constructors.get(tag); + if (konstructor) return konstructor(props); + if (typeof tag == 'string') return document.newElement(tag, props); + return document.id(tag).set(props); + }, + + afterImplement: function(key, value){ + Element.Prototype[key] = value; + if (Array[key]) return; + Elements.implement(key, function(){ + var items = [], elements = true; + for (var i = 0, j = this.length; i < j; i++){ + var returns = this[i][key].apply(this[i], arguments); + items.push(returns); + if (elements) elements = ($type(returns) == 'element'); + } + return (elements) ? new Elements(items) : items; + }); + } + +}); + +Element.Prototype = {$family: {name: 'element'}}; + +Element.Constructors = new Hash; + +var IFrame = new Native({ + + name: 'IFrame', + + generics: false, + + initialize: function(){ + var params = Array.link(arguments, {properties: Object.type, iframe: $defined}); + var props = params.properties || {}; + var iframe = document.id(params.iframe); + var onload = props.onload || $empty; + delete props.onload; + props.id = props.name = $pick(props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + $time()); + iframe = new Element(iframe || 'iframe', props); + var onFrameLoad = function(){ + var host = $try(function(){ + return iframe.contentWindow.location.host; + }); + if (!host || host == window.location.host){ + var win = new Window(iframe.contentWindow); + new Document(iframe.contentWindow.document); + $extend(win.Element.prototype, Element.Prototype); + } + onload.call(iframe.contentWindow, iframe.contentWindow.document); + }; + var contentWindow = $try(function(){ + return iframe.contentWindow; + }); + ((contentWindow && contentWindow.document.body) || window.frames[props.id]) ? onFrameLoad() : iframe.addListener('load', onFrameLoad); + return iframe; + } + +}); + +var Elements = new Native({ + + initialize: function(elements, options){ + options = $extend({ddup: true, cash: true}, options); + elements = elements || []; + if (options.ddup || options.cash){ + var uniques = {}, returned = []; + for (var i = 0, l = elements.length; i < l; i++){ + var el = document.id(elements[i], !options.cash); + if (options.ddup){ + if (uniques[el.uid]) continue; + uniques[el.uid] = true; + } + if (el) returned.push(el); + } + elements = returned; + } + return (options.cash) ? $extend(elements, this) : elements; + } + +}); + +Elements.implement({ + + filter: function(filter, bind){ + if (!filter) return this; + return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){ + return item.match(filter); + } : filter, bind)); + } + +}); + +Document.implement({ + + newElement: function(tag, props){ + if (Browser.Engine.trident && props){ + ['name', 'type', 'checked'].each(function(attribute){ + if (!props[attribute]) return; + tag += ' ' + attribute + '="' + props[attribute] + '"'; + if (attribute != 'checked') delete props[attribute]; + }); + tag = '<' + tag + '>'; + } + return document.id(this.createElement(tag)).set(props); + }, + + newTextNode: function(text){ + return this.createTextNode(text); + }, + + getDocument: function(){ + return this; + }, + + getWindow: function(){ + return this.window; + }, + + id: (function(){ + + var types = { + + string: function(id, nocash, doc){ + id = doc.getElementById(id); + return (id) ? types.element(id, nocash) : null; + }, + + element: function(el, nocash){ + $uid(el); + if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){ + var proto = Element.Prototype; + for (var p in proto) el[p] = proto[p]; + }; + return el; + }, + + object: function(obj, nocash, doc){ + if (obj.toElement) return types.element(obj.toElement(doc), nocash); + return null; + } + + }; + + types.textnode = types.whitespace = types.window = types.document = $arguments(0); + + return function(el, nocash, doc){ + if (el && el.$family && el.uid) return el; + var type = $type(el); + return (types[type]) ? types[type](el, nocash, doc || document) : null; + }; + + })() + +}); + +if (window.$ == null) Window.implement({ + $: function(el, nc){ + return document.id(el, nc, this.document); + } +}); + +Window.implement({ + + $$: function(selector){ + if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector); + var elements = []; + var args = Array.flatten(arguments); + for (var i = 0, l = args.length; i < l; i++){ + var item = args[i]; + switch ($type(item)){ + case 'element': elements.push(item); break; + case 'string': elements.extend(this.document.getElements(item, true)); + } + } + return new Elements(elements); + }, + + getDocument: function(){ + return this.document; + }, + + getWindow: function(){ + return this; + } + +}); + +Native.implement([Element, Document], { + + getElement: function(selector, nocash){ + return document.id(this.getElements(selector, true)[0] || null, nocash); + }, + + getElements: function(tags, nocash){ + tags = tags.split(','); + var elements = []; + var ddup = (tags.length > 1); + tags.each(function(tag){ + var partial = this.getElementsByTagName(tag.trim()); + (ddup) ? elements.extend(partial) : elements = partial; + }, this); + return new Elements(elements, {ddup: ddup, cash: !nocash}); + } + +}); + +(function(){ + +var collected = {}, storage = {}; +var props = {input: 'checked', option: 'selected', textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerHTML' : 'value'}; + +var get = function(uid){ + return (storage[uid] || (storage[uid] = {})); +}; + +var clean = function(item, retain){ + if (!item) return; + var uid = item.uid; + if (Browser.Engine.trident){ + if (item.clearAttributes){ + var clone = retain && item.cloneNode(false); + item.clearAttributes(); + if (clone) item.mergeAttributes(clone); + } else if (item.removeEvents){ + item.removeEvents(); + } + if ((/object/i).test(item.tagName)){ + for (var p in item){ + if (typeof item[p] == 'function') item[p] = $empty; + } + Element.dispose(item); + } + } + if (!uid) return; + collected[uid] = storage[uid] = null; +}; + +var purge = function(){ + Hash.each(collected, clean); + if (Browser.Engine.trident) $A(document.getElementsByTagName('object')).each(clean); + if (window.CollectGarbage) CollectGarbage(); + collected = storage = null; +}; + +var walk = function(element, walk, start, match, all, nocash){ + var el = element[start || walk]; + var elements = []; + while (el){ + if (el.nodeType == 1 && (!match || Element.match(el, match))){ + if (!all) return document.id(el, nocash); + elements.push(el); + } + el = el[walk]; + } + return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : null; +}; + +var attributes = { + 'html': 'innerHTML', + 'class': 'className', + 'for': 'htmlFor', + 'defaultValue': 'defaultValue', + 'text': (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? 'innerText' : 'textContent' +}; +var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer']; +var camels = ['value', 'type', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap']; + +bools = bools.associate(bools); + +Hash.extend(attributes, bools); +Hash.extend(attributes, camels.associate(camels.map(String.toLowerCase))); + +var inserters = { + + before: function(context, element){ + if (element.parentNode) element.parentNode.insertBefore(context, element); + }, + + after: function(context, element){ + if (!element.parentNode) return; + var next = element.nextSibling; + (next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context); + }, + + bottom: function(context, element){ + element.appendChild(context); + }, + + top: function(context, element){ + var first = element.firstChild; + (first) ? element.insertBefore(context, first) : element.appendChild(context); + } + +}; + +inserters.inside = inserters.bottom; + +Hash.each(inserters, function(inserter, where){ + + where = where.capitalize(); + + Element.implement('inject' + where, function(el){ + inserter(this, document.id(el, true)); + return this; + }); + + Element.implement('grab' + where, function(el){ + inserter(document.id(el, true), this); + return this; + }); + +}); + +Element.implement({ + + set: function(prop, value){ + switch ($type(prop)){ + case 'object': + for (var p in prop) this.set(p, prop[p]); + break; + case 'string': + var property = Element.Properties.get(prop); + (property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value); + } + return this; + }, + + get: function(prop){ + var property = Element.Properties.get(prop); + return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop); + }, + + erase: function(prop){ + var property = Element.Properties.get(prop); + (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); + return this; + }, + + setProperty: function(attribute, value){ + var key = attributes[attribute]; + if (value == undefined) return this.removeProperty(attribute); + if (key && bools[attribute]) value = !!value; + (key) ? this[key] = value : this.setAttribute(attribute, '' + value); + return this; + }, + + setProperties: function(attributes){ + for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); + return this; + }, + + getProperty: function(attribute){ + var key = attributes[attribute]; + var value = (key) ? this[key] : this.getAttribute(attribute, 2); + return (bools[attribute]) ? !!value : (key) ? value : value || null; + }, + + getProperties: function(){ + var args = $A(arguments); + return args.map(this.getProperty, this).associate(args); + }, + + removeProperty: function(attribute){ + var key = attributes[attribute]; + (key) ? this[key] = (key && bools[attribute]) ? false : '' : this.removeAttribute(attribute); + return this; + }, + + removeProperties: function(){ + Array.each(arguments, this.removeProperty, this); + return this; + }, + + hasClass: function(className){ + return this.className.contains(className, ' '); + }, + + addClass: function(className){ + if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean(); + return this; + }, + + removeClass: function(className){ + this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1'); + return this; + }, + + toggleClass: function(className){ + return this.hasClass(className) ? this.removeClass(className) : this.addClass(className); + }, + + adopt: function(){ + Array.flatten(arguments).each(function(element){ + element = document.id(element, true); + if (element) this.appendChild(element); + }, this); + return this; + }, + + appendText: function(text, where){ + return this.grab(this.getDocument().newTextNode(text), where); + }, + + grab: function(el, where){ + inserters[where || 'bottom'](document.id(el, true), this); + return this; + }, + + inject: function(el, where){ + inserters[where || 'bottom'](this, document.id(el, true)); + return this; + }, + + replaces: function(el){ + el = document.id(el, true); + el.parentNode.replaceChild(this, el); + return this; + }, + + wraps: function(el, where){ + el = document.id(el, true); + return this.replaces(el).grab(el, where); + }, + + getPrevious: function(match, nocash){ + return walk(this, 'previousSibling', null, match, false, nocash); + }, + + getAllPrevious: function(match, nocash){ + return walk(this, 'previousSibling', null, match, true, nocash); + }, + + getNext: function(match, nocash){ + return walk(this, 'nextSibling', null, match, false, nocash); + }, + + getAllNext: function(match, nocash){ + return walk(this, 'nextSibling', null, match, true, nocash); + }, + + getFirst: function(match, nocash){ + return walk(this, 'nextSibling', 'firstChild', match, false, nocash); + }, + + getLast: function(match, nocash){ + return walk(this, 'previousSibling', 'lastChild', match, false, nocash); + }, + + getParent: function(match, nocash){ + return walk(this, 'parentNode', null, match, false, nocash); + }, + + getParents: function(match, nocash){ + return walk(this, 'parentNode', null, match, true, nocash); + }, + + getSiblings: function(match, nocash){ + return this.getParent().getChildren(match, nocash).erase(this); + }, + + getChildren: function(match, nocash){ + return walk(this, 'nextSibling', 'firstChild', match, true, nocash); + }, + + getWindow: function(){ + return this.ownerDocument.window; + }, + + getDocument: function(){ + return this.ownerDocument; + }, + + getElementById: function(id, nocash){ + var el = this.ownerDocument.getElementById(id); + if (!el) return null; + for (var parent = el.parentNode; parent != this; parent = parent.parentNode){ + if (!parent) return null; + } + return document.id(el, nocash); + }, + + getSelected: function(){ + return new Elements($A(this.options).filter(function(option){ + return option.selected; + })); + }, + + getComputedStyle: function(property){ + if (this.currentStyle) return this.currentStyle[property.camelCase()]; + var computed = this.getDocument().defaultView.getComputedStyle(this, null); + return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null; + }, + + toQueryString: function(){ + var queryString = []; + this.getElements('input, select, textarea', true).each(function(el){ + if (!el.name || el.disabled || el.type == 'submit' || el.type == 'reset' || el.type == 'file') return; + var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){ + return opt.value; + }) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value; + $splat(value).each(function(val){ + if (typeof val != 'undefined') queryString.push(el.name + '=' + encodeURIComponent(val)); + }); + }); + return queryString.join('&'); + }, + + clone: function(contents, keepid){ + contents = contents !== false; + var clone = this.cloneNode(contents); + var clean = function(node, element){ + if (!keepid) node.removeAttribute('id'); + if (Browser.Engine.trident){ + node.clearAttributes(); + node.mergeAttributes(element); + node.removeAttribute('uid'); + if (node.options){ + var no = node.options, eo = element.options; + for (var j = no.length; j--;) no[j].selected = eo[j].selected; + } + } + var prop = props[element.tagName.toLowerCase()]; + if (prop && element[prop]) node[prop] = element[prop]; + }; + + if (contents){ + var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*'); + for (var i = ce.length; i--;) clean(ce[i], te[i]); + } + + clean(clone, this); + return document.id(clone); + }, + + destroy: function(){ + Element.empty(this); + Element.dispose(this); + clean(this, true); + return null; + }, + + empty: function(){ + $A(this.childNodes).each(function(node){ + Element.destroy(node); + }); + return this; + }, + + dispose: function(){ + return (this.parentNode) ? this.parentNode.removeChild(this) : this; + }, + + hasChild: function(el){ + el = document.id(el, true); + if (!el) return false; + if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el); + return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16); + }, + + match: function(tag){ + return (!tag || (tag == this) || (Element.get(this, 'tag') == tag)); + } + +}); + +Native.implement([Element, Window, Document], { + + addListener: function(type, fn){ + if (type == 'unload'){ + var old = fn, self = this; + fn = function(){ + self.removeListener('unload', fn); + old(); + }; + } else { + collected[this.uid] = this; + } + if (this.addEventListener) this.addEventListener(type, fn, false); + else this.attachEvent('on' + type, fn); + return this; + }, + + removeListener: function(type, fn){ + if (this.removeEventListener) this.removeEventListener(type, fn, false); + else this.detachEvent('on' + type, fn); + return this; + }, + + retrieve: function(property, dflt){ + var storage = get(this.uid), prop = storage[property]; + if (dflt != undefined && prop == undefined) prop = storage[property] = dflt; + return $pick(prop); + }, + + store: function(property, value){ + var storage = get(this.uid); + storage[property] = value; + return this; + }, + + eliminate: function(property){ + var storage = get(this.uid); + delete storage[property]; + return this; + } + +}); + +window.addListener('unload', purge); + +})(); + +Element.Properties = new Hash; + +Element.Properties.style = { + + set: function(style){ + this.style.cssText = style; + }, + + get: function(){ + return this.style.cssText; + }, + + erase: function(){ + this.style.cssText = ''; + } + +}; + +Element.Properties.tag = { + + get: function(){ + return this.tagName.toLowerCase(); + } + +}; + +Element.Properties.html = (function(){ + var wrapper = document.createElement('div'); + + var translations = { + table: [1, '', '
'], + select: [1, ''], + tbody: [2, '', '
'], + tr: [3, '', '
'] + }; + translations.thead = translations.tfoot = translations.tbody; + + var html = { + set: function(){ + var html = Array.flatten(arguments).join(''); + var wrap = Browser.Engine.trident && translations[this.get('tag')]; + if (wrap){ + var first = wrapper; + first.innerHTML = wrap[1] + html + wrap[2]; + for (var i = wrap[0]; i--;) first = first.firstChild; + this.empty().adopt(first.childNodes); + } else { + this.innerHTML = html; + } + } + }; + + html.erase = html.set; + + return html; +})(); + +if (Browser.Engine.webkit && Browser.Engine.version < 420) Element.Properties.text = { + get: function(){ + if (this.innerText) return this.innerText; + var temp = this.ownerDocument.newElement('div', {html: this.innerHTML}).inject(this.ownerDocument.body); + var text = temp.innerText; + temp.destroy(); + return text; + } +}; + + +/* +--- + +script: Element.Event.js + +description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events. + +license: MIT-style license. + +requires: +- /Element +- /Event + +provides: [Element.Event] + +... +*/ + +Element.Properties.events = {set: function(events){ + this.addEvents(events); +}}; + +Native.implement([Element, Window, Document], { + + addEvent: function(type, fn){ + var events = this.retrieve('events', {}); + events[type] = events[type] || {'keys': [], 'values': []}; + if (events[type].keys.contains(fn)) return this; + events[type].keys.push(fn); + var realType = type, custom = Element.Events.get(type), condition = fn, self = this; + if (custom){ + if (custom.onAdd) custom.onAdd.call(this, fn); + if (custom.condition){ + condition = function(event){ + if (custom.condition.call(this, event)) return fn.call(this, event); + return true; + }; + } + realType = custom.base || realType; + } + var defn = function(){ + return fn.call(self); + }; + var nativeEvent = Element.NativeEvents[realType]; + if (nativeEvent){ + if (nativeEvent == 2){ + defn = function(event){ + event = new Event(event, self.getWindow()); + if (condition.call(self, event) === false) event.stop(); + }; + } + this.addListener(realType, defn); + } + events[type].values.push(defn); + return this; + }, + + removeEvent: function(type, fn){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + var pos = events[type].keys.indexOf(fn); + if (pos == -1) return this; + events[type].keys.splice(pos, 1); + var value = events[type].values.splice(pos, 1)[0]; + var custom = Element.Events.get(type); + if (custom){ + if (custom.onRemove) custom.onRemove.call(this, fn); + type = custom.base || type; + } + return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this; + }, + + addEvents: function(events){ + for (var event in events) this.addEvent(event, events[event]); + return this; + }, + + removeEvents: function(events){ + var type; + if ($type(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + var attached = this.retrieve('events'); + if (!attached) return this; + if (!events){ + for (type in attached) this.removeEvents(type); + this.eliminate('events'); + } else if (attached[events]){ + while (attached[events].keys[0]) this.removeEvent(events, attached[events].keys[0]); + attached[events] = null; + } + return this; + }, + + fireEvent: function(type, args, delay){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + events[type].keys.each(function(fn){ + fn.create({'bind': this, 'delay': delay, 'arguments': args})(); + }, this); + return this; + }, + + cloneEvents: function(from, type){ + from = document.id(from); + var fevents = from.retrieve('events'); + if (!fevents) return this; + if (!type){ + for (var evType in fevents) this.cloneEvents(from, evType); + } else if (fevents[type]){ + fevents[type].keys.each(function(fn){ + this.addEvent(type, fn); + }, this); + } + return this; + } + +}); + +Element.NativeEvents = { + click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons + mousewheel: 2, DOMMouseScroll: 2, //mouse wheel + mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement + keydown: 2, keypress: 2, keyup: 2, //keyboard + focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements + load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window + error: 1, abort: 1, scroll: 1 //misc +}; + +(function(){ + +var $check = function(event){ + var related = event.relatedTarget; + if (related == undefined) return true; + if (related === false) return false; + return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related)); +}; + +Element.Events = new Hash({ + + mouseenter: { + base: 'mouseover', + condition: $check + }, + + mouseleave: { + base: 'mouseout', + condition: $check + }, + + mousewheel: { + base: (Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel' + } + +}); + +})(); + + +/* +--- + +script: Element.Style.js + +description: Contains methods for interacting with the styles of Elements in a fashionable way. + +license: MIT-style license. + +requires: +- /Element + +provides: [Element.Style] + +... +*/ + +Element.Properties.styles = {set: function(styles){ + this.setStyles(styles); +}}; + +Element.Properties.opacity = { + + set: function(opacity, novisibility){ + if (!novisibility){ + if (opacity == 0){ + if (this.style.visibility != 'hidden') this.style.visibility = 'hidden'; + } else { + if (this.style.visibility != 'visible') this.style.visibility = 'visible'; + } + } + if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1; + if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')'; + this.style.opacity = opacity; + this.store('opacity', opacity); + }, + + get: function(){ + return this.retrieve('opacity', 1); + } + +}; + +Element.implement({ + + setOpacity: function(value){ + return this.set('opacity', value, true); + }, + + getOpacity: function(){ + return this.get('opacity'); + }, + + setStyle: function(property, value){ + switch (property){ + case 'opacity': return this.set('opacity', parseFloat(value)); + case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat'; + } + property = property.camelCase(); + if ($type(value) != 'string'){ + var map = (Element.Styles.get(property) || '@').split(' '); + value = $splat(value).map(function(val, i){ + if (!map[i]) return ''; + return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; + }).join(' '); + } else if (value == String(Number(value))){ + value = Math.round(value); + } + this.style[property] = value; + return this; + }, + + getStyle: function(property){ + switch (property){ + case 'opacity': return this.get('opacity'); + case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat'; + } + property = property.camelCase(); + var result = this.style[property]; + if (!$chk(result)){ + result = []; + for (var style in Element.ShortStyles){ + if (property != style) continue; + for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s)); + return result.join(' '); + } + result = this.getComputedStyle(property); + } + if (result){ + result = String(result); + var color = result.match(/rgba?\([\d\s,]+\)/); + if (color) result = result.replace(color[0], color[0].rgbToHex()); + } + if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result, 10)))){ + if (property.test(/^(height|width)$/)){ + var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; + values.each(function(value){ + size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); + }, this); + return this['offset' + property.capitalize()] - size + 'px'; + } + if ((Browser.Engine.presto) && String(result).test('px')) return result; + if (property.test(/(border(.+)Width|margin|padding)/)) return '0px'; + } + return result; + }, + + setStyles: function(styles){ + for (var style in styles) this.setStyle(style, styles[style]); + return this; + }, + + getStyles: function(){ + var result = {}; + Array.flatten(arguments).each(function(key){ + result[key] = this.getStyle(key); + }, this); + return result; + } + +}); + +Element.Styles = new Hash({ + left: '@px', top: '@px', bottom: '@px', right: '@px', + width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px', + backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)', + fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)', + margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)', + borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)', + zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@' +}); + +Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; + +['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ + var Short = Element.ShortStyles; + var All = Element.Styles; + ['margin', 'padding'].each(function(style){ + var sd = style + direction; + Short[style][sd] = All[sd] = '@px'; + }); + var bd = 'border' + direction; + Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; + var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; + Short[bd] = {}; + Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; + Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; + Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; +}); + + +/* +--- + +script: Element.Dimensions.js + +description: Contains methods to work with size, scroll, or positioning of Elements and the window object. + +license: MIT-style license. + +credits: +- Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). +- Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). + +requires: +- /Element + +provides: [Element.Dimensions] + +... +*/ + +(function(){ + +Element.implement({ + + scrollTo: function(x, y){ + if (isBody(this)){ + this.getWindow().scrollTo(x, y); + } else { + this.scrollLeft = x; + this.scrollTop = y; + } + return this; + }, + + getSize: function(){ + if (isBody(this)) return this.getWindow().getSize(); + return {x: this.offsetWidth, y: this.offsetHeight}; + }, + + getScrollSize: function(){ + if (isBody(this)) return this.getWindow().getScrollSize(); + return {x: this.scrollWidth, y: this.scrollHeight}; + }, + + getScroll: function(){ + if (isBody(this)) return this.getWindow().getScroll(); + return {x: this.scrollLeft, y: this.scrollTop}; + }, + + getScrolls: function(){ + var element = this, position = {x: 0, y: 0}; + while (element && !isBody(element)){ + position.x += element.scrollLeft; + position.y += element.scrollTop; + element = element.parentNode; + } + return position; + }, + + getOffsetParent: function(){ + var element = this; + if (isBody(element)) return null; + if (!Browser.Engine.trident) return element.offsetParent; + while ((element = element.parentNode) && !isBody(element)){ + if (styleString(element, 'position') != 'static') return element; + } + return null; + }, + + getOffsets: function(){ + if (this.getBoundingClientRect){ + var bound = this.getBoundingClientRect(), + html = document.id(this.getDocument().documentElement), + htmlScroll = html.getScroll(), + elemScrolls = this.getScrolls(), + elemScroll = this.getScroll(), + isFixed = (styleString(this, 'position') == 'fixed'); + + return { + x: bound.left.toInt() + elemScrolls.x - elemScroll.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, + y: bound.top.toInt() + elemScrolls.y - elemScroll.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop + }; + } + + var element = this, position = {x: 0, y: 0}; + if (isBody(this)) return position; + + while (element && !isBody(element)){ + position.x += element.offsetLeft; + position.y += element.offsetTop; + + if (Browser.Engine.gecko){ + if (!borderBox(element)){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + var parent = element.parentNode; + if (parent && styleString(parent, 'overflow') != 'visible'){ + position.x += leftBorder(parent); + position.y += topBorder(parent); + } + } else if (element != this && Browser.Engine.webkit){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + + element = element.offsetParent; + } + if (Browser.Engine.gecko && !borderBox(this)){ + position.x -= leftBorder(this); + position.y -= topBorder(this); + } + return position; + }, + + getPosition: function(relative){ + if (isBody(this)) return {x: 0, y: 0}; + var offset = this.getOffsets(), + scroll = this.getScrolls(); + var position = { + x: offset.x - scroll.x, + y: offset.y - scroll.y + }; + var relativePosition = (relative && (relative = document.id(relative))) ? relative.getPosition() : {x: 0, y: 0}; + return {x: position.x - relativePosition.x, y: position.y - relativePosition.y}; + }, + + getCoordinates: function(element){ + if (isBody(this)) return this.getWindow().getCoordinates(); + var position = this.getPosition(element), + size = this.getSize(); + var obj = { + left: position.x, + top: position.y, + width: size.x, + height: size.y + }; + obj.right = obj.left + obj.width; + obj.bottom = obj.top + obj.height; + return obj; + }, + + computePosition: function(obj){ + return { + left: obj.x - styleNumber(this, 'margin-left'), + top: obj.y - styleNumber(this, 'margin-top') + }; + }, + + setPosition: function(obj){ + return this.setStyles(this.computePosition(obj)); + } + +}); + + +Native.implement([Document, Window], { + + getSize: function(){ + if (Browser.Engine.presto || Browser.Engine.webkit){ + var win = this.getWindow(); + return {x: win.innerWidth, y: win.innerHeight}; + } + var doc = getCompatElement(this); + return {x: doc.clientWidth, y: doc.clientHeight}; + }, + + getScroll: function(){ + var win = this.getWindow(), doc = getCompatElement(this); + return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; + }, + + getScrollSize: function(){ + var doc = getCompatElement(this), min = this.getSize(); + return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)}; + }, + + getPosition: function(){ + return {x: 0, y: 0}; + }, + + getCoordinates: function(){ + var size = this.getSize(); + return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; + } + +}); + +// private methods + +var styleString = Element.getComputedStyle; + +function styleNumber(element, style){ + return styleString(element, style).toInt() || 0; +}; + +function borderBox(element){ + return styleString(element, '-moz-box-sizing') == 'border-box'; +}; + +function topBorder(element){ + return styleNumber(element, 'border-top-width'); +}; + +function leftBorder(element){ + return styleNumber(element, 'border-left-width'); +}; + +function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); +}; + +function getCompatElement(element){ + var doc = element.getDocument(); + return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; +}; + +})(); + +//aliases +Element.alias('setPosition', 'position'); //compatability + +Native.implement([Window, Document, Element], { + + getHeight: function(){ + return this.getSize().y; + }, + + getWidth: function(){ + return this.getSize().x; + }, + + getScrollTop: function(){ + return this.getScroll().y; + }, + + getScrollLeft: function(){ + return this.getScroll().x; + }, + + getScrollHeight: function(){ + return this.getScrollSize().y; + }, + + getScrollWidth: function(){ + return this.getScrollSize().x; + }, + + getTop: function(){ + return this.getPosition().y; + }, + + getLeft: function(){ + return this.getPosition().x; + } + +}); + + +/* +--- + +script: Selectors.js + +description: Adds advanced CSS-style querying capabilities for targeting HTML Elements. Includes pseudo selectors. + +license: MIT-style license. + +requires: +- /Element + +provides: [Selectors] + +... +*/ + +Native.implement([Document, Element], { + + getElements: function(expression, nocash){ + expression = expression.split(','); + var items, local = {}; + for (var i = 0, l = expression.length; i < l; i++){ + var selector = expression[i], elements = Selectors.Utils.search(this, selector, local); + if (i != 0 && elements.item) elements = $A(elements); + items = (i == 0) ? elements : (items.item) ? $A(items).concat(elements) : items.concat(elements); + } + return new Elements(items, {ddup: (expression.length > 1), cash: !nocash}); + } + +}); + +Element.implement({ + + match: function(selector){ + if (!selector || (selector == this)) return true; + var tagid = Selectors.Utils.parseTagAndID(selector); + var tag = tagid[0], id = tagid[1]; + if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false; + var parsed = Selectors.Utils.parseSelector(selector); + return (parsed) ? Selectors.Utils.filter(this, parsed, {}) : true; + } + +}); + +var Selectors = {Cache: {nth: {}, parsed: {}}}; + +Selectors.RegExps = { + id: (/#([\w-]+)/), + tag: (/^(\w+|\*)/), + quick: (/^(\w+|\*)$/), + splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g), + combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g) +}; + +Selectors.Utils = { + + chk: function(item, uniques){ + if (!uniques) return true; + var uid = $uid(item); + if (!uniques[uid]) return uniques[uid] = true; + return false; + }, + + parseNthArgument: function(argument){ + if (Selectors.Cache.nth[argument]) return Selectors.Cache.nth[argument]; + var parsed = argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/); + if (!parsed) return false; + var inta = parseInt(parsed[1], 10); + var a = (inta || inta === 0) ? inta : 1; + var special = parsed[2] || false; + var b = parseInt(parsed[3], 10) || 0; + if (a != 0){ + b--; + while (b < 1) b += a; + while (b >= a) b -= a; + } else { + a = b; + special = 'index'; + } + switch (special){ + case 'n': parsed = {a: a, b: b, special: 'n'}; break; + case 'odd': parsed = {a: 2, b: 0, special: 'n'}; break; + case 'even': parsed = {a: 2, b: 1, special: 'n'}; break; + case 'first': parsed = {a: 0, special: 'index'}; break; + case 'last': parsed = {special: 'last-child'}; break; + case 'only': parsed = {special: 'only-child'}; break; + default: parsed = {a: (a - 1), special: 'index'}; + } + + return Selectors.Cache.nth[argument] = parsed; + }, + + parseSelector: function(selector){ + if (Selectors.Cache.parsed[selector]) return Selectors.Cache.parsed[selector]; + var m, parsed = {classes: [], pseudos: [], attributes: []}; + while ((m = Selectors.RegExps.combined.exec(selector))){ + var cn = m[1], an = m[2], ao = m[3], av = m[5], pn = m[6], pa = m[7]; + if (cn){ + parsed.classes.push(cn); + } else if (pn){ + var parser = Selectors.Pseudo.get(pn); + if (parser) parsed.pseudos.push({parser: parser, argument: pa}); + else parsed.attributes.push({name: pn, operator: '=', value: pa}); + } else if (an){ + parsed.attributes.push({name: an, operator: ao, value: av}); + } + } + if (!parsed.classes.length) delete parsed.classes; + if (!parsed.attributes.length) delete parsed.attributes; + if (!parsed.pseudos.length) delete parsed.pseudos; + if (!parsed.classes && !parsed.attributes && !parsed.pseudos) parsed = null; + return Selectors.Cache.parsed[selector] = parsed; + }, + + parseTagAndID: function(selector){ + var tag = selector.match(Selectors.RegExps.tag); + var id = selector.match(Selectors.RegExps.id); + return [(tag) ? tag[1] : '*', (id) ? id[1] : false]; + }, + + filter: function(item, parsed, local){ + var i; + if (parsed.classes){ + for (i = parsed.classes.length; i--; i){ + var cn = parsed.classes[i]; + if (!Selectors.Filters.byClass(item, cn)) return false; + } + } + if (parsed.attributes){ + for (i = parsed.attributes.length; i--; i){ + var att = parsed.attributes[i]; + if (!Selectors.Filters.byAttribute(item, att.name, att.operator, att.value)) return false; + } + } + if (parsed.pseudos){ + for (i = parsed.pseudos.length; i--; i){ + var psd = parsed.pseudos[i]; + if (!Selectors.Filters.byPseudo(item, psd.parser, psd.argument, local)) return false; + } + } + return true; + }, + + getByTagAndID: function(ctx, tag, id){ + if (id){ + var item = (ctx.getElementById) ? ctx.getElementById(id, true) : Element.getElementById(ctx, id, true); + return (item && Selectors.Filters.byTag(item, tag)) ? [item] : []; + } else { + return ctx.getElementsByTagName(tag); + } + }, + + search: function(self, expression, local){ + var splitters = []; + + var selectors = expression.trim().replace(Selectors.RegExps.splitter, function(m0, m1, m2){ + splitters.push(m1); + return ':)' + m2; + }).split(':)'); + + var items, filtered, item; + + for (var i = 0, l = selectors.length; i < l; i++){ + + var selector = selectors[i]; + + if (i == 0 && Selectors.RegExps.quick.test(selector)){ + items = self.getElementsByTagName(selector); + continue; + } + + var splitter = splitters[i - 1]; + + var tagid = Selectors.Utils.parseTagAndID(selector); + var tag = tagid[0], id = tagid[1]; + + if (i == 0){ + items = Selectors.Utils.getByTagAndID(self, tag, id); + } else { + var uniques = {}, found = []; + for (var j = 0, k = items.length; j < k; j++) found = Selectors.Getters[splitter](found, items[j], tag, id, uniques); + items = found; + } + + var parsed = Selectors.Utils.parseSelector(selector); + + if (parsed){ + filtered = []; + for (var m = 0, n = items.length; m < n; m++){ + item = items[m]; + if (Selectors.Utils.filter(item, parsed, local)) filtered.push(item); + } + items = filtered; + } + + } + + return items; + + } + +}; + +Selectors.Getters = { + + ' ': function(found, self, tag, id, uniques){ + var items = Selectors.Utils.getByTagAndID(self, tag, id); + for (var i = 0, l = items.length; i < l; i++){ + var item = items[i]; + if (Selectors.Utils.chk(item, uniques)) found.push(item); + } + return found; + }, + + '>': function(found, self, tag, id, uniques){ + var children = Selectors.Utils.getByTagAndID(self, tag, id); + for (var i = 0, l = children.length; i < l; i++){ + var child = children[i]; + if (child.parentNode == self && Selectors.Utils.chk(child, uniques)) found.push(child); + } + return found; + }, + + '+': function(found, self, tag, id, uniques){ + while ((self = self.nextSibling)){ + if (self.nodeType == 1){ + if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self); + break; + } + } + return found; + }, + + '~': function(found, self, tag, id, uniques){ + while ((self = self.nextSibling)){ + if (self.nodeType == 1){ + if (!Selectors.Utils.chk(self, uniques)) break; + if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self); + } + } + return found; + } + +}; + +Selectors.Filters = { + + byTag: function(self, tag){ + return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag)); + }, + + byID: function(self, id){ + return (!id || (self.id && self.id == id)); + }, + + byClass: function(self, klass){ + return (self.className && self.className.contains && self.className.contains(klass, ' ')); + }, + + byPseudo: function(self, parser, argument, local){ + return parser.call(self, argument, local); + }, + + byAttribute: function(self, name, operator, value){ + var result = Element.prototype.getProperty.call(self, name); + if (!result) return (operator == '!='); + if (!operator || value == undefined) return true; + switch (operator){ + case '=': return (result == value); + case '*=': return (result.contains(value)); + case '^=': return (result.substr(0, value.length) == value); + case '$=': return (result.substr(result.length - value.length) == value); + case '!=': return (result != value); + case '~=': return result.contains(value, ' '); + case '|=': return result.contains(value, '-'); + } + return false; + } + +}; + +Selectors.Pseudo = new Hash({ + + // w3c pseudo selectors + + checked: function(){ + return this.checked; + }, + + empty: function(){ + return !(this.innerText || this.textContent || '').length; + }, + + not: function(selector){ + return !Element.match(this, selector); + }, + + contains: function(text){ + return (this.innerText || this.textContent || '').contains(text); + }, + + 'first-child': function(){ + return Selectors.Pseudo.index.call(this, 0); + }, + + 'last-child': function(){ + var element = this; + while ((element = element.nextSibling)){ + if (element.nodeType == 1) return false; + } + return true; + }, + + 'only-child': function(){ + var prev = this; + while ((prev = prev.previousSibling)){ + if (prev.nodeType == 1) return false; + } + var next = this; + while ((next = next.nextSibling)){ + if (next.nodeType == 1) return false; + } + return true; + }, + + 'nth-child': function(argument, local){ + argument = (argument == undefined) ? 'n' : argument; + var parsed = Selectors.Utils.parseNthArgument(argument); + if (parsed.special != 'n') return Selectors.Pseudo[parsed.special].call(this, parsed.a, local); + var count = 0; + local.positions = local.positions || {}; + var uid = $uid(this); + if (!local.positions[uid]){ + var self = this; + while ((self = self.previousSibling)){ + if (self.nodeType != 1) continue; + count ++; + var position = local.positions[$uid(self)]; + if (position != undefined){ + count = position + count; + break; + } + } + local.positions[uid] = count; + } + return (local.positions[uid] % parsed.a == parsed.b); + }, + + // custom pseudo selectors + + index: function(index){ + var element = this, count = 0; + while ((element = element.previousSibling)){ + if (element.nodeType == 1 && ++count > index) return false; + } + return (count == index); + }, + + even: function(argument, local){ + return Selectors.Pseudo['nth-child'].call(this, '2n+1', local); + }, + + odd: function(argument, local){ + return Selectors.Pseudo['nth-child'].call(this, '2n', local); + }, + + selected: function(){ + return this.selected; + }, + + enabled: function(){ + return (this.disabled === false); + } + +}); + + +/* +--- + +script: DomReady.js + +description: Contains the custom event domready. + +license: MIT-style license. + +requires: +- /Element.Event + +provides: [DomReady] + +... +*/ + +Element.Events.domready = { + + onAdd: function(fn){ + if (Browser.loaded) fn.call(this); + } + +}; + +(function(){ + + var domready = function(){ + if (Browser.loaded) return; + Browser.loaded = true; + window.fireEvent('domready'); + document.fireEvent('domready'); + }; + + window.addEvent('load', domready); + + if (Browser.Engine.trident){ + var temp = document.createElement('div'); + (function(){ + ($try(function(){ + temp.doScroll(); // Technique by Diego Perini + return document.id(temp).inject(document.body).set('html', 'temp').dispose(); + })) ? domready() : arguments.callee.delay(50); + })(); + } else if (Browser.Engine.webkit && Browser.Engine.version < 525){ + (function(){ + (['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50); + })(); + } else { + document.addEvent('DOMContentLoaded', domready); + } + +})(); + + +/* +--- + +script: JSON.js + +description: JSON encoder and decoder. + +license: MIT-style license. + +See Also: + +requires: +- /Array +- /String +- /Number +- /Function +- /Hash + +provides: [JSON] + +... +*/ + +var JSON = new Hash(this.JSON && { + stringify: JSON.stringify, + parse: JSON.parse +}).extend({ + + $specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}, + + $replaceChars: function(chr){ + return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16); + }, + + encode: function(obj){ + switch ($type(obj)){ + case 'string': + return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"'; + case 'array': + return '[' + String(obj.map(JSON.encode).clean()) + ']'; + case 'object': case 'hash': + var string = []; + Hash.each(obj, function(value, key){ + var json = JSON.encode(value); + if (json) string.push(JSON.encode(key) + ':' + json); + }); + return '{' + string + '}'; + case 'number': case 'boolean': return String(obj); + case false: return 'null'; + } + return null; + }, + + decode: function(string, secure){ + if ($type(string) != 'string' || !string.length) return null; + if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null; + return eval('(' + string + ')'); + } + +}); + +Native.implement([Hash, Array, String, Number], { + + toJSON: function(){ + return JSON.encode(this); + } + +}); + + +/* +--- + +script: Cookie.js + +description: Class for creating, reading, and deleting browser Cookies. + +license: MIT-style license. + +credits: +- Based on the functions by Peter-Paul Koch (http://quirksmode.org). + +requires: +- /Options + +provides: [Cookie] + +... +*/ + +var Cookie = new Class({ + + Implements: Options, + + options: { + path: false, + domain: false, + duration: false, + secure: false, + document: document + }, + + initialize: function(key, options){ + this.key = key; + this.setOptions(options); + }, + + write: function(value){ + value = encodeURIComponent(value); + if (this.options.domain) value += '; domain=' + this.options.domain; + if (this.options.path) value += '; path=' + this.options.path; + if (this.options.duration){ + var date = new Date(); + date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (this.options.secure) value += '; secure'; + this.options.document.cookie = this.key + '=' + value; + return this; + }, + + read: function(){ + var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); + return (value) ? decodeURIComponent(value[1]) : null; + }, + + dispose: function(){ + new Cookie(this.key, $merge(this.options, {duration: -1})).write(''); + return this; + } + +}); + +Cookie.write = function(key, value, options){ + return new Cookie(key, options).write(value); +}; + +Cookie.read = function(key){ + return new Cookie(key).read(); +}; + +Cookie.dispose = function(key, options){ + return new Cookie(key, options).dispose(); +}; + + +/* +--- + +script: Swiff.js + +description: Wrapper for embedding SWF movies. Supports External Interface Communication. + +license: MIT-style license. + +credits: +- Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject. + +requires: +- /Options +- /$util + +provides: [Swiff] + +... +*/ + +var Swiff = new Class({ + + Implements: [Options], + + options: { + id: null, + height: 1, + width: 1, + container: null, + properties: {}, + params: { + quality: 'high', + allowScriptAccess: 'always', + wMode: 'transparent', + swLiveConnect: true + }, + callBacks: {}, + vars: {} + }, + + toElement: function(){ + return this.object; + }, + + initialize: function(path, options){ + this.instance = 'Swiff_' + $time(); + + this.setOptions(options); + options = this.options; + var id = this.id = options.id || this.instance; + var container = document.id(options.container); + + Swiff.CallBacks[this.instance] = {}; + + var params = options.params, vars = options.vars, callBacks = options.callBacks; + var properties = $extend({height: options.height, width: options.width}, options.properties); + + var self = this; + + for (var callBack in callBacks){ + Swiff.CallBacks[this.instance][callBack] = (function(option){ + return function(){ + return option.apply(self.object, arguments); + }; + })(callBacks[callBack]); + vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack; + } + + params.flashVars = Hash.toQueryString(vars); + if (Browser.Engine.trident){ + properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + params.movie = path; + } else { + properties.type = 'application/x-shockwave-flash'; + properties.data = path; + } + var build = ''; + } + build += ''; + this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild; + }, + + replaces: function(element){ + element = document.id(element, true); + element.parentNode.replaceChild(this.toElement(), element); + return this; + }, + + inject: function(element){ + document.id(element, true).appendChild(this.toElement()); + return this; + }, + + remote: function(){ + return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments)); + } + +}); + +Swiff.CallBacks = {}; + +Swiff.remote = function(obj, fn){ + var rs = obj.CallFunction('' + __flash__argumentsToXML(arguments, 2) + ''); + return eval(rs); +}; + + +/* +--- + +script: Fx.js + +description: Contains the basic animation logic to be extended by all other Fx Classes. + +license: MIT-style license. + +requires: +- /Chain +- /Events +- /Options + +provides: [Fx] + +... +*/ + +var Fx = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onStart: $empty, + onCancel: $empty, + onComplete: $empty, + */ + fps: 50, + unit: false, + duration: 500, + link: 'ignore' + }, + + initialize: function(options){ + this.subject = this.subject || this; + this.setOptions(options); + this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt(); + var wait = this.options.wait; + if (wait === false) this.options.link = 'cancel'; + }, + + getTransition: function(){ + return function(p){ + return -(Math.cos(Math.PI * p) - 1) / 2; + }; + }, + + step: function(){ + var time = $time(); + if (time < this.time + this.options.duration){ + var delta = this.transition((time - this.time) / this.options.duration); + this.set(this.compute(this.from, this.to, delta)); + } else { + this.set(this.compute(this.from, this.to, 1)); + this.complete(); + } + }, + + set: function(now){ + return now; + }, + + compute: function(from, to, delta){ + return Fx.compute(from, to, delta); + }, + + check: function(){ + if (!this.timer) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.bind(this, arguments)); return false; + } + return false; + }, + + start: function(from, to){ + if (!this.check(from, to)) return this; + this.from = from; + this.to = to; + this.time = 0; + this.transition = this.getTransition(); + this.startTimer(); + this.onStart(); + return this; + }, + + complete: function(){ + if (this.stopTimer()) this.onComplete(); + return this; + }, + + cancel: function(){ + if (this.stopTimer()) this.onCancel(); + return this; + }, + + onStart: function(){ + this.fireEvent('start', this.subject); + }, + + onComplete: function(){ + this.fireEvent('complete', this.subject); + if (!this.callChain()) this.fireEvent('chainComplete', this.subject); + }, + + onCancel: function(){ + this.fireEvent('cancel', this.subject).clearChain(); + }, + + pause: function(){ + this.stopTimer(); + return this; + }, + + resume: function(){ + this.startTimer(); + return this; + }, + + stopTimer: function(){ + if (!this.timer) return false; + this.time = $time() - this.time; + this.timer = $clear(this.timer); + return true; + }, + + startTimer: function(){ + if (this.timer) return false; + this.time = $time() - this.time; + this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this); + return true; + } + +}); + +Fx.compute = function(from, to, delta){ + return (to - from) * delta + from; +}; + +Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; + + +/* +--- + +script: Fx.CSS.js + +description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. + +license: MIT-style license. + +requires: +- /Fx +- /Element.Style + +provides: [Fx.CSS] + +... +*/ + +Fx.CSS = new Class({ + + Extends: Fx, + + //prepares the base from/to object + + prepare: function(element, property, values){ + values = $splat(values); + var values1 = values[1]; + if (!$chk(values1)){ + values[1] = values[0]; + values[0] = element.getStyle(property); + } + var parsed = values.map(this.parse); + return {from: parsed[0], to: parsed[1]}; + }, + + //parses a value into an array + + parse: function(value){ + value = $lambda(value)(); + value = (typeof value == 'string') ? value.split(' ') : $splat(value); + return value.map(function(val){ + val = String(val); + var found = false; + Fx.CSS.Parsers.each(function(parser, key){ + if (found) return; + var parsed = parser.parse(val); + if ($chk(parsed)) found = {value: parsed, parser: parser}; + }); + found = found || {value: val, parser: Fx.CSS.Parsers.String}; + return found; + }); + }, + + //computes by a from and to prepared objects, using their parsers. + + compute: function(from, to, delta){ + var computed = []; + (Math.min(from.length, to.length)).times(function(i){ + computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); + }); + computed.$family = {name: 'fx:css:value'}; + return computed; + }, + + //serves the value as settable + + serve: function(value, unit){ + if ($type(value) != 'fx:css:value') value = this.parse(value); + var returned = []; + value.each(function(bit){ + returned = returned.concat(bit.parser.serve(bit.value, unit)); + }); + return returned; + }, + + //renders the change to an element + + render: function(element, property, value, unit){ + element.setStyle(property, this.serve(value, unit)); + }, + + //searches inside the page css to find the values for a selector + + search: function(selector){ + if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; + var to = {}; + Array.each(document.styleSheets, function(sheet, j){ + var href = sheet.href; + if (href && href.contains('://') && !href.contains(document.domain)) return; + var rules = sheet.rules || sheet.cssRules; + Array.each(rules, function(rule, i){ + if (!rule.style) return; + var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ + return m.toLowerCase(); + }) : null; + if (!selectorText || !selectorText.test('^' + selector + '$')) return; + Element.Styles.each(function(value, style){ + if (!rule.style[style] || Element.ShortStyles[style]) return; + value = String(rule.style[style]); + to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value; + }); + }); + }); + return Fx.CSS.Cache[selector] = to; + } + +}); + +Fx.CSS.Cache = {}; + +Fx.CSS.Parsers = new Hash({ + + Color: { + parse: function(value){ + if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); + return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; + }, + compute: function(from, to, delta){ + return from.map(function(value, i){ + return Math.round(Fx.compute(from[i], to[i], delta)); + }); + }, + serve: function(value){ + return value.map(Number); + } + }, + + Number: { + parse: parseFloat, + compute: Fx.compute, + serve: function(value, unit){ + return (unit) ? value + unit : value; + } + }, + + String: { + parse: $lambda(false), + compute: $arguments(1), + serve: $arguments(0) + } + +}); + + +/* +--- + +script: Fx.Tween.js + +description: Formerly Fx.Style, effect to transition any CSS property for an element. + +license: MIT-style license. + +requires: +- /Fx.CSS + +provides: [Fx.Tween, Element.fade, Element.highlight] + +... +*/ + +Fx.Tween = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(property, now){ + if (arguments.length == 1){ + now = property; + property = this.property || this.options.property; + } + this.render(this.element, property, now, this.options.unit); + return this; + }, + + start: function(property, from, to){ + if (!this.check(property, from, to)) return this; + var args = Array.flatten(arguments); + this.property = this.options.property || args.shift(); + var parsed = this.prepare(this.element, this.property, args); + return this.parent(parsed.from, parsed.to); + } + +}); + +Element.Properties.tween = { + + set: function(options){ + var tween = this.retrieve('tween'); + if (tween) tween.cancel(); + return this.eliminate('tween').store('tween:options', $extend({link: 'cancel'}, options)); + }, + + get: function(options){ + if (options || !this.retrieve('tween')){ + if (options || !this.retrieve('tween:options')) this.set('tween', options); + this.store('tween', new Fx.Tween(this, this.retrieve('tween:options'))); + } + return this.retrieve('tween'); + } + +}; + +Element.implement({ + + tween: function(property, from, to){ + this.get('tween').start(arguments); + return this; + }, + + fade: function(how){ + var fade = this.get('tween'), o = 'opacity', toggle; + how = $pick(how, 'toggle'); + switch (how){ + case 'in': fade.start(o, 1); break; + case 'out': fade.start(o, 0); break; + case 'show': fade.set(o, 1); break; + case 'hide': fade.set(o, 0); break; + case 'toggle': + var flag = this.retrieve('fade:flag', this.get('opacity') == 1); + fade.start(o, (flag) ? 0 : 1); + this.store('fade:flag', !flag); + toggle = true; + break; + default: fade.start(o, arguments); + } + if (!toggle) this.eliminate('fade:flag'); + return this; + }, + + highlight: function(start, end){ + if (!end){ + end = this.retrieve('highlight:original', this.getStyle('background-color')); + end = (end == 'transparent') ? '#fff' : end; + } + var tween = this.get('tween'); + tween.start('background-color', start || '#ffff88', end).chain(function(){ + this.setStyle('background-color', this.retrieve('highlight:original')); + tween.callChain(); + }.bind(this)); + return this; + } + +}); + + +/* +--- + +script: Fx.Morph.js + +description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules. + +license: MIT-style license. + +requires: +- /Fx.CSS + +provides: [Fx.Morph] + +... +*/ + +Fx.Morph = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(now){ + if (typeof now == 'string') now = this.search(now); + for (var p in now) this.render(this.element, p, now[p], this.options.unit); + return this; + }, + + compute: function(from, to, delta){ + var now = {}; + for (var p in from) now[p] = this.parent(from[p], to[p], delta); + return now; + }, + + start: function(properties){ + if (!this.check(properties)) return this; + if (typeof properties == 'string') properties = this.search(properties); + var from = {}, to = {}; + for (var p in properties){ + var parsed = this.prepare(this.element, p, properties[p]); + from[p] = parsed.from; + to[p] = parsed.to; + } + return this.parent(from, to); + } + +}); + +Element.Properties.morph = { + + set: function(options){ + var morph = this.retrieve('morph'); + if (morph) morph.cancel(); + return this.eliminate('morph').store('morph:options', $extend({link: 'cancel'}, options)); + }, + + get: function(options){ + if (options || !this.retrieve('morph')){ + if (options || !this.retrieve('morph:options')) this.set('morph', options); + this.store('morph', new Fx.Morph(this, this.retrieve('morph:options'))); + } + return this.retrieve('morph'); + } + +}; + +Element.implement({ + + morph: function(props){ + this.get('morph').start(props); + return this; + } + +}); + + +/* +--- + +script: Fx.Transitions.js + +description: Contains a set of advanced transitions to be used with any of the Fx Classes. + +license: MIT-style license. + +credits: +- Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. + +requires: +- /Fx + +provides: [Fx.Transitions] + +... +*/ + +Fx.implement({ + + getTransition: function(){ + var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; + if (typeof trans == 'string'){ + var data = trans.split(':'); + trans = Fx.Transitions; + trans = trans[data[0]] || trans[data[0].capitalize()]; + if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; + } + return trans; + } + +}); + +Fx.Transition = function(transition, params){ + params = $splat(params); + return $extend(transition, { + easeIn: function(pos){ + return transition(pos, params); + }, + easeOut: function(pos){ + return 1 - transition(1 - pos, params); + }, + easeInOut: function(pos){ + return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2; + } + }); +}; + +Fx.Transitions = new Hash({ + + linear: $arguments(0) + +}); + +Fx.Transitions.extend = function(transitions){ + for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); +}; + +Fx.Transitions.extend({ + + Pow: function(p, x){ + return Math.pow(p, x[0] || 6); + }, + + Expo: function(p){ + return Math.pow(2, 8 * (p - 1)); + }, + + Circ: function(p){ + return 1 - Math.sin(Math.acos(p)); + }, + + Sine: function(p){ + return 1 - Math.sin((1 - p) * Math.PI / 2); + }, + + Back: function(p, x){ + x = x[0] || 1.618; + return Math.pow(p, 2) * ((x + 1) * p - x); + }, + + Bounce: function(p){ + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2){ + if (p >= (7 - 4 * a) / 11){ + value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + Elastic: function(p, x){ + return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3); + } + +}); + +['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ + Fx.Transitions[transition] = new Fx.Transition(function(p){ + return Math.pow(p, [i + 2]); + }); +}); + + +/* +--- + +script: Request.js + +description: Powerful all purpose Request Class. Uses XMLHTTPRequest. + +license: MIT-style license. + +requires: +- /Element +- /Chain +- /Events +- /Options +- /Browser + +provides: [Request] + +... +*/ + +var Request = new Class({ + + Implements: [Chain, Events, Options], + + options: {/* + onRequest: $empty, + onComplete: $empty, + onCancel: $empty, + onSuccess: $empty, + onFailure: $empty, + onException: $empty,*/ + url: '', + data: '', + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }, + async: true, + format: false, + method: 'post', + link: 'ignore', + isSuccess: null, + emulation: true, + urlEncoded: true, + encoding: 'utf-8', + evalScripts: false, + evalResponse: false, + noCache: false + }, + + initialize: function(options){ + this.xhr = new Browser.Request(); + this.setOptions(options); + this.options.isSuccess = this.options.isSuccess || this.isSuccess; + this.headers = new Hash(this.options.headers); + }, + + onStateChange: function(){ + if (this.xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + $try(function(){ + this.status = this.xhr.status; + }.bind(this)); + this.xhr.onreadystatechange = $empty; + if (this.options.isSuccess.call(this, this.status)){ + this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML}; + this.success(this.response.text, this.response.xml); + } else { + this.response = {text: null, xml: null}; + this.failure(); + } + }, + + isSuccess: function(){ + return ((this.status >= 200) && (this.status < 300)); + }, + + processScripts: function(text){ + if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text); + return text.stripScripts(this.options.evalScripts); + }, + + success: function(text, xml){ + this.onSuccess(this.processScripts(text), xml); + }, + + onSuccess: function(){ + this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); + }, + + failure: function(){ + this.onFailure(); + }, + + onFailure: function(){ + this.fireEvent('complete').fireEvent('failure', this.xhr); + }, + + setHeader: function(name, value){ + this.headers.set(name, value); + return this; + }, + + getHeader: function(name){ + return $try(function(){ + return this.xhr.getResponseHeader(name); + }.bind(this)); + }, + + check: function(){ + if (!this.running) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.bind(this, arguments)); return false; + } + return false; + }, + + send: function(options){ + if (!this.check(options)) return this; + this.running = true; + + var type = $type(options); + if (type == 'string' || type == 'element') options = {data: options}; + + var old = this.options; + options = $extend({data: old.data, url: old.url, method: old.method}, options); + var data = options.data, url = String(options.url), method = options.method.toLowerCase(); + + switch ($type(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Hash.toQueryString(data); + } + + if (this.options.format){ + var format = 'format=' + this.options.format; + data = (data) ? format + '&' + data : format; + } + + if (this.options.emulation && !['get', 'post'].contains(method)){ + var _method = '_method=' + method; + data = (data) ? _method + '&' + data : _method; + method = 'post'; + } + + if (this.options.urlEncoded && method == 'post'){ + var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; + this.headers.set('Content-type', 'application/x-www-form-urlencoded' + encoding); + } + + if (this.options.noCache){ + var noCache = 'noCache=' + new Date().getTime(); + data = (data) ? noCache + '&' + data : noCache; + } + + var trimPosition = url.lastIndexOf('/'); + if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); + + if (data && method == 'get'){ + url = url + (url.contains('?') ? '&' : '?') + data; + data = null; + } + + this.xhr.open(method.toUpperCase(), url, this.options.async); + + this.xhr.onreadystatechange = this.onStateChange.bind(this); + + this.headers.each(function(value, key){ + try { + this.xhr.setRequestHeader(key, value); + } catch (e){ + this.fireEvent('exception', [key, value]); + } + }, this); + + this.fireEvent('request'); + this.xhr.send(data); + if (!this.options.async) this.onStateChange(); + return this; + }, + + cancel: function(){ + if (!this.running) return this; + this.running = false; + this.xhr.abort(); + this.xhr.onreadystatechange = $empty; + this.xhr = new Browser.Request(); + this.fireEvent('cancel'); + return this; + } + +}); + +(function(){ + +var methods = {}; +['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ + methods[method] = function(){ + var params = Array.link(arguments, {url: String.type, data: $defined}); + return this.send($extend(params, {method: method})); + }; +}); + +Request.implement(methods); + +})(); + +Element.Properties.send = { + + set: function(options){ + var send = this.retrieve('send'); + if (send) send.cancel(); + return this.eliminate('send').store('send:options', $extend({ + data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') + }, options)); + }, + + get: function(options){ + if (options || !this.retrieve('send')){ + if (options || !this.retrieve('send:options')) this.set('send', options); + this.store('send', new Request(this.retrieve('send:options'))); + } + return this.retrieve('send'); + } + +}; + +Element.implement({ + + send: function(url){ + var sender = this.get('send'); + sender.send({data: this, url: url || sender.options.url}); + return this; + } + +}); + + +/* +--- + +script: Request.HTML.js + +description: Extends the basic Request Class with additional methods for interacting with HTML responses. + +license: MIT-style license. + +requires: +- /Request +- /Element + +provides: [Request.HTML] + +... +*/ + +Request.HTML = new Class({ + + Extends: Request, + + options: { + update: false, + append: false, + evalScripts: true, + filter: false + }, + + processHTML: function(text){ + var match = text.match(/]*>([\s\S]*?)<\/body>/i); + text = (match) ? match[1] : text; + + var container = new Element('div'); + + return $try(function(){ + var root = '' + text + '', doc; + if (Browser.Engine.trident){ + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = false; + doc.loadXML(root); + } else { + doc = new DOMParser().parseFromString(root, 'text/xml'); + } + root = doc.getElementsByTagName('root')[0]; + if (!root) return null; + for (var i = 0, k = root.childNodes.length; i < k; i++){ + var child = Element.clone(root.childNodes[i], true, true); + if (child) container.grab(child); + } + return container; + }) || container.set('html', text); + }, + + success: function(text){ + var options = this.options, response = this.response; + + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + + var temp = this.processHTML(response.html); + + response.tree = temp.childNodes; + response.elements = temp.getElements('*'); + + if (options.filter) response.tree = response.elements.filter(options.filter); + if (options.update) document.id(options.update).empty().set('html', response.html); + else if (options.append) document.id(options.append).adopt(temp.getChildren()); + if (options.evalScripts) $exec(response.javascript); + + this.onSuccess(response.tree, response.elements, response.html, response.javascript); + } + +}); + +Element.Properties.load = { + + set: function(options){ + var load = this.retrieve('load'); + if (load) load.cancel(); + return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options)); + }, + + get: function(options){ + if (options || ! this.retrieve('load')){ + if (options || !this.retrieve('load:options')) this.set('load', options); + this.store('load', new Request.HTML(this.retrieve('load:options'))); + } + return this.retrieve('load'); + } + +}; + +Element.implement({ + + load: function(){ + this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type})); + return this; + } + +}); + + +/* +--- + +script: Request.JSON.js + +description: Extends the basic Request Class with additional methods for sending and receiving JSON data. + +license: MIT-style license. + +requires: +- /Request JSON + +provides: [Request.HTML] + +... +*/ + +Request.JSON = new Class({ + + Extends: Request, + + options: { + secure: true + }, + + initialize: function(options){ + this.parent(options); + this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'}); + }, + + success: function(text){ + this.response.json = JSON.decode(text, this.options.secure); + this.onSuccess(this.response.json, text); + } + +}); + +//MooTools More, . Copyright (c) 2006-2009 Aaron Newton , Valerio Proietti & the MooTools team , MIT Style License. + +/* +--- + +script: More.js + +description: MooTools More + +license: MIT-style license + +authors: +- Guillermo Rauch +- Thomas Aylott +- Scott Kyle + +requires: +- core:1.2.4/MooTools + +provides: [MooTools.More] + +... +*/ + +MooTools.More = { + 'version': '1.2.4.2', + 'build': 'bd5a93c0913cce25917c48cbdacde568e15e02ef' +}; + +/* +--- + +script: Fx.Scroll.js + +description: Effect to smoothly scroll any element, including the window. + +license: MIT-style license + +authors: +- Valerio Proietti + +requires: +- core:1.2.4/Fx +- core:1.2.4/Element.Event +- core:1.2.4/Element.Dimensions +- /MooTools.More + +provides: [Fx.Scroll] + +... +*/ + +Fx.Scroll = new Class({ + + Extends: Fx, + + options: { + offset: {x: 0, y: 0}, + wheelStops: true + }, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + var cancel = this.cancel.bind(this, false); + + if ($type(this.element) != 'element') this.element = document.id(this.element.getDocument().body); + + var stopper = this.element; + + if (this.options.wheelStops){ + this.addEvent('start', function(){ + stopper.addEvent('mousewheel', cancel); + }, true); + this.addEvent('complete', function(){ + stopper.removeEvent('mousewheel', cancel); + }, true); + } + }, + + set: function(){ + var now = Array.flatten(arguments); + if (Browser.Engine.gecko) now = [Math.round(now[0]), Math.round(now[1])]; + this.element.scrollTo(now[0], now[1]); + }, + + compute: function(from, to, delta){ + return [0, 1].map(function(i){ + return Fx.compute(from[i], to[i], delta); + }); + }, + + start: function(x, y){ + if (!this.check(x, y)) return this; + var scrollSize = this.element.getScrollSize(), + scroll = this.element.getScroll(), + values = {x: x, y: y}; + for (var z in values){ + var max = scrollSize[z]; + if ($chk(values[z])) values[z] = ($type(values[z]) == 'number') ? values[z] : max; + else values[z] = scroll[z]; + values[z] += this.options.offset[z]; + } + return this.parent([scroll.x, scroll.y], [values.x, values.y]); + }, + + toTop: function(){ + return this.start(false, 0); + }, + + toLeft: function(){ + return this.start(0, false); + }, + + toRight: function(){ + return this.start('right', false); + }, + + toBottom: function(){ + return this.start(false, 'bottom'); + }, + + toElement: function(el){ + var position = document.id(el).getPosition(this.element); + return this.start(position.x, position.y); + }, + + scrollIntoView: function(el, axes, offset){ + axes = axes ? $splat(axes) : ['x','y']; + var to = {}; + el = document.id(el); + var pos = el.getPosition(this.element); + var size = el.getSize(); + var scroll = this.element.getScroll(); + var containerSize = this.element.getSize(); + var edge = { + x: pos.x + size.x, + y: pos.y + size.y + }; + ['x','y'].each(function(axis) { + if (axes.contains(axis)) { + if (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] = edge[axis] - containerSize[axis]; + if (pos[axis] < scroll[axis]) to[axis] = pos[axis]; + } + if (to[axis] == null) to[axis] = scroll[axis]; + if (offset && offset[axis]) to[axis] = to[axis] + offset[axis]; + }, this); + if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y); + return this; + }, + + scrollToCenter: function(el, axes, offset){ + axes = axes ? $splat(axes) : ['x', 'y']; + el = $(el); + var to = {}, + pos = el.getPosition(this.element), + size = el.getSize(), + scroll = this.element.getScroll(), + containerSize = this.element.getSize(), + edge = { + x: pos.x + size.x, + y: pos.y + size.y + }; + + ['x','y'].each(function(axis){ + if(axes.contains(axis)){ + to[axis] = pos[axis] - (containerSize[axis] - size[axis])/2; + } + if(to[axis] == null) to[axis] = scroll[axis]; + if(offset && offset[axis]) to[axis] = to[axis] + offset[axis]; + }, this); + if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y); + return this; + } + +}); + + +/* +--- + +script: Drag.js + +description: The base Drag Class. Can be used to drag and resize Elements using mouse events. + +license: MIT-style license + +authors: +- Valerio Proietti +- Tom Occhinno +- Jan Kassens + +requires: +- core:1.2.4/Events +- core:1.2.4/Options +- core:1.2.4/Element.Event +- core:1.2.4/Element.Style +- /MooTools.More + +provides: [Drag] + +*/ + +var Drag = new Class({ + + Implements: [Events, Options], + + options: {/* + onBeforeStart: $empty(thisElement), + onStart: $empty(thisElement, event), + onSnap: $empty(thisElement) + onDrag: $empty(thisElement, event), + onCancel: $empty(thisElement), + onComplete: $empty(thisElement, event),*/ + snap: 6, + unit: 'px', + grid: false, + style: true, + limit: false, + handle: false, + invert: false, + preventDefault: false, + stopPropagation: false, + modifiers: {x: 'left', y: 'top'} + }, + + initialize: function(){ + var params = Array.link(arguments, {'options': Object.type, 'element': $defined}); + this.element = document.id(params.element); + this.document = this.element.getDocument(); + this.setOptions(params.options || {}); + var htype = $type(this.options.handle); + this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element; + this.mouse = {'now': {}, 'pos': {}}; + this.value = {'start': {}, 'now': {}}; + + this.selection = (Browser.Engine.trident) ? 'selectstart' : 'mousedown'; + + this.bound = { + start: this.start.bind(this), + check: this.check.bind(this), + drag: this.drag.bind(this), + stop: this.stop.bind(this), + cancel: this.cancel.bind(this), + eventStop: $lambda(false) + }; + this.attach(); + }, + + attach: function(){ + this.handles.addEvent('mousedown', this.bound.start); + return this; + }, + + detach: function(){ + this.handles.removeEvent('mousedown', this.bound.start); + return this; + }, + + start: function(event){ + if (event.rightClick) return; + if (this.options.preventDefault) event.preventDefault(); + if (this.options.stopPropagation) event.stopPropagation(); + this.mouse.start = event.page; + this.fireEvent('beforeStart', this.element); + var limit = this.options.limit; + this.limit = {x: [], y: []}; + for (var z in this.options.modifiers){ + if (!this.options.modifiers[z]) continue; + if (this.options.style) this.value.now[z] = this.element.getStyle(this.options.modifiers[z]).toInt(); + else this.value.now[z] = this.element[this.options.modifiers[z]]; + if (this.options.invert) this.value.now[z] *= -1; + this.mouse.pos[z] = event.page[z] - this.value.now[z]; + if (limit && limit[z]){ + for (var i = 2; i--; i){ + if ($chk(limit[z][i])) this.limit[z][i] = $lambda(limit[z][i])(); + } + } + } + if ($type(this.options.grid) == 'number') this.options.grid = {x: this.options.grid, y: this.options.grid}; + this.document.addEvents({mousemove: this.bound.check, mouseup: this.bound.cancel}); + this.document.addEvent(this.selection, this.bound.eventStop); + }, + + check: function(event){ + if (this.options.preventDefault) event.preventDefault(); + var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2))); + if (distance > this.options.snap){ + this.cancel(); + this.document.addEvents({ + mousemove: this.bound.drag, + mouseup: this.bound.stop + }); + this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element); + } + }, + + drag: function(event){ + if (this.options.preventDefault) event.preventDefault(); + this.mouse.now = event.page; + for (var z in this.options.modifiers){ + if (!this.options.modifiers[z]) continue; + this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z]; + if (this.options.invert) this.value.now[z] *= -1; + if (this.options.limit && this.limit[z]){ + if ($chk(this.limit[z][1]) && (this.value.now[z] > this.limit[z][1])){ + this.value.now[z] = this.limit[z][1]; + } else if ($chk(this.limit[z][0]) && (this.value.now[z] < this.limit[z][0])){ + this.value.now[z] = this.limit[z][0]; + } + } + if (this.options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % this.options.grid[z]); + if (this.options.style) { + this.element.setStyle(this.options.modifiers[z], this.value.now[z] + this.options.unit); + } else { + this.element[this.options.modifiers[z]] = this.value.now[z]; + } + } + this.fireEvent('drag', [this.element, event]); + }, + + cancel: function(event){ + this.document.removeEvent('mousemove', this.bound.check); + this.document.removeEvent('mouseup', this.bound.cancel); + if (event){ + this.document.removeEvent(this.selection, this.bound.eventStop); + this.fireEvent('cancel', this.element); + } + }, + + stop: function(event){ + this.document.removeEvent(this.selection, this.bound.eventStop); + this.document.removeEvent('mousemove', this.bound.drag); + this.document.removeEvent('mouseup', this.bound.stop); + if (event) this.fireEvent('complete', [this.element, event]); + } + +}); + +Element.implement({ + + makeResizable: function(options){ + var drag = new Drag(this, $merge({modifiers: {x: 'width', y: 'height'}}, options)); + this.store('resizer', drag); + return drag.addEvent('drag', function(){ + this.fireEvent('resize', drag); + }.bind(this)); + } + +}); + + +/* +--- + +script: Drag.Move.js + +description: A Drag extension that provides support for the constraining of draggables to containers and droppables. + +license: MIT-style license + +authors: +- Valerio Proietti +- Tom Occhinno +- Jan Kassens +- Aaron Newton +- Scott Kyle + +requires: +- core:1.2.4/Element.Dimensions +- /Drag + +provides: [Drag.Move] + +... +*/ + +Drag.Move = new Class({ + + Extends: Drag, + + options: {/* + onEnter: $empty(thisElement, overed), + onLeave: $empty(thisElement, overed), + onDrop: $empty(thisElement, overed, event),*/ + droppables: [], + container: false, + precalculate: false, + includeMargins: true, + checkDroppables: true + }, + + initialize: function(element, options){ + this.parent(element, options); + element = this.element; + + this.droppables = $$(this.options.droppables); + this.container = document.id(this.options.container); + + if (this.container && $type(this.container) != 'element') + this.container = document.id(this.container.getDocument().body); + + var styles = element.getStyles('left', 'right', 'position'); + if (styles.left == 'auto' || styles.top == 'auto') + element.setPosition(element.getPosition(element.getOffsetParent())); + + if (styles.position == 'static') + element.setStyle('position', 'absolute'); + + this.addEvent('start', this.checkDroppables, true); + + this.overed = null; + }, + + start: function(event){ + if (this.container) this.options.limit = this.calculateLimit(); + + if (this.options.precalculate){ + this.positions = this.droppables.map(function(el){ + return el.getCoordinates(); + }); + } + + this.parent(event); + }, + + calculateLimit: function(){ + var offsetParent = this.element.getOffsetParent(), + containerCoordinates = this.container.getCoordinates(offsetParent), + containerBorder = {}, + elementMargin = {}, + elementBorder = {}, + containerMargin = {}, + offsetParentPadding = {}; + + ['top', 'right', 'bottom', 'left'].each(function(pad){ + containerBorder[pad] = this.container.getStyle('border-' + pad).toInt(); + elementBorder[pad] = this.element.getStyle('border-' + pad).toInt(); + elementMargin[pad] = this.element.getStyle('margin-' + pad).toInt(); + containerMargin[pad] = this.container.getStyle('margin-' + pad).toInt(); + offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt(); + }, this); + + var width = this.element.offsetWidth + elementMargin.left + elementMargin.right, + height = this.element.offsetHeight + elementMargin.top + elementMargin.bottom, + left = 0, + top = 0, + right = containerCoordinates.right - containerBorder.right - width, + bottom = containerCoordinates.bottom - containerBorder.bottom - height; + + if (this.options.includeMargins){ + left += elementMargin.left; + top += elementMargin.top; + } else { + right += elementMargin.right; + bottom += elementMargin.bottom; + } + + if (this.element.getStyle('position') == 'relative'){ + var coords = this.element.getCoordinates(offsetParent); + coords.left -= this.element.getStyle('left').toInt(); + coords.top -= this.element.getStyle('top').toInt(); + + left += containerBorder.left - coords.left; + top += containerBorder.top - coords.top; + right += elementMargin.left - coords.left; + bottom += elementMargin.top - coords.top; + + if (this.container != offsetParent){ + left += containerMargin.left + offsetParentPadding.left; + top += (Browser.Engine.trident4 ? 0 : containerMargin.top) + offsetParentPadding.top; + } + } else { + left -= elementMargin.left; + top -= elementMargin.top; + + if (this.container == offsetParent){ + right -= containerBorder.left; + bottom -= containerBorder.top; + } else { + left += containerCoordinates.left + containerBorder.left; + top += containerCoordinates.top + containerBorder.top; + } + } + + return { + x: [left, right], + y: [top, bottom] + }; + }, + + checkAgainst: function(el, i){ + el = (this.positions) ? this.positions[i] : el.getCoordinates(); + var now = this.mouse.now; + return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top); + }, + + checkDroppables: function(){ + var overed = this.droppables.filter(this.checkAgainst, this).getLast(); + if (this.overed != overed){ + if (this.overed) this.fireEvent('leave', [this.element, this.overed]); + if (overed) this.fireEvent('enter', [this.element, overed]); + this.overed = overed; + } + }, + + drag: function(event){ + this.parent(event); + if (this.options.checkDroppables && this.droppables.length) this.checkDroppables(); + }, + + stop: function(event){ + this.checkDroppables(); + this.fireEvent('drop', [this.element, this.overed, event]); + this.overed = null; + return this.parent(event); + } + +}); + +Element.implement({ + + makeDraggable: function(options){ + var drag = new Drag.Move(this, options); + this.store('dragger', drag); + return drag; + } + +}); + + +/* +--- + +script: Hash.Cookie.js + +description: Class for creating, reading, and deleting Cookies in JSON format. + +license: MIT-style license + +authors: +- Valerio Proietti +- Aaron Newton + +requires: +- core:1.2.4/Cookie +- core:1.2.4/JSON +- /MooTools.More + +provides: [Hash.Cookie] + +... +*/ + +Hash.Cookie = new Class({ + + Extends: Cookie, + + options: { + autoSave: true + }, + + initialize: function(name, options){ + this.parent(name, options); + this.load(); + }, + + save: function(){ + var value = JSON.encode(this.hash); + if (!value || value.length > 4096) return false; //cookie would be truncated! + if (value == '{}') this.dispose(); + else this.write(value); + return true; + }, + + load: function(){ + this.hash = new Hash(JSON.decode(this.read(), true)); + return this; + } + +}); + +Hash.each(Hash.prototype, function(method, name){ + if (typeof method == 'function') Hash.Cookie.implement(name, function(){ + var value = method.apply(this.hash, arguments); + if (this.options.autoSave) this.save(); + return value; + }); +}); diff --git a/javascript/mif-tree/Demos/assets/scripts/showdown.js b/javascript/mif-tree/Demos/assets/scripts/showdown.js new file mode 100755 index 0000000..3f0696a --- /dev/null +++ b/javascript/mif-tree/Demos/assets/scripts/showdown.js @@ -0,0 +1,1296 @@ +// +// showdown.js -- A javascript port of Markdown. +// +// Copyright (c) 2007 John Fraser. +// +// Original Markdown Copyright (c) 2004-2005 John Gruber +// +// +// Redistributable under a BSD-style open source license. +// See license.txt for more information. +// +// The full source distribution is at: +// +// A A L +// T C A +// T K B +// +// +// + +// +// Wherever possible, Showdown is a straight, line-by-line port +// of the Perl version of Markdown. +// +// This is not a normal parser design; it's basically just a +// series of string substitutions. It's hard to read and +// maintain this way, but keeping Showdown close to the original +// design makes it easier to port new features. +// +// More importantly, Showdown behaves like markdown.pl in most +// edge cases. So web applications can do client-side preview +// in Javascript, and then build identical HTML on the server. +// +// This port needs the new RegExp functionality of ECMA 262, +// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers +// should do fine. Even with the new regular expression features, +// We do a lot of work to emulate Perl's regex functionality. +// The tricky changes in this file mostly have the "attacklab:" +// label. Major or self-explanatory changes don't. +// +// Smart diff tools like Araxis Merge will be able to match up +// this file with markdown.pl in a useful way. A little tweaking +// helps: in a copy of markdown.pl, replace "#" with "//" and +// replace "$text" with "text". Be sure to ignore whitespace +// and line endings. +// + + +// +// Showdown usage: +// +// var text = "Markdown *rocks*."; +// +// var converter = new Showdown.converter(); +// var html = converter.makeHtml(text); +// +// alert(html); +// +// Note: move the sample code to the bottom of this +// file before uncommenting it. +// + + +// +// Showdown namespace +// +var Showdown = {}; + +// +// converter +// +// Wraps all "globals" so that the only thing +// exposed is makeHtml(). +// +Showdown.converter = function() { + +// +// Globals: +// + +// Global hashes, used by various utility routines +var g_urls; +var g_titles; +var g_html_blocks; + +// Used to track when we're inside an ordered or unordered list +// (see _ProcessListItems() for details): +var g_list_level = 0; + + +this.makeHtml = function(text) { +// +// Main function. The order in which other subs are called here is +// essential. Link and image substitutions need to happen before +// _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the +// and tags get encoded. +// + + // Clear the global hashes. If we don't clear these, you get conflicts + // from other articles when generating a page which contains more than + // one article (e.g. an index page that shows the N most recent + // articles): + g_urls = new Array(); + g_titles = new Array(); + g_html_blocks = new Array(); + + // attacklab: Replace ~ with ~T + // This lets us use tilde as an escape char to avoid md5 hashes + // The choice of character is arbitray; anything that isn't + // magic in Markdown will work. + text = text.replace(/~/g,"~T"); + + // attacklab: Replace $ with ~D + // RegExp interprets $ as a special character + // when it's in a replacement string + text = text.replace(/\$/g,"~D"); + + // Standardize line endings + text = text.replace(/\r\n/g,"\n"); // DOS to Unix + text = text.replace(/\r/g,"\n"); // Mac to Unix + + // Make sure text begins and ends with a couple of newlines: + text = "\n\n" + text + "\n\n"; + + // Convert all tabs to spaces. + text = _Detab(text); + + // Strip any lines consisting only of spaces and tabs. + // This makes subsequent regexen easier to write, because we can + // match consecutive blank lines with /\n+/ instead of something + // contorted like /[ \t]*\n+/ . + text = text.replace(/^[ \t]+$/mg,""); + + // Turn block-level HTML blocks into hash entries + text = _HashHTMLBlocks(text); + + // Strip link definitions, store in hashes. + text = _StripLinkDefinitions(text); + + text = _RunBlockGamut(text); + + text = _UnescapeSpecialChars(text); + + // attacklab: Restore dollar signs + text = text.replace(/~D/g,"$$"); + + // attacklab: Restore tildes + text = text.replace(/~T/g,"~"); + + return text; +} + + +var _StripLinkDefinitions = function(text) { +// +// Strips link definitions from text, stores the URLs and titles in +// hash references. +// + + // Link defs are in the form: ^[id]: url "optional title" + + /* + var text = text.replace(/ + ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1 + [ \t]* + \n? // maybe *one* newline + [ \t]* + ? // url = $2 + [ \t]* + \n? // maybe one newline + [ \t]* + (?: + (\n*) // any lines skipped = $3 attacklab: lookbehind removed + ["(] + (.+?) // title = $4 + [")] + [ \t]* + )? // title is optional + (?:\n+|$) + /gm, + function(){...}); + */ + text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm, + function (wholeMatch,m1,m2,m3,m4) { + m1 = m1.toLowerCase(); + g_urls[m1] = _EncodeAmpsAndAngles(m2); // Link IDs are case-insensitive + if (m3) { + // Oops, found blank lines, so it's not a title. + // Put back the parenthetical statement we stole. + return m3+m4; + } else if (m4) { + g_titles[m1] = m4.replace(/"/g,"""); + } + + // Completely remove the definition from the text + return ""; + } + ); + + return text; +} + + +var _HashHTMLBlocks = function(text) { + // attacklab: Double up blank lines to reduce lookaround + text = text.replace(/\n/g,"\n\n"); + + // Hashify HTML blocks: + // We only want to do this for block-level HTML tags, such as headers, + // lists, and tables. That's because we still want to wrap

s around + // "paragraphs" that are wrapped in non-block-level tags, such as anchors, + // phrase emphasis, and spans. The list of tags we're looking for is + // hard-coded: + var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del" + var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math" + + // First, look for nested blocks, e.g.: + //

+ //
+ // tags for inner block must be indented. + //
+ //
+ // + // The outermost tags must start at the left margin for this to match, and + // the inner nested divs must be indented. + // We need to do this before the next, more liberal match, because the next + // match will start at the first `
` and stop at the first `
`. + + // attacklab: This regex can be expensive when it fails. + /* + var text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_a) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*?\n // any number of lines, minimally matching + // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,hashElement); + + // + // Now match more liberally, simply from `\n` to `\n` + // + + /* + var text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_b) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*? // any number of lines, minimally matching + .* // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,hashElement); + + // Special case just for
. It was easier to make a special case than + // to make the other regex more complicated. + + /* + text = text.replace(/ + ( // save in $1 + \n\n // Starting after a blank line + [ ]{0,3} + (<(hr) // start tag = $2 + \b // word break + ([^<>])*? // + \/?>) // the matching end tag + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,hashElement); + + // Special case for standalone HTML comments: + + /* + text = text.replace(/ + ( // save in $1 + \n\n // Starting after a blank line + [ ]{0,3} // attacklab: g_tab_width - 1 + + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/(\n\n[ ]{0,3}[ \t]*(?=\n{2,}))/g,hashElement); + + // PHP and ASP-style processor instructions ( and <%...%>) + + /* + text = text.replace(/ + (?: + \n\n // Starting after a blank line + ) + ( // save in $1 + [ ]{0,3} // attacklab: g_tab_width - 1 + (?: + <([?%]) // $2 + [^\r]*? + \2> + ) + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,hashElement); + + // attacklab: Undo double lines (see comment at top of this function) + text = text.replace(/\n\n/g,"\n"); + return text; +} + +var hashElement = function(wholeMatch,m1) { + var blockText = m1; + + // Undo double lines + blockText = blockText.replace(/\n\n/g,"\n"); + blockText = blockText.replace(/^\n/,""); + + // strip trailing blank lines + blockText = blockText.replace(/\n+$/g,""); + + // Replace the element text with a marker ("~KxK" where x is its key) + blockText = "\n\n~K" + (g_html_blocks.push(blockText)-1) + "K\n\n"; + + return blockText; +}; + +var _RunBlockGamut = function(text) { +// +// These are all the transformations that form block-level +// tags like paragraphs, headers, and list items. +// + text = _DoHeaders(text); + + // Do Horizontal Rules: + var key = hashBlock("
"); + text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key); + text = text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key); + text = text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key); + + text = _DoLists(text); + text = _DoCodeBlocks(text); + text = _DoBlockQuotes(text); + + // We already ran _HashHTMLBlocks() before, in Markdown(), but that + // was to escape raw HTML in the original Markdown source. This time, + // we're escaping the markup we've just created, so that we don't wrap + //

tags around block-level tags. + text = _HashHTMLBlocks(text); + text = _FormParagraphs(text); + + return text; +} + + +var _RunSpanGamut = function(text) { +// +// These are all the transformations that occur *within* block-level +// tags like paragraphs, headers, and list items. +// + + text = _DoCodeSpans(text); + text = _EscapeSpecialCharsWithinTagAttributes(text); + text = _EncodeBackslashEscapes(text); + + // Process anchor and image tags. Images must come first, + // because ![foo][f] looks like an anchor. + text = _DoImages(text); + text = _DoAnchors(text); + + // Make links out of things like `` + // Must come after _DoAnchors(), because you can use < and > + // delimiters in inline links like [this](). + text = _DoAutoLinks(text); + text = _EncodeAmpsAndAngles(text); + text = _DoItalicsAndBold(text); + + // Do hard breaks: + text = text.replace(/ +\n/g,"
\n"); + + return text; +} + +var _EscapeSpecialCharsWithinTagAttributes = function(text) { +// +// Within tags -- meaning between < and > -- encode [\ ` * _] so they +// don't conflict with their use in Markdown for code, italics and strong. +// + + // Build a regex to find HTML tags and comments. See Friedl's + // "Mastering Regular Expressions", 2nd Ed., pp. 200-201. + var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi; + + text = text.replace(regex, function(wholeMatch) { + var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g,"$1`"); + tag = escapeCharacters(tag,"\\`*_"); + return tag; + }); + + return text; +} + +var _DoAnchors = function(text) { +// +// Turn Markdown link shortcuts into XHTML
tags. +// + // + // First, handle reference-style links: [link text] [id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[] // or anything else + )* + ) + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + )()()()() // pad remaining backreferences + /g,_DoAnchors_callback); + */ + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeAnchorTag); + + // + // Next, inline-style links: [link text](url "optional title") + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[\]] // or anything else + ) + ) + \] + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? // href = $4 + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // Title = $7 + \6 // matching quote + [ \t]* // ignore any spaces/tabs between closing quote and ) + )? // title is optional + \) + ) + /g,writeAnchorTag); + */ + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeAnchorTag); + + // + // Last, handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link test][1] + // or [link test](/foo) + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ([^\[\]]+) // link text = $2; can't contain '[' or ']' + \] + )()()()()() // pad rest of backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag); + + return text; +} + +var writeAnchorTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) { + if (m7 == undefined) m7 = ""; + var whole_match = m1; + var link_text = m2; + var link_id = m3.toLowerCase(); + var url = m4; + var title = m7; + + if (url == "") { + if (link_id == "") { + // lower-case and turn embedded newlines into spaces + link_id = link_text.toLowerCase().replace(/ ?\n/g," "); + } + url = "#"+link_id; + + if (g_urls[link_id] != undefined) { + url = g_urls[link_id]; + if (g_titles[link_id] != undefined) { + title = g_titles[link_id]; + } + } + else { + if (whole_match.search(/\(\s*\)$/m)>-1) { + // Special case for explicit empty url + url = ""; + } else { + return whole_match; + } + } + } + + url = escapeCharacters(url,"*_"); + var result = ""; + + return result; +} + + +var _DoImages = function(text) { +// +// Turn Markdown image shortcuts into tags. +// + + // + // First, handle reference-style labeled images: ![alt text][id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + )()()()() // pad rest of backreferences + /g,writeImageTag); + */ + text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeImageTag); + + // + // Next, handle inline images: ![alt text](url "optional title") + // Don't forget: encode * and _ + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + \s? // One optional whitespace character + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? // src url = $4 + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // title = $7 + \6 // matching quote + [ \t]* + )? // title is optional + \) + ) + /g,writeImageTag); + */ + text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeImageTag); + + return text; +} + +var writeImageTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) { + var whole_match = m1; + var alt_text = m2; + var link_id = m3.toLowerCase(); + var url = m4; + var title = m7; + + if (!title) title = ""; + + if (url == "") { + if (link_id == "") { + // lower-case and turn embedded newlines into spaces + link_id = alt_text.toLowerCase().replace(/ ?\n/g," "); + } + url = "#"+link_id; + + if (g_urls[link_id] != undefined) { + url = g_urls[link_id]; + if (g_titles[link_id] != undefined) { + title = g_titles[link_id]; + } + } + else { + return whole_match; + } + } + + alt_text = alt_text.replace(/"/g,"""); + url = escapeCharacters(url,"*_"); + var result = "\""" + _RunSpanGamut(m1) + "");}); + + text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, + function(matchFound,m1){return hashBlock("

" + _RunSpanGamut(m1) + "

");}); + + // atx-style headers: + // # Header 1 + // ## Header 2 + // ## Header 2 with closing hashes ## + // ... + // ###### Header 6 + // + + /* + text = text.replace(/ + ^(\#{1,6}) // $1 = string of #'s + [ \t]* + (.+?) // $2 = Header text + [ \t]* + \#* // optional closing #'s (not counted) + \n+ + /gm, function() {...}); + */ + + text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, + function(wholeMatch,m1,m2) { + var h_level = m1.length; + return hashBlock("" + _RunSpanGamut(m2) + ""); + }); + + return text; +} + +// This declaration keeps Dojo compressor from outputting garbage: +var _ProcessListItems; + +var _DoLists = function(text) { +// +// Form HTML ordered (numbered) and unordered (bulleted) lists. +// + + // attacklab: add sentinel to hack around khtml/safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=11231 + text += "~0"; + + // Re-usable pattern to match any entirel ul or ol list: + + /* + var whole_list = / + ( // $1 = whole list + ( // $2 + [ ]{0,3} // attacklab: g_tab_width - 1 + ([*+-]|\d+[.]) // $3 = first list item marker + [ \t]+ + ) + [^\r]+? + ( // $4 + ~0 // sentinel for workaround; should be $ + | + \n{2,} + (?=\S) + (?! // Negative lookahead for another list item marker + [ \t]* + (?:[*+-]|\d+[.])[ \t]+ + ) + ) + )/g + */ + var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + + if (g_list_level) { + text = text.replace(whole_list,function(wholeMatch,m1,m2) { + var list = m1; + var list_type = (m2.search(/[*+-]/g)>-1) ? "ul" : "ol"; + + // Turn double returns into triple returns, so that we can make a + // paragraph for the last item in a list, if necessary: + list = list.replace(/\n{2,}/g,"\n\n\n");; + var result = _ProcessListItems(list); + + // Trim any trailing whitespace, to put the closing `` + // up on the preceding line, to get it past the current stupid + // HTML block parser. This is a hack to work around the terrible + // hack that is the HTML block parser. + result = result.replace(/\s+$/,""); + result = "<"+list_type+">" + result + "\n"; + return result; + }); + } else { + whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; + text = text.replace(whole_list,function(wholeMatch,m1,m2,m3) { + var runup = m1; + var list = m2; + + var list_type = (m3.search(/[*+-]/g)>-1) ? "ul" : "ol"; + // Turn double returns into triple returns, so that we can make a + // paragraph for the last item in a list, if necessary: + var list = list.replace(/\n{2,}/g,"\n\n\n");; + var result = _ProcessListItems(list); + result = runup + "<"+list_type+">\n" + result + "\n"; + return result; + }); + } + + // attacklab: strip sentinel + text = text.replace(/~0/,""); + + return text; +} + +_ProcessListItems = function(list_str) { +// +// Process the contents of a single ordered or unordered list, splitting it +// into individual list items. +// + // The $g_list_level global keeps track of when we're inside a list. + // Each time we enter a list, we increment it; when we leave a list, + // we decrement. If it's zero, we're not in a list anymore. + // + // We do this because when we're not inside a list, we want to treat + // something like this: + // + // I recommend upgrading to version + // 8. Oops, now this line is treated + // as a sub-list. + // + // As a single paragraph, despite the fact that the second line starts + // with a digit-period-space sequence. + // + // Whereas when we're inside a list (or sub-list), that line will be + // treated as the start of a sub-list. What a kludge, huh? This is + // an aspect of Markdown's syntax that's hard to parse perfectly + // without resorting to mind-reading. Perhaps the solution is to + // change the syntax rules such that sub-lists must start with a + // starting cardinal number; e.g. "1." or "a.". + + g_list_level++; + + // trim trailing blank lines: + list_str = list_str.replace(/\n{2,}$/,"\n"); + + // attacklab: add sentinel to emulate \z + list_str += "~0"; + + /* + list_str = list_str.replace(/ + (\n)? // leading line = $1 + (^[ \t]*) // leading whitespace = $2 + ([*+-]|\d+[.]) [ \t]+ // list marker = $3 + ([^\r]+? // list item text = $4 + (\n{1,2})) + (?= \n* (~0 | \2 ([*+-]|\d+[.]) [ \t]+)) + /gm, function(){...}); + */ + list_str = list_str.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm, + function(wholeMatch,m1,m2,m3,m4){ + var item = m4; + var leading_line = m1; + var leading_space = m2; + + if (leading_line || (item.search(/\n{2,}/)>-1)) { + item = _RunBlockGamut(_Outdent(item)); + } + else { + // Recursion for sub-lists: + item = _DoLists(_Outdent(item)); + item = item.replace(/\n$/,""); // chomp(item) + item = _RunSpanGamut(item); + } + + return "
  • " + item + "
  • \n"; + } + ); + + // attacklab: strip sentinel + list_str = list_str.replace(/~0/g,""); + + g_list_level--; + return list_str; +} + + +var _DoCodeBlocks = function(text) { +// +// Process Markdown `
    ` blocks.
    +//  
    +
    +	/*
    +		text = text.replace(text,
    +			/(?:\n\n|^)
    +			(								// $1 = the code block -- one or more lines, starting with a space/tab
    +				(?:
    +					(?:[ ]{4}|\t)			// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
    +					.*\n+
    +				)+
    +			)
    +			(\n*[ ]{0,3}[^ \t\n]|(?=~0))	// attacklab: g_tab_width
    +		/g,function(){...});
    +	*/
    +
    +	// attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
    +	text += "~0";
    +
    +	text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
    +		function(wholeMatch,m1,m2) {
    +			var codeblock = m1;
    +			var nextChar = m2;
    +
    +			codeblock = _EncodeCode( _Outdent(codeblock));
    +			codeblock = _Detab(codeblock);
    +			codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines
    +			codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace
    +
    +			codeblock = "
    " + codeblock + "\n
    "; + + return hashBlock(codeblock) + nextChar; + } + ); + + // attacklab: strip sentinel + text = text.replace(/~0/,""); + + return text; +} + +var hashBlock = function(text) { + text = text.replace(/(^\n+|\n+$)/g,""); + return "\n\n~K" + (g_html_blocks.push(text)-1) + "K\n\n"; +} + + +var _DoCodeSpans = function(text) { +// +// * Backtick quotes are used for spans. +// +// * You can use multiple backticks as the delimiters if you want to +// include literal backticks in the code span. So, this input: +// +// Just type ``foo `bar` baz`` at the prompt. +// +// Will translate to: +// +//

    Just type foo `bar` baz at the prompt.

    +// +// There's no arbitrary limit to the number of backticks you +// can use as delimters. If you need three consecutive backticks +// in your code, use four for delimiters, etc. +// +// * You can use spaces to get literal backticks at the edges: +// +// ... type `` `bar` `` ... +// +// Turns to: +// +// ... type `bar` ... +// + + /* + text = text.replace(/ + (^|[^\\]) // Character before opening ` can't be a backslash + (`+) // $2 = Opening run of ` + ( // $3 = The code block + [^\r]*? + [^`] // attacklab: work around lack of lookbehind + ) + \2 // Matching closer + (?!`) + /gm, function(){...}); + */ + + text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, + function(wholeMatch,m1,m2,m3,m4) { + var c = m3; + c = c.replace(/^([ \t]*)/g,""); // leading whitespace + c = c.replace(/[ \t]*$/g,""); // trailing whitespace + c = _EncodeCode(c); + return m1+""+c+""; + }); + + return text; +} + + +var _EncodeCode = function(text) { +// +// Encode/escape certain characters inside Markdown code runs. +// The point is that in code, these characters are literals, +// and lose their special Markdown meanings. +// + // Encode all ampersands; HTML entities are not + // entities within a Markdown code span. + text = text.replace(/&/g,"&"); + + // Do the angle bracket song and dance: + text = text.replace(//g,">"); + + // Now, escape characters that are magic in Markdown: + text = escapeCharacters(text,"\*_{}[]\\",false); + +// jj the line above breaks this: +//--- + +//* Item + +// 1. Subitem + +// special char: * +//--- + + return text; +} + + +var _DoItalicsAndBold = function(text) { + + // must go first: + text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g, + "$2"); + + text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, + "$2"); + + return text; +} + + +var _DoBlockQuotes = function(text) { + + /* + text = text.replace(/ + ( // Wrap whole match in $1 + ( + ^[ \t]*>[ \t]? // '>' at the start of a line + .+\n // rest of the first line + (.+\n)* // subsequent consecutive lines + \n* // blanks + )+ + ) + /gm, function(){...}); + */ + + text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, + function(wholeMatch,m1) { + var bq = m1; + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + bq = bq.replace(/^[ \t]*>[ \t]?/gm,"~0"); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/~0/g,""); + + bq = bq.replace(/^[ \t]+$/gm,""); // trim whitespace-only lines + bq = _RunBlockGamut(bq); // recurse + + bq = bq.replace(/(^|\n)/g,"$1 "); + // These leading spaces screw with
     content, so we need to fix that:
    +			bq = bq.replace(
    +					/(\s*
    [^\r]+?<\/pre>)/gm,
    +				function(wholeMatch,m1) {
    +					var pre = m1;
    +					// attacklab: hack around Konqueror 3.5.4 bug:
    +					pre = pre.replace(/^  /mg,"~0");
    +					pre = pre.replace(/~0/g,"");
    +					return pre;
    +				});
    +
    +			return hashBlock("
    \n" + bq + "\n
    "); + }); + return text; +} + + +var _FormParagraphs = function(text) { +// +// Params: +// $text - string to process with html

    tags +// + + // Strip leading and trailing lines: + text = text.replace(/^\n+/g,""); + text = text.replace(/\n+$/g,""); + + var grafs = text.split(/\n{2,}/g); + var grafsOut = new Array(); + + // + // Wrap

    tags. + // + var end = grafs.length; + for (var i=0; i= 0) { + grafsOut.push(str); + } + else if (str.search(/\S/) >= 0) { + str = _RunSpanGamut(str); + str = str.replace(/^([ \t]*)/g,"

    "); + str += "

    " + grafsOut.push(str); + } + + } + + // + // Unhashify HTML blocks + // + end = grafsOut.length; + for (var i=0; i= 0) { + var blockText = g_html_blocks[RegExp.$1]; + blockText = blockText.replace(/\$/g,"$$$$"); // Escape any dollar signs + grafsOut[i] = grafsOut[i].replace(/~K\d+K/,blockText); + } + } + + return grafsOut.join("\n\n"); +} + + +var _EncodeAmpsAndAngles = function(text) { +// Smart processing for ampersands and angle brackets that need to be encoded. + + // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: + // http://bumppo.net/projects/amputator/ + text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&"); + + // Encode naked <'s + text = text.replace(/<(?![a-z\/?\$!])/gi,"<"); + + return text; +} + + +var _EncodeBackslashEscapes = function(text) { +// +// Parameter: String. +// Returns: The string, with after processing the following backslash +// escape sequences. +// + + // attacklab: The polite way to do this is with the new + // escapeCharacters() function: + // + // text = escapeCharacters(text,"\\",true); + // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); + // + // ...but we're sidestepping its use of the (slow) RegExp constructor + // as an optimization for Firefox. This function gets called a LOT. + + text = text.replace(/\\(\\)/g,escapeCharacters_callback); + text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g,escapeCharacters_callback); + return text; +} + + +var _DoAutoLinks = function(text) { + + text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"
    $1"); + + // Email addresses: + + /* + text = text.replace(/ + < + (?:mailto:)? + ( + [-.\w]+ + \@ + [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ + ) + > + /gi, _DoAutoLinks_callback()); + */ + text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, + function(wholeMatch,m1) { + return _EncodeEmailAddress( _UnescapeSpecialChars(m1) ); + } + ); + + return text; +} + + +var _EncodeEmailAddress = function(addr) { +// +// Input: an email address, e.g. "foo@example.com" +// +// Output: the email address as a mailto link, with each character +// of the address encoded as either a decimal or hex entity, in +// the hopes of foiling most address harvesting spam bots. E.g.: +// +// foo +// @example.com +// +// Based on a filter by Matthew Wickline, posted to the BBEdit-Talk +// mailing list: +// + + // attacklab: why can't javascript speak hex? + function char2hex(ch) { + var hexDigits = '0123456789ABCDEF'; + var dec = ch.charCodeAt(0); + return(hexDigits.charAt(dec>>4) + hexDigits.charAt(dec&15)); + } + + var encode = [ + function(ch){return "&#"+ch.charCodeAt(0)+";";}, + function(ch){return "&#x"+char2hex(ch)+";";}, + function(ch){return ch;} + ]; + + addr = "mailto:" + addr; + + addr = addr.replace(/./g, function(ch) { + if (ch == "@") { + // this *must* be encoded. I insist. + ch = encode[Math.floor(Math.random()*2)](ch); + } else if (ch !=":") { + // leave ':' alone (to spot mailto: later) + var r = Math.random(); + // roughly 10% raw, 45% hex, 45% dec + ch = ( + r > .9 ? encode[2](ch) : + r > .45 ? encode[1](ch) : + encode[0](ch) + ); + } + return ch; + }); + + addr = "" + addr + ""; + addr = addr.replace(/">.+:/g,"\">"); // strip the mailto: from the visible part + + return addr; +} + + +var _UnescapeSpecialChars = function(text) { +// +// Swap back in all the special characters we've hidden. +// + text = text.replace(/~E(\d+)E/g, + function(wholeMatch,m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + } + ); + return text; +} + + +var _Outdent = function(text) { +// +// Remove one level of line-leading tabs or spaces +// + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + text = text.replace(/^(\t|[ ]{1,4})/gm,"~0"); // attacklab: g_tab_width + + // attacklab: clean up hack + text = text.replace(/~0/g,"") + + return text; +} + +var _Detab = function(text) { +// attacklab: Detab's completely rewritten for speed. +// In perl we could fix it by anchoring the regexp with \G. +// In javascript we're less fortunate. + + // expand first n-1 tabs + text = text.replace(/\t(?=\t)/g," "); // attacklab: g_tab_width + + // replace the nth with two sentinels + text = text.replace(/\t/g,"~A~B"); + + // use the sentinel to anchor our regex so it doesn't explode + text = text.replace(/~B(.+?)~A/g, + function(wholeMatch,m1,m2) { + var leadingText = m1; + var numSpaces = 4 - leadingText.length % 4; // attacklab: g_tab_width + + // there *must* be a better way to do this: + for (var i=0; i. +*/ + +body{/*opera 9.5 fix*/ +position:absolute; +} + +/*@group Mif*/ + +#title h1 .mif-m{ +color:#e76f01; +} + +#title h1 .mif-i{ +color:#375b8f; +} + +#title h1 .mif-f{ +color:#e74747; +} + +#title h1 .mif-tree{ +color:#2cad59; +} + +#title h1 .mif-dot{ +color:#588ed1; +} + +#title h1 a:hover .mif-dot{ +color:#db4f6a; +} +/*@end*/ + +/* @group Reset */ + +* { + margin: 0; + padding: 0; +} + +.clear { + clear: both; + display: block; +} + +.left { float: left; } + +#menu ul { + list-style: none; +} + +#submenu ul { + list-style-type: square; +} + +/* @end */ + +/* @group Base */ + +html { + overflow: hidden; +} + +body { + font: 11px/1.5 Lucida Grande, Helvetica, Arial, sans-serif; + background: #F3F1F1; + color: #41464D; +} + +body, #container { + width: 100%; + height: 100%; + overflow: hidden; +} + +a { + text-decoration:none; +} + +#title { + position: absolute; + top: 0; + left: 0; + width: 100%; + padding: 5px 0; + background: #aaa; + background: #41464D; + color: #F3F1F1; + height: 30px; +} + +#menu { + position: absolute; + width: 30%; + overflow-y: auto; + overflow-x: hidden; + top: 40px; + left: 0; + bottom: 0; + height: expression(document.body.clientHeight-40); +} + +#demos { + position: absolute; + top: 40px; + right: 0; + bottom: 0; + overflow: auto; + width: 70%; + height: expression(document.body.clientHeight-40); +} + +span.spc { + display: block; + height: 16px; +} + +#demos-wrapper, #menu-wrapper { + overflow: hidden; + padding: 4px 4px 0; + background: #fff; +} + +#demos-wrapper { + margin: 16px 16px 0 8px; +} + +#menu-wrapper { + margin: 16px 8px 0 16px; +} + +.success a:link, .success a:visited { + color: #657528; +} + +.exception a:link, .exception a:visited { + color: #B33F3F; +} + +a:link, a:visited { + color: #528CE0; +} + +a:hover, a:active { + color: #41464D !important; + cursor: pointer !important; +} + +#title h1 { + font: 25px/1.1 Arial, sans-serif; + font-weight: bolder; + float: left; + margin: 1px 0 2px 20px; + text-shadow: 0 2px 2px rgba(0,0,0,0.4); +} + +#title h1 span { + color: #D2E0E6; +} + +#title ul li { + font-weight: bold; + font-size: 12px; + float: right; + margin: 10px 5px 0; +} + +#title ul { + margin-right: 20px; +} + +#menu h2 { + font-size: 14px; + background: #D0C8C8; + color: #8A7575; + margin-bottom: 4px; + padding: 2px 5px; +} + +br { + display: none; +} + +#menu h3 a { + display: block; +} + +#menu h3.selected { + background-color: #e2e5d2; +} + +#menu h3.selected a { + color: #657528; +} + +h1, h2, h3, h4, h5, h6 { + cursor: default; +} + +#menu h3 { + font-size: 12px; + padding: 3px 5px 1px; + background: #D2E0E6; + color: #528CE0; + margin-bottom: 4px; +} + +#submenu { + background: #CBCEBD; + color: #424D1A; + padding: 2px 30px; + max-height: 200px; + overflow: auto; + margin-bottom: 4px; +} + +#submenu a { + color: #424D1A; + display: block; +} + +#submenu a:hover { + text-decoration: underline; + color: #424D1A; + display: block; +} + +#submenu ul.subgroup { + padding-left: 20px; +} + +p { + color: #575d67; +} + +div#footer { + text-align: right; + padding: 10px 16px 0 0; +} + +div#footer p { + padding: 0; +} + +/* @end */ + + +/* @group demos */ +.help { + background: #e6efc2; + border: 2px solid #c6d880; + color: #529214; + margin: 1em 0; + padding: 0.8em; +} + +.help a { + color: #529214; +} + +#container #demos-wrapper { + padding: 1em; +} + +#container #demos-wrapper h1 { + margin-bottom: 1em; +} + +#container #demos-wrapper hr { + background: none; + border: none; + border-bottom: 2px solid #cecece; + margin: 0.5em 0 1em; +} + +#container #demos-wrapper h2 { + border-bottom: 1px solid #cecece; + margin: 0.5em; +} + +.info{ +border:solid 1px #aeaeae; +padding:5px; +text-align: right; +background:#f5f5bc; +} + +.info a{ +padding-right:20px; +margin-right:5px; +text-decoration:underline; +} + +.informer{ +border: solid 1px #d2d2d2; +border-top:none; +max-height:300px; +overflow:auto; +padding-left:1em; +} + + +/* @end */ diff --git a/javascript/mif-tree/Demos/assets/styles/docs.css b/javascript/mif-tree/Demos/assets/styles/docs.css new file mode 100755 index 0000000..a9a8312 --- /dev/null +++ b/javascript/mif-tree/Demos/assets/styles/docs.css @@ -0,0 +1,320 @@ +/* +File: Style.css + Slick Style for MooTools Docs. + +License: + Copyright (c)2007 Valerio Proietti, . +*/ + +/*@group Mif*/ + +#title h1 .mif-m{ +color:#e76f01; +} + +#title h1 .mif-i{ +color:#375b8f; +} + +#title h1 .mif-f{ +color:#e74747; +} + +#title h1 .mif-tree{ +color:#2cad59; +} + +#title h1 .mif-dot{ +color:#588ed1; +} + +#title h1 a:hover .mif-dot{ +color:#db4f6a; +} +/*@end*/ + +/* @group Reset */ + +* { + margin: 0; + padding: 0; +} + +#menu ul { + list-style: none; +} + +#submenu ul { + list-style-type: square; +} + +/* @end */ + +/* @group Base */ + +html { + overflow: hidden; +} + +body { + font: 11px/1.5 Lucida Grande, Helvetica, Arial, sans-serif; + background: #F3F1F1; + color: #41464D; +} + +body, #container { + width: 100%; + height: 100%; + overflow: hidden; +} + +a { + text-decoration:none; +} + +#title { + position: absolute; + top: 0; + left: 0; + width: 100%; + padding: 5px 0; + background: #aaa; + background: #41464D; + color: #F3F1F1; + height: 30px; +} + +#menu { + position: absolute; + width: 30%; + overflow-y: auto; + overflow-x: hidden; + top: 40px; + left: 0; + bottom: 0; + height: expression(document.body.clientHeight-40); +} + +#docs { + position: absolute; + top: 40px; + right: 0; + bottom: 0; + overflow: auto; + width: 70%; + height: expression(document.body.clientHeight-40); +} + +span.spc { + display: block; + height: 16px; +} + +#docs-wrapper, #menu-wrapper { + overflow: hidden; + padding: 4px 4px 0; + background: #fff; +} + +#docs-wrapper { + margin: 16px 16px 0 8px; +} + +#menu-wrapper { + margin: 16px 8px 0 16px; +} + +.success a:link, .success a:visited { + color: #657528; +} + +.exception a:link, .exception a:visited { + color: #B33F3F; +} + +a:link, a:visited { + color: #528CE0; +} + +a:hover, a:active { + color: #41464D !important; + cursor: pointer !important; +} + +#title h1 { + font: 25px/1.1 Arial, sans-serif; + font-weight: bolder; + float: left; + margin: 1px 0 2px 20px; + text-shadow: 0 2px 2px rgba(0,0,0,0.4); +} + +#title h1 span { + color: #D2E0E6; +} + +#title ul li { + font-weight: bold; + font-size: 12px; + float: right; + margin: 10px 5px 0; +} + +#title ul { + margin-right: 20px; +} + +#menu h2 { + font-size: 14px; + background: #D0C8C8; + color: #8A7575; + margin-bottom: 4px; + padding: 2px 5px; +} + +br { + display: none; +} + +#menu h3 a { + display: block; +} + +#menu h3.selected { + background-color: #e2e5d2; +} + +#menu h3.selected a { + color: #657528; +} + +h1, h2, h3, h4, h5, h6 { + cursor: default; +} + +#menu h3 { + font-size: 12px; + padding: 3px 5px 1px; + background: #D2E0E6; + color: #528CE0; + margin-bottom: 4px; +} + +#submenu { + background: #CBCEBD; + color: #424D1A; + padding: 2px 30px; + max-height: 200px; + overflow: auto; + margin-bottom: 4px; +} + +#submenu a { + color: #424D1A; + display: block; +} + +#submenu a:hover { + text-decoration: underline; + color: #424D1A; + display: block; +} + +#submenu ul.subgroup { + padding-left: 20px; +} + +p { + color: #575d67; +} + +div#footer { + text-align: right; + padding: 10px 16px 0 0; +} + +div#footer p { + padding: 0; +} + +/* @end */ + + +/* @group Docs */ + +#docs p { + padding: 5px; + font-size: 12px; +} + +#docs p, #docs code, #docs li { + font-size: 12px; +} + +#docs h1, #docs h2, #docs h3, #docs h4, #docs h5, #docs h6 { + margin: 5px 0; + padding: 3px 5px 1px; + background: #ddd; +} + +#docs h1 { + margin: 25px 0 10px; + background: #D2E0E6; + color: #528CE0; +} + +#docs h1.first { + margin: 0 0 10px; +} + +#docs h2, #docs h3 { + margin: 10px 0; +} + +#docs h3 { + background: #D0C8C8; + color: #5d4f4f; +} + +#docs h2 { + color: #B33F3F; + background: #eed8d8; +} + +#docs ul, #docs ol { + margin-left: 20px; +} + +#docs ul { + list-style: square; +} + +#docs ul li p { + padding: 0px; +} + +#docs pre { + padding: 5px 7px; + margin: 5px 0; + background: #f5f5f5; + border: 1px solid #ddd; + color: #333; + overflow: auto; +} + +#docs h5, #docs h6 { + margin: 5px 0; + padding: 3px 5px 1px; + color: #ce4521; + background: #f0f0ee; +} + +#container #docs #docs-wrapper li strong { + color: #5a86a3; +} + +#container #docs #docs-wrapper li em { + color: #a56f49; +} + +/* @end */ diff --git a/javascript/mif-tree/Demos/assets/styles/mif-tree.css b/javascript/mif-tree/Demos/assets/styles/mif-tree.css new file mode 100755 index 0000000..9c378a6 --- /dev/null +++ b/javascript/mif-tree/Demos/assets/styles/mif-tree.css @@ -0,0 +1,287 @@ +/*@global*/ + +.mif-tree-wrapper{ +position: relative; +width: 100%; +height:100%; +margin:0; +padding:0; +overflow:auto; +font-family:sans-serif; +font-size:11px; +line-height:18px;/******Tree node height******/ +white-space:nowrap; +cursor:default; +} + +.mif-tree-bg{ +width:100%; +height:100%; +position:absolute; +overflow:hidden; +} + +.mif-tree-bg-container{ +width:100%; +display:none; +} + +.mif-tree-bg-node{ +width:100%; +height:18px; +} + +.mif-tree-bg-selected{ +background-color:#dcd7ab; +} + +.mif-tree-wrapper:focus{ +outline:0; +} + +.mif-tree-wrapper span{ +padding-bottom:2px; +padding-top:2px; +cursor:inherit; +} + +.mif-tree-children{ +padding-left:18px; +width:18px; +} + +.mif-tree-node{ +width:18px; +position:relative; +background:url('images/line.gif') repeat-y 8px 0px; +} + +.mif-tree-node-last{ +background:url('images/line.gif') no-repeat 8px 0px; +} + +.mif-tree-name{ +cursor: default; +overflow:hidden; +margin-left:4px; +} + +.mif-tree-name a{ +color:red; +} + +.mif-tree-name a:hover{ +color:blue; +} + + +.mif-tree-wrapper .mif-tree-node-wrapper{ +background:url('images/horizontal-line.gif') no-repeat 9px center; +} + +/*@gadjets*/ + +.mif-tree-gadjet{ +background-image:url('images/gadjets.gif'); +padding-right: 16px; +z-index:1; +overflow:hidden; +background-repeat:no-repeat; +cursor:default; +} + +.mif-tree-gadjet-none{ +background:none; +} + +.mif-tree-gadjet-minus{ +background-position: 0px 50%; +} + +.mif-tree-gadjet-plus{ +background-position: -18px 50%; +} + +.mif-tree-gadjet-middle{ +background-position: -36px 50%; +} + +.mif-tree-gadjet-hover .mif-tree-gadjet-minus{ +background-position: -54px 50%; +} + +.mif-tree-gadjet-hover .mif-tree-gadjet-plus{ +background-position: -72px 50%; +} + +.mif-tree-gadjet-hover .mif-tree-gadjet-middle{ +background-position: -90px 50%; +} + + +/*.mif-tree-gadjet-hover{ +background-image:url('images/gadjets-hover.gif'); +}*/ + + + + +/*@icons*/ +.mif-tree-icon{ +padding-right:18px; +background-position:0 50%; +background-repeat:no-repeat; +cursor:inherit; +} + +.mif-tree-open-icon{ +background-image:url('images/openicon.gif') +} + +.mif-tree-close-icon{ +background-image:url('images/closeicon.gif') +} + +.mif-tree-middle-icon{ +background-image:url('images/middleicon.gif'); +} + +.mif-tree-loader-open-icon,.mif-tree-loader-close-icon{ +background-image:url('images/mootree_loader.gif'); +} + +.mif-tree-book-icon{ +background-image:url('images/book_icon.gif'); +} + +.mif-tree-bin-open-icon{ +background-image:url('images/bin_open_icon.gif'); +} + +.mif-tree-bin-close-icon{ +background-image:url('images/bin_close_icon.gif'); +} + +.mif-tree-bin-middle-icon{ +background-image:url('images/bin_middle_icon.gif'); +} + + + + +/*@selection*/ + +.mif-tree-node-selected .mif-tree-name{ +background-color: #010161; +color:#fff; +text-transform:italic; +} + +.mif-tree-highlighter{ +height:18px; +overflow:hidden; +width:100%; +background:#b64553; +position:absolute; +} + + + +/*@d'n'd*/ +.mif-tree-pointer{ +height:1px; +overflow: hidden; +position: absolute; +background-image:url('images/1.gif'); +background-repeat:repeat-x; +background-color:#292fef; +} + + +.mif-tree-ghost{ +background-color:#fff; +border:solid 2px #e8e8f7; +padding-left:2px; +position:absolute; +} + +.mif-tree-ghost .mif-tree-node-wrapper{ +background:none; +} + +.mif-tree-ghost span.mif-tree-text{ +padding-top:1px; +padding-bottom:1px; +} + +.mif-tree-ghost-icon{ +padding-left:16px; +background-color:#fff; +background-repeat:no-repeat; +background-image:url('images/dropzone.gif'); +} + +.mif-tree-ghost-after{ +background-position:-64px 2px; +} + +.mif-tree-ghost-before{ +background-position:-48px 2px; +} + +.mif-tree-ghost-between{ +background-position:-16px 2px; +} + +.mif-tree-ghost-inside{ +background-position:-0px 2px; +} + +.mif-tree-ghost-notAllowed{ +background-position:-32px 2px; +} + +.mif-tree-drag-current{ +background-color:#cfcfd8; +} + +.mif-tree-replace{ +background-color:#99c8fb; +} + + +/*@checkbox*/ +.mif-tree-checkbox{ +padding-left:18px; +} + +.mif-tree-node-checked, .mif-tree-node-checked .mif-tree-checkbox{ +background:url('images/checked.gif') center 2px no-repeat; +} + +.mif-tree-node-unchecked, .mif-tree-node-unchecked .mif-tree-checkbox{ +background:url('images/unchecked.gif') center 2px no-repeat; +} + +.mif-tree-node-checked-selected{ +background:url('images/checked_selected.gif') center 2px no-repeat; +} + +.mif-tree-node-unchecked-selected{ +background:url('images/unchecked_selected.gif') center 2px no-repeat; +} + + + +/*@rename*/ +.mif-tree-rename{ +display: inline; +line-height: 14px; +height:14px; +cursor: default; +overflow:hidden; +font-family:sans-serif; +font-size:11px; +padding:1px 0; +border:solid 1px black; +} \ No newline at end of file diff --git a/javascript/mif-tree/Demos/assets/styles/specs.css b/javascript/mif-tree/Demos/assets/styles/specs.css new file mode 100755 index 0000000..9632a36 --- /dev/null +++ b/javascript/mif-tree/Demos/assets/styles/specs.css @@ -0,0 +1,297 @@ +/* +File: Style.css + Slick Style for JSSpec. + +License: + Copyright (c)2007 Valerio Proietti, . + You can only use this stylesheet to run MooTools JSSpec Runner. +*/ + +/* @group Reset */ + +* { + margin: 0; + padding: 0; +} + +ul { + list-style: none; +} + +/* @end */ + +/* @group Base */ + +html { + overflow: hidden; +} + +body { + font: 11px/1.5 Lucida Grande, Helvetica, Arial, sans-serif; + background: #F3F1F1; + color: #41464D; +} + +body, #container { + width: 100%; + height: 100%; + overflow: hidden; +} + +a { + text-decoration:none; +} + +#title { + position: absolute; + top: 0; + left: 0; + width: 100%; + padding: 5px 0; + background: #aaa; + background: #41464D; + color: #F3F1F1; + height: 30px; +} + +#list { + position: absolute; + width: 30%; + overflow-y: auto; + overflow-x: hidden; + top: 40px; + left: 0; + bottom: 0; + height: expression(document.body.clientHeight-40); +} + +#log { + position: absolute; + top: 40px; + right: 0; + bottom: 0; + overflow-y: auto; + overflow-x: hidden; + width: 70%; + height: expression(document.body.clientHeight-40); +} + +span.spc { + display: block; + height: 16px; +} + +#log-wrapper, #list-wrapper { + overflow: hidden; + padding: 4px 4px 0; + background: #fff; +} + +#log-wrapper { + margin: 16px 16px 0 8px; +} + +#list-wrapper { + margin: 16px 8px 0 16px; +} + +.success a:link, .success a:visited { + color: #657528; +} + +.exception a:link, .exception a:visited { + color: #B33F3F; +} + +a:link, a:visited { + color: #528CE0; +} + +a:hover, a:active { + color: #41464D !important; + cursor: pointer !important; +} + +#title h1 { + font: 25px/1.1 Arial, sans-serif; + font-weight: bolder; + float: left; + margin: 1px 0 2px 20px; + text-shadow: 0 2px 2px rgba(0,0,0,0.4); +} + +#title h1 span { + color: #D2E0E6; +} + +#title ul li { + font-weight: bold; + font-size: 12px; + float: right; + margin: 10px 5px 0; +} + +#title ul { + margin-right: 20px; +} + +h2 { + font-size: 14px; + background: #D0C8C8; + color: #8A7575; + margin-bottom: 4px; + padding: 2px 5px; +} + +h2#runner { + cursor: pointer; + background-color: #CFE773; + color: #657528; +} + +h2#runner:hover { + color: #41464D; +} + +h2#runner.disabled { + color: #fff; + background: #C8CBD0; + cursor: default; +} + +br { + display: none; +} + +h3 { + font-size: 12px; + padding: 3px 5px 1px; +} + +h4 { + font-size: 11px; + background: #C8CBD0; + padding: 3px 5px 1px; + margin-bottom: 4px; +} + +h3, h4 { + cursor: default; +} + +#list h3 { + background: #D2E0E6; + color: #528CE0; + margin-bottom: 4px; +} + +#log h3 { + background: #D0C8C8; + color: #8A7575; + margin-bottom: 4px; +} + +#log li div { + overflow: hidden; + padding: 0 4px 4px; +} + +p { + color: #575d67; +} + +p.uri { + float: right; + margin-top: -15px; + font-size: 10px; +} + +p.left, p.uri { + font-family: Monaco, Courier New, monospace; +} + +li div { + display: none; +} + +p#footer { + text-align: right; + padding: 10px 16px 0 0; +} + +/* @end */ + +/* @group Success/Failure Colors */ + +#log .exception h3 { + color: #B33F3F; + background: #EE9A9A; +} + +#log .exception h4 { + color: #B33F3F; + background: #eed8d8; + cursor: pointer; +} + +#log .success h3 { + background-color: #CFE773; + color: #657528; +} + +#log .success h4 { + background-color: #e2e5d2; + color: #657528; + cursor: default; +} + +#log .stub h4 { + background-color: #e5e5e1; + color: #a1a87e; + cursor: default; +} + +#list .exception h3 { + color: #B33F3F; + background: #eed8d8; +} + +#list .success h3 { + background-color: #e2e5d2; + color: #657528; +} + +a.rerun { + font-size: 11px; + color: #fff !important; +} + +/* @end */ + +/* @group Code */ + +.number_value { + color: red; +} + +.string_value { + color: green; +} + +.regexp_value { + color: olive; +} + +.boolean_value { + color: red; +} + +.dom_value { + color: purple; +} + +.undefined_value, .null_value { + color: gray; +} + +/* @end */ \ No newline at end of file diff --git a/javascript/mif-tree/Demos/index.html b/javascript/mif-tree/Demos/index.html new file mode 100755 index 0000000..01bef58 --- /dev/null +++ b/javascript/mif-tree/Demos/index.html @@ -0,0 +1,32 @@ + + + + Mif.Tree Demos + + + + + + + +
    +
    +

    Mif.Tree Demos

    +
    + + + +
    +
    + +
    + + +
    +
    + + -- 2.39.5