From aa9b64dba05c02740e2ad2a1dafbd3f448ea56af Mon Sep 17 00:00:00 2001 From: shypike <> Date: Sat, 27 Oct 2007 14:13:02 +0000 Subject: [PATCH] Updated NOVA_0.4.5 templates. Removed NOVA_0.4.4 templates. --- main/NOVA_0.4.4/LICENSE.txt | 63 - main/NOVA_0.4.4/README.txt | 96 - main/NOVA_0.4.4/templates/config.tmpl | 27 - main/NOVA_0.4.4/templates/config_directories.tmpl | 89 - main/NOVA_0.4.4/templates/config_general.tmpl | 97 - main/NOVA_0.4.4/templates/config_rss.tmpl | 113 - main/NOVA_0.4.4/templates/config_scheduling.tmpl | 74 - main/NOVA_0.4.4/templates/config_server.tmpl | 65 - main/NOVA_0.4.4/templates/config_switches.tmpl | 120 - main/NOVA_0.4.4/templates/connection_info.tmpl | 40 - main/NOVA_0.4.4/templates/history.tmpl | 23 - main/NOVA_0.4.4/templates/main.tmpl | 191 - main/NOVA_0.4.4/templates/nzo.tmpl | 98 - main/NOVA_0.4.4/templates/queue.tmpl | 49 - .../templates/static/images/bg_dataBar.png | Bin 469 -> 0 bytes .../templates/static/images/bg_downloaded.png | Bin 336 -> 0 bytes .../static/images/bg_downloaded_minibar.png | Bin 1061 -> 0 bytes .../templates/static/images/bg_lonelyhearts.png | Bin 3434 -> 0 bytes .../templates/static/images/bg_thead_tr.png | Bin 221 -> 0 bytes .../static/images/bg_thead_tr_heading.png | Bin 221 -> 0 bytes .../templates/static/images/bg_thead_tr_orig.png | Bin 941 -> 0 bytes .../templates/static/images/bg_topBar.png | Bin 324 -> 0 bytes .../templates/static/images/bg_tr_hover.png | Bin 267 -> 0 bytes .../templates/static/images/bg_tr_odd.png | Bin 267 -> 0 bytes .../NOVA_0.4.4/templates/static/images/favicon.ico | Bin 15086 -> 0 bytes .../templates/static/images/icon-blank.png | Bin 1171 -> 0 bytes .../templates/static/images/icon-header-addnzb.png | Bin 1088 -> 0 bytes .../images/icon-header-currenthistorysize.png | Bin 502 -> 0 bytes .../static/images/icon-header-freespacecom.png | Bin 552 -> 0 bytes .../static/images/icon-header-freespaceinc.png | Bin 623 -> 0 bytes .../static/images/icon-header-history.png | Bin 714 -> 0 bytes .../static/images/icon-header-knowndownloaded.png | Bin 576 -> 0 bytes .../templates/static/images/icon-header-mbleft.png | Bin 986 -> 0 bytes .../templates/static/images/icon-header-queue.png | Bin 720 -> 0 bytes .../static/images/icon-header-sidebyside.png | Bin 822 -> 0 bytes .../templates/static/images/icon-header-speed.png | Bin 679 -> 0 bytes .../static/images/icon-header-timeleft.png | Bin 1211 -> 0 bytes .../static/images/icon-header-topbottom.png | Bin 767 -> 0 bytes .../static/images/icon-history-cleanup.gif | Bin 905 -> 0 bytes .../static/images/icon-history-fucked.png | Bin 228 -> 0 bytes .../templates/static/images/icon-history-join.png | Bin 980 -> 0 bytes .../templates/static/images/icon-history-par2.png | Bin 899 -> 0 bytes .../static/images/icon-history-postprocessing.gif | Bin 2947 -> 0 bytes .../templates/static/images/icon-history-unrar.png | Bin 539 -> 0 bytes .../templates/static/images/icon-history-unzip.gif | Bin 180 -> 0 bytes .../templates/static/images/icon-newzbin.png | Bin 1061 -> 0 bytes .../static/images/icon-queue-1downarrow.png | Bin 808 -> 0 bytes .../static/images/icon-queue-1uparrow.png | Bin 781 -> 0 bytes .../static/images/icon-queue-2downarrow.png | Bin 1063 -> 0 bytes .../static/images/icon-queue-2uparrow.png | Bin 1037 -> 0 bytes .../templates/static/images/icon-queue-drop.png | Bin 1150 -> 0 bytes .../templates/static/images/icon-queue-order.png | Bin 166 -> 0 bytes .../javascripts/lytebox/images/close_grey.png | Bin 1715 -> 0 bytes .../static/javascripts/lytebox/images/loading.gif | Bin 2767 -> 0 bytes .../static/javascripts/lytebox/lytebox.css | 93 - .../static/javascripts/lytebox/lytebox.js | 831 ---- .../templates/static/javascripts/nova.js | 582 --- .../static/javascripts/prototype/prototype.js | 4174 -------------------- .../static/javascripts/scriptaculous/builder.js | 136 - .../static/javascripts/scriptaculous/controls.js | 875 ---- .../static/javascripts/scriptaculous/dragdrop.js | 970 ----- .../static/javascripts/scriptaculous/effects.js | 1094 ----- .../javascripts/scriptaculous/scriptaculous.js | 58 - .../static/javascripts/scriptaculous/slider.js | 277 -- .../static/javascripts/scriptaculous/sound.js | 60 - .../static/javascripts/scriptaculous/unittest.js | 564 --- .../templates/static/stylesheets/default.css | 218 - .../templates/static/stylesheets/nova.css | 514 --- main/NOVA_0.4.5/LICENCE.TXT | 63 + main/NOVA_0.4.5/README.TXT | 98 + main/NOVA_0.4.5/templates/config.tmpl | 27 + main/NOVA_0.4.5/templates/config_directories.tmpl | 89 + main/NOVA_0.4.5/templates/config_general.tmpl | 97 + main/NOVA_0.4.5/templates/config_rss.tmpl | 113 + main/NOVA_0.4.5/templates/config_scheduling.tmpl | 74 + main/NOVA_0.4.5/templates/config_server.tmpl | 65 + main/NOVA_0.4.5/templates/config_switches.tmpl | 120 + main/NOVA_0.4.5/templates/connection_info.tmpl | 40 + main/NOVA_0.4.5/templates/history.tmpl | 23 + main/NOVA_0.4.5/templates/main.tmpl | 192 + main/NOVA_0.4.5/templates/nzo.tmpl | 98 + main/NOVA_0.4.5/templates/queue.tmpl | 49 + .../templates/static/images/bg_dataBar.png | Bin 0 -> 469 bytes .../templates/static/images/bg_downloaded.png | Bin 0 -> 336 bytes .../static/images/bg_downloaded_minibar.png | Bin 0 -> 1061 bytes .../templates/static/images/bg_lonelyhearts.png | Bin 0 -> 3434 bytes .../templates/static/images/bg_thead_tr.png | Bin 0 -> 221 bytes .../static/images/bg_thead_tr_heading.png | Bin 0 -> 221 bytes .../templates/static/images/bg_thead_tr_orig.png | Bin 0 -> 941 bytes .../templates/static/images/bg_topBar.png | Bin 0 -> 324 bytes .../templates/static/images/bg_tr_hover.png | Bin 0 -> 267 bytes .../templates/static/images/bg_tr_odd.png | Bin 0 -> 267 bytes main/NOVA_0.4.5/templates/static/images/blank.gif | Bin 0 -> 43 bytes .../templates/static/images/close_grey.png | Bin 0 -> 1715 bytes .../NOVA_0.4.5/templates/static/images/favicon.ico | Bin 0 -> 15086 bytes .../templates/static/images/icon-blank.png | Bin 0 -> 1171 bytes .../templates/static/images/icon-header-addnzb.png | Bin 0 -> 1088 bytes .../images/icon-header-currenthistorysize.png | Bin 0 -> 502 bytes .../static/images/icon-header-freespacecom.png | Bin 0 -> 552 bytes .../static/images/icon-header-freespaceinc.png | Bin 0 -> 623 bytes .../static/images/icon-header-history.png | Bin 0 -> 714 bytes .../static/images/icon-header-knowndownloaded.png | Bin 0 -> 576 bytes .../templates/static/images/icon-header-mbleft.png | Bin 0 -> 986 bytes .../templates/static/images/icon-header-queue.png | Bin 0 -> 720 bytes .../static/images/icon-header-sidebyside.png | Bin 0 -> 822 bytes .../templates/static/images/icon-header-speed.png | Bin 0 -> 679 bytes .../static/images/icon-header-timeleft.png | Bin 0 -> 1211 bytes .../static/images/icon-header-topbottom.png | Bin 0 -> 767 bytes .../static/images/icon-history-cleanup.png | Bin 0 -> 3655 bytes .../static/images/icon-history-fucked.png | Bin 0 -> 228 bytes .../templates/static/images/icon-history-join.png | Bin 0 -> 980 bytes .../templates/static/images/icon-history-par2.png | Bin 0 -> 899 bytes .../static/images/icon-history-postprocessing.gif | Bin 0 -> 2947 bytes .../templates/static/images/icon-history-unrar.png | Bin 0 -> 539 bytes .../templates/static/images/icon-history-unzip.gif | Bin 0 -> 180 bytes .../templates/static/images/icon-newzbin.png | Bin 0 -> 1061 bytes .../static/images/icon-queue-1downarrow.png | Bin 0 -> 808 bytes .../static/images/icon-queue-1uparrow.png | Bin 0 -> 781 bytes .../static/images/icon-queue-2downarrow.png | Bin 0 -> 1063 bytes .../static/images/icon-queue-2uparrow.png | Bin 0 -> 1037 bytes .../templates/static/images/icon-queue-drop.png | Bin 0 -> 1150 bytes .../templates/static/images/icon-queue-order.png | Bin 0 -> 166 bytes .../NOVA_0.4.5/templates/static/images/loading.gif | Bin 0 -> 2767 bytes .../templates/static/javascripts/builder.js | 136 + .../templates/static/javascripts/controls.js | 972 +++++ .../templates/static/javascripts/dragdrop.js | 976 +++++ .../templates/static/javascripts/effects.js | 1117 ++++++ .../templates/static/javascripts/lytebox.js | 843 ++++ .../templates/static/javascripts/nova.js | 582 +++ .../templates/static/javascripts/prototype.js | 4152 +++++++++++++++++++ .../templates/static/javascripts/scriptaculous.js | 58 + .../templates/static/javascripts/slider.js | 276 ++ .../templates/static/javascripts/sound.js | 55 + .../templates/static/javascripts/unittest.js | 568 +++ .../templates/static/stylesheets/default.css | 218 + .../templates/static/stylesheets/lytebox.css | 93 + .../templates/static/stylesheets/nova.css | 514 +++ 137 files changed, 11708 insertions(+), 11591 deletions(-) delete mode 100644 main/NOVA_0.4.4/LICENSE.txt delete mode 100644 main/NOVA_0.4.4/README.txt delete mode 100644 main/NOVA_0.4.4/templates/config.tmpl delete mode 100644 main/NOVA_0.4.4/templates/config_directories.tmpl delete mode 100644 main/NOVA_0.4.4/templates/config_general.tmpl delete mode 100644 main/NOVA_0.4.4/templates/config_rss.tmpl delete mode 100644 main/NOVA_0.4.4/templates/config_scheduling.tmpl delete mode 100644 main/NOVA_0.4.4/templates/config_server.tmpl delete mode 100644 main/NOVA_0.4.4/templates/config_switches.tmpl delete mode 100644 main/NOVA_0.4.4/templates/connection_info.tmpl delete mode 100644 main/NOVA_0.4.4/templates/history.tmpl delete mode 100644 main/NOVA_0.4.4/templates/main.tmpl delete mode 100644 main/NOVA_0.4.4/templates/nzo.tmpl delete mode 100644 main/NOVA_0.4.4/templates/queue.tmpl delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_dataBar.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_downloaded.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_downloaded_minibar.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_lonelyhearts.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_thead_tr.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_thead_tr_heading.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_thead_tr_orig.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_topBar.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_tr_hover.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/bg_tr_odd.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/favicon.ico delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-blank.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-addnzb.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-currenthistorysize.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-freespacecom.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-freespaceinc.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-history.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-knowndownloaded.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-mbleft.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-queue.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-sidebyside.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-speed.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-timeleft.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-header-topbottom.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-history-cleanup.gif delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-history-fucked.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-history-join.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-history-par2.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-history-postprocessing.gif delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-history-unrar.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-history-unzip.gif delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-newzbin.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-queue-1downarrow.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-queue-1uparrow.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-queue-2downarrow.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-queue-2uparrow.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-queue-drop.png delete mode 100644 main/NOVA_0.4.4/templates/static/images/icon-queue-order.png delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/lytebox/images/close_grey.png delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/lytebox/images/loading.gif delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/lytebox/lytebox.css delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/lytebox/lytebox.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/nova.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/prototype/prototype.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/builder.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/controls.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/dragdrop.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/effects.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/scriptaculous.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/slider.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/sound.js delete mode 100644 main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/unittest.js delete mode 100644 main/NOVA_0.4.4/templates/static/stylesheets/default.css delete mode 100644 main/NOVA_0.4.4/templates/static/stylesheets/nova.css create mode 100644 main/NOVA_0.4.5/LICENCE.TXT create mode 100644 main/NOVA_0.4.5/README.TXT create mode 100644 main/NOVA_0.4.5/templates/config.tmpl create mode 100644 main/NOVA_0.4.5/templates/config_directories.tmpl create mode 100644 main/NOVA_0.4.5/templates/config_general.tmpl create mode 100644 main/NOVA_0.4.5/templates/config_rss.tmpl create mode 100644 main/NOVA_0.4.5/templates/config_scheduling.tmpl create mode 100644 main/NOVA_0.4.5/templates/config_server.tmpl create mode 100644 main/NOVA_0.4.5/templates/config_switches.tmpl create mode 100644 main/NOVA_0.4.5/templates/connection_info.tmpl create mode 100644 main/NOVA_0.4.5/templates/history.tmpl create mode 100644 main/NOVA_0.4.5/templates/main.tmpl create mode 100644 main/NOVA_0.4.5/templates/nzo.tmpl create mode 100644 main/NOVA_0.4.5/templates/queue.tmpl create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_dataBar.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_downloaded.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_downloaded_minibar.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_lonelyhearts.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_thead_tr.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_thead_tr_heading.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_thead_tr_orig.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_topBar.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_tr_hover.png create mode 100644 main/NOVA_0.4.5/templates/static/images/bg_tr_odd.png create mode 100644 main/NOVA_0.4.5/templates/static/images/blank.gif create mode 100644 main/NOVA_0.4.5/templates/static/images/close_grey.png create mode 100644 main/NOVA_0.4.5/templates/static/images/favicon.ico create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-blank.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-addnzb.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-currenthistorysize.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-freespacecom.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-freespaceinc.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-history.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-knowndownloaded.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-mbleft.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-queue.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-sidebyside.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-speed.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-timeleft.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-header-topbottom.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-history-cleanup.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-history-fucked.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-history-join.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-history-par2.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-history-postprocessing.gif create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-history-unrar.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-history-unzip.gif create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-newzbin.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-queue-1downarrow.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-queue-1uparrow.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-queue-2downarrow.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-queue-2uparrow.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-queue-drop.png create mode 100644 main/NOVA_0.4.5/templates/static/images/icon-queue-order.png create mode 100644 main/NOVA_0.4.5/templates/static/images/loading.gif create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/builder.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/controls.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/dragdrop.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/effects.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/lytebox.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/nova.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/prototype.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/scriptaculous.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/slider.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/sound.js create mode 100644 main/NOVA_0.4.5/templates/static/javascripts/unittest.js create mode 100644 main/NOVA_0.4.5/templates/static/stylesheets/default.css create mode 100644 main/NOVA_0.4.5/templates/static/stylesheets/lytebox.css create mode 100644 main/NOVA_0.4.5/templates/static/stylesheets/nova.css diff --git a/main/NOVA_0.4.4/LICENSE.txt b/main/NOVA_0.4.4/LICENSE.txt deleted file mode 100644 index ad5f44f..0000000 --- a/main/NOVA_0.4.4/LICENSE.txt +++ /dev/null @@ -1,63 +0,0 @@ -http://creativecommons.org/licenses/by/3.0/ -http://creativecommons.org/licenses/by/3.0/legalcode - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. - -1. Definitions - - 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. - 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. - 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. - 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. - 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. - 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. - 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. - 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. - 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. - -2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: - - 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; - 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; - 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, - 4. to Distribute and Publicly Perform Adaptations. - 5. - - For the avoidance of doubt: - 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; - 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, - 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. - -The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: - - 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. - 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. - 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. - -5. Representations, Warranties and Disclaimer - -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. Termination - - 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. - 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. - -8. Miscellaneous - - 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. - 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. - 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. - 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. - 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. - 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/main/NOVA_0.4.4/README.txt b/main/NOVA_0.4.4/README.txt deleted file mode 100644 index fc029d3..0000000 --- a/main/NOVA_0.4.4/README.txt +++ /dev/null @@ -1,96 +0,0 @@ -================================ -NOVA 0.4.4 README - Oct 10, 2007 -http://sabnzbd.organixdesign.com - -======= -AUTHORS -* Nathan Langlois => complete rewrite of NOVA for version 0.4 -* Dana Woodman => original NOVA + concept design -* ShyPike => modified for SABnzbd-0.2.7 - -============ -INTRODUCTION -We view this release very much as a public test. NOVA 0.3 preview 2 returned such a great response that we did not feel it was necessary to provide a final revision, and instead jumped straight to this one. Hope you all enjoy & happy downloading. - -=========== -WHAT IS NEW -* "Nighttime" concept design (NOTE: Dana hasn't had a chance to go over the new graphic design yet! If you think it looks good now, just you wait.) -* No more iFrames, layout is much more adaptive now -* AJAX Queue Components: Drag & drop sort, Post-processing, Drop, Pause, Verbosity, Sort by average age -* AJAX History Components: Verbosity, Purge -* AJAX refresh rate slider -* AJAX enqueueing of nzbs by report id & URL -* Many structural enhancements to the main statistics -* Standardized Queue & History JSON -* Compatible with multiple browser sessions opened concurrently -* Special care taken in terms of explanations that pop up when hovering items with your cursor -* Not to mention all the good parts from NOVA 0.3p2 -* Much much more! - -================== -NOVA 0.4.4 UPDATES -* History Verbosity has been drastically cleaned up -(1) Details are now hidden behind icons (hover icon with cursor to view) -(2) Exceptions are processing stages & errors -* Options bar now has its own menu item -* "Shutdown SAB" feature now in Options (+confirmation) -* Fixed queue menu width for Windows -* SABnzbdPlus 0.2.7 compatible (hopefully) - if installed, will use D+ (Delete+Script) as default post-processing option - -================== -NOVA 0.4.3 UPDATES -* Added "Toggle Shutdown" back in + alert box (Windows only) -* Queue & History reverted to NOVA v0.3p2 look -* Queue Verbosity is now a two-step process: -(1) Toggle Verbosity -ON- -(2) Click the 'v' on an enqueued nzb to see its files -* Double-click nzb filename to jump to top of queue -* Drag & drop on filename column to sort enqueued nzbs -* Queue & History menus no longer get scrunched -* Overall % now stays visible on screen -* Better labeling in Stats & Queue (more wording/icons for explanation) -* "MB downloaded" replaced "MB remaining" in Queue & Stats -* Better "broken nzb set" detection -* Non-Newzbin nzbs won't show a 'View Report' icon anymore -* (Very) minor optimizations - long way to go on this one -* Default refresh rate increased to 8 seconds from 4 -* Current version number now visible in NOVA options - -================== -NOVA 0.4.2 UPDATES -* Config & Connections now use Lytebox (pop up over content) -* History verbosity has a new icon to indicate an unzip - -================== -NOVA 0.4.1 UPDATES -* Layout settings & Refresh rate now saved -* Fixed 'View Report' (the i icon) sometimes being unclickable -* History verbosity now has a new icon to indicate a join -* Queue verbosity now colored slightly better -* Stats more precise for free space & history - -========= -DRAWBACKS -* Only works with Firefox 2+, Safari 3, & Opera 9.5 -* Not optimized yet; it's okay, but not great - -=== -FAQ - -Q: Can I contribute? -A: Yes; while we do not have a subversion repository set up, we encourage any suggestions. The good stuff will definitely get added in. Our goal is to turn this into a community project, if that wasn't obvious. - -Q: How else can I help? -A: Visit our official site and donate Usenet access. - -Q: Can you provide more information?! -A: Yes, stay tuned. Our ultimate goal is to allow for straightforward customization. - -============== -SPECIAL THANKS -* Pim for the Dutch translation => http://www.pimspage.nl/ -* Prototype Core Team => http://www.prototypejs.org/ -* script.aculo.us => http://script.aculo.us/ -* Lytebox => http://www.dolem.com/lytebox/ -* Nuvola icon set => http://www.icon-king.com/?p=15 -* Everyone in the community who left so much valuable feedback - we appreciate it greatly! diff --git a/main/NOVA_0.4.4/templates/config.tmpl b/main/NOVA_0.4.4/templates/config.tmpl deleted file mode 100644 index e1dc4f4..0000000 --- a/main/NOVA_0.4.4/templates/config.tmpl +++ /dev/null @@ -1,27 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - -

SABnzbdThe automatic usenet download tool

- -NOVA | -Connections | -Config - -General | Directories | Switches | Servers | Scheduling | RSS -

Configuration

-

-Configfile: $configfn -

- - - diff --git a/main/NOVA_0.4.4/templates/config_directories.tmpl b/main/NOVA_0.4.4/templates/config_directories.tmpl deleted file mode 100644 index c1b67fe..0000000 --- a/main/NOVA_0.4.4/templates/config_directories.tmpl +++ /dev/null @@ -1,89 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - -

SABnzbdThe automatic usenet download tool

- -NOVA | -Connections | -Config - - -General | -Directories | -Switches | -Servers | -Scheduling | -RSS - -

Directory configuration

-

NOTE: Directories won't be created automatically.

-
-
-
- User directories - Download Directory:
- Location to put downloads to.
- -
-
- Minimum free space for Download Directory:
- Auto-pause when free space is beneath this value (MB).
- -
-
- Complete Directory:
- Location to put completed downloads to.
- -
-
- OPTIONAL: Dirscan Directory:
- Specify a directory to scan for .nzb files.
- -
-
- OPTIONAL: Dirscan Speed:
- Specify number of seconds between scans for .nzb files.
- -
-
- OPTIONAL: External post-processing script:
- Specify an external post-processing script.
- -
-
- System directories - Cache Directory:
- Location of cache directories for SABnzbd.
- -
-
- Log Directory:
- Location of log files for SABnzbd.
- -
-
- Template Directory:
- Location of the template directory.
- -
-
- OPTIONAL: .nzb Backup Directory:
- Specify a directory to backup .nzb files to.
- -
-

- -
- - - diff --git a/main/NOVA_0.4.4/templates/config_general.tmpl b/main/NOVA_0.4.4/templates/config_general.tmpl deleted file mode 100644 index 89db1c9..0000000 --- a/main/NOVA_0.4.4/templates/config_general.tmpl +++ /dev/null @@ -1,97 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - -

SABnzbdThe automatic usenet download tool

- -NOVA | -Connections | -Config - - -General | -Directories | -Switches | -Servers | -Scheduling | -RSS - -

General configuration

-
-
-
-SABnzbd server -SABnzbd Host:
-Host SABnzbd should listen on.
- -
-
-SABnzbd Port:
-Post SABnzbd should listen on.
- -
-
-SABnzbd Username:
-Authentication Username.
- -
-
-SABnzbd Password:
-Authentication Password.
- -
-
-
-
-SABnzbd tuning -SABnzbd RSS checking rate:
-Checking rate (times per hour 1, 2, 3, 4)
- -
-
-SABnzbd Bandwith Limit:
-Slowdown factor, try values between 0.01 and 1.0.
- -
-
-SABnzbd Article Cache Limit:
-Cache articles in memory. See SABnzbd.ini
- -
-
-Cleanup List:
-List of file (extensions) that should be deleted at the cleanup stage.
-For example: ".nfo," or ".nfo, .sfv"
- -
-
-
-
-Newzbin settings -OPTIONAL: Newzbin Username:
-Set your www.newzbin.com username here.
- -
-
-OPTIONAL: Newzbin Password:
-Set your www.newzbin.com password here.
- -
-
-

- -

-
- - - - diff --git a/main/NOVA_0.4.4/templates/config_rss.tmpl b/main/NOVA_0.4.4/templates/config_rss.tmpl deleted file mode 100644 index 1d4c685..0000000 --- a/main/NOVA_0.4.4/templates/config_rss.tmpl +++ /dev/null @@ -1,113 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - -

SABnzbdThe automatic usenet download tool

- -NOVA | -Connections | -Config - - -General | -Directories | -Switches | -Servers | -Scheduling | -RSS - -

EXPERIMENTAL RSS Configuration

- -
-
-
- RSS feed settings - RSS-Feed URI:
-

- - Text Filter:
- (Basic) text based filter. A single '*' matches everything. -
- -
-
- - Regex Filter:
- Regular Expression filter. Overwrites text filter. -
- -
-
- - Match Multiple:
- Match this filter more than once? -
- No - Yes -
-
- - Unpack Opts:
- None - +Repair - +Unpack - +Delete - Repair+Script - Unpack+Script - Delete+Script -
-
- - -
-
-
-
-
- - - - - - - "> - - - - - - - active"> - - - - active"> - - - - active"> - - - - - -
URL/Match Name
Remove$uri
RemoveFilter: $filter[0]
Unpack-opts: $filter[1]
Match Multiple: $filter[2]
- - - -

- feedparser module missing -

- - - - diff --git a/main/NOVA_0.4.4/templates/config_scheduling.tmpl b/main/NOVA_0.4.4/templates/config_scheduling.tmpl deleted file mode 100644 index 5f60d85..0000000 --- a/main/NOVA_0.4.4/templates/config_scheduling.tmpl +++ /dev/null @@ -1,74 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - -

SABnzbdThe automatic usenet download tool

- -NOVA | -Connections | -Config - - -General | -Directories | -Switches | -Servers | -Scheduling | -RSS - -

Scheduling configuration

-
-
-
-Add schedule - - - - -

-
-
-
-

Current Schedules:

-
- -
-
- -Task $schednum -$line - - -
-
- -
- - - diff --git a/main/NOVA_0.4.4/templates/config_server.tmpl b/main/NOVA_0.4.4/templates/config_server.tmpl deleted file mode 100644 index bfa1077..0000000 --- a/main/NOVA_0.4.4/templates/config_server.tmpl +++ /dev/null @@ -1,65 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - -

SABnzbdThe automatic usenet download tool

- -NOVA | -Connections | -Config - - -General | -Directories | -Switches | -Servers | -Scheduling | -RSS - -

Server configuration

-
-
-
- Add server - Host:

- Port:

- Username:

- Password:

- Connections:

- Fillserver:
No - Yes -
-

-
-
- -
-
- $server - Host:

- Port:

- Username:

- Password:

- Connections:

- Fillserver:
/> No - /> Yes -
- -

-

-
-
- -
- - - diff --git a/main/NOVA_0.4.4/templates/config_switches.tmpl b/main/NOVA_0.4.4/templates/config_switches.tmpl deleted file mode 100644 index 3e0494c..0000000 --- a/main/NOVA_0.4.4/templates/config_switches.tmpl +++ /dev/null @@ -1,120 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - -

SABnzbdThe automatic usenet download tool

- -NOVA | -Connections | -Config - - -General | -Directories | -Switches | -Servers | -Scheduling | -RSS - -

Configuration switches

-
-
-
- Processing switches - Enable Unrar:
- Enable built-in unrar functionality.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Enable Unzip:
- Enable built-in unzip functionality.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Enable Filejoin:
- Enable built-in filejoin functionality.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Enable Par Cleanup:
- Cleanup par files (if verifiying/repairing succeded).
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Fail on yenc crc Errors:
- Use fill servers on yenc crc errors.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Top Only:
- Only fetch Articles from topmost collection. Enable for less memory usage.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Dirscan Options:
- Use following post process option on .nzb files imported by the dirscanner.
- /> None - /> +Repair - /> +Unpack - /> +Delete - /> R+Script - /> U+Script - /> D+Script -
-
-
-
- Other switches - Enable periodic Save:
- Enabling will make the queue save it's state after every completed file.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Create group Folders:
- Place downloads into group folders.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Create Category Folders:
- Place downloads into newzbin.com category folders.
- /> No - /> Root - /> Root+Sub -
-
- Send Group
- Send group command before requesting articles.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
- Auto Sort:
- Automatically sort items by (average) age.
- /> No - 0 then "checked=1" else ""#--> /> Yes -
-
-
-
-

-
- - - diff --git a/main/NOVA_0.4.4/templates/connection_info.tmpl b/main/NOVA_0.4.4/templates/connection_info.tmpl deleted file mode 100644 index ab4dbf4..0000000 --- a/main/NOVA_0.4.4/templates/connection_info.tmpl +++ /dev/null @@ -1,40 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - -

SABnzbdThe automatic usenet download tool

- -NOVA | -Connections | -Config - - -Force Disconnect - -

Connections

- - - - - - diff --git a/main/NOVA_0.4.4/templates/history.tmpl b/main/NOVA_0.4.4/templates/history.tmpl deleted file mode 100644 index 1c63842..0000000 --- a/main/NOVA_0.4.4/templates/history.tmpl +++ /dev/null @@ -1,23 +0,0 @@ -{ - "bytes_beginning": $bytes_beginning, - "total_bytes": $total_bytes, - - "lines": [ - { - "added": "$line.added", - "filename": "$line.filename", - "loaded": "$line.loaded", - "stages": [ - { - "name": "$stage.name", - "actions": [ - { - "name": "$action.name", - "value": '$action.value' - }, - ] - }, - ] - }, - ] -} \ No newline at end of file diff --git a/main/NOVA_0.4.4/templates/main.tmpl b/main/NOVA_0.4.4/templates/main.tmpl deleted file mode 100644 index 1913987..0000000 --- a/main/NOVA_0.4.4/templates/main.tmpl +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - NOVA (Loading...?) - - - - - - - - - - -
- - -
- - -
- - - - - - - - - - -
-
-
-
- -
-
-
- Time Left - KB/s -   of  MB Downloaded ( GB Left) -
-
-
-

  GB Free In Temp

-

  GB Free In Done

-
-
-

  GB Downloaded

-

  GB In History

-
-
- - -
- - -
- - - - -
-
 QUEUE  
- Shutdown - SortAge - Verbosity - Pause -
-
- - -
- - - - - - - - -
-
 HISTORY  
- Purge - Verbosity -
-
-
- -
- - \ No newline at end of file diff --git a/main/NOVA_0.4.4/templates/nzo.tmpl b/main/NOVA_0.4.4/templates/nzo.tmpl deleted file mode 100644 index e8449f0..0000000 --- a/main/NOVA_0.4.4/templates/nzo.tmpl +++ /dev/null @@ -1,98 +0,0 @@ - - - - SABnzbd-$version - Uptime: $uptime - - - - - - - - -

SABnzbdThe automatic usenet download tool

- -Home | -Queue | -History | -Config | -Connections - - -Toggle verbosity - -
-
-
- -
- - - - -
- selection:all - none - invert - - - - - - active"> - - - - - - -
Filename/SubjectSizeAge
>$file.filename$file.mb MB$file.age
-
- - - diff --git a/main/NOVA_0.4.4/templates/queue.tmpl b/main/NOVA_0.4.4/templates/queue.tmpl deleted file mode 100644 index 1e76563..0000000 --- a/main/NOVA_0.4.4/templates/queue.tmpl +++ /dev/null @@ -1,49 +0,0 @@ -{ - "uptime": "$uptime", - "diskspace1": $diskspace1, - "diskspace2": $diskspace2, - "kbpersec": $kbpersec, - "mbleft": $mbleft, - "mb": $mb, - "paused": "$paused", - "shutdown": "$shutdown", - "noofslots": "$noofslots", - "jobs": [ - { - "index": $slot.index, - "unpackopts": $slot.unpackopts, - "nzo_id": "$slot.nzo_id", - "filename": "$slot.filename", - "mbleft": $slot.mbleft, - "mb": $slot.mb, - "eta": "$slot.eta", - "avg_age": "$slot.avg_age", - "finished": [ - { - "filename": "$line.filename", - "age": "$line.age", - "mbleft": "$line.mbleft", - "mb": "$line.mb" - }, - ], - "active": [ - { - "filename": "$line.filename", - "age": "$line.age", - "mbleft": "$line.mbleft", - "mb": "$line.mb", - "nzf_id": "$line.nzf_id" - }, - ], - "queued": [ - { - "filename": "$line.filename", - "age": "$line.age", - "mbleft": "$line.mbleft", - "mb": "$line.mb", - "set": "$line.set" - }, - ] - }, - ] -} \ No newline at end of file diff --git a/main/NOVA_0.4.4/templates/static/images/bg_dataBar.png b/main/NOVA_0.4.4/templates/static/images/bg_dataBar.png deleted file mode 100644 index 8296047b878e11c8688feeb69a67a41f66dd1701..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmV;`0V@89P);%sL<1|>1b{@W9PSH8CTX>nh;6!kV4SqbwbCSIbGdaV=?>ev+&f|bv~KyT z7A>?Ty@h5HG3)m01=-H7McZZo)UW4kO^O!&hSDG_R&zU4Y3#Ah0F;L+8QXGJ4hOts zEw-s`7ctaMtyoUNQnG#HV(~_{+eUTQKDBaqu^6*;Z0};u*6f5O-8E?*P}2EGA_hR= zJpkG3lFeSro`?a^5B5@vW{;Z=!!m6hNyMz%O`q9%Hr!3v_ItLsn+(|cVJQ)FlRj8~tHBtJV@R z02+Q~wfi-+{Pnj)4Ao85?l-oF|Is}3knQEcMt-ng6pihk?C{(;AF>^tTX#OZWBa~Y zNW=i7=ukB6{Rm5mSpIx#e_-uhu-%~gu4$iba8vdGUi+79*VXzRR@=qRA|LKbTH21I<1y-A^-rqfF&@*CN)H+c!4KH(zMV0j*m=mi$%4!tV)6e{ zyl_>;OHWGT(t-J&q}{dzQ@*6|+=6K(={;i|w@`Ty!%uS*fNcv$+|XcI?t~DkK5r`o zTN}3v7gam-xvfk|y$@`;EqMu3OEa)e!zW&Bz)qV!?M^n9Thvq(K3{`%TNJ5gE3jT0 zPNVpD>K}tmmX@YA=zxt=E9$WbA%>lR+bAt4{Oknm`=_AZ2lllncnSSJ6R`6rApS^l zZWocJ-S2a-%dV#Iw;9+~PgC#LDcE(adHHwmdfmh!x0k7*q2Bhvo+n1^|J1ty*wfhT i!Ygq<1bZBr{qrweUU26e2%L5R0000`00Uh~L_t(|+U!}~daEE1^rxn^u~;D{ z;r(Cq?81V(3wnCxm3*zq=T2s3#{k+kZQI~5=5`y$`~9PBKf*5@$I%$O4PyWh3ZV=y zdL;?)fQW0NK0nR54U@#dF5P_j>3DA;-O~H}^X#@phnTKRyQy8;F8wl>K zfzV{?A(X8Jk1hMWwg62C4V41*z!lmt#v5Y3HS7BGGfm$6crG3cYTS%@g|Wn8EnJ+G zJsfTUux!KO#j_hC09ZW`H0%NbKoS7M#*YL|vn&!|?O!b<)S@hK1zS;Q`KOO8P!AH| zDk(&Z(*#*BSKwy{KF@vs`T0A~x7#ql8N2{1jPLITPH!UtsEl<9=zE%28KMAllL3SP zfFx*w!X5zv62Tg*?pvsOM1o8n-{>ZV0x&csU`WNEn#b5f)^LtB2}w^^;AaO;?@>;hcDkQE+X2KcIlNV02z0Ip);ut{Gw ziOa%LS2#?8Slku(*@4G5u$#o~kq&6=&Bi=C=Y2xJQ1t*{<$?eKfdD}@01>2e0KDq} zQrWSPNlFVYTR3hqK@Kbgz)_PsDO`b{9{AVS`wep`&w(gqZMY84IB>2}B@)3@dDHdBQ_-v3Y#tBVY<3BdVcXgR zfdGX4?sdfA3Xht=>Lv@oVUx6BGK#WEdX9->nskg2a0PyL;P@8@>7>|f2Co6N&8Gfv z6$u8h9#ja{|0oP1u5vpY3P5c;6Hkzb0Av2pWNpLL53#(5;PDFl?7)qYGhrCivlHFS z=bfMg_#*&r$zr-s(}1_41%Pi?B|s7=2Aa(Ru&)rdGo>IGJ^T`C3)8WMvWHbG#Q!>6 ffu9`sKLG{+BXTE4cD7{h00000NkvXXu0mjflS|s` diff --git a/main/NOVA_0.4.4/templates/static/images/bg_lonelyhearts.png b/main/NOVA_0.4.4/templates/static/images/bg_lonelyhearts.png deleted file mode 100644 index 3eafdacf76f11d1f2e6f351ee5e7c46609714df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3434 zcmV-w4VChVP)!0YiLpeNDaM6kuEAR2@p!akN_e!L{xA@ zQIVzyGAQ7HqeGFgB8r6pQL*a;8AQ}^a1n6@-c&M->OB3XhmR+Dq` zEL(i`nPm?-^D=}y8Ow9d;$`sU+$ZCWITF5%kzg4Y=Lq<@GQK8bgLFxTK*n$6u^D_$ zHUKD++%D#GQ)Fx{W0EK`f-U2D0N_Z;U+~f|Sj^88%MZoQ%vvrIB&UcOCR|g7jgu3L z;m^-a=ZnS6Fb+43BjPdGnHgCe;c@_G&-_^wd2Jc8B0JbPIXEzFEp5Ii)PG(4o09i- zmR^K^?ioZM_`~*Bewhsbu%>0T+4_fVX%zrn>j6-^{fEt9F93?NzI6_LaUQySUQ)#3 zEN3gL+}vDC0iSCrFX-?3pALURUwqF}zTNNTVR-YCIFfWRLtZy-W_qSX#K_L#aQO`8 zpNIG#2mW;)77_d;zKAcBMMTS{Odw2_wOhy&hy|HKhCukAn)naH{-oKtmWkT<5zv-c z0;M4uKz<$oC@K*k343HK(C>W<#zzDB&5O~Qn4SC2g8qG1xJ>@Y79@X;V@E_XxDrv$ z?3(;q0yH21ML+}UKpW@-6Tk$vz!A6r58wj=K`4j>abPjvf)tPeL?9OwfVH3)l!C2b zC#VK>pb<2KHgFhpfn(q_I0r6)%U}fD0a7pyo`5Ov3d}$dgoVfu6;g+EAVbI;vV~ZX z8{`88LlICMln5n5LP!D?K>Y--nTj(fs8oB@tL${z&XcGDrdIuvg38ukX zun}wpvtUm+2#$mo!O8G4I3F&8x4@Nf1AGwfgiphl;1O5~KY^zafDjQnqKhyQ7Q#kC zk$5Bt5h1IP5~KoYK-!QVq#wD8NRg+=TNDOGMKMrJlncrq6@}uWmZ4UmHlwOh2T+}; zKGapzC~6Az5lu#GqRr9H=m2yqIvJgdE=E_No6sHTv*;1@IQkU^gP~)LF^(92OdKW^ zvjVdjvm4WnIfWUY%#V9dk}jPdj&g=eS;(7ba1vfUtBy+ zh%3ZZ;977ea93~>xEZ_>-VpDM55@EF%kgFSMtl!`2tSUWAt)1!39f`lLMmY`p_0%> zI7_%octIo*^@vWyaH4>?hFD2FL_AL%CB7w5NMLy&#jxMr03i zJXuWMLT)CXA>SvzQJ^YVDg-F-6jm$LD0C`ZQFx|^S2R@gR9vi>uUMgYL~%&*sS;kv zNQte)QCg)`qjXg1hSIb$RoO;4R5?R=vvP~_1?5K+EX9c8L*Y@1DEla9C}UKFs!wH8 zxzu&kM(SDWI1NKHrUlSaX{EGpXoIvV6^e?TO0-IzN{z~K6)7E|8_@&k>GU%CVfuCY zJ5?=JPgTC^Ce=38E2^*6=BRn7@zqMy+SNwX-l;Rxebm#`x2boj-_t;8m}!J-V#`E~|8t09<>bY`U>s_U847WtLy>3!> zU3ZRqgZl#yeGi^TlgEUosb{L^LC^t4d)BzcZGt`fY9xs_ri?BmW6#EjtLJ7uL*w`VG~gh(Z7JYV9A1(1+OB# zBFiH0M43cMqI#nhqZ6W=qhH5($CSrNW36IW#$Jlkh!ezh$7AE8xdr`1lgVC7dNk648kso~Qb!)}_8q3r*Xf_9;Cky*&e$ zk(hB*ND-z9`!cmN^D>9C%(IHKq|2O_?OZk`3KBJCL)nY6yTvrw&(wg#M6zBon&XyJ zlk+AwI`>GPa-J}6V7b}yP0J_pee=Iwfm*>`(OaNfu(n`yrRU1}RnV%Xt9n=KuP$0W zzQ%9OfwhFSX={Hdv@R?!e7P=WT~Co#(VC*M^?vJHixrAR#Wyy%Y^d9a+9=pKxM}XD zs!bnDcqJE0txGFP-*4t_zW9~RSCwCV+LE+ou*{)s&sNM<;nwTh+_xPlS1!*lAKMka+N6C(tJD2RdP+?b5w~Me#vP)VST-jY^P_?z{eRWFpNR3xbd#z^errOuLdAqOd z@z~Q=r&U*4_inFX@6CF@`pyQUhKhZdeL4FcHbyu0f6e;3xk;m`wCTfs;eP3Xhy#7i zj?K+2nk{9maI2(s@?gTj%inl^)7{2wt8b^bmmUI#B!?bmEKDc(k|2rKjV2%kTFe(>+#mT;+J#3Brk@6Q54zpPW9G zb?WKqB=X}qd>G$kEdEWK>u?x-@j$UM4?7HM|sdK=7 zpyLPoA36pd20Mowhq^C2UG5p4H+rvNl-blD1y~(@z z=vMlz=eKii&)iva7k#(np3=RF`@L<7%J7e6jCqHHX^nSeP zA^Bm&gw90sBil#ECVeL_KVJBF{7Kf6nWx1+EB{>k%;ed3zj*vIFcmvB{#^9@)32Lf zsK40%((YyNblCL$R~fHnUYER4e{uvwLn0FI1x$m*>D?gZi==m7*@$RRLPoI7R z_k{EN8U*;`00009a7bBm000kR000kR0jNKxX#fBKA#_DpbW?9;ba!ELWdKKVVQ^?^ zV?%Flc4cyOWpW@WNp5syY$Hb$& zY+)fJfiaIJGfc;JFgm^x66!RW`#g?6;=;}YuDc9a8P|8?^E@4H+&YXGV<8HgtUUF| zb~-(KVzF_!PM?>^G)gsNWz_om9f@`GSad{cNvYjC-PK}-oCznGbl-|)!#ju!OsB^v zEdTM>5c1Km3l?1YFIeU|AcxgA)601Hf#ZPt`xaPcJqXMPx^&$gg2loJAA(K}$YB{#?EeXi*@H?j>$Lh#9zNx5 ze<$J*!>nQMeRoSHix%a!r9$_GbYO!{^vF+(nrTb6MIL0g^S)bST%t&<3bF$C#Ye|E zq|Q-1W&Bm0X7^#CRH`s4;wUU?0CpcuQK^0|+*b9Q+bGmnMk-m3s9M;qg#D2Xxcyic zMHoyR@+UkK_ry}22)B5!R{I6KMJ$$YJ7dv3$SRU_Xw=^ADF8)Iq)Xs2fqPKfjM$xH zz!fI5{a9Mh>6^Jn^p=-u>9iPeE0z?T^=j?{`d}}KjjZBN zxWt5lRZ+8!TF*(hp8R$5gK2)L#G>Y-Cy7xK9`s=i5aWS`8+0keb1>%(imIE^+?y$3QMMHnozH<)5o`PqO5CO#-@spjUA91 z?jkw0FIGk#)WUaDi}y;MGJ=Vk^WD_V=VxW=Acaz7UZ-<(sMNopJD*&Q#<=e~ZK(Hr z(jc-_?PE;%lk(a)hsrg>KYZfWBY|ZHVudhYGJ<3>_dfst0RR630Q|*~yrql}3;+NC M07*qoM6N<$g6*4-CIA2c diff --git a/main/NOVA_0.4.4/templates/static/images/bg_thead_tr.png b/main/NOVA_0.4.4/templates/static/images/bg_thead_tr.png deleted file mode 100644 index e17c7794daa62525d00b6de01cef8eb09e307c73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{M!3-pCdAEE8QfUD`A+G=b|NFny@P8pAh}@+A ze}nG-bvpl7YyDrT`G2|k|D~$`7peSTp!9#9;{Q4F|7XhnpDy!%s?`6lk3T=-0`g3@nXL{eaQx9uaaybcD!I^hy95YEL<_*8j+he1<`bFeR69s53He(G{ zk&h~3fD}H(wOz=fVk7fi?I%`yH>21vMJ>dJ@N9%6Wh1@ z7sf1^aw_$DsgQ(1V``qHLZhvlcdKWnX0Ol;x7AV4rZF~eFVvYnu~f-9(K~yuU$}1Z zX$H~q(FlnF`vTcg`s`d6XxWl5CYnzfl*Kw|q$vom*2I1n-S z%DVXN-(t=4ffhWBt~R*F`&vk%>RQ$`bASHgY-uT7gPQDXmk!4;U4FR==zzNh8_U+e zmzCJJwRK}&u2N&>mQ_Hv87w(^=2qIyDF-eksR3=dYP6ka!hsKKYxf&_UZ3xgAhkAY zW;B~e!jIbtwWrngPCZ}}1yUlh=WPDzr7YKSb40fv{B!KqHY7hhGe4TUVPo>!sO77t z?M!W8X|vD%er(stK9*&dU)E*ihA-aA^I~J@l(zh{QM=}QCA`QrxVgD(>1>F-XM0L# zSHpa<**p99>g%@O;y0OqeDWp;4UGhHZR zm-X}mCA%Q*-f`{NZDZl;*B(rlGeS?_FIg z`RZ>Hx+mXpXa9dS4dg2$wQ7A8gWj;MXLOl=xorB@9m!@E_g5JydSd_OPI~uW3mS(P zrk_un^Dw{pukh?In^~4!Tm=dD{I`c@$jlMhe(Xv$lSG6kI4R zvuDe<>Cl)1hQLlk%NotbmtQLWUA(0Y@>Kcxc(23T({gS8Ycww0e(+&-cKxeoy38uT zbd`SW$&0NlZS%IydV2QwX8vpU*2H~(_tQHQ6a?w=Dh6}cN&PglsLFoJf7b}8eEG2_ wKh{EB<}hEZ{Mx;lsR@r?z89JSw!T4r_k{5J|1(#g24+JBPgg&ebxsLQ0IiSHHvj+t diff --git a/main/NOVA_0.4.4/templates/static/images/bg_topBar.png b/main/NOVA_0.4.4/templates/static/images/bg_topBar.png deleted file mode 100644 index 083b1553f43084f797e53ac98f7861babf12ec60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmV-K0lWT*P)K2BJG-~6%(|co|a_}*6eF>S$u-E24NjhlA>i0&HhAg z53Tw6Sf|FFeX!ZvZ*L(Y?i`@KZlj6t?jhLMi}tSD^ckX|J=raHkCgr75v+Htr+xka z)<4nWKEFpBg>_VWqdYjpXm)DZ86^F#_`Tza+|NZv={q+C+^Z)$u|NQU&{OxnSgVE$;wpe}rY=2`+1BIUL RMRx!I002ovPDHLkV1gSEsJ{RJ diff --git a/main/NOVA_0.4.4/templates/static/images/bg_tr_odd.png b/main/NOVA_0.4.4/templates/static/images/bg_tr_odd.png deleted file mode 100644 index d3cb9655ff79d4a737347beedddb673770a6b8bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!3-ohG7?;YR7-$Qi0l9V|Nj5~|K>B0`2X)8 z2>k`3zyJS$(eFS1f#??){rvqOh<*Ukum9h{=-bc#K=c)Ye*FIeMxVd`2cl0v^zHvg zF#7QA|A(*t--FS+FaLq)Ef9SMSqee(K1nD8-Q(ox;uyj)ll35{kQ0!5VD3caPM4)Z zic|jEZ-{N28=x}nhPP}=Us3DiOOZ><3QI5VsIJJ`TT+$ZeDO*0wusulIrYgt%&qg@ Sx|RdAGkCiCxvXuZ1cXd^bM)N1l zpEV;!XsEQ(gbvbZ#%eSgD=XdKf7581>9fC4$=@&ji$=4Z8rV=9>Y`ad#Gi|Q1C>Jk z|8Kwjrg`+}k%r6T+9=z&y|bFVR}O^x(ti-Wpre1l;*wy%U=MK&x+rlyosme&v;mN?nFEfkL4CP8e#9! zdG(x)lzpnlJT159evJ3dy~Rn!QuO(f{C%ox$r!a-REgp{wK5%wtlOu zaQLVG2w2q*fvcG;5WJ>8j!0Td^slKwG-aYB4n*{(fr#HcsMnO?IuY%s z@_|PWKst$EfBjXI=IX!VA)2*8NOcjofb%>ekXwnpIk zp$N5q1(BO<5WB?&aa(PW;5YdL%|h4JGe(#hcW>x2%{h1fB-4C| ze+p6JwjoG#RPaSR*w8#)L5STe2wL|F{C^&RsLjI=yY)3BY#WZ0ox_o~YdF%KUPGqy z>&PO?-lHQE^`nQT;96^m9=nt~m%XWj*5P7(0&-kN8Tc?i9q$ank-qyiq!O;A9m5gt zI2i91Fib@wQwJC8=zo;Q%~G8%bq3gz#81LmkX-?i5| z^Eh2P7WHip9?U4QS9Xm>>Yg`|>GCFW+}=dq zFK;1#|Jx`y@HUDLnx_(v$+&;}ieBH<@@A}^7muMi-w930t8qGa2d8maHCDD?<28uzx!Pss0o{E z)Sh`Wj-o@8PYht_vG$`32VGOP4AO>JdfCim!rJJ-zi zX`nT`-*s8vPp$!%XYzL&^(*&NFq9FNQlIH4^7;_@9v=v-nfs<8b?-DpJB~rF$4ngc znu%hcnb02o1m*sppd#QCR0e*EDyE=MQEh_GR~**sf?9WOU8)uBxv%Ue>vd5Jaqs4N zJ$~7b@wXK0F>23!Dg!=6IbkXD`vj%FAEVHFCh|S$Za*{=83#T>^tQ3c_x>D(zOztD z=XhDbEK~-~LRIjWs6O&f)P#I#mM&BV80n1EpPT2(&GxB}`H#S_mbU18nS-j(IjAN&7B&a9 z;pXX7#s*xh4(>s%g>Gj1HO4Q+z0M1I`Ah6vo-H}hqaR~nEL9E(0@O!w`3>rI^tifguk=y+ zs_Q4y?ZlZY_pVxh+DhF8FWH{?)DnNjQcakuLKmR?$b6Ip&Bsyyc{u9#HQ|2?CBe2R z3tfcD@I|PJT!dp$i%=K+AMjc;H9P~U`>E?K1ul4WzsuzLbFR!=@RIGhtRt!=JdCM2 zVi79B7C{?gi=rS~6a*|3^3V7F4CUdAQ604e$6}VCE_MkT;+CR;)|%J5FR9~rib?E> z{v7PVi!s#4DVS=am!L9o31R)7?AOI&{|1vS7rV(CS$ij-ob;zIZaL}`R-hqq1)36n zL{k!#NnAdE{Z!^gJh*dJe`ZPDXC2}@;Y{AH9=sX}M+4zuOto<520&bBK$82{0W3Vb*lw3wpk+AX|TAz8WWb`WcvE2 zB9`&Fa$j6;EhJ25gk8Y+q^!-=+v}rE@;Q;V9>-JHkq#|I!NEyL*=mLOP5l-8YbE}E zP~*?uVS(ITRw&#%92JK@Ktt?eoJd;-#%7>R-Rhgb`>(6L!N@)^brZ>QSy>3gHKWQGfE;rz8 z@qRRuZGDQy;l0W-Dmge-@L}2IksOWjTj=E<`Z)ceIpa^ z{Za7qJmeY}>Q_#to3w!xydd2^jVmWJNWUV;zI39!^ewdRZxhy6RI*Xa$xv71Zyx`% z=?{&sn@5@FJ4QOAmh}UAmo>&Op|*1UxZhLOpF)55{Fmov_D(u~RQkhmP%taD#l^nKz%~ivCOdhW#6&-@nTJYb1Zw`KiacVw@f+6dkJBH19~QU_*3H3Ke`>?$ z;^EyJCiRDHpWjn|>Z5Ii9Mv+Ey3i2!9pSgu;ZgLVV9y}1olh#G*BROV;oY04@O|H? zJ@4P1_m|=Pf8O(_c;5(NcgnM0J&(KB&yub4oqiok4~;`>p({9Up>8MZofoRf?i};X z`eStd>+OH#{(an8-CiFfBpX0)|LEkune6|K%KKN! zpW|H#^d?T(!tZwrWNlaG%zYWFf>$@Duuros z4)Nx9EWZac2~!&R7m~Z-4_RkTzQlhu^P8UE#{5Rk+^%{9(;VbGjNilN>iKlmR0n^7 zjuWXm|G09-NbGVwc>mtLd5+#+A@ru6M7ly}l++bf$+BZ&Jz#yvApEIY$<8GFaU}nU z_5Hx|Pj~-kb4x|2ZTu!nB++*~N3jOfhwWDJj@OOFZ&5j}xq80yAbNLyf|D8Kk0|%S z6`Bv*6CF*-Xe;w2|IQke`%=7N_shaIR>osK3SJ(U>&#b?y&}(a(hJrPey6a%DtsN` zUu%ie<>9s@BTY&0LM@*`$<#*7f!2WMEs6Iu&qtxh)z#n0_D@%`zDT~TH;kS4Cd-%g zB-*|o!q)bqxc&kyV`sX3%4U~j#{o1?WgWO5uLY06I@Nnp^i}EiY<1?##QMzG zh29hP*bV(CzHW`m1P7O{>*q!OhMWVJZ8b5rB>}UW({~OL{kSi$M;eXuyAtta-mEiH z?um5H6lXt4=*oY3s8%cu9M67r8$qJEME~SF)eGuC-DO zf2-jP+zIuDm6kqjc4=F#Y#Ak+n3?4I^a#=E+IUi*t5-6uCdJD;&a#fO@D96K9 z$)z~De>~+Rj7RYyW72xRZ{$a3UUw;8&G&H~#o$^B+$d${o{?-WREHSGp)m^%j2Af@ z*=}zkZO>as*foyw97a-}!zAP#m_j)Y@1n%>U6grG?LkdRKN*e9{7<3o2VS9@0K>n_R#w(|>wZ1bb-(WiB8hnV1{U0K3*8~x#FFyP^ z#q+VgI|DI9A$9Fipf|biS4eW1N^$0YQ~cHzH4(NH)3rr?^dixZ`#ueE?7)cstxFVV zqBtv$Lu1y_yZl(BEvmw8DOUV%6b3Ftvg`jK*L^xFBNn4JmfCV$IN^t9pk?B{rRIP4 zMjORySLnxTi2s3Npi5B`y%ZG@OOfyMzX+ooz1WRpgE@~N*~~*@(n^Yvt|EK3_jDq4 z4KCG1_IS&3PLh5c8nY>B6~#MOiFj?k#|%VKeq_+md7F)N__~&Y$BLlzI$~S8@(Swln4Qkxk8Sh3@?MUBPdU;{Bt<-eDa4 z2A9NRD(`kf9;M_dOTGu#S10>$+>zJ5_~4uL=CT&{;^X-9TT1_Sqjw?4&8lf1^ZqtB zU&;I7{aa{nh^2GUj&cpYqrE>9g>FN|TS~k;=eKL-Sa?p7k1Y8d>by`zvBDIJ z)9*wToii*uj={-(T=HA)dH8ER#`oae(UjDKkD8~t{=EF_BIfttU+y#2XpU-r-RsZG zzn=DllsT8`SV(tXrvC10{_JZu#mC%dea-*Y#hM=ctAjo>lF=PHABx<_|I`Qi*IoX6 z_H>^s$6(cK)R+8gBjy>6O~w%U)`lBl;5;ief8lR;9?&QAFFEiA`B)zrjenskP{H8* zvhbC$POACyogiiOyz9^7@P1d1FYA2f$+|4rpTzpmd;a}}KZ5-z-Opb+Mw!=S@SQ4o zJgz)n;iu=#{pI}Ge0^<`tRwJL7^kFGwf!lDhDVEcnAB~&m z%D{V(V}oZ)4hcImZ@0C|pQiKI(Re&Jo+JB#V#!w*Msec8kY$lwS6gk!9&R@H87&14 zZr>LqeOAm{%$@Fj_EjbAnbh2QrB(QP?%wM7dv(lDkr}&&>HRwFr|J{Z`G};SFKOGW zB=Z%KcRD-7`#YDs1`fiL(A_ie-~F3;<`QrAQ?OgYib(ILpx>Hx|JT-(H!XO>$aeM< z$lo)W`wbR<&+XW65okZM{cL02v`EKs?V;JW7}i5QcnG@*NlF9(N<+_bMv0;ynLK~Uob|rQ%dWl>|e(ztVJ5uZMj`)t-@!7{`d+fGR?esga hY1yu0+xZ;qjn7@4mnpl)wA22a=0LvAXZ^>0{||6c94Y_+ diff --git a/main/NOVA_0.4.4/templates/static/images/icon-blank.png b/main/NOVA_0.4.4/templates/static/images/icon-blank.png deleted file mode 100644 index 3e985d301b20c2e91d5faa96d9ccd619596af442..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1171 zcmd^;-A_^h7>7@}RdaK#i?%*4s*74}b<@_?)>Wk$TXUwiwP_&~ijDjrQp23BITh2f z+02Y^egO)Fm?DT8APES}_(lXo3zd|aajl=1_T`6x$HKYOg2V?RDTiY;h#4@BpL!g);gHov2k4Sv5#ucKf6XMl4ws*E> z%=+|`xJ8$+_;>goq(u{@3H97Hq;gcJ4x+nYYQo^(PJj}76igwsF%`!af1}tESi-&5 znAi~|Osr4aBh!u@p6Tzvg7abLxIYRn1VQRtfUDm$2jVM%$cWb0rEm&t+YP$pE0!Yv zixNRm+>oYI7wMW`V|mdPZ>V4G_C!D;*U-MWjpyij=CDY+ta8W7`sKAe4RzAeIBDfN zK=B$#VG27fkleaX=#%36H;_1*CW(_}+Ja!Dn9hGE4=Q~ySzxUgQhl?>jlKkVP`2O*KmWe`dtZZuS1Kgo&)hVy0rox=9ymTlv2}>!UPVGL`^ILQm6t zNMZl;WWrxBc9jjQN7Sp$LQ@-mu|s4mVH;rt{b}9UhhUB)=?o`I*-HZ&KaOj`j;+>- zT~mIfWyaZKi>uaSgDVh@DQi^kO1$uO;?=Yg2bQzfE~2+MErCoSkk4PnR8k0}D|M~O)9K@rnC#m{^pfT9{;&=|5oFFCgx5C zCdU5^zkvGwFf#xI5F^9@Mj&PZ>i;XIDz1EIW7#HNO(``7Wbpj`D~6DkIEG`Fj~g>E zv7BT0%MMh}%m5HTKwUu1|AE&0`w6t2L0CglgBzr|=0G*WndfI1m|2+_WcXznrnpXK zFxRwXICk!k9K(Oca|}%X!CCZghWKjC@{mZ}K|9&$aet3l8(A`4} z3_y#NM3or6{{6!6{l|9(hVS2X7}(iA0KNK@fra@tKmf4-8BwZIYO@XHj5z=N`2F8h z!HkKOiG_iOjfa7mgPDPijg5hqofqgzMg|KtBZgP5QB79zkL@az9?F#YcPyZ^3>T>rDQvi#@l=KQZeU;qEDcej8t|Nj34Vi0)x=H-9m zRJUIM0mPyts?4V;rOD8+yMbZvjlB#koIpo0{bjiO@h$^58#ge#m>6Dvd(DusJA;9f zos;1k5E_WURn1feKaiAuu1|BaZK*xijMU?6_J&-MoG9!s-C zzdQA+U}|%2STXXENpkw6Jq=WB#30h**Zqx80G7xg2LKoZVN&=1FEccT3xQkve43;n zjZvX^?*P{BPNoA(9dqA2RbK$HFf%bTgA}R?sWRwG>M<~LvjC&_AH(x+&l!FKqZXu* zgNcJdK|q0lm5r6*+rMuN%KXYeyO>(c-8{PO?x|MdU-|N8&%^z#2WXiNJ7h~@6v zdzJqE0h7#>E!qD3`omx(tIv?@mCeAx!U6Ut*b6}K$qC3ZY&&|8VcW@F4D1|S3|H@7 z|9AS=o?ccaRt6&pBZl99|1dDI zGBU^m{m;e1#lXV}Oi-MhCxK>dW&i~p&}9Gt!~zOUV9)~%0Wtr6y!+zLuZM3QbN0IR zG5i5SP>3@F;m5C^8P4814U9_G7Yt0G+{*~gyZ`~j$dJs4lARg<{>{>s*6r4l)n@}` z=l}m08CV!u816i~$8h@Qg}#6P7^{HU`5(hCMsRip2rvLwO?vxoke4F>0000Gx} zk@W)v5DS=md6s{T)R1KTwR32}0l81~vr4#SHvcfrdB& znMXke00a=kfG@8Y7+&9C*tmEq12F*Tz5Osl00IbNz}Ht`&Ddk0ssOG0Gwde-7a@U^8f$<07*qoM6N<$f(3WEX8-^I diff --git a/main/NOVA_0.4.4/templates/static/images/icon-header-freespacecom.png b/main/NOVA_0.4.4/templates/static/images/icon-header-freespacecom.png deleted file mode 100644 index 7246a187e0b62a76df18f7f20e402425b7d7b6e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 zcmV+@0@wYCP)P3_cnEkincmelH=H0R#}(fY1LwfF=L^|Hr_@$ONWO{MZXN1RVek zy$UqM5y(6WG5{cezy`ek`-b7spF0e5*3V!d1^~UcA7%(Z06`4+_XeyPn~k^t&?O*4 zEC2!sZU6|J|9K4J6=0zMW%$GJ`~Pns{>AW{;U~kd|387^{}{G@TgKqZ84NSW6(E4X z27LVYmH`$POhEYO{~wTcux5zHzhE{E8#K0gM0vgl51;hW|jV|A7#s31r02|382(`VBVh57bK_SHJ*306`6S z&wvPv|6n$IXUD0ub*72q0L-0MYDF!-xT( q-1!R>Q~&|Q`2YWZ21)=xfB^u%B?@tfyd%B<0000aF diff --git a/main/NOVA_0.4.4/templates/static/images/icon-header-freespaceinc.png b/main/NOVA_0.4.4/templates/static/images/icon-header-freespaceinc.png deleted file mode 100644 index 5225e28858a1f99c49a3561755c29ce6655db557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 623 zcmV-#0+9WQP)^argH%3RRzCy140hF*%fE}B&i^_SAb`LIy#MzGuHf;X zdtl9TGM6*(F$v-fys)VreL(6OKmdUa`26n!!k@n{g6SK-FEIT6{|gvu{}}%K{|$8E zABH{O*D=_0cq5ym2M|DD13vwS81VGZ1BPcSzA$7b=Ku};2-Nx)Y{*{_{QrmH=l>rJ zpMaLFTeuMvpc_CA1_&S&7rgoKngPOxX#NG%46^+{m(^9REI`5)Q#!yqL90R%Pxq*=_5lfh8H0%*WzhJXM6K@Is24Md1R zAazjNLFs@Sq!%E77=c&|7`Im$hy*|b`hiq05I+Oi01!YR13;wDt4-xTMRr-7)H#XFZLHu* zlh8ej%|?;WR+`g7f3iW2&Rm|=PL%|L{`RhiMX#L#`1u2z@L zowCC)fWz?e^gD*eP>jA%in%Xxs@UP_N`0us)#5^m#4UKX@bdFroz%L=(k^6?hoibR zfWCW_sngx&FnPAs-Q!o5$~JqpM}V(foz#AyyHk$8uD;AIdAO##%&WZ1;^*sQjjyG$ zyiJqNMTEIKe6u%qtv`6FOpU@ufwNC|nlyd7^7Qvkk;via>r;iVi>SYiqO(67yy52Rn6k$&gUMf@)^@e(|NsA=9y0s@ z008DmL_t(|+Cz4EyB)?jgl^t#StbUk$-s_XeDdEbtH#%C+F7VRekfZB*ZF~xs@poj#4;chO z*qp_|<7z(!Rs;syK3<_ht<<%kwsaqEwYOV-CG&yiybfO{+P^UzOdO#$diJZJ|Cr zgs<`w(_~OvZh_A8I_!_Bs>&d(@8F~T`Un$)k|Z%usw;OtayR_FSRmplhnjj~zMwBQ w9ehe8LNXa)&ySlYTtQ;Q|9{^f5sLy006BF={5dU6?EnA(07*qoM6N<$g5h9j^Z)<= diff --git a/main/NOVA_0.4.4/templates/static/images/icon-header-knowndownloaded.png b/main/NOVA_0.4.4/templates/static/images/icon-header-knowndownloaded.png deleted file mode 100644 index 5b9d2c82f41b52185acbe046976d43d541b15f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmV-G0>Ax&n?(!;z`G+54^)t}RU{{@c!B8~iEW=EI0D>Cu3Zdf7EwJXquJsHIoI&<#Kxj{yP*#RVVVy@nX{14%Q?6+r&a z-+vj{e}015{s@Q<0R#}#fHw?3Kfh&IcM}+WVZIOpp_;&kfY?C%510bxZ#)RI{WuW6 z0tg_m0q@_vW!P|w0bx5x0|>yJ4#hwIFd*B07>NG>1Q6H&kmfK=1_o|bTLuP@6QMRj zT=5TX07xCwc2GLt2I&O|AVwh80>xXaEEd_P4T O0000KF diff --git a/main/NOVA_0.4.4/templates/static/images/icon-header-mbleft.png b/main/NOVA_0.4.4/templates/static/images/icon-header-mbleft.png deleted file mode 100644 index 0bd2ab262febdbf7073241e08719ded751aa303a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 986 zcmV<0110>4P);fisW@Z@$ZU#vyW(KaW%qRwcfB+8zgS0Fc0|N^OH^Z-=K*mq70RRES!obE1 z6a*T=!Se6Lm;VfRUokLz{>*?d;6KRu3=E<`Pks6ca?XE{_uyUx2p|>)L7-p001e}0 zX88PTwZAom;8-#`WItPu8v+YAinZvACoU}PAb^+|{(QLf_2sh*ckci6mR8f^ zP*-4Q`2P=~`45o&2k0VTkT84)y6*SG9Sr}^7hGp}b21K10~wm|H_z`&&d3_)R_mlSvyHIff&mtXtO@6!91fr)nxD77$P0RRES2sS{_ z0_+%u?+<{k0H$LOexTdGaxkz-Ol0_U=RL#UPZbO}06>5N06eiO3M)PuG5`Po07*qo IM6N<$f@0x$iEP)1riOp)M-B+L7VWQYIILK!3DZkG)Wp&RCbsFMhvPnbJdmvrBfGLUy7n zZ>GY_(oU4nGkLW%g~(Ep$VP*-T%FY6=Ic0z$xMQ;KZ?j&n9DMS$}fY-cD3sN|Np6~ zwrl_Z0O?6YK~#9!M9*bc0s#<(;o07$I}I?fyAu@*FtEED><--f+ns~w;QMW!FZT?I zKBrmE=@Uuvx}(G2Q@wkK$^EF?E0GY+j`nTW0Em5Fzl8-dZ4;f*Q=^ov`iZY!(&{>+Pv1b0zIW^43jfZtQ*JHe&j9!0fxB);Pwbg zBRaP1c80O$2Ao$s0Lt!HB*Gv!)%~s3o-N2SgZlB*{tgTPgR82_K=j-_bf4)NPj4;} zpMs-UYB3nhuNNHxNv_aOxsdCIM2qMDeUC-_6<`2jOH1+gjyewj0000Dbf*ROy70|XGu$IpKm;C; z;QAO;Zp`u!KI8EgR11^O0*L7^P!T)<02z#ou($>iz(4|d;Xlw7|Np_l0ciW5 zKj44`B{+Zp9FxHg03ZlLNp02o|GyQBIyv7s$b_I?fd{}JkdVKJhNT8Eo!C;rb^b~9 zKzlE&R?-`;0Ak_f;bhu>pNZl2oA?HP_%(l z6$2z-z(EAe6ikc^-(Efg2q4D)|8d13aR4B|0Czrax+2O1p#T5?07*qoM6N<$f_15H Awg3PC diff --git a/main/NOVA_0.4.4/templates/static/images/icon-header-speed.png b/main/NOVA_0.4.4/templates/static/images/icon-header-speed.png deleted file mode 100644 index c16368c87cd1ab0fa9d6515b7f40df76748cbf26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmV;Y0$BZtP)tC zGBAT2`-6eu@7Lc94FA~dIrzm&0Ro7HH0u}{{{H;I!SJ6kJ}NY{i-V1q9Uy?18BBo^ ze}QuU85#cn0kZ!wF))HK6AO^f2<9^YUB~bbDF5Y~3^%`EPf-b2sGVm}kym|M9;s0N3X@G$NAb?m9P6oR9`+r>?QJyAKe~kcD8wrMQzkV~k z{rDXmeJCzOVgm#a3pAh@{{Q?RqiiZw?+~P?BC5>K@aE%JhF?GaGB7bS0;3d!8Nh)C zay~NQ{QL9gUkrbM3Fr^d&mj8uum23c zfeGx-Z$<_^E?ovOMloQ*VqxH9;$psV?d~gp0Ai#xHv$9@#kmn6zyNpTs)@xCe6|1p N002ovPDHLkV1ns5CdB{% diff --git a/main/NOVA_0.4.4/templates/static/images/icon-header-timeleft.png b/main/NOVA_0.4.4/templates/static/images/icon-header-timeleft.png deleted file mode 100644 index f81357ead0d17b00c89a04f64ceca4d358108636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1211 zcmX9+TTl}R6urBNNl2Cf0WlH9D3(#mz>)}3iIP}AG8LqvA~UE-B%<}fXsM`!B#1>y z>uZV_v5K|rv||yhwYH23lpshz<0vhP4@f~2v>`9EdF^gf{kZqc`8ap(Irn~%lf68U zJA(@Vf%43>RelWqzc?&^pKYg=eqa{KvSa|ww--&R8TWHRN&32y+~Un8rOMrEkQElI z)I#|VWs!Q7T3NVnSC3la*JR1lWUKcMf(%+|~8NfI&SUL`UxRQuU9lq>ccvqt(xY7>tJcsRTN??3z@5$B1DX zIsq?Wb8QL9R7>~e({JMSr4egbo75>8EY=YXHql70DLHy&&!uy>U+#988~9pKy&f2@ zKOxDTcQ()Q!Mz(p81}n1+tb@_$*MS3@p)ctg=tZgeyFrqkQ{llNHNMZj57jNN`>pn zk(1xH5ynrn@Xk%=(a1L``3To^!34Zn0Ac?4C{{L*;rRfZxj@qZ6fp`+(~rO$YXXPe z0S*!YelQBRn`p1!%?o=&sj<p&Fb+Kf0t_kpqJPvG)+ zFf}9yJcJ8ePaguw<$!CN6aokZDVByNhrxbm@z5}aRtNkvJn-EEtaoR#($y6+XlSP>A%k}ctJGeN(H|x@3R=s_9?Prv zdvvS{3!&pgmh!ENKMqU~Z4uK2n;8eJvxHjRO>GiR7VWi+;f!Ao`SKz@*6-+>*_O;N zr%y7Y=k8%eXJoMA>f$j`-x&dO>2#6giQQr}EWkoHmML{;zX5`!vGh6tpI^~Klf_j} z#Leeo5Tfeu%bi5r*KmB@O@@~H?tPy2j_!ioXcOeAQaT@Z%iA@hIV4;l=HHQ*>FQ*JAMnVzTU(<@JQRDr@Bi@e|v&O}d@` z7>{eVChC<*JFAR#in4@FuK3NI<&lM xGALDi!^I7I*57W)lvOBW#6gvDIcC08i@;*_iD=QwaR0RcS#@)vN0mNeCVJPEJ z6w31O8AQV`82*F6KcV>dABfzK-wX_F+zbqiD>sS&1Q5%+Pyhby-}9E?)B7I`%*+f7 z|A0392igEc5DX;#{YQwg00~|o{gs)6;p^AG{{aGs<>TkS4DnhF3=Uet42%p=0B3-h zj8LNxQjCoM8Ma^k&5*wN9|J%DvHWIaV&LRpWf0`!V893d1D*B{=#+mznw9N813NpA z57Y|~KrDa%Gl2sJ8vtqe4|MxqpaKy7_YZ zFHrH{zd#yj0FY*5_{DJUtpLy<76yO-VqsurWqA1fGsBmcpMeenYWfS)_!q3{Kal?S z8^rztbT*I%I-T|JH--lc(m)q5F#rS*gJ$Tak2@}W`A-=91ESymfB*UkWPks^>HN3< z98Nnv0t65^48DB-1M%Yj|L~Ch`xg{=f1v^Rm*Ef4=0ATRG&k#Ch7a$7K?w{DfB*s- zz>E^_AVVPdA0+Dj{)Za^!~Yn8-uVX%SfJ$q0XQauBmiIt1}eGq|KCNsT%06hY@$Jd zEz;V6D0;tb&axxa;7U5dd`SrO=dU*I{Lk_E+aI9I8NoU29~6TP0QwIY x5lEQ>l)^xn0+>j?y?h4{K#U;&QUU-13;^jivpYYu_xb<;002ovPDHLkV1m$HRlooM diff --git a/main/NOVA_0.4.4/templates/static/images/icon-history-cleanup.gif b/main/NOVA_0.4.4/templates/static/images/icon-history-cleanup.gif deleted file mode 100644 index e9382ae7a7bf4e3e258c0e16f9ef05675f79a65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 zcmV;419tpJNk%w1VGsZi0QUef|Ns9(k4#FJRZ^Z>R-a)`pjlL-Tv(-FR-|EHrfXTK zV_K=EZ&H$a3h#b?C)<>dSQL%zEzAZtT=`>(GAh(|GODe(u$I@78_r&VTXN zee&3L@!5QXy@rFpiGak5g2j!5#*T!?kcG&Sj>eOS$&rf4m5R)jjm?&h&X|tSmyynz zlhB-&(x8#prdc4j%ZKdE zhVIUc?$Uzo(2MNQk@C@j@Y96x)q?TWg!a>d^3#j**@5-hf%e#j_1uE@-G%kriTK-t z_}q)~)ROYmnD^S0_1K#F+>-g+ocQ5}`{b1T1Smu%WMPPjNt6~x3S{B3W`K?;5|*s#a-vS2Oj@*% fNw5V^p%7OH4T>}=ixwYmyG(7W4QgbxR+kZ&{73X-mIEGZrSu)9y zi$Q^dr8Z6f#iifY*BuS+nrRAg3N4TI(cEjhbV5)M&xJlKCnmLh(ou}u4Q1+F$2e^G zd-m%om^WuJsBp1Zc(NYeKkZB#E8~kP-yA1z{B?P^`hSOX)~WAfcip+h$-wacKQqGx XZ|PO%W~!Y5+RNbS>gTe~DWM4fCbmma diff --git a/main/NOVA_0.4.4/templates/static/images/icon-history-join.png b/main/NOVA_0.4.4/templates/static/images/icon-history-join.png deleted file mode 100644 index a4a3834abc93ce96f5847af4f43d36e06da5187a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmV;_11tQAP)P*KqkyKv!*%&%YHSA$#uatJyG2q0!pPybDkkxACK zZe5qUb?aL0g9mq1)YUcAMMXt`hKMpee*9GY+O8;s6g13;+rW2mlcg5eNGE`WpND`vCg- z`2hL(_yG9$_yG0w_5k+w_5cEi<=wm2-`~D{%ONc-%aEE{==JQ`BQI-fTLu=E{|v0G z%nZMO|6zLn{=G0TsDL*91{&}a=z{+YA3uHss$pUP2q0!oPIhG-9eraN8Cjr{#TX0? z4S=?D0b_-k;nSyY4C?A?Y;WJbGrxNE%4wjVAA8g@+Fx zx~i&biAhUK0-encw3!uX!xsjSVp&-+1`7*ofk%&?`dz<%<f1iR30J(&TiHQLq zfS9GFr9M4>{&d^1V+UpK-McSz<;vB+M~)n2QdL!FR#K7#M-|YO43?JGT)+SgymIC8 zUZ6{!1H%Pu06+jS=&j;__ zdlY14Wyi(9zyb`H&kO4Fi2)B_WMl$*i}}>1O>6wi%JN@)`t%hT zOWZ&iCWd?W9xyzA{^A-y0O2(N1VDiW1V`7cTM?9(m+^{~l?@mkUl<}Hf)5`$v_BLe zfLIua2gf&WUgwpN@N4IX5AQEszI-tnn8BU{1Q-C6K6#RDCBsJm0000U@Soua19n#c1P~L@+1DO!z0mb) z*G>lM^fm^gg)ub3%%KbnE;4p1GxYnb z_*lh&?)kNuf#JtB2ByEv3|xY&46>q3yq|7-@%Zrm|2|FzhWo5g*T67905R@T=6M4Q zFyTKO0t}yT9AS|209x{gfnit4V}@@`Rty&|Uw!!a!IS#ij2v6Pef#$2?{8E`00a=j zI$`!bYc&OK&k|r**u}=MIGVzz9Tu z0Ag6l$;>#9osnq*kkbfE6LWRB-+Y{{{y$4b;4UK@`lNlaypmNlNlQbm-92 zPoF-WM>YT;fS5yBnHc_p5(UtJ??8e7e;H1{diVdt2S$!V|AhEYzh`2+ziaz;KSf1F z=H%pL-#vTwy!`(C`x%%4009Iy;1ke*-;l)e9~i%PzO!?Df6d3s@b&-yODxRHPj~Iw z<)fma!jzbp=(%_A-j_dq{5T6T03d*v7zhAR>SJSLo5#-1p5EHp`sdQ6OU%=!PoE(u zD3}J42M8dz3qB%T0LI_gI2hjY^D?~u^PAz%pFa$L|NcD>#7}|Y;H{;l#gvec;C=Gs z$tM5-M3e!4fd>2r#{a*6|3HR3IC$`&ud%T)v%0#v4?qC1Fpv%wgY2lUub(L)A#oER ZzyP%9MqS-0YG?oe002ovPDHLkV1gT+wr>Cc diff --git a/main/NOVA_0.4.4/templates/static/images/icon-history-postprocessing.gif b/main/NOVA_0.4.4/templates/static/images/icon-history-postprocessing.gif deleted file mode 100644 index bc57632e24e1cc9502bbe63858ae3f654ebc453c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2947 zcmciEdr(tX9tZHtB@glrHz6+)%!|AU+D)-txX+OjTK$I_0|qP4ABRCJ|lE!$e_IJVP0-GhJZFthaEJ%8N4 z?#%su=6lZX+`1LD&dT*%jEgcDc6Gs#5jZ*uj~s!S41DuVc=RY78-q?KOsC5Z9v+&tx;jh2K zyLaKt44j^Z=gz@I0zP~Q@85?%`~YWX;gu`!!UfpY2IuGD&71JjCAfMueEMm4?;gB$ z3tqbh*RF-Ft?mJ)33%oVOeW#C-@=O*VMPVpxDmFr zzzrK%|{|is8fAOhS`Cp!Su}!}I z+4V1N+_b*c{LFJtZ^9J6kZ5%DmT4j3LWvmlWIL8j;-Ir5je$bBJXr>|;`u_UqARIi zj(6ZRV(0GHERLGN44pS59nd=r&Otnvad=3Pw2b-d0Ex*wPDnBRnAKVd$mjmfATYxx z9#05RE?uT*XRc}imBnJSIbxmB=Bf?^KpvaV5s8&Lld;McTycz3aNpJAJ)b;Fm)ja? z?JWvFHNQA=qGj?)&>PRl+wPVrZ@wzACtK9&*<2b=x9(E9KRvR)7sGRw(wthPp%IAj zIO60o=)5jP%+!QD4J0OmM@VCoWLY*7CJ)nzJ=IBl7O$sL!laRy;JAJ{V6mvwaf0w; zdW*vW_CU55i`2$ zV-jZ*5Qt8)!i;xV@qM^he3ru^n8qEr>>G)=K-HnYsRv4>N~KoEosJ(I77J)B)(dYYVnA|N3^xW#PkY3RSSJICS9rJ(82i7ikqV)h}dqKh0!Mpn{PjGu& z>E_=4bdO?J$I=D8x2PZ#oJ`6^8ZL*;>OwRc-q9~8;17_QbRLnP%}B(eT@(^yR4B~i z%Zg-2*_1=bEG-0TmGVOlg)t#jDC9s>T&z}#Da2>;ne(`A_J($A3NI}+mza!NgMJ5I zQEsvuZCb0rqW`h%eY?A9etNT#$}Vs`c#Gh+l6%C}jSqV^->vO_JhSbbt|lJg=}NV2_~5^g}ftW_&z;;u)=y_twcy{mxz z2HJgl@s-iHR5B4Oe4I|F0kgR@s!{SEk;cXGG~HTIkr_0Q(i3yk^b8+n>_Z z!p$@3UYt@_gO8=g&--J_{?0}`kF=C$a*?M|StJpxL7tV7VwFrRD&XfKQAMdvGaxQN zZPo9~l$)amWrD*jDrFz;v%jrV%S8P5!{G*yNZ3tgjet!JlgT6!@P2J{m#7$I=5+=G z*n)E|ZCog%&(DME>OkD%$D%PILGXBBRb2b>R3vAXlFOA|3{HW7ysJ=;VZB5$_mw7m z?3QR4A0DFcg-KWPz>@(iKC-cmT;I;^#*T#Q15?xId|S};```I?Vv%Ygzj_%``RwJ} zi&aGuE<)8B-6pfH7^u+%RJ&|OotVRB zqX_}Dm#=6kSFce($m6NB8Zd&vB$59G=B!SG9+MLEJKuvk|2<1mVGa$nZ}OV|>bRYQ zP5R`%m6_B`dOtUi?j#6r;-de?=~soyjcPU4Dd);75az;k2wNJnc)UHakb5Pt$0;E3Tpgr{m<86FVKdVr7 zqYsf*YvbFi687>6B&w?nX#+v8+f-s+na%jE!*Q4Q_0p&=i`N*O{z|ROXe!l3G;4vw zVHmdt646MpTCD<>OPBOmiSk;}EYN?`VWt)c#1e_DucL|-BT+d8qVGTx7UIX`Jmwzz zP=r%s&X0{ee*zn8-?D|XmNtrS*iRxe^6ZtqIQd5S|t)7r?$fa`3jYL_y_e^fyq3!lm zG_vH)vv|NQgtpcp3Cd{cvU;?ukff=@;^_9o11qu_O~>x;P{0+;;)OAKBB?i2#$C3m zTA)zGVyyTs4=UD}0MZN6vqe^${qkiXyoye}oT`bGmi!Z3=ke$aGE1b=M5CpEHqT&^ zDSScEy&?DhgPZ=egTgOsLuwj zm@hWGqqE@;2Hav#)57ImgFKI$JGu?dI;1I#@f^u+RMhIhj8qYm9dJ0Um7&3fzahCI zgjoz$Pe{885QI<|V<(;O!~@lU_r=FCFIM@v>l;94(613Jt!?gG!2FIx4wH(__Jq;s z1r6VascexfVlKD8L^}NCnf6mufxAC_uRCbSslOi`?U~G_>6j-+VyX7ixlD;^kN2lm UrP8N~Gg@CdVvJ8T{tPsSoXz{WTA&Gn`g=y0mE?#7qIFSL! zE)mhm7EnhfV`P<~8vg(PfAshnpq?rwZ=h3=d#SuGX`l` zyKdu;-~UgazY5ediz{h?Kn7NFDo1=9Q*e%wI)j>;+PU+W{`>{m0~7*U_syD@qgp# z|7A!2XYKzVzw>|a=KuV5Q7C?3h*%Ev1CRuv@I?$^^TB8iL&!8Rn!=Cf2L|5`pdT1) z(s3b>4aEC_hldB<4~)&Ac-Z~*VbA-sMXwLVz1$V~Vu#bybvlohirt^haA%Ud6F(?b z0nLW`p}=G3P6mdqD29#*bkrUWG!EnkNRoo+VMuoZ`a#kUCxY4lK@JWM`27F`KxF^` d009600{~lb39RHA!}S0F002ovPDHLkV1hqt@EQOB diff --git a/main/NOVA_0.4.4/templates/static/images/icon-history-unzip.gif b/main/NOVA_0.4.4/templates/static/images/icon-history-unzip.gif deleted file mode 100644 index 36dfbfbd4c025a3c405241c0ec8f423dbc0b8bd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmZ?wbhEHb6krfw*v!x1arpNC{~!LJpMQQn!~g&D84L^<=AZu$;sc2UhJ^Y5&l~&) z0tP5h{K>+|z`)O-1LA|sU|>o7aPsGzy{+3~ry4qNr1(2?coweZnv`3x$B^&Q6dqxj z^i4W^vv{{Z{#keM*4jW7l|F}uMbBH@rmD)l`Yx@~zD&3L!PIGC8Q$G4g%u7;W=or< Xoxk1o`_5Z~52984Ts3vgf(+IGT`f&b diff --git a/main/NOVA_0.4.4/templates/static/images/icon-newzbin.png b/main/NOVA_0.4.4/templates/static/images/icon-newzbin.png deleted file mode 100644 index 0ed988fc533b9f019fb806a319c32f921e514229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1061 zcmdUt>rYb$7{<>8i8#n0(;?f388f%&Ha~1xbWx{O*d&=90|!dcQbwUN7=smrGUg?& z+6t?~RD`AkL<&+UbhJ>5wUn+`s`h#+y>M#_g?3yDt@d)xS+o5Wdz1I~1T=A6~)9$ zxGFq=Dyk^N@6IU4mEg1RxT3mB75)eSY>CbM`b;_uBaLEvqbWRM^pv!Vu`NP|4W=5P zDwaII$M6eR$FM`BA#L?Tby=t6mOfO!+U_AK1A=Kk zw)Ju4Ab8=ffUF6aTL$%v^Tceo1F<+f9m<)xwIHESM^&vB_GsBg@95+U#mq)=hopwB zCh<%SJh0Ci6wC&ROn#FoECJ{7?c&0AiNfl>K58yxj^C6nmUl_R5F(rjsBP{C@|pD@ zGGg1LnM0#<;b)GQl^k7JkNUFE)@@h`LokNMxgv4Polw;fc(F^-Kjqgu16B9OWma#| zz>DXLFH2Y&`k0>j*iM^5uymft8TpB&sAnr0cqR$x_|xPibgM8-=@__7<4@k;{B=+3 zqnJY*fnXVb?(&33I<<6u*i|dA7e7$;DyOgW4L3Qe#!-DfOAo=w6L9fW80xWxY~DZt z>shDTh3hk62d6Iy>?1CiJZ5V#`xWyW_bp)@bG$*hDRe-{zvHZ>z7;J^KQRlP{h#x{ zAh4CblNs!eVVjF7_%H9{zlU+t7Y-oxt}^);@?qz?(WYy52jcNqP9+Sj_}YI z*Q_G2nwp6jFO36t_&ajGg!a~av}ga5Hg@XW=lLR1d&2iOT9=khJ4Nz@JC>^>uTDE} zT@d9}NMiSq_kXzi*ua&8_5KrK)85pC>5q^9dT&pQA<})EyzAue@wf9-?|zbUiZYC{ ziSw@R6A-GK-#ctP#-hZ3tjI2a@9J^Tadz=W8ci>Xzg+y%TA2fWTDPA|#c*F>WO N8R_UW&WVC+{{RY_!+Zb$ diff --git a/main/NOVA_0.4.4/templates/static/images/icon-queue-1downarrow.png b/main/NOVA_0.4.4/templates/static/images/icon-queue-1downarrow.png deleted file mode 100644 index a4f8e50f06aef4dfe51f4bb32b78c1a0d3118dfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmV+@1K0eCP)rUz&k| z5vb_zKMjWeOxs!5IVAqGurmB(X1n!onTkF@0D%oqlH#@KDz#$x!OX<4{rF3%`HOB& zU|?l*VPIkV4A%YkA2;*gf78`;q!j-13Nw88!pQLY^#?tWUVs1sd*RiKulKo`m>5DW zWEj#?3>geeWXu>o|F2}=6a?xA8u0Z`j*+T>gNczW0|OTi!!HJAhQEIqUxM@k1Q6JO zcW-|br8OUCxb^%i0~agMplAaIelgx$hM#|o82Vkh3|jo zW_bFRf#K7;PYnP6{aePs#JmKg6(E2h2Cy(QFbHxsuHOCZ%KE)e8Ki+Bs;Dl*ATBRz z#wQ|R|6fpo;lXPLhR+|rG5q=d;~oPuOFhsDV66ZF1To;>U!Y(AzxvP4Qr*4q?w?mL zzA?xOF)}FXDKkiGC^9^K&&crZ!yks9pMhb@%-jgnaR(AL3=9AP1Tlb(8;F6{vaxM? z`|0n2vn=@qgy# zgC7~befk1YF%M|+c5F!*Ab=P_nTav_F1j$tC7i%SzK@ZWo%25vqdidQBf94QbA%WG m0*H~)+z1dr6z4{O00RJC?d9TwiNbpT0000WdP)GHU<_>Mg~3!1_nM!1O@_t0K)EtAAih*g*h|3 zO05_IqAeMC#Q0Mfe*Jb~0EHJa1_FQp!ZhIDe>R5izo$1Anu#!p3o~5$!porJX2s3O zz&IHw#|zf@?=J)c0YCsj4fqeie}HcP{Ikv9UCGEhK$l_TH3o(UFBlk@B~=;NeF zJq89Y-ed+QmIwxRZUzQ+Ua%H`0D>662n@Kt|Am-;|Lv&Avt<9kC(N+-#y^IG8;&vD zJ$izHhv^@~KNfBVCMivzLdGVb^W_-+{{w3U2q1_7e}T?_|Gh5ATg^bjQiEadO$LVZ zNAEDaeDLD@ua6&(D>FP|5CK}qA}G$lE-a-AbZG+v6GSUO071ylKfDx_1apF8Eg4Qc zV`8{+{UgJ*V^_a3u(D=-{==4hz{-4rf%*USXRm+ty}tj1L0taD zwdG~wV_;!sX5i%Gk_PDo2p~pKW@0s)eTJElRr?P!JHuZlmX8c9tdT%J?gz)Yuo43} zz?j%{8QHkDva)lCGO%(o{9$3g|92|87C-V+> diff --git a/main/NOVA_0.4.4/templates/static/images/icon-queue-2downarrow.png b/main/NOVA_0.4.4/templates/static/images/icon-queue-2downarrow.png deleted file mode 100644 index 67913cec9698ae85c7ee244ed47f035b0b1910e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1063 zcmV+?1laqDP))u00ssI101;Ef(o6soB#<8000FC008{~00094RsseD zlK%n&5ex_c0r>j>;QEgMCIX0s0SMSx*mw)VeFS?W>tjUi=pUN_8;& zXJBAtWXO~fVeb3-kA;Jehk=2IlY!yxQwBbeUVs2%0ue7i{0%If^!U=bGoKi2)Y%!_ zoTQi}WO&*c{{3%aVP>e%Q(&FK&CSZe2Xqi88w10=rwn&~{$dCQ=>-TNMvxa6y-om~ z$*#gBz_+q8THHupg@2r25SWfAcz6~egloa4D{R?28PGyKQVA{Mb6pFwBX7E1_mi$ zP`!Tnf6ad;h9HJFk6tmnxdXK9A;i@{01!anSOA7I0|N^O1H;GH3=F?M0lmZZlR@4j zea%^h2f#q&VBlnIVt8}!JHyB4K)mSK4Ig03K^ zI9Pru>#C_eW)NiHXZ^$Q?9Lm8cW-|*GqAAMgY*If5F`+pf&S!T>pimn#pf@7&Q7c- zG30Qv6J>bxiCy9Q4+e%ifA|>q*?uv+dhq7=$9KQVfGKJMGz=L40tga~(1-v^%(`&? zV`4+wmAAS=pBX%D`50LF_!zhue=xkf_v*{X_rJ1$>LxHC0e}EvVn7G1Oe=2O{1MjB zbMKL<*k=Z3^&bo`ZoYi|_0#VdU~-&;t{fnMSQxMY4#s^?UjGeloBLuZJ10B)uRs6e hf!;ibO({Tt0RXSeLpuOuej diff --git a/main/NOVA_0.4.4/templates/static/images/icon-queue-2uparrow.png b/main/NOVA_0.4.4/templates/static/images/icon-queue-2uparrow.png deleted file mode 100644 index 57fe9d471fb8d4997591174bd1c6ef8512d8cf8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1037 zcmV+o1oHcdP)F8u>s{+ z85lUY7#P?&8UF8ZVgLvrCI)Qa+aEJA0oDzb)sFg>p>FCdY+P#@{`_&qrW7E6Fb(+q z*IQAEZ$o2`yV?y#MTY&)q!^@J-Q>80g;z2B`x}X_93X%Y2K)!&KmTJiwFQ^8_IXI& zW0YlBzx^%4w->J&zHx~$NZ2?C@raAfWBB(k4cP#I0D>6s52*Y5?+hbziTUll9(+$( z#2I$(dd~3q%&zBLxAs0#`tzLO2fHAHq_qu)fQ-aUU|5wh{QnQu3J^eG1DOB)%MS`s zn?850H_LBcL52f6A2Hn7weQitAK$z`e*NwG=;X26!k?cqd}iQgkhQaB5Lc7$V*3BT z2Ba4tfEYosAnvyGe@&?+0|O@)!@(187`CoCf9=PQU*Qa#+*g3n!ocwNj|z_f=hA;t zT4rn_A`GHje;J-!y~Xfttra6c0D%o)GoM|}!NBbL^DpDSKmY$f`p3*v&%ns`kb#*4 z7;QiUSbz@w_g9jEg|(i6g-wl_g@x%q6Z4V3TWo6p0tjpXqtQ$ThR?ql8JK|zxj6qb zu(AUKl!XPTF@u?nh2t+f*JK99e?P$i&G3&A>?$^n|NpnyF#rS*3nT`B35SgZs1ax* zJ1;0502Tf1_w`W9dH0u<;pmaax(uA0sSNDwzkuHP4|EOCoPS`g009Jv1y()=1|EI} z25x>(3Iryx|BGV7)pIO7j2PaF>oW*zD#tPY`?~@t&JVVL1E`LJ53Cg+fS?9&0;2+$ zMF0F@XZrVVO>UZYjHRa`!`!1x4A&k49jBnlAf=-g$i&F75$FOzaJaB>g0%t!5X1mb zoc{PD$V!3@snyqGX!Y`2q3TlqCy<&Cp4Oyx%w(H9J~3AVb7*Z49{*pX<^`CEBXDGsrJIv z*X2K--1+c`I)Pro)Y zFf;eT-1v`ysq4|x&+nMu-|zhRl#7d(o0<7P6Duo78X&*`0qs1I;1~-^00000NkvXX Hu0mjfF@@)N diff --git a/main/NOVA_0.4.4/templates/static/images/icon-queue-drop.png b/main/NOVA_0.4.4/templates/static/images/icon-queue-drop.png deleted file mode 100644 index 2997461b2191b95d954b41f766752d3249c810ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmV-^1cCdBP))u00bMdO00RB}K{Dv*srmW&2A}`{b@l!In*{#;03!nf05}B&00;d100H{?6d?%- zyA%rxDwF2sr{VqmVBr7&00IC(0KWeNEf^RBIxKZ(&pwO*#H2t0suh(zW)PY0|U%qDJc;W zhK2wHJv{&>-`@iP;NV8n|NrO;0s_t*0Rape|Np->G&C?EYH9%gI5+?x6chm{<>fBD z=jR6k06_r0{{;2<`3MIA0RZ{j+yM9w4*(8YS^!x1_y+yR$dtzd0u>Yi0a7t1CommV zRRI40008&V(Etee_y7e31pxv7|1<)K`7s~gtFKR)bh@pZ~vp z?W*(mF$*KmfIq-MV+Cs9`T3JkR9TsUgO?Yqnd9kGhFiyuF%(_8^y1Lpzi~hZ?FI-S zW&uu4hA)5ro;}0B@Pg&jCpYC6FIfKl`o+NX^CtrrH#Y+d(6B!*UNHQA{hHz0ty>J` zH*UN*`uA@XQ1f0OW&j8vW^HkC20>s{@h~%=d&SB5TkzK}7qO>L8Gn8J$nfX=dxl>? zjXyqrX7~m)u>Ib>cSnBz4iIEuILrgo3#tYPZABX`0h*=L9U_bx==aKsH zz`#>QYFCB-7i%Bqn~jZGkDHtMFECZI0L7Vs zt}#_mV3GLu&u!n^w+{gVh)L%2XKihu=D$FV|A3eu7@&`Vn!CS!d$IG~JHLgmUuT~G z`SX_uP$Ls4!2x511(;sU<>c4|nVFLS0*LuF7ncG*C#QinFwR+lwwwlPuK)i1#rcmP zqu3Z353w^aoWK6%%S$m97B?LsAr?Vkn)n2aou;#Af9(AFbt*srF~|Z#S4UiY(JC>q zf1AX`|LgJdKLpF diff --git a/main/NOVA_0.4.4/templates/static/images/icon-queue-order.png b/main/NOVA_0.4.4/templates/static/images/icon-queue-order.png deleted file mode 100644 index ed18d2a5097453454c8c48d6b76fe232d320556b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^96-#?!2~4F{){dHQfwtbe!&bk82&Lhx38)F2^3K* zag8Vm&QB{TPb^Aha4$+M$jD4~&d)1LEhEaktF(+xq z$MZ8+KeiEIlswVFsJHRgqxup~1*Wc~=?7eRoKN!sRWkhl&&;r{d2@Dh;PIUxzNf37 J%Q~loCIEUeHM{@- diff --git a/main/NOVA_0.4.4/templates/static/javascripts/lytebox/images/close_grey.png b/main/NOVA_0.4.4/templates/static/javascripts/lytebox/images/close_grey.png deleted file mode 100644 index bc83ac55ef79ac1f8e27c8cdd8b2fba16cf2de8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1715 zcmV;k22A;hP)WdJZTFEKVRFgFh^6@~x+ z1_((+K~z|U<(O?qQ*R%~KU=2L6U@{xGX!P1#D|%h6>Ih!LJ7lG1UL-0{$dMMn-<0k1P{ZRaHgG%E}@=Jv~eEJv}{})zaI~N3a_wF4Ihl4k7-YCUy-@cvP+*|-|-n_~9_&66XT=;G=LqkJ6dGZ8F zl9X6cQ4tjt6=*aX07OxwySqCkPenxqSy@^1_4U!$*SF-_OXYRBTpT}s9F0bUUav=` zQUNeEHAN^C;?SW(+`D%VK@dnwO9NnjejcCCha^d~wY3ok;C8!dZ*NDV(NJ1iibkX1 z_3PKn%*-gsW@l$(8vAd!-EQvOxx<<@YdCP=0Evl-3=9nL;>8QTeEGtWBS!$Zefu_E zuNSk~tjvqLWNvN_Ns=fjDIqyI`MbHI$j{HmZntBz*$4yz=yWFMdH)oL;`Gh@bu!(k>SCI|+D*zI=8%gX^!4-XF$2m~lDE>@af3bHJJSAb8S zJ~25tNp5bg(o7U3B_&9b#L&UkcDorK9tMaRA9cX|{QNI9A4Pe2Id;39Kp?>M z^fW71u3U6YPEIar9zZ=lK8_?w6ciNvFv*V`;P?BHBnhonyNF9pPDYX>g25mFhYue{ ztyXjS@?|bvx}@v{u;2i@-A;XdJ@xhVJbLu#mqf5wELg2prl+TgkB?t;1p)!ARx1{Z zC1ze+I2=ZnWqx)T%+1Xq%kq+3BoaZEWy0a`Pr3E$*VEF{LPtjj{r&yCdi9FBx;iWt z3(;CE7K^fJ<>ci2k^uev{d9G8q0{MzkB?u(>-BoNy1FPWEsYUDy?XU(L{VgHZ0v^# zWLZWO#U;7S%uGa4WOQ_N5jQqAhA4`xUAtC^B_$e`{D6+D$$jQlJVqyY7 zalr5F0fU2s*laekva%>FEF>{85w%*)=;$bYeSLU59@J_zNl8f*6%~=5o{r6CV{mW~ zfH*-AIC$_N?d|QHI(3S@d-oCy2I=YPK@bFP+_(WOIH0|~J*I%d!a__Y6UUAnqp7J0 zo6W|aJ$nFn{`@%~KYrx&>C*^;0Km0t*YNp#m`o;oJ|9k}lPz1e01FOy`t+%?X+}{~ zQ?sb~w{PEa=FAy%Ivqx%Q90^dE*F!NlhoGMa_iPDJRT3l#l--aOeUO8Cuh%|U3d?u zsi`3?EsX~c9?;g-27uXYrna_LNfvcLl#k-*(W975CQK$1EiElvxpIZOckcpVFc>(0 z{ybZ^ZdJx>G#Wm9_<+;tL=Xga?AXD{lP7@%2RwfKcu})U31BoDDJUqw<#O@$>sMB- zTE)o72tJ>W*49=wZ{AFCaWRdJjd(mB^7Hcv1OoW|eoQ74Mx*hcc@_S*QD0w=%jF^^ zC56wQKhxUU%BD@56yD)*(Ad~WYHBJ|Q&Z&U=X3q~^>5@q_<{DXqM@N7Vm6y24u@k& z-r;aW%w}_>p`jrrzAPLN#pviL>(;INEq+-E@K>-b{s;UW{0A(en&Fl&+g|_x002ov JPDHLkV1k5(A1eR= diff --git a/main/NOVA_0.4.4/templates/static/javascripts/lytebox/images/loading.gif b/main/NOVA_0.4.4/templates/static/javascripts/lytebox/images/loading.gif deleted file mode 100644 index f864d5fd38b7466c76b5a36dc0e3e9455c0126e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2767 zcmeH``%_bA0*1eHPVNawNVtR;Fkp-nQj8edfS`v<5L7TgR6wi;WfgH-0}4fE+c_uU zB6tf6auF}FAcDdgg|bMU&H)LR5jARM!8$tuwd$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9 z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I= zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8 zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_} zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$ zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+` z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80 diff --git a/main/NOVA_0.4.4/templates/static/javascripts/lytebox/lytebox.css b/main/NOVA_0.4.4/templates/static/javascripts/lytebox/lytebox.css deleted file mode 100644 index f437739..0000000 --- a/main/NOVA_0.4.4/templates/static/javascripts/lytebox/lytebox.css +++ /dev/null @@ -1,93 +0,0 @@ -#lbOverlay { position: absolute; top: 0; left: 0; z-index: 99998; width: 100%; height: 500px; } - #lbOverlay.grey { background-color: #000000; } - #lbOverlay.red { background-color: #330000; } - #lbOverlay.green { background-color: #003300; } - #lbOverlay.blue { background-color: #011D50; } - #lbOverlay.gold { background-color: #666600; } - -#lbMain { position: absolute; left: 0; width: 100%; z-index: 99999; text-align: center; line-height: 0; } -#lbMain a img { border: none; } - -#lbOuterContainer { position: relative; background-color: #fff; width: 200px; height: 200px; margin: 0 auto; } - #lbOuterContainer.grey { border: 3px solid #888888; } - #lbOuterContainer.red { border: 3px solid #DD0000; } - #lbOuterContainer.green { border: 3px solid #00B000; } - #lbOuterContainer.blue { border: 3px solid #5F89D8; } - #lbOuterContainer.gold { border: 3px solid #B0B000; } - -#lbDetailsContainer { font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; width: 100%; line-height: 1.4em; overflow: auto; margin: 0 auto; } - #lbDetailsContainer.grey { border: 3px solid #888888; border-top: none; } - #lbDetailsContainer.red { border: 3px solid #DD0000; border-top: none; } - #lbDetailsContainer.green { border: 3px solid #00B000; border-top: none; } - #lbDetailsContainer.blue { border: 3px solid #5F89D8; border-top: none; } - #lbDetailsContainer.gold { border: 3px solid #B0B000; border-top: none; } - -#lbImageContainer, #lbIframeContainer { padding: 10px; } -#lbLoading { - position: absolute; top: 45%; left: 0%; height: 32px; width: 100%; text-align: center; line-height: 0; background: url(images/loading.gif) center no-repeat; -} - -#lbHoverNav { position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; } -#lbImageContainer>#lbHoverNav { left: 0; } -#lbHoverNav a { outline: none; } - -#lbPrev { width: 49%; height: 100%; background: transparent url(images/blank.gif) no-repeat; display: block; left: 0; float: left; } - #lbPrev.grey:hover, #lbPrev.grey:visited:hover { background: url(images/prev_grey.gif) left 15% no-repeat; } - #lbPrev.red:hover, #lbPrev.red:visited:hover { background: url(images/prev_red.gif) left 15% no-repeat; } - #lbPrev.green:hover, #lbPrev.green:visited:hover { background: url(images/prev_green.gif) left 15% no-repeat; } - #lbPrev.blue:hover, #lbPrev.blue:visited:hover { background: url(images/prev_blue.gif) left 15% no-repeat; } - #lbPrev.gold:hover, #lbPrev.gold:visited:hover { background: url(images/prev_gold.gif) left 15% no-repeat; } - -#lbNext { width: 49%; height: 100%; background: transparent url(images/blank.gif) no-repeat; display: block; right: 0; float: right; } - #lbNext.grey:hover, #lbNext.grey:visited:hover { background: url(images/next_grey.gif) right 15% no-repeat; } - #lbNext.red:hover, #lbNext.red:visited:hover { background: url(images/next_red.gif) right 15% no-repeat; } - #lbNext.green:hover, #lbNext.green:visited:hover { background: url(images/next_green.gif) right 15% no-repeat; } - #lbNext.blue:hover, #lbNext.blue:visited:hover { background: url(images/next_blue.gif) right 15% no-repeat; } - #lbNext.gold:hover, #lbNext.gold:visited:hover { background: url(images/next_gold.gif) right 15% no-repeat; } - -#lbPrev2, #lbNext2 { text-decoration: none; font-weight: bold; } - #lbPrev2.grey, #lbNext2.grey, #lbSpacer.grey { color: #333333; } - #lbPrev2.red, #lbNext2.red, #lbSpacer.red { color: #620000; } - #lbPrev2.green, #lbNext2.green, #lbSpacer.green { color: #003300; } - #lbPrev2.blue, #lbNext2.blue, #lbSpacer.blue { color: #01379E; } - #lbPrev2.gold, #lbNext2.gold, #lbSpacer.gold { color: #666600; } - -#lbPrev2_Off, #lbNext2_Off { font-weight: bold; } - #lbPrev2_Off.grey, #lbNext2_Off.grey { color: #CCCCCC; } - #lbPrev2_Off.red, #lbNext2_Off.red { color: #FFCCCC; } - #lbPrev2_Off.green, #lbNext2_Off.green { color: #82FF82; } - #lbPrev2_Off.blue, #lbNext2_Off.blue { color: #B7CAEE; } - #lbPrev2_Off.gold, #lbNext2_Off.gold { color: #E1E100; } - -#lbDetailsData { padding: 0 10px; } - #lbDetailsData.grey { color: #333333; } - #lbDetailsData.red { color: #620000; } - #lbDetailsData.green { color: #003300; } - #lbDetailsData.blue { color: #01379E; } - #lbDetailsData.gold { color: #666600; } - -#lbDetails { width: 60%; float: left; text-align: left; } -#lbCaption { display: block; font-weight: bold; } -#lbNumberDisplay { float: left; display: block; padding-bottom: 1.0em; } -#lbNavDisplay { float: left; display: block; padding-bottom: 1.0em; } - -#lbClose { width: 64px; height: 28px; float: right; margin-bottom: 1px; } - #lbClose.grey { background: url(images/close_grey.png) no-repeat; } - #lbClose.red { background: url(images/close_red.png) no-repeat; } - #lbClose.green { background: url(images/close_green.png) no-repeat; } - #lbClose.blue { background: url(images/close_blue.png) no-repeat; } - #lbClose.gold { background: url(images/close_gold.png) no-repeat; } - -#lbPlay { width: 64px; height: 28px; float: right; margin-bottom: 1px; } - #lbPlay.grey { background: url(images/play_grey.png) no-repeat; } - #lbPlay.red { background: url(images/play_red.png) no-repeat; } - #lbPlay.green { background: url(images/play_green.png) no-repeat; } - #lbPlay.blue { background: url(images/play_blue.png) no-repeat; } - #lbPlay.gold { background: url(images/play_gold.png) no-repeat; } - -#lbPause { width: 64px; height: 28px; float: right; margin-bottom: 1px; } - #lbPause.grey { background: url(images/pause_grey.png) no-repeat; } - #lbPause.red { background: url(images/pause_red.png) no-repeat; } - #lbPause.green { background: url(images/pause_green.png) no-repeat; } - #lbPause.blue { background: url(images/pause_blue.png) no-repeat; } - #lbPause.gold { background: url(images/pause_gold.png) no-repeat; } \ No newline at end of file diff --git a/main/NOVA_0.4.4/templates/static/javascripts/lytebox/lytebox.js b/main/NOVA_0.4.4/templates/static/javascripts/lytebox/lytebox.js deleted file mode 100644 index 6f27c1a..0000000 --- a/main/NOVA_0.4.4/templates/static/javascripts/lytebox/lytebox.js +++ /dev/null @@ -1,831 +0,0 @@ -//***********************************************************************************************************************************/ -// LyteBox v3.20 -// -// Author: Markus F. Hay -// Website: http://www.dolem.com/lytebox -// Date: July 12, 2007 -// License: Creative Commons Attribution 3.0 License (http://creativecommons.org/licenses/by/3.0/) -// Browsers: Tested successfully on WinXP with the following browsers (using no DOCTYPE, Strict DOCTYPE, and Transitional DOCTYPE): -// * Firefox: 2.0.0.4, 1.5.0.12 -// * Internet Explorer: 7.0, 6.0 SP2, 5.5 SP2 -// * Opera: 9.21 -// -// Releases: For up-to-date and complete release information, visit http://www.dolem.com/forum/showthread.php?tid=62 -// * v3.20 (07/11/07) -// * v3.10 (05/28/07) -// * v3.00 (05/15/07) -// * v2.02 (11/13/06) -// -// Credit: LyteBox was originally derived from the Lightbox class (v2.02) that was written by Lokesh Dhakar. For more -// information please visit http://huddletogether.com/projects/lightbox2/ -//***********************************************************************************************************************************/ -Array.prototype.removeDuplicates = function () { for (var i = 1; i < this.length; i++) { if (this[i][0] == this[i-1][0]) { this.splice(i,1); } } } -Array.prototype.empty = function () { for (var i = 0; i <= this.length; i++) { this.shift(); } } -String.prototype.trim = function () { return this.replace(/^\s+|\s+$/g, ''); } - -function LyteBox() { - /*** Start Global Configuration ***/ - this.theme = 'grey'; // themes: grey (default), red, green, blue, gold - this.hideFlash = true; // controls whether or not Flash objects should be hidden - this.outerBorder = false; // controls whether to show the outer grey (or theme) border - this.resizeSpeed = 8; // controls the speed of the image resizing (1=slowest and 10=fastest) - this.maxOpacity = 80; // higher opacity = darker overlay, lower opacity = lighter overlay - this.navType = 1; // 1 = "Prev/Next" buttons on top left and left (default), 2 = "<< prev | next >>" links next to image number - this.autoResize = true; // controls whether or not images should be resized if larger than the browser window dimensions - this.doAnimations = false; // controls whether or not "animate" Lytebox, i.e. resize transition between images, fade in/out effects, etc. - - this.borderSize = 12; // if you adjust the padding in the CSS, you will need to update this variable -- otherwise, leave this alone... - /*** End Global Configuration ***/ - - /*** Configure Slideshow Options ***/ - this.slideInterval = 4000; // Change value (milliseconds) to increase/decrease the time between "slides" (10000 = 10 seconds) - this.showNavigation = true; // true to display Next/Prev buttons/text during slideshow, false to hide - this.showClose = true; // true to display the Close button, false to hide - this.showDetails = true; // true to display image details (caption, count), false to hide - this.showPlayPause = true; // true to display pause/play buttons next to close button, false to hide - this.autoEnd = true; // true to automatically close Lytebox after the last image is reached, false to keep open - this.pauseOnNextClick = false; // true to pause the slideshow when the "Next" button is clicked - this.pauseOnPrevClick = true; // true to pause the slideshow when the "Prev" button is clicked - /*** End Slideshow Configuration ***/ - - if(this.resizeSpeed > 10) { this.resizeSpeed = 10; } - if(this.resizeSpeed < 1) { resizeSpeed = 1; } - this.resizeDuration = (11 - this.resizeSpeed) * 0.15; - this.resizeWTimerArray = new Array(); - this.resizeWTimerCount = 0; - this.resizeHTimerArray = new Array(); - this.resizeHTimerCount = 0; - this.showContentTimerArray = new Array(); - this.showContentTimerCount = 0; - this.overlayTimerArray = new Array(); - this.overlayTimerCount = 0; - this.imageTimerArray = new Array(); - this.imageTimerCount = 0; - this.timerIDArray = new Array(); - this.timerIDCount = 0; - this.slideshowIDArray = new Array(); - this.slideshowIDCount = 0; - this.imageArray = new Array(); - this.activeImage = null; - this.slideArray = new Array(); - this.activeSlide = null; - this.frameArray = new Array(); - this.activeFrame = null; - this.checkFrame(); - this.isSlideshow = false; - this.isLyteframe = false; - /*@cc_on - /*@if (@_jscript) - this.ie = (document.all && !window.opera) ? true : false; - /*@else @*/ - this.ie = false; - /*@end - @*/ - this.ie7 = (this.ie && window.XMLHttpRequest); - this.initialize(); -} -LyteBox.prototype.initialize = function() { - this.updateLyteboxItems(); - var objBody = this.doc.getElementsByTagName("body").item(0); - if (this.doc.getElementById('lbOverlay')) { - objBody.removeChild(this.doc.getElementById("lbOverlay")); - objBody.removeChild(this.doc.getElementById("lbMain")); - } - var objOverlay = this.doc.createElement("div"); - objOverlay.setAttribute('id','lbOverlay'); - objOverlay.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objOverlay.style.display = 'none'; - objBody.appendChild(objOverlay); - var objLytebox = this.doc.createElement("div"); - objLytebox.setAttribute('id','lbMain'); - objLytebox.style.display = 'none'; - objBody.appendChild(objLytebox); - var objOuterContainer = this.doc.createElement("div"); - objOuterContainer.setAttribute('id','lbOuterContainer'); - objOuterContainer.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objLytebox.appendChild(objOuterContainer); - var objIframeContainer = this.doc.createElement("div"); - objIframeContainer.setAttribute('id','lbIframeContainer'); - objIframeContainer.style.display = 'none'; - objOuterContainer.appendChild(objIframeContainer); - var objIframe = this.doc.createElement("iframe"); - objIframe.setAttribute('id','lbIframe'); - objIframe.setAttribute('name','lbIframe'); - objIframe.style.display = 'none'; - objIframeContainer.appendChild(objIframe); - var objImageContainer = this.doc.createElement("div"); - objImageContainer.setAttribute('id','lbImageContainer'); - objOuterContainer.appendChild(objImageContainer); - var objLyteboxImage = this.doc.createElement("img"); - objLyteboxImage.setAttribute('id','lbImage'); - objImageContainer.appendChild(objLyteboxImage); - var objLoading = this.doc.createElement("div"); - objLoading.setAttribute('id','lbLoading'); - objOuterContainer.appendChild(objLoading); - var objDetailsContainer = this.doc.createElement("div"); - objDetailsContainer.setAttribute('id','lbDetailsContainer'); - objDetailsContainer.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objLytebox.appendChild(objDetailsContainer); - var objDetailsData =this.doc.createElement("div"); - objDetailsData.setAttribute('id','lbDetailsData'); - objDetailsData.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objDetailsContainer.appendChild(objDetailsData); - var objDetails = this.doc.createElement("div"); - objDetails.setAttribute('id','lbDetails'); - objDetailsData.appendChild(objDetails); - var objCaption = this.doc.createElement("span"); - objCaption.setAttribute('id','lbCaption'); - objDetails.appendChild(objCaption); - var objHoverNav = this.doc.createElement("div"); - objHoverNav.setAttribute('id','lbHoverNav'); - objImageContainer.appendChild(objHoverNav); - var objBottomNav = this.doc.createElement("div"); - objBottomNav.setAttribute('id','lbBottomNav'); - objDetailsData.appendChild(objBottomNav); - var objPrev = this.doc.createElement("a"); - objPrev.setAttribute('id','lbPrev'); - objPrev.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objPrev.setAttribute('href','#'); - objHoverNav.appendChild(objPrev); - var objNext = this.doc.createElement("a"); - objNext.setAttribute('id','lbNext'); - objNext.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objNext.setAttribute('href','#'); - objHoverNav.appendChild(objNext); - var objNumberDisplay = this.doc.createElement("span"); - objNumberDisplay.setAttribute('id','lbNumberDisplay'); - objDetails.appendChild(objNumberDisplay); - var objNavDisplay = this.doc.createElement("span"); - objNavDisplay.setAttribute('id','lbNavDisplay'); - objNavDisplay.style.display = 'none'; - objDetails.appendChild(objNavDisplay); - var objClose = this.doc.createElement("a"); - objClose.setAttribute('id','lbClose'); - objClose.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objClose.setAttribute('href','#'); - objBottomNav.appendChild(objClose); - var objPause = this.doc.createElement("a"); - objPause.setAttribute('id','lbPause'); - objPause.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objPause.setAttribute('href','#'); - objPause.style.display = 'none'; - objBottomNav.appendChild(objPause); - var objPlay = this.doc.createElement("a"); - objPlay.setAttribute('id','lbPlay'); - objPlay.setAttribute((this.ie ? 'className' : 'class'), this.theme); - objPlay.setAttribute('href','#'); - objPlay.style.display = 'none'; - objBottomNav.appendChild(objPlay); -}; -LyteBox.prototype.updateLyteboxItems = function() { - var anchors = (this.isFrame) ? window.parent.frames[window.name].document.getElementsByTagName('a') : document.getElementsByTagName('a'); - for (var i = 0; i < anchors.length; i++) { - var anchor = anchors[i]; - var relAttribute = String(anchor.getAttribute('rel')); - if (anchor.getAttribute('href')) { - if (relAttribute.toLowerCase().match('lytebox')) { - anchor.onclick = function () { myLytebox.start(this, false, false); return false; } - } else if (relAttribute.toLowerCase().match('lyteshow')) { - anchor.onclick = function () { myLytebox.start(this, true, false); return false; } - } else if (relAttribute.toLowerCase().match('lyteframe')) { - anchor.onclick = function () { myLytebox.start(this, false, true); return false; } - } - } - } -}; -LyteBox.prototype.start = function(imageLink, doSlide, doFrame) { - if (this.ie && !this.ie7) { this.toggleSelects('hide'); } - if (this.hideFlash) { this.toggleFlash('hide'); } - this.isLyteframe = (doFrame ? true : false); - var pageSize = this.getPageSize(); - var objOverlay = this.doc.getElementById('lbOverlay'); - var objBody = this.doc.getElementsByTagName("body").item(0); - objOverlay.style.height = pageSize[1] + "px"; - objOverlay.style.display = ''; - this.appear('lbOverlay', (this.doAnimations ? 0 : this.maxOpacity)); - var anchors = (this.isFrame) ? window.parent.frames[window.name].document.getElementsByTagName('a') : document.getElementsByTagName('a'); - if (this.isLyteframe) { - this.frameArray = []; - this.frameNum = 0; - if ((imageLink.getAttribute('rel') == 'lyteframe')) { - var rev = imageLink.getAttribute('rev'); - this.frameArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title'), (rev == null || rev == '' ? 'width: 400px; height: 400px; scrolling: auto;' : rev))); - } else { - if (imageLink.getAttribute('rel').indexOf('lyteframe') != -1) { - for (var i = 0; i < anchors.length; i++) { - var anchor = anchors[i]; - if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { - var rev = anchor.getAttribute('rev'); - this.frameArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'), (rev == null || rev == '' ? 'width: 400px; height: 400px; scrolling: auto;' : rev))); - } - } - this.frameArray.removeDuplicates(); - while(this.frameArray[this.frameNum][0] != imageLink.getAttribute('href')) { this.frameNum++; } - } - } - } else { - this.imageArray = []; - this.imageNum = 0; - this.slideArray = []; - this.slideNum = 0; - if ((imageLink.getAttribute('rel') == 'lytebox')) { - this.imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title'))); - } else { - if (imageLink.getAttribute('rel').indexOf('lytebox') != -1) { - for (var i = 0; i < anchors.length; i++) { - var anchor = anchors[i]; - if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { - this.imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'))); - } - } - this.imageArray.removeDuplicates(); - while(this.imageArray[this.imageNum][0] != imageLink.getAttribute('href')) { this.imageNum++; } - } - if (imageLink.getAttribute('rel').indexOf('lyteshow') != -1) { - for (var i = 0; i < anchors.length; i++) { - var anchor = anchors[i]; - if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { - this.slideArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'))); - } - } - this.slideArray.removeDuplicates(); - while(this.slideArray[this.slideNum][0] != imageLink.getAttribute('href')) { this.slideNum++; } - } - } - } - var object = this.doc.getElementById('lbMain'); - object.style.top = (this.getPageScroll() + (pageSize[3] / 15)) + "px"; - object.style.display = ''; - if (!this.outerBorder) { - this.doc.getElementById('lbOuterContainer').style.border = 'none'; - this.doc.getElementById('lbDetailsContainer').style.border = 'none'; - } else { - this.doc.getElementById('lbOuterContainer').style.borderBottom = ''; - this.doc.getElementById('lbOuterContainer').setAttribute((this.ie ? 'className' : 'class'), this.theme); - } - this.doc.getElementById('lbOverlay').onclick = function() { myLytebox.end(); return false; } - this.doc.getElementById('lbMain').onclick = function(e) { - var e = e; - if (!e) { - if (window.parent.frames[window.name] && (parent.document.getElementsByTagName('frameset').length <= 0)) { - e = window.parent.window.event; - } else { - e = window.event; - } - } - var id = (e.target ? e.target.id : e.srcElement.id); - if (id == 'lbMain') { myLytebox.end(); return false; } - } - this.doc.getElementById('lbClose').onclick = function() { myLytebox.end(); return false; } - this.doc.getElementById('lbPause').onclick = function() { myLytebox.togglePlayPause("lbPause", "lbPlay"); return false; } - this.doc.getElementById('lbPlay').onclick = function() { myLytebox.togglePlayPause("lbPlay", "lbPause"); return false; } - this.isSlideshow = doSlide; - this.isPaused = (this.slideNum != 0 ? true : false); - if (this.isSlideshow && this.showPlayPause && this.isPaused) { - this.doc.getElementById('lbPlay').style.display = ''; - this.doc.getElementById('lbPause').style.display = 'none'; - } - if (this.isLyteframe) { - this.changeContent(this.frameNum); - } else { - if (this.isSlideshow) { - this.changeContent(this.slideNum); - } else { - this.changeContent(this.imageNum); - } - } -}; -LyteBox.prototype.changeContent = function(imageNum) { - if (this.isSlideshow) { - for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } - } - this.activeImage = this.activeSlide = this.activeFrame = imageNum; - if (!this.outerBorder) { - this.doc.getElementById('lbOuterContainer').style.border = 'none'; - this.doc.getElementById('lbDetailsContainer').style.border = 'none'; - } else { - this.doc.getElementById('lbOuterContainer').style.borderBottom = ''; - this.doc.getElementById('lbOuterContainer').setAttribute((this.ie ? 'className' : 'class'), this.theme); - } - this.doc.getElementById('lbLoading').style.display = ''; - this.doc.getElementById('lbImage').style.display = 'none'; - this.doc.getElementById('lbIframe').style.display = 'none'; - this.doc.getElementById('lbPrev').style.display = 'none'; - this.doc.getElementById('lbNext').style.display = 'none'; - this.doc.getElementById('lbIframeContainer').style.display = 'none'; - this.doc.getElementById('lbDetailsContainer').style.display = 'none'; - this.doc.getElementById('lbNumberDisplay').style.display = 'none'; - if (this.navType == 2 || this.isLyteframe) { - object = this.doc.getElementById('lbNavDisplay'); - object.innerHTML = '    || '; - object.style.display = 'none'; - } - if (this.isLyteframe) { - var iframe = myLytebox.doc.getElementById('lbIframe'); - var styles = this.frameArray[this.activeFrame][2]; - var aStyles = styles.split(';'); - for (var i = 0; i < aStyles.length; i++) { - if (aStyles[i].indexOf('width:') >= 0) { - var w = aStyles[i].replace('width:', ''); - iframe.width = w.trim(); - } else if (aStyles[i].indexOf('height:') >= 0) { - var h = aStyles[i].replace('height:', ''); - iframe.height = h.trim(); - } else if (aStyles[i].indexOf('scrolling:') >= 0) { - var s = aStyles[i].replace('scrolling:', ''); - iframe.scrolling = s.trim(); - } else if (aStyles[i].indexOf('border:') >= 0) { - // Not implemented yet, as there are cross-platform issues with setting the border (from a GUI standpoint) - //var b = aStyles[i].replace('border:', ''); - //iframe.style.border = b.trim(); - } - } - iframe.src = this.frameArray[this.activeFrame][0]; - this.resizeContainer(parseInt(iframe.width), parseInt(iframe.height)); - } else { - imgPreloader = new Image(); - imgPreloader.onload = function() { - var imageWidth = imgPreloader.width; - var imageHeight = imgPreloader.height; - if (myLytebox.autoResize) { - var pagesize = myLytebox.getPageSize(); - var x = pagesize[2] - 150; - var y = pagesize[3] - 150; - if (imageWidth > x) { - imageHeight = Math.round(imageHeight * (x / imageWidth)); - imageWidth = x; - if (imageHeight > y) { - imageWidth = Math.round(imageWidth * (y / imageHeight)); - imageHeight = y; - } - } else if (imageHeight > y) { - imageWidth = Math.round(imageWidth * (y / imageHeight)); - imageHeight = y; - if (imageWidth > x) { - imageHeight = Math.round(imageHeight * (x / imageWidth)); - imageWidth = x; - } - } - } - var lbImage = myLytebox.doc.getElementById('lbImage') - lbImage.src = (myLytebox.isSlideshow ? myLytebox.slideArray[myLytebox.activeSlide][0] : myLytebox.imageArray[myLytebox.activeImage][0]); - lbImage.width = imageWidth; - lbImage.height = imageHeight; - myLytebox.resizeContainer(imageWidth, imageHeight); - imgPreloader.onload = function() {}; - } - imgPreloader.src = (this.isSlideshow ? this.slideArray[this.activeSlide][0] : this.imageArray[this.activeImage][0]); - } -}; -LyteBox.prototype.resizeContainer = function(imgWidth, imgHeight) { - this.wCur = this.doc.getElementById('lbOuterContainer').offsetWidth; - this.hCur = this.doc.getElementById('lbOuterContainer').offsetHeight; - this.xScale = ((imgWidth + (this.borderSize * 2)) / this.wCur) * 100; - this.yScale = ((imgHeight + (this.borderSize * 2)) / this.hCur) * 100; - var wDiff = (this.wCur - this.borderSize * 2) - imgWidth; - var hDiff = (this.hCur - this.borderSize * 2) - imgHeight; - if (!(hDiff == 0)) { - this.hDone = false; - this.resizeH('lbOuterContainer', this.hCur, imgHeight + this.borderSize*2, this.getPixelRate(this.hCur, imgHeight)); - } else { - this.hDone = true; - } - if (!(wDiff == 0)) { - this.wDone = false; - this.resizeW('lbOuterContainer', this.wCur, imgWidth + this.borderSize*2, this.getPixelRate(this.wCur, imgWidth)); - } else { - this.wDone = true; - } - if ((hDiff == 0) && (wDiff == 0)) { - if (this.ie){ this.pause(250); } else { this.pause(100); } - } - this.doc.getElementById('lbPrev').style.height = imgHeight + "px"; - this.doc.getElementById('lbNext').style.height = imgHeight + "px"; - this.doc.getElementById('lbDetailsContainer').style.width = (imgWidth + (this.borderSize * 2) + (this.ie && this.doc.compatMode == "BackCompat" && this.outerBorder ? 2 : 0)) + "px"; - this.showContent(); -}; -LyteBox.prototype.showContent = function() { - if (this.wDone && this.hDone) { - for (var i = 0; i < this.showContentTimerCount; i++) { window.clearTimeout(this.showContentTimerArray[i]); } - if (this.outerBorder) { - this.doc.getElementById('lbOuterContainer').style.borderBottom = 'none'; - } - this.doc.getElementById('lbLoading').style.display = 'none'; - if (this.isLyteframe) { - this.doc.getElementById('lbIframe').style.display = ''; - this.appear('lbIframe', (this.doAnimations ? 0 : 100)); - } else { - this.doc.getElementById('lbImage').style.display = ''; - this.appear('lbImage', (this.doAnimations ? 0 : 100)); - this.preloadNeighborImages(); - } - if (this.isSlideshow) { - if(this.activeSlide == (this.slideArray.length - 1)) { - if (this.autoEnd) { - this.slideshowIDArray[this.slideshowIDCount++] = setTimeout("myLytebox.end('slideshow')", this.slideInterval); - } - } else { - if (!this.isPaused) { - this.slideshowIDArray[this.slideshowIDCount++] = setTimeout("myLytebox.changeContent("+(this.activeSlide+1)+")", this.slideInterval); - } - } - this.doc.getElementById('lbHoverNav').style.display = (this.showNavigation && this.navType == 1 ? '' : 'none'); - this.doc.getElementById('lbClose').style.display = (this.showClose ? '' : 'none'); - this.doc.getElementById('lbDetails').style.display = (this.showDetails ? '' : 'none'); - this.doc.getElementById('lbPause').style.display = (this.showPlayPause && !this.isPaused ? '' : 'none'); - this.doc.getElementById('lbPlay').style.display = (this.showPlayPause && !this.isPaused ? 'none' : ''); - this.doc.getElementById('lbNavDisplay').style.display = (this.showNavigation && this.navType == 2 ? '' : 'none'); - } else { - this.doc.getElementById('lbHoverNav').style.display = (this.navType == 1 && !this.isLyteframe ? '' : 'none'); - if ((this.navType == 2 && !this.isLyteframe && this.imageArray.length > 1) || (this.frameArray.length > 1 && this.isLyteframe)) { - this.doc.getElementById('lbNavDisplay').style.display = ''; - } else { - this.doc.getElementById('lbNavDisplay').style.display = 'none'; - } - this.doc.getElementById('lbClose').style.display = ''; - this.doc.getElementById('lbDetails').style.display = ''; - this.doc.getElementById('lbPause').style.display = 'none'; - this.doc.getElementById('lbPlay').style.display = 'none'; - } - this.doc.getElementById('lbImageContainer').style.display = (this.isLyteframe ? 'none' : ''); - this.doc.getElementById('lbIframeContainer').style.display = (this.isLyteframe ? '' : 'none'); - } else { - this.showContentTimerArray[this.showContentTimerCount++] = setTimeout("myLytebox.showContent()", 200); - } -}; -LyteBox.prototype.updateDetails = function() { - var object = this.doc.getElementById('lbCaption'); - var sTitle = (this.isSlideshow ? this.slideArray[this.activeSlide][1] : (this.isLyteframe ? this.frameArray[this.activeFrame][1] : this.imageArray[this.activeImage][1])); - object.style.display = ''; - object.innerHTML = (sTitle == null ? '' : sTitle); - this.updateNav(); - this.doc.getElementById('lbDetailsContainer').style.display = ''; - object = this.doc.getElementById('lbNumberDisplay'); - if (this.isSlideshow && this.slideArray.length > 1) { - object.style.display = ''; - object.innerHTML = "Image " + eval(this.activeSlide + 1) + " of " + this.slideArray.length; - this.doc.getElementById('lbNavDisplay').style.display = (this.navType == 2 && this.showNavigation ? '' : 'none'); - } else if (this.imageArray.length > 1 && !this.isLyteframe) { - object.style.display = ''; - object.innerHTML = "Image " + eval(this.activeImage + 1) + " of " + this.imageArray.length; - this.doc.getElementById('lbNavDisplay').style.display = (this.navType == 2 ? '' : 'none'); - } else if (this.frameArray.length > 1 && this.isLyteframe) { - object.style.display = ''; - object.innerHTML = "Page " + eval(this.activeFrame + 1) + " of " + this.frameArray.length; - this.doc.getElementById('lbNavDisplay').style.display = ''; - } else { - this.doc.getElementById('lbNavDisplay').style.display = 'none'; - } - this.appear('lbDetailsContainer', (this.doAnimations ? 0 : 100)); -}; -LyteBox.prototype.updateNav = function() { - if (this.isSlideshow) { - if (this.activeSlide != 0) { - var object = (this.navType == 2 ? this.doc.getElementById('lbPrev2') : this.doc.getElementById('lbPrev')); - object.style.display = ''; - object.onclick = function() { - if (myLytebox.pauseOnPrevClick) { myLytebox.togglePlayPause("lbPause", "lbPlay"); } - myLytebox.changeContent(myLytebox.activeSlide - 1); return false; - } - } else { - if (this.navType == 2) { this.doc.getElementById('lbPrev2_Off').style.display = ''; } - } - if (this.activeSlide != (this.slideArray.length - 1)) { - var object = (this.navType == 2 ? this.doc.getElementById('lbNext2') : this.doc.getElementById('lbNext')); - object.style.display = ''; - object.onclick = function() { - if (myLytebox.pauseOnNextClick) { myLytebox.togglePlayPause("lbPause", "lbPlay"); } - myLytebox.changeContent(myLytebox.activeSlide + 1); return false; - } - } else { - if (this.navType == 2) { this.doc.getElementById('lbNext2_Off').style.display = ''; } - } - } else if (this.isLyteframe) { - if(this.activeFrame != 0) { - var object = this.doc.getElementById('lbPrev2'); - object.style.display = ''; - object.onclick = function() { - myLytebox.changeContent(myLytebox.activeFrame - 1); return false; - } - } else { - this.doc.getElementById('lbPrev2_Off').style.display = ''; - } - if(this.activeFrame != (this.frameArray.length - 1)) { - var object = this.doc.getElementById('lbNext2'); - object.style.display = ''; - object.onclick = function() { - myLytebox.changeContent(myLytebox.activeFrame + 1); return false; - } - } else { - this.doc.getElementById('lbNext2_Off').style.display = ''; - } - } else { - if(this.activeImage != 0) { - var object = (this.navType == 2 ? this.doc.getElementById('lbPrev2') : this.doc.getElementById('lbPrev')); - object.style.display = ''; - object.onclick = function() { - myLytebox.changeContent(myLytebox.activeImage - 1); return false; - } - } else { - if (this.navType == 2) { this.doc.getElementById('lbPrev2_Off').style.display = ''; } - } - if(this.activeImage != (this.imageArray.length - 1)) { - var object = (this.navType == 2 ? this.doc.getElementById('lbNext2') : this.doc.getElementById('lbNext')); - object.style.display = ''; - object.onclick = function() { - myLytebox.changeContent(myLytebox.activeImage + 1); return false; - } - } else { - if (this.navType == 2) { this.doc.getElementById('lbNext2_Off').style.display = ''; } - } - } - this.enableKeyboardNav(); -}; -LyteBox.prototype.enableKeyboardNav = function() { document.onkeydown = this.keyboardAction; }; -LyteBox.prototype.disableKeyboardNav = function() { document.onkeydown = ''; }; -LyteBox.prototype.keyboardAction = function(e) { - var keycode = key = escape = null; - keycode = (e == null) ? event.keyCode : e.which; - key = String.fromCharCode(keycode).toLowerCase(); - escape = (e == null) ? 27 : e.DOM_VK_ESCAPE; - if ((key == 'x') || (key == 'c') || (keycode == escape)) { - myLytebox.end(); - } else if ((key == 'p') || (keycode == 37)) { - if (myLytebox.isSlideshow) { - if(myLytebox.activeSlide != 0) { - myLytebox.disableKeyboardNav(); - myLytebox.changeContent(myLytebox.activeSlide - 1); - } - } else if (myLytebox.isLyteframe) { - if(myLytebox.activeFrame != 0) { - myLytebox.disableKeyboardNav(); - myLytebox.changeContent(myLytebox.activeFrame - 1); - } - } else { - if(myLytebox.activeImage != 0) { - myLytebox.disableKeyboardNav(); - myLytebox.changeContent(myLytebox.activeImage - 1); - } - } - } else if ((key == 'n') || (keycode == 39)) { - if (myLytebox.isSlideshow) { - if(myLytebox.activeSlide != (myLytebox.slideArray.length - 1)) { - myLytebox.disableKeyboardNav(); - myLytebox.changeContent(myLytebox.activeSlide + 1); - } - } else if (myLytebox.isLyteframe) { - if(myLytebox.activeFrame != (myLytebox.frameArray.length - 1)) { - myLytebox.disableKeyboardNav(); - myLytebox.changeContent(myLytebox.activeFrame + 1); - } - } else { - if(myLytebox.activeImage != (myLytebox.imageArray.length - 1)) { - myLytebox.disableKeyboardNav(); - myLytebox.changeContent(myLytebox.activeImage + 1); - } - } - } -}; -LyteBox.prototype.preloadNeighborImages = function() { - if (this.isSlideshow) { - if ((this.slideArray.length - 1) > this.activeSlide) { - preloadNextImage = new Image(); - preloadNextImage.src = this.slideArray[this.activeSlide + 1][0]; - } - if(this.activeSlide > 0) { - preloadPrevImage = new Image(); - preloadPrevImage.src = this.slideArray[this.activeSlide - 1][0]; - } - } else { - if ((this.imageArray.length - 1) > this.activeImage) { - preloadNextImage = new Image(); - preloadNextImage.src = this.imageArray[this.activeImage + 1][0]; - } - if(this.activeImage > 0) { - preloadPrevImage = new Image(); - preloadPrevImage.src = this.imageArray[this.activeImage - 1][0]; - } - } -}; -LyteBox.prototype.togglePlayPause = function(hideID, showID) { - if (this.isSlideshow && hideID == "lbPause") { - for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } - } - this.doc.getElementById(hideID).style.display = 'none'; - this.doc.getElementById(showID).style.display = ''; - if (hideID == "lbPlay") { - this.isPaused = false; - if (this.activeSlide == (this.slideArray.length - 1)) { - this.end(); - } else { - this.changeContent(this.activeSlide + 1); - } - } else { - this.isPaused = true; - } -}; -LyteBox.prototype.end = function(caller) { - var closeClick = (caller == 'slideshow' ? false : true); - if (this.isSlideshow && this.isPaused && !closeClick) { return; } - this.disableKeyboardNav(); - this.doc.getElementById('lbMain').style.display = 'none'; - this.fade('lbOverlay', (this.doAnimations ? this.maxOpacity : 0)); - this.toggleSelects('visible'); - if (this.hideFlash) { this.toggleFlash('visible'); } - if (this.isSlideshow) { - for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } - } -}; -LyteBox.prototype.checkFrame = function() { - if (window.parent.frames[window.name] && (parent.document.getElementsByTagName('frameset').length <= 0)) { - this.isFrame = true; - this.lytebox = "window.parent." + window.name + ".myLytebox"; - this.doc = parent.document; - } else { - this.isFrame = false; - this.lytebox = "myLytebox"; - this.doc = document; - } -}; -LyteBox.prototype.getPixelRate = function(cur, img) { - var diff = (img > cur) ? img - cur : cur - img; - if (diff >= 0 && diff <= 100) { return 10; } - if (diff > 100 && diff <= 200) { return 15; } - if (diff > 200 && diff <= 300) { return 20; } - if (diff > 300 && diff <= 400) { return 25; } - if (diff > 400 && diff <= 500) { return 30; } - if (diff > 500 && diff <= 600) { return 35; } - if (diff > 600 && diff <= 700) { return 40; } - if (diff > 700) { return 45; } -}; -LyteBox.prototype.appear = function(id, opacity) { - var object = this.doc.getElementById(id).style; - object.opacity = (opacity / 100); - object.MozOpacity = (opacity / 100); - object.KhtmlOpacity = (opacity / 100); - object.filter = "alpha(opacity=" + (opacity + 10) + ")"; - if (opacity == 100 && (id == 'lbImage' || id == 'lbIframe')) { - this.updateDetails(); - } else if (opacity >= this.maxOpacity && id == 'lbOverlay') { - for (var i = 0; i < this.overlayTimerCount; i++) { window.clearTimeout(this.overlayTimerArray[i]); } - return; - } else if (opacity >= 100 && id == 'lbDetailsContainer') { - for (var i = 0; i < this.imageTimerCount; i++) { window.clearTimeout(this.imageTimerArray[i]); } - this.doc.getElementById('lbOverlay').style.height = this.getPageSize()[1] + "px"; - } else { - if (id == 'lbOverlay') { - this.overlayTimerArray[this.overlayTimerCount++] = setTimeout("myLytebox.appear('" + id + "', " + (opacity+20) + ")", 1); - } else { - this.imageTimerArray[this.imageTimerCount++] = setTimeout("myLytebox.appear('" + id + "', " + (opacity+10) + ")", 1); - } - } -}; -LyteBox.prototype.fade = function(id, opacity) { - var object = this.doc.getElementById(id).style; - object.opacity = (opacity / 100); - object.MozOpacity = (opacity / 100); - object.KhtmlOpacity = (opacity / 100); - object.filter = "alpha(opacity=" + opacity + ")"; - if (opacity <= 0) { - try { - object.display = 'none'; - } catch(err) { } - } else if (id == 'lbOverlay') { - this.overlayTimerArray[this.overlayTimerCount++] = setTimeout("myLytebox.fade('" + id + "', " + (opacity-20) + ")", 1); - } else { - this.timerIDArray[this.timerIDCount++] = setTimeout("myLytebox.fade('" + id + "', " + (opacity-10) + ")", 1); - } -}; -LyteBox.prototype.resizeW = function(id, curW, maxW, pixelrate, speed) { - if (!this.hDone) { - this.resizeWTimerArray[this.resizeWTimerCount++] = setTimeout("myLytebox.resizeW('" + id + "', " + curW + ", " + maxW + ", " + pixelrate + ")", 100); - return; - } - var object = this.doc.getElementById(id); - var timer = speed ? speed : (this.resizeDuration/2); - var newW = (this.doAnimations ? curW : maxW); - object.style.width = (newW) + "px"; - if (newW < maxW) { - newW += (newW + pixelrate >= maxW) ? (maxW - newW) : pixelrate; - } else if (newW > maxW) { - newW -= (newW - pixelrate <= maxW) ? (newW - maxW) : pixelrate; - } - this.resizeWTimerArray[this.resizeWTimerCount++] = setTimeout("myLytebox.resizeW('" + id + "', " + newW + ", " + maxW + ", " + pixelrate + ", " + (timer+0.02) + ")", timer+0.02); - if (parseInt(object.style.width) == maxW) { - this.wDone = true; - for (var i = 0; i < this.resizeWTimerCount; i++) { window.clearTimeout(this.resizeWTimerArray[i]); } - } -}; -LyteBox.prototype.resizeH = function(id, curH, maxH, pixelrate, speed) { - var timer = speed ? speed : (this.resizeDuration/2); - var object = this.doc.getElementById(id); - var newH = (this.doAnimations ? curH : maxH); - object.style.height = (newH) + "px"; - if (newH < maxH) { - newH += (newH + pixelrate >= maxH) ? (maxH - newH) : pixelrate; - } else if (newH > maxH) { - newH -= (newH - pixelrate <= maxH) ? (newH - maxH) : pixelrate; - } - this.resizeHTimerArray[this.resizeHTimerCount++] = setTimeout("myLytebox.resizeH('" + id + "', " + newH + ", " + maxH + ", " + pixelrate + ", " + (timer+.02) + ")", timer+.02); - if (parseInt(object.style.height) == maxH) { - this.hDone = true; - for (var i = 0; i < this.resizeHTimerCount; i++) { window.clearTimeout(this.resizeHTimerArray[i]); } - } -}; -LyteBox.prototype.getPageScroll = function() { - if (self.pageYOffset) { - return this.isFrame ? parent.pageYOffset : self.pageYOffset; - } else if (this.doc.documentElement && this.doc.documentElement.scrollTop){ - return this.doc.documentElement.scrollTop; - } else if (document.body) { - return this.doc.body.scrollTop; - } -}; -LyteBox.prototype.getPageSize = function() { - var xScroll, yScroll, windowWidth, windowHeight; - if (window.innerHeight && window.scrollMaxY) { - xScroll = this.doc.scrollWidth; - yScroll = (this.isFrame ? parent.innerHeight : self.innerHeight) + (this.isFrame ? parent.scrollMaxY : self.scrollMaxY); - } else if (this.doc.body.scrollHeight > this.doc.body.offsetHeight){ - xScroll = this.doc.body.scrollWidth; - yScroll = this.doc.body.scrollHeight; - } else { - xScroll = this.doc.getElementsByTagName("html").item(0).offsetWidth; - yScroll = this.doc.getElementsByTagName("html").item(0).offsetHeight; - xScroll = (xScroll < this.doc.body.offsetWidth) ? this.doc.body.offsetWidth : xScroll; - yScroll = (yScroll < this.doc.body.offsetHeight) ? this.doc.body.offsetHeight : yScroll; - } - if (self.innerHeight) { - windowWidth = (this.isFrame) ? parent.innerWidth : self.innerWidth; - windowHeight = (this.isFrame) ? parent.innerHeight : self.innerHeight; - } else if (document.documentElement && document.documentElement.clientHeight) { - windowWidth = this.doc.documentElement.clientWidth; - windowHeight = this.doc.documentElement.clientHeight; - } else if (document.body) { - windowWidth = this.doc.getElementsByTagName("html").item(0).clientWidth; - windowHeight = this.doc.getElementsByTagName("html").item(0).clientHeight; - windowWidth = (windowWidth == 0) ? this.doc.body.clientWidth : windowWidth; - windowHeight = (windowHeight == 0) ? this.doc.body.clientHeight : windowHeight; - } - var pageHeight = (yScroll < windowHeight) ? windowHeight : yScroll; - var pageWidth = (xScroll < windowWidth) ? windowWidth : xScroll; - return new Array(pageWidth, pageHeight, windowWidth, windowHeight); -}; -LyteBox.prototype.toggleFlash = function(state) { - var objects = this.doc.getElementsByTagName("object"); - for (var i = 0; i < objects.length; i++) { - objects[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; - } - var embeds = this.doc.getElementsByTagName("embed"); - for (var i = 0; i < embeds.length; i++) { - embeds[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; - } - if (this.isFrame) { - for (var i = 0; i < parent.frames.length; i++) { - try { - objects = parent.frames[i].window.document.getElementsByTagName("object"); - for (var j = 0; j < objects.length; j++) { - objects[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; - } - } catch(e) { } - try { - embeds = parent.frames[i].window.document.getElementsByTagName("embed"); - for (var j = 0; j < embeds.length; j++) { - embeds[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; - } - } catch(e) { } - } - } -}; -LyteBox.prototype.toggleSelects = function(state) { - var selects = this.doc.getElementsByTagName("select"); - for (var i = 0; i < selects.length; i++ ) { - selects[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; - } - if (this.isFrame) { - for (var i = 0; i < parent.frames.length; i++) { - try { - selects = parent.frames[i].window.document.getElementsByTagName("select"); - for (var j = 0; j < selects.length; j++) { - selects[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; - } - } catch(e) { } - } - } -}; -LyteBox.prototype.pause = function(numberMillis) { - var now = new Date(); - var exitTime = now.getTime() + numberMillis; - while (true) { - now = new Date(); - if (now.getTime() > exitTime) { return; } - } -}; -if (window.addEventListener) { - window.addEventListener("load",initLytebox,false); -} else if (window.attachEvent) { - window.attachEvent("onload",initLytebox); -} else { - window.onload = function() {initLytebox();} -} -function initLytebox() { myLytebox = new LyteBox(); } \ No newline at end of file diff --git a/main/NOVA_0.4.4/templates/static/javascripts/nova.js b/main/NOVA_0.4.4/templates/static/javascripts/nova.js deleted file mode 100644 index 544dd72..0000000 --- a/main/NOVA_0.4.4/templates/static/javascripts/nova.js +++ /dev/null @@ -1,582 +0,0 @@ -// globals -var queue; // contains parsed json -var histore; // chokes when this is named 'history'??? -var changingOrder = false; // when you are mid-drag the container will serialize at current position; this is how NOVA knows not to redraw -var lastQueueOrder = new Array(); // know when to reset container ids (to be replaced I believe) - -// queue drag & drop sort effect -var myStartEffect = function(element) { new Effect.Opacity(element, {duration:0, from:0.2, to:0.6}); } - -// called upon page load -- restore previous layout & initiate data updates -window.onload=function(){ - if (ReadCookie('Layout_Orientation')=='TopToBottom') - $("history_container").style.clear = $("queue_container").style.clear ='both'; - if (ReadCookie('Layout_Stats')=='hide') $("dataBar").style.display ='none'; - if (ReadCookie('Layout_Queue')=='hide') $("queue_container").style.display ='none'; - if (ReadCookie('Layout_History')=='hide') $("history_container").style.display='none'; - if (ReadCookie('RefreshRate')) { - refreshTime = ReadCookie('RefreshRate'); - $('refresh_handle').innerHTML='  '+refreshTime+' sec'; - } - MainLoop(); -} - -// called every refresh (calls itself) -function MainLoop(){ - - // handle queue json - new Ajax.Request('queue', { - method:'get', - requestHeaders: {Accept: 'application/json'}, - onSuccess: function(transport){ - queue = transport.responseText.evalJSON(); - RefreshQueueOrder(); - // main stats - document.title= 'NOVA ' + Math.round(queue.kbpersec) + ' KB/s '+queue.noofslots+' Queued'; - $("logo").title = "Uptime: "+queue.uptime; - $("kbpersec").innerHTML = Math.round(queue.kbpersec); - $("mbdone").innerHTML = Math.round(queue.mb-queue.mbleft); - $("mb").innerHTML = Math.round(queue.mb); - $("mbleft").innerHTML = Math.round(queue.mbleft/1024*100)/100; - $("statusbar").style.width = - $("statusbartext").innerHTML = (queue.mb > 0) ? Math.round((1-queue.mbleft/queue.mb)*100)+'%' : "0%"; - if ($("diskspace1").innerHTML !=queue.diskspace1) - $("diskspace1").innerHTML = queue.diskspace1; - if ($("diskspace2").innerHTML !=queue.diskspace2) - $("diskspace2").innerHTML = queue.diskspace2; - $("timeleft").innerHTML = " "+TimeLeft(queue.kbpersec, queue.mbleft, queue.mb)+""; - if (queue.paused=='True' && $("queue_pause").innerHTML != 'Paused!') { - $("queue_pause").innerHTML = 'Paused!'; - $("queue_pause").setAttribute("class", "toggled"); - $("queue_pause").setAttribute("onclick", "NOVAction('queue_resume')"); - } else if (queue.paused=='False' && $("queue_pause").innerHTML != 'Pause') { - $("queue_pause").innerHTML = 'Pause'; - $("queue_pause").setAttribute("class", "untoggled"); - $("queue_pause").setAttribute("onclick", "NOVAction('queue_pause')"); - } - if (queue.noofslots>0 && - ( queue.jobs[0].finished.length>0 - ||queue.jobs[0].active.length>0 - ||queue.jobs[0].queued.length>0) && $("queue_tog_verbose").innerHTML != 'Verbosity!') { - $("queue_tog_verbose").innerHTML = 'Verbosity!'; - $("queue_tog_verbose").setAttribute("class", "toggled"); - } else if (queue.noofslots>0 && - ( queue.jobs[0].finished.length==0 - &&queue.jobs[0].active.length==0 - &&queue.jobs[0].queued.length==0) && $("queue_tog_verbose").innerHTML != 'Verbosity') { - $("queue_tog_verbose").innerHTML = 'Verbosity'; - $("queue_tog_verbose").setAttribute("class", "untoggled"); - } - if (queue.shutdown=='True' && $("queue_tog_shutdown").innerHTML != 'Shutdown!') { - $("queue_tog_shutdown").innerHTML = 'Shutdown!'; - $("queue_tog_shutdown").setAttribute("class", "toggled"); - } else if (queue.shutdown=='False' && $("queue_tog_shutdown") && $("queue_tog_shutdown").innerHTML != 'Shutdown') { - $("queue_tog_shutdown").innerHTML = 'Shutdown'; - $("queue_tog_shutdown").setAttribute("class", "untoggled"); - } - for(var i=0; i
of '+Math.round(queue.jobs[i].mb)+' MB'; - // time left - nzb.childNodes[1].childNodes[1].innerHTML = " "+TimeLeft(queue.kbpersec, queue.jobs[i].mbleft, queue.jobs[i].mb)+""; - nzb.childNodes[1].title = "ETA: "+queue.jobs[i].eta+" ... Average Age: "+queue.jobs[i].avg_age; - // hop - if (hop!="" && nzb.childNodes[2].childNodes[1].href != hop) { - nzb.childNodes[2].childNodes[1].href = hop; - nzb.childNodes[2].childNodes[1].target = "_blank"; - nzb.childNodes[2].childNodes[1].childNodes[0].src = 'static/images/icon-newzbin.png'; - } - // post-processing options - nzb.childNodes[2].childNodes[2].selectedIndex = queue.jobs[i].unpackopts; - // verbosity - if ($("queue_tog_verbose").innerHTML == 'Verbosity!' && nzb.childNodes[0].childNodes[2].style.display != 'none') { - var verbosity_names=''; - var verbosity_sizes=''; - var verbosity_icons=''; - // finished files - verbosity_names = '
.: Finished
'; - verbosity_sizes = '
'; - verbosity_icons = '

'; - for (var j=0; j'+queue.jobs[i].finished[j].filename+'
'; - verbosity_sizes += Math.round((queue.jobs[i].finished[j].mb - queue.jobs[i].finished[j].mbleft)*100)/100 +' of '+ queue.jobs[i].finished[j].mb +' MB
'; - verbosity_icons += '
'; - } - // active files - verbosity_names += '
.: Active
'; - verbosity_sizes += '

'; - verbosity_icons += '
'; - for (var j=0; j'+queue.jobs[i].active[j].filename+'
'; - verbosity_sizes += Math.round((queue.jobs[i].active[j].mb - queue.jobs[i].active[j].mbleft)*100)/100 +' of '+ queue.jobs[i].active[j].mb +' MB
'; - verbosity_icons += '' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +'' - +'
'; - } - // queued files - verbosity_names += '
.: Queued
'; - verbosity_sizes += '

'; - verbosity_icons += '
'; - for (var j=0; j'+queue.jobs[i].queued[j].filename+'
'; - verbosity_sizes += Math.round((queue.jobs[i].queued[j].mb - queue.jobs[i].queued[j].mbleft)*100)/100 +' of '+ queue.jobs[i].queued[j].mb +' MB
'; - verbosity_icons += '
'; - } - verbosity_names += '
'; - verbosity_sizes += '
'; - // and update - if (nzb.childNodes[0].childNodes[2].innerHTML !=verbosity_names) - nzb.childNodes[0].childNodes[2].innerHTML = verbosity_names; - if (nzb.childNodes[1].childNodes[5].innerHTML !=verbosity_sizes) - nzb.childNodes[1].childNodes[5].innerHTML = verbosity_sizes; - if (nzb.childNodes[2].childNodes[4].innerHTML !=verbosity_icons) - nzb.childNodes[2].childNodes[4].innerHTML = verbosity_icons; - } - - }}}); - - // handle history json - new Ajax.Request('history', { - method:'get', - requestHeaders: {Accept: 'application/json'}, - onSuccess: function(transport){ - histore = transport.responseText.evalJSON(); // it didnt work when i called it 'history' - $("bytes_beginning").innerHTML = histore.bytes_beginning; // main stats - $("total_bytes").innerHTML = histore.total_bytes; // main stats - if (histore.lines.length>0 && - histore.lines[0].stages.length>0 && $("history_tog_verbose").innerHTML != 'Verbosity!') { - $("history_tog_verbose").innerHTML = 'Verbosity!'; - $("history_tog_verbose").setAttribute("class", "toggled"); - } else if ( histore.lines.length>0 && - histore.lines[0].stages.length==0 && $("history_tog_verbose").innerHTML != 'Verbosity!') { - $("history_tog_verbose").innerHTML = 'Verbosity'; - $("history_tog_verbose").setAttribute("class", "untoggled"); - } - var numnodes = $("history").getElementsByTagName("tr").length; - var nzb; - var verbosity; - while (numnodes'); - numnodes++; - } - while (numnodes-->histore.lines.length) // need less node(s) - $("history").removeChild($("history").lastChild); - for (var i=0; i^N '; - goodname = goodname.substr(14); - } - if (histore.lines[i].loaded=="True") - loading = '... '; - // verbosity - if (histore.lines[i].stages.length>0) { - verbosity='
'; - for (var j=0; j'; - break; - case "RAR": - verbosity += ''; - break; - case "ZIP": - verbosity += ''; - break; - case "DEL": - verbosity += ''; - break; - case "FJN": - verbosity += ''; - break; - default: - verbosity += '['+ histore.lines[i].stages[j].actions[k].name.substr(1,3) +']'; - }; - switch (histore.lines[i].stages[j].actions[k].value.substr(3,8)) { - case 'Scanning': - case 'Verified': - case 'Repaired': - case 'Unpacked': - case 'Unzipped': - case 'Deleted ': - break; // clean verbosity - default: - verbosity += ' '+ histore.lines[i].stages[j].actions[k].value.substr(3) +''; - break; - }; - if (histore.lines[i].stages[j].actions[k].value.substr(0,9) == "=> ERROR:" || histore.lines[i].stages[j].actions[k].value.substr(0,6) == "=> Not") - sick = '... '; - } - } - } else verbosity=''; - if ($("history").childNodes[i].childNodes[0].innerHTML !=hop+loading+sick+''+goodname+''+verbosity) { - $("history").childNodes[i].childNodes[0].innerHTML = hop+loading+sick+''+goodname+''+verbosity; - $("history").childNodes[i].title = 'Done @ '+histore.lines[i].added+' :: '+histore.lines[i].filename; - } - } - }}); - - setTimeout("MainLoop()",refreshTime*1000); // loop -} - -// determine time left in HH:MM:SS -// replace this with parsed ETA for queued items -// will still be necessary for overall ETA -function TimeLeft (kbpersec, mbleft, mb) { - var timeleft = '∞'; - if (kbpersec >= 1 && mb > 0) { - var kbleft = mbleft * 1024; - var hoursleft = 0; - var minsleft = 0; - var secsleft = Math.round(kbleft / kbpersec); - if (secsleft>=60) { - minsleft = Math.round(secsleft/60); - secsleft = secsleft%60; - } - if (minsleft>=60) { - hoursleft = Math.round(minsleft/60); - minsleft = minsleft%60; - } - timeleft = ((hoursleft < 10) ? "0" : "") + hoursleft; - timeleft += ((minsleft < 10) ? ":0" : ":") + minsleft; - timeleft += ((secsleft < 10) ? ":0" : ":") + secsleft; - } - return timeleft; -} - -// append an empty enqueued nzb container -function AppendNZBSlot(nzo_id) { - - if (sabplus=='F') // 0.2.5 - $("queue").insert('' - +'' - +':
' - +'' - +'
' - +'' - +'' - +'' - +'' - +'' - +'
' - +''); - else // 0.2.7+ - $("queue").insert('' - +'' - +':
' - +'' - +'
' - +'' - +'' - +'' - +'' - +'' - +'
' - +''); -} - -// called from MainLoop, resets node ids & appends/removes rows -function RefreshQueueOrder() { - if (changingOrder) - return false; - var numnodes = $("queue").getElementsByTagName("tr").length; - while (numnodesqueue.noofslots) // need less node(s) - $("queue").removeChild($("queue").lastChild); - var orderedNodes = $("queue").getElementsByTagName("tr"); - for (var i=0; i 0) { - for (var i = 0, subclass; subclass = destination.subclasses[i]; i++) { - Class.extending = true; - Object.extend(subclass.prototype, new destination()); - subclass.prototype.constructor = subclass; - delete Class.extending; - Class.inherit(subclass, destination.prototype, name); - } - } - }, - - mixin: function(destination, source) { - return Object.extend(destination, source); - } -}; - -var Abstract = { }; - -Object.extend = function(destination, source) { - for (var property in source) { - destination[property] = source[property]; - } - return destination; -}; - -Object.extend(Object, { - inspect: function(object) { - try { - if (object === undefined) return 'undefined'; - if (object === null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } - }, - - toJSON: function(object) { - var type = typeof object; - switch (type) { - case 'undefined': - case 'function': - case 'unknown': return; - case 'boolean': return object.toString(); - } - - if (object === null) return 'null'; - if (object.toJSON) return object.toJSON(); - if (Object.isElement(object)) return; - - var results = []; - for (var property in object) { - var value = Object.toJSON(object[property]); - if (value !== undefined) - results.push(property.toJSON() + ': ' + value); - } - - return '{' + results.join(', ') + '}'; - }, - - toHTML: function(object) { - return object && object.toHTML ? object.toHTML() : String.interpret(object); - }, - - keys: function(object) { - var keys = []; - for (var property in object) - keys.push(property); - return keys; - }, - - values: function(object) { - var values = []; - for (var property in object) - values.push(object[property]); - return values; - }, - - clone: function(object) { - return Object.extend({ }, object); - }, - - isElement: function(object) { - return object && object.nodeType == 1; - }, - - isArray: function(object) { - return object && object.constructor === Array; - }, - - isFunction: function(object) { - return typeof object == "function"; - }, - - isString: function(object) { - return typeof object == "string"; - }, - - isNumber: function(object) { - return typeof object == "number"; - }, - - isUndefined: function(object) { - return typeof object == "undefined"; - } -}); - -Object.extend(Function.prototype, { - argumentNames: function() { - var names = this.toString().match(/^[\s\(]*function\s*\((.*?)\)/)[1].split(",").invoke("strip"); - return names.length == 1 && !names[0] ? [] : names; - }, - - bind: function() { - if (arguments.length < 2 && arguments[0] === undefined) return this; - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } - }, - - bindAsEventListener: function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function(event) { - return __method.apply(object, [event || window.event].concat(args)); - } - }, - - curry: function() { - if (!arguments.length) return this; - var __method = this, args = $A(arguments); - return function() { - return __method.apply(this, args.concat($A(arguments))); - } - }, - - delay: function() { - var __method = this, args = $A(arguments), timeout = args.shift() * 1000; - return window.setTimeout(function() { - return __method.apply(__method, args); - }, timeout); - }, - - wrap: function(wrapper) { - var __method = this; - return function() { - return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); - } - }, - - methodize: function() { - if (this._methodized) return this._methodized; - var __method = this; - return this._methodized = function() { - return __method.apply(null, [this].concat($A(arguments))); - }; - } -}); - -Function.prototype.defer = Function.prototype.delay.curry(0.01); - -Date.prototype.toJSON = function() { - return '"' + this.getFullYear() + '-' + - (this.getMonth() + 1).toPaddedString(2) + '-' + - this.getDate().toPaddedString(2) + 'T' + - this.getHours().toPaddedString(2) + ':' + - this.getMinutes().toPaddedString(2) + ':' + - this.getSeconds().toPaddedString(2) + '"'; -}; - -var Try = { - these: function() { - var returnValue; - - for (var i = 0, length = arguments.length; i < length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) { } - } - - return returnValue; - } -}; - -RegExp.prototype.match = RegExp.prototype.test; - -RegExp.escape = function(str) { - return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); -}; - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create({ - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - stop: function() { - if (!this.timer) return; - clearInterval(this.timer); - this.timer = null; - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.callback(this); - } finally { - this.currentlyExecuting = false; - } - } - } -}); -Object.extend(String, { - interpret: function(value) { - return value == null ? '' : String(value); - }, - specialChar: { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '\\': '\\\\' - } -}); - -Object.extend(String.prototype, { - gsub: function(pattern, replacement) { - var result = '', source = this, match; - replacement = arguments.callee.prepareReplacement(replacement); - - while (source.length > 0) { - if (match = source.match(pattern)) { - result += source.slice(0, match.index); - result += String.interpret(replacement(match)); - source = source.slice(match.index + match[0].length); - } else { - result += source, source = ''; - } - } - return result; - }, - - sub: function(pattern, replacement, count) { - replacement = this.gsub.prepareReplacement(replacement); - count = count === undefined ? 1 : count; - - return this.gsub(pattern, function(match) { - if (--count < 0) return match[0]; - return replacement(match); - }); - }, - - scan: function(pattern, iterator) { - this.gsub(pattern, iterator); - return String(this); - }, - - truncate: function(length, truncation) { - length = length || 30; - truncation = truncation === undefined ? '...' : truncation; - return this.length > length ? - this.slice(0, length - truncation.length) + truncation : String(this); - }, - - strip: function() { - return this.replace(/^\s+/, '').replace(/\s+$/, ''); - }, - - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(function(script) { return eval(script) }); - }, - - escapeHTML: function() { - var self = arguments.callee; - self.text.data = this; - return self.div.innerHTML; - }, - - unescapeHTML: function() { - var div = new Element('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? (div.childNodes.length > 1 ? - $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : - div.childNodes[0].nodeValue) : ''; - }, - - toQueryParams: function(separator) { - var match = this.strip().match(/([^?#]*)(#.*)?$/); - if (!match) return { }; - - return match[1].split(separator || '&').inject({ }, function(hash, pair) { - if ((pair = pair.split('='))[0]) { - var key = decodeURIComponent(pair.shift()); - var value = pair.length > 1 ? pair.join('=') : pair[0]; - if (value != undefined) value = decodeURIComponent(value); - - if (key in hash) { - if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; - hash[key].push(value); - } - else hash[key] = value; - } - return hash; - }); - }, - - toArray: function() { - return this.split(''); - }, - - succ: function() { - return this.slice(0, this.length - 1) + - String.fromCharCode(this.charCodeAt(this.length - 1) + 1); - }, - - times: function(count) { - var result = ''; - for (var i = 0; i < count; i++) result += this; - return result; - }, - - camelize: function() { - var parts = this.split('-'), len = parts.length; - if (len == 1) return parts[0]; - - var camelized = this.charAt(0) == '-' - ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) - : parts[0]; - - for (var i = 1; i < len; i++) - camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - - return camelized; - }, - - capitalize: function() { - return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - }, - - underscore: function() { - return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); - }, - - dasherize: function() { - return this.gsub(/_/,'-'); - }, - - inspect: function(useDoubleQuotes) { - var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { - var character = String.specialChar[match[0]]; - return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); - }); - if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; - return "'" + escapedString.replace(/'/g, '\\\'') + "'"; - }, - - toJSON: function() { - return this.inspect(true); - }, - - unfilterJSON: function(filter) { - return this.sub(filter || Prototype.JSONFilter, '#{1}'); - }, - - isJSON: function() { - var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); - return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); - }, - - evalJSON: function(sanitize) { - var json = this.unfilterJSON(); - try { - if (!sanitize || json.isJSON()) return eval('(' + json + ')'); - } catch (e) { } - throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); - }, - - include: function(pattern) { - return this.indexOf(pattern) > -1; - }, - - startsWith: function(pattern) { - return this.indexOf(pattern) === 0; - }, - - endsWith: function(pattern) { - var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; - }, - - empty: function() { - return this == ''; - }, - - blank: function() { - return /^\s*$/.test(this); - }, - - interpolate: function(object, pattern) { - return new Template(this, pattern).evaluate(object); - } -}); - -if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { - escapeHTML: function() { - return this.replace(/&/g,'&').replace(//g,'>'); - }, - unescapeHTML: function() { - return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { - if (Object.isFunction(replacement)) return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; -}; - -String.prototype.parseQuery = String.prototype.toQueryParams; - -Object.extend(String.prototype.escapeHTML, { - div: document.createElement('div'), - text: document.createTextNode('') -}); - -with (String.prototype.escapeHTML) div.appendChild(text); - -var Template = Class.create(); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; -Template.prototype = { - initialize: function(template, pattern) { - this.template = template.toString(); - this.pattern = pattern || Template.Pattern; - }, - - evaluate: function(object) { - if (Object.isFunction(object.toTemplateReplacements)) - object = object.toTemplateReplacements(); - - return this.template.gsub(this.pattern, function(match) { - if (object == null) return ''; - - var before = match[1] || ''; - if (before == '\\') return match[2]; - - var ctx = object, expr = match[3]; - var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr); - if (match == null) return ''; - - while (match != null) { - var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; - ctx = ctx[comp]; - if (null == ctx || '' == match[3]) break; - expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); - match = pattern.exec(expr); - } - - return before + String.interpret(ctx); - }.bind(this)); - } -}; - -var $break = { }; - -var Enumerable = { - each: function(iterator, context) { - var index = 0; - iterator = iterator.bind(context); - try { - this._each(function(value) { - iterator(value, index++); - }); - } catch (e) { - if (e != $break) throw e; - } - return this; - }, - - eachSlice: function(number, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var index = -number, slices = [], array = this.toArray(); - while ((index += number) < array.length) - slices.push(array.slice(index, index+number)); - return slices.collect(iterator, context); - }, - - all: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = true; - this.each(function(value, index) { - result = result && !!iterator(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = false; - this.each(function(value, index) { - if (result = !!iterator(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function(iterator, context) { - iterator = iterator.bind(context); - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(filter, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - - if (Object.isString(filter)) - filter = new RegExp(filter); - - this.each(function(value, index) { - if (filter.match(value)) - results.push(iterator(value, index)); - }); - return results; - }, - - include: function(object) { - if (Object.isFunction(this.indexOf)) - return this.indexOf(object) != -1; - - var found = false; - this.each(function(value) { - if (value === object) { - found = true; - throw $break; - } - }); - return found; - }, - - inGroupsOf: function(number, fillWith) { - fillWith = fillWith === undefined ? null : fillWith; - return this.eachSlice(number, function(slice) { - while(slice.length < number) slice.push(fillWith); - return slice; - }); - }, - - inject: function(memo, iterator, context) { - iterator = iterator.bind(context); - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.map(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == undefined || value >= result) - result = value; - }); - return result; - }, - - min: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == undefined || value < result) - result = value; - }); - return result; - }, - - partition: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var trues = [], falses = []; - this.each(function(value, index) { - (iterator(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator, context) { - iterator = iterator.bind(context); - return this.map(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.map(); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (Object.isFunction(args.last())) - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - return iterator(collections.pluck(index)); - }); - }, - - size: function() { - return this.toArray().length; - }, - - inspect: function() { - return '#'; - } -}; - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - filter: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray, - every: Enumerable.all, - some: Enumerable.any -}); -function $A(iterable) { - if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); - else { - var results = []; - for (var i = 0, length = iterable.length; i < length; i++) - results.push(iterable[i]); - return results; - } -} - -if (Prototype.Browser.WebKit) { - function $A(iterable) { - if (!iterable) return []; - if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && - iterable.toArray) { - return iterable.toArray(); - } else { - var results = []; - for (var i = 0, length = iterable.length; i < length; i++) - results.push(iterable[i]); - return results; - } - } -} - -Array.from = $A; - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0, length = this.length; i < length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(Object.isArray(value) ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - reduce: function() { - return this.length > 1 ? this : this[0]; - }, - - uniq: function(sorted) { - return this.inject([], function(array, value, index) { - if (0 == index || (sorted ? array.last() != value : !array.include(value))) - array.push(value); - return array; - }); - }, - - intersect: function(array) { - return this.uniq().findAll(function(item) { - return array.include(item); - }); - }, - - clone: function() { - return [].concat(this); - }, - - size: function() { - return this.length; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - }, - - toJSON: function() { - var results = []; - this.each(function(object) { - var value = Object.toJSON(object); - if (value !== undefined) results.push(value); - }); - return '[' + results.join(', ') + ']'; - } -}); - -// use native browser JS 1.6 implementation if available -if (Object.isFunction(Array.prototype.forEach)) - Array.prototype._each = Array.prototype.forEach; - -if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { - i || (i = 0); - var length = this.length; - if (i < 0) i = length + i; - for (; i < length; i++) - if (this[i] === item) return i; - return -1; -}; - -if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { - i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; - var n = this.slice(0, i).reverse().indexOf(item); - return (n < 0) ? n : i - n - 1; -}; - -Array.prototype.toArray = Array.prototype.clone; - -function $w(string) { - string = string.strip(); - return string ? string.split(/\s+/) : []; -} - -if (Prototype.Browser.Opera){ - Array.prototype.concat = function() { - var array = []; - for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); - for (var i = 0, length = arguments.length; i < length; i++) { - if (Object.isArray(arguments[i])) { - for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) - array.push(arguments[i][j]); - } else { - array.push(arguments[i]); - } - } - return array; - }; -} -Object.extend(Number.prototype, { - toColorPart: function() { - return this.toPaddedString(2, 16); - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - }, - - toPaddedString: function(length, radix) { - var string = this.toString(radix || 10); - return '0'.times(length - string.length) + string; - }, - - toJSON: function() { - return isFinite(this) ? this.toString() : 'null'; - } -}); - -$w('abs round ceil floor').each(function(method){ - Number.prototype[method] = Math[method].methodize(); -}); -var Hash = function(object) { - if (object instanceof Hash) this.merge(object); - else Object.extend(this, object || { }); -}; - -Object.extend(Hash, { - toQueryString: function(obj) { - var parts = []; - parts.add = arguments.callee.addPair; - - this.prototype._each.call(obj, function(pair) { - if (!pair.key) return; - var value = pair.value; - - if (value && typeof value == 'object') { - if (Object.isArray(value)) value.each(function(value) { - parts.add(pair.key, value); - }); - return; - } - parts.add(pair.key, value); - }); - - return parts.join('&'); - }, - - toJSON: function(object) { - var results = []; - this.prototype._each.call(object, function(pair) { - var value = Object.toJSON(pair.value); - if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value); - }); - return '{' + results.join(', ') + '}'; - } -}); - -Hash.toQueryString.addPair = function(key, value, prefix) { - key = encodeURIComponent(key); - if (value === undefined) this.push(key); - else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value))); -}; - -Object.extend(Hash.prototype, Enumerable); -Object.extend(Hash.prototype, { - _each: function(iterator) { - for (var key in this) { - var value = this[key]; - if (value && value == Hash.prototype[key]) continue; - - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - index: function(value) { - var match = this.detect(function(pair) { - return pair.value === value; - }); - return match && match.key; - }, - - merge: function(hash) { - return $H(hash).inject(this, function(mergedHash, pair) { - mergedHash[pair.key] = pair.value; - return mergedHash; - }); - }, - - remove: function() { - var result; - for(var i = 0, length = arguments.length; i < length; i++) { - var value = this[arguments[i]]; - if (value !== undefined){ - if (result === undefined) result = value; - else { - if (!Object.isArray(result)) result = [result]; - result.push(value); - } - } - delete this[arguments[i]]; - } - return result; - }, - - toQueryString: function() { - return Hash.toQueryString(this); - }, - - inspect: function() { - return '#'; - }, - - toJSON: function() { - return Hash.toJSON(this); - } -}); - -function $H(object) { - if (object instanceof Hash) return object; - return new Hash(object); -}; - -// Safari iterates over shadowed properties -if (function() { - var i = 0, Test = function(value) { this.key = value }; - Test.prototype.key = 'foo'; - for (var property in new Test('bar')) i++; - return i > 1; -}()) Hash.prototype._each = function(iterator) { - var cache = []; - for (var key in this) { - var value = this[key]; - if ((value && value == Hash.prototype[key]) || cache.include(key)) continue; - cache.push(key); - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } -}; -ObjectRange = Class.create(); -Object.extend(ObjectRange.prototype, Enumerable); -Object.extend(ObjectRange.prototype, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - while (this.include(value)) { - iterator(value); - value = value.succ(); - } - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -}; - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new XMLHttpRequest()}, - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')} - ) || false; - }, - - activeRequestCount: 0 -}; - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responder) { - if (!this.include(responder)) - this.responders.push(responder); - }, - - unregister: function(responder) { - this.responders = this.responders.without(responder); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (Object.isFunction(responder[callback])) { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) { } - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { - Ajax.activeRequestCount++; - }, - onComplete: function() { - Ajax.activeRequestCount--; - } -}); - -Ajax.Base = function() { }; -Ajax.Base.prototype = { - setOptions: function(options) { - this.options = { - method: 'post', - asynchronous: true, - contentType: 'application/x-www-form-urlencoded', - encoding: 'UTF-8', - parameters: '', - evalJSON: true, - evalJS: true - }; - Object.extend(this.options, options || { }); - - this.options.method = this.options.method.toLowerCase(); - if (Object.isString(this.options.parameters)) - this.options.parameters = this.options.parameters.toQueryParams(); - } -}; - -Ajax.Request = Class.create(); -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Request.prototype = Object.extend(new Ajax.Base(), { - _complete: false, - - initialize: function(url, options) { - this.transport = Ajax.getTransport(); - this.setOptions(options); - this.request(url); - }, - - request: function(url) { - this.url = url; - this.method = this.options.method; - var params = Object.clone(this.options.parameters); - - if (!['get', 'post'].include(this.method)) { - // simulate other verbs over post - params['_method'] = this.method; - this.method = 'post'; - } - - this.parameters = params; - - if (params = Hash.toQueryString(params)) { - // when GET, append parameters to URL - if (this.method == 'get') - this.url += (this.url.include('?') ? '&' : '?') + params; - else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - params += '&_='; - } - - try { - var response = new Ajax.Response(this); - if (this.options.onCreate) this.options.onCreate(response); - Ajax.Responders.dispatch('onCreate', this, response); - - this.transport.open(this.method.toUpperCase(), this.url, - this.options.asynchronous); - - if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); - - this.transport.onreadystatechange = this.onStateChange.bind(this); - this.setRequestHeaders(); - - this.body = this.method == 'post' ? (this.options.postBody || params) : null; - this.transport.send(this.body); - - /* Force Firefox to handle ready state 4 for synchronous requests */ - if (!this.options.asynchronous && this.transport.overrideMimeType) - this.onStateChange(); - - } - catch (e) { - this.dispatchException(e); - } - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState > 1 && !((readyState == 4) && this._complete)) - this.respondToReadyState(this.transport.readyState); - }, - - setRequestHeaders: function() { - var headers = { - 'X-Requested-With': 'XMLHttpRequest', - 'X-Prototype-Version': Prototype.Version, - 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' - }; - - if (this.method == 'post') { - headers['Content-type'] = this.options.contentType + - (this.options.encoding ? '; charset=' + this.options.encoding : ''); - - /* Force "Connection: close" for older Mozilla browsers to work - * around a bug where XMLHttpRequest sends an incorrect - * Content-length header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType && - (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) - headers['Connection'] = 'close'; - } - - // user-defined headers - if (typeof this.options.requestHeaders == 'object') { - var extras = this.options.requestHeaders; - - if (Object.isFunction(extras.push)) - for (var i = 0, length = extras.length; i < length; i += 2) - headers[extras[i]] = extras[i+1]; - else - $H(extras).each(function(pair) { headers[pair.key] = pair.value }); - } - - for (var name in headers) - this.transport.setRequestHeader(name, headers[name]); - }, - - success: function() { - var status = this.getStatus(); - return !status || (status >= 200 && status < 300); - }, - - getStatus: function() { - try { - return this.transport.status || 0; - } catch (e) { return 0 } - }, - - respondToReadyState: function(readyState) { - var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); - - if (state == 'Complete') { - try { - this._complete = true; - (this.options['on' + response.status] - || this.options['on' + (this.success() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - var contentType = response.getHeader('Content-type'); - if (this.options.evalJS == 'force' - || (this.options.evalJS && contentType - && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) - this.evalResponse(); - } - - try { - (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); - Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - if (state == 'Complete') { - // avoid memory leak in MSIE: clean up - this.transport.onreadystatechange = Prototype.emptyFunction; - } - }, - - getHeader: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) { return null } - }, - - evalResponse: function() { - try { - return eval((this.transport.responseText || '').unfilterJSON()); - } catch (e) { - this.dispatchException(e); - } - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Response = Class.create(); -Ajax.Response.prototype = { - initialize: function(request){ - this.request = request; - var transport = this.transport = request.transport, - readyState = this.readyState = transport.readyState; - - if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { - this.status = this.getStatus(); - this.statusText = this.getStatusText(); - this.responseText = String.interpret(transport.responseText); - this.headerJSON = this.getHeaderJSON(); - } - - if(readyState == 4) { - var xml = transport.responseXML; - this.responseXML = xml === undefined ? null : xml; - this.responseJSON = this.getResponseJSON(); - } - }, - - status: 0, - statusText: '', - - getStatus: Ajax.Request.prototype.getStatus, - - getStatusText: function() { - try { - return this.transport.statusText || ''; - } catch (e) { return '' } - }, - - getHeader: Ajax.Request.prototype.getHeader, - - getAllHeaders: function() { - try { - return this.getAllResponseHeaders(); - } catch (e) { return null } - }, - - getResponseHeader: function(name) { - return this.transport.getResponseHeader(name); - }, - - getAllResponseHeaders: function() { - return this.transport.getAllResponseHeaders(); - }, - - getHeaderJSON: function() { - var json = this.getHeader('X-JSON'); - try { - return json ? json.evalJSON(this.request.options.sanitizeJSON) : null; - } catch (e) { - this.request.dispatchException(e); - } - }, - - getResponseJSON: function() { - var options = this.request.options; - try { - if (options.evalJSON == 'force' || (options.evalJSON && - (this.getHeader('Content-type') || '').include('application/json'))) - return this.transport.responseText.evalJSON(options.sanitizeJSON); - return null; - } catch (e) { - this.request.dispatchException(e); - } - } -}; - -Ajax.Updater = Class.create(); - -Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { - initialize: function(container, url, options) { - this.container = { - success: (container.success || container), - failure: (container.failure || (container.success ? null : container)) - }; - - this.transport = Ajax.getTransport(); - this.setOptions(options); - - var onComplete = this.options.onComplete || Prototype.emptyFunction; - this.options.onComplete = (function(response, param) { - this.updateContent(response.responseText); - onComplete(response, param); - }).bind(this); - - this.request(url); - }, - - updateContent: function(responseText) { - var receiver = this.container[this.success() ? 'success' : 'failure'], - options = this.options; - - if (!options.evalScripts) responseText = responseText.stripScripts(); - - if (receiver = $(receiver)) { - if (options.insertion) { - if (Object.isString(options.insertion)) { - var insertion = { }; insertion[options.insertion] = responseText; - receiver.insert(insertion); - } - else options.insertion(receiver, responseText); - } - else receiver.update(responseText); - } - - if (this.success()) { - if (this.onComplete) this.onComplete.bind(this).defer(); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(); -Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { - initialize: function(container, url, options) { - this.setOptions(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = { }; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.options.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(responseText) { - if (this.options.decay) { - this.decay = (responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = responseText; - } - this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -function $(element) { - if (arguments.length > 1) { - for (var i = 0, elements = [], length = arguments.length; i < length; i++) - elements.push($(arguments[i])); - return elements; - } - if (Object.isString(element)) - element = document.getElementById(element); - return Element.extend(element); -} - -if (Prototype.BrowserFeatures.XPath) { - document._getElementsByXPath = function(expression, parentElement) { - var results = []; - var query = document.evaluate(expression, $(parentElement) || document, - null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - for (var i = 0, length = query.snapshotLength; i < length; i++) - results.push(query.snapshotItem(i)); - return results; - }; -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Node) - var Node = { }; - -Object.extend(Node, { - ELEMENT_NODE: 1, - ATTRIBUTE_NODE: 2, - TEXT_NODE: 3, - CDATA_SECTION_NODE: 4, - ENTITY_REFERENCE_NODE: 5, - ENTITY_NODE: 6, - PROCESSING_INSTRUCTION_NODE: 7, - COMMENT_NODE: 8, - DOCUMENT_NODE: 9, - DOCUMENT_TYPE_NODE: 10, - DOCUMENT_FRAGMENT_NODE: 11, - NOTATION_NODE: 12 -}); - -(function() { - var element = this.Element; - this.Element = function(tagName, attributes) { - attributes = attributes || { }; - tagName = tagName.toLowerCase(); - var cache = Element.cache; - if (Prototype.Browser.IE && attributes.name) { - tagName = '<' + tagName + ' name="' + attributes.name + '">'; - delete attributes.name; - return Element.writeAttribute(document.createElement(tagName), attributes); - } - if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); - return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); - }; - Object.extend(this.Element, element || { }); -}).call(window); - -Element.cache = { }; - -Element.Methods = { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function(element) { - element = $(element); - Element[Element.visible(element) ? 'hide' : 'show'](element); - return element; - }, - - hide: function(element) { - $(element).style.display = 'none'; - return element; - }, - - show: function(element) { - $(element).style.display = ''; - return element; - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - return element; - }, - - update: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - content = Object.toHTML(content); - element.innerHTML = content.stripScripts(); - content.evalScripts.bind(content).defer(); - return element; - }, - - replace: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - else if (!Object.isElement(content)) { - content = Object.toHTML(content); - var range = element.ownerDocument.createRange(); - range.selectNode(element); - content.evalScripts.bind(content).defer(); - content = range.createContextualFragment(content.stripScripts()); - } - element.parentNode.replaceChild(content, element); - return element; - }, - - insert: function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = {bottom:insertions}; - - var content, t, range; - - for (position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - t = Element._insertionTranslations[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - t.insert(element, content); - continue; - } - - content = Object.toHTML(content); - - range = element.ownerDocument.createRange(); - t.initializeRange(element, range); - t.insert(element, range.createContextualFragment(content.stripScripts())); - - content.evalScripts.bind(content).defer(); - } - - return element; - }, - - wrap: function(element, wrapper, attributes) { - element = $(element); - if (Object.isElement(wrapper)) - $(wrapper).writeAttribute(attributes || { }); - else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); - else wrapper = new Element('div', wrapper); - if (element.parentNode) - element.parentNode.replaceChild(wrapper, element); - wrapper.appendChild(element); - return element; - }, - - inspect: function(element) { - element = $(element); - var result = '<' + element.tagName.toLowerCase(); - $H({'id': 'id', 'className': 'class'}).each(function(pair) { - var property = pair.first(), attribute = pair.last(); - var value = (element[property] || '').toString(); - if (value) result += ' ' + attribute + '=' + value.inspect(true); - }); - return result + '>'; - }, - - recursivelyCollect: function(element, property) { - element = $(element); - var elements = []; - while (element = element[property]) - if (element.nodeType == 1) - elements.push(Element.extend(element)); - return elements; - }, - - ancestors: function(element) { - return $(element).recursivelyCollect('parentNode'); - }, - - descendants: function(element) { - return $A($(element).getElementsByTagName('*')).each(Element.extend); - }, - - firstDescendant: function(element) { - element = $(element).firstChild; - while (element && element.nodeType != 1) element = element.nextSibling; - return $(element); - }, - - immediateDescendants: function(element) { - if (!(element = $(element).firstChild)) return []; - while (element && element.nodeType != 1) element = element.nextSibling; - if (element) return [element].concat($(element).nextSiblings()); - return []; - }, - - previousSiblings: function(element) { - return $(element).recursivelyCollect('previousSibling'); - }, - - nextSiblings: function(element) { - return $(element).recursivelyCollect('nextSibling'); - }, - - siblings: function(element) { - element = $(element); - return element.previousSiblings().reverse().concat(element.nextSiblings()); - }, - - match: function(element, selector) { - if (Object.isString(selector)) - selector = new Selector(selector); - return selector.match($(element)); - }, - - up: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(element.parentNode); - var ancestors = element.ancestors(); - return expression ? Selector.findElement(ancestors, expression, index) : - ancestors[index || 0]; - }, - - down: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return element.firstDescendant(); - var descendants = element.descendants(); - return expression ? Selector.findElement(descendants, expression, index) : - descendants[index || 0]; - }, - - previous: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); - var previousSiblings = element.previousSiblings(); - return expression ? Selector.findElement(previousSiblings, expression, index) : - previousSiblings[index || 0]; - }, - - next: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); - var nextSiblings = element.nextSiblings(); - return expression ? Selector.findElement(nextSiblings, expression, index) : - nextSiblings[index || 0]; - }, - - select: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element, args); - }, - - adjacent: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element.parentNode, args).without(element); - }, - - identify: function(element) { - element = $(element); - var id = element.readAttribute('id'), self = arguments.callee; - if (id) return id; - do { id = 'anonymous_element_' + self.counter++ } while ($(id)); - element.writeAttribute('id', id); - return id; - }, - - readAttribute: function(element, name) { - element = $(element); - if (Prototype.Browser.IE) { - var t = Element._attributeTranslations.read; - if (t.values[name]) return t.values[name](element, name); - if (t.names[name]) name = t.names[name]; - if (name.include(':')) { - return (!element.attributes || !element.attributes[name]) ? null : - element.attributes[name].value; - } - } - return element.getAttribute(name); - }, - - writeAttribute: function(element, name, value) { - element = $(element); - var attributes = { }, t = Element._attributeTranslations.write; - - if (typeof name == 'object') attributes = name; - else attributes[name] = value === undefined ? true : value; - - for (var attr in attributes) { - var name = t.names[attr] || attr, value = attributes[attr]; - if (t.values[attr]) name = t.values[attr](element, value); - if (value === false || value === null) - element.removeAttribute(name); - else if (value === true) - element.setAttribute(name, name); - else element.setAttribute(name, value); - } - return element; - }, - - getHeight: function(element) { - return $(element).getDimensions().height; - }, - - getWidth: function(element) { - return $(element).getDimensions().width; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - var elementClassName = element.className; - return (elementClassName.length > 0 && (elementClassName == className || - elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - if (!element.hasClassName(className)) - element.className += (element.className ? ' ' : '') + className; - return element; - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - element.className = element.className.replace( - new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); - return element; - }, - - toggleClassName: function(element, className) { - if (!(element = $(element))) return; - return element[element.hasClassName(className) ? - 'removeClassName' : 'addClassName'](className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - var node = element.firstChild; - while (node) { - var nextNode = node.nextSibling; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - element.removeChild(node); - node = nextNode; - } - return element; - }, - - empty: function(element) { - return $(element).innerHTML.blank(); - }, - - descendantOf: function(element, ancestor) { - element = $(element), ancestor = $(ancestor); - while (element = element.parentNode) - if (element == ancestor) return true; - return false; - }, - - scrollTo: function(element) { - element = $(element); - var pos = element.cumulativeOffset(); - window.scrollTo(pos[0], pos[1]); - return element; - }, - - getStyle: function(element, style) { - element = $(element); - style = style == 'float' ? 'cssFloat' : style.camelize(); - var value = element.style[style]; - if (!value) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css[style] : null; - } - if (style == 'opacity') return value ? parseFloat(value) : 1.0; - return value == 'auto' ? null : value; - }, - - getOpacity: function(element) { - return $(element).getStyle('opacity'); - }, - - setStyle: function(element, styles) { - element = $(element); - var elementStyle = element.style, match; - if (Object.isString(styles)) { - element.style.cssText += ';' + styles; - return styles.include('opacity') ? - element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; - } - for (var property in styles) - if (property == 'opacity') element.setOpacity(styles[property]); - else - elementStyle[(property == 'float' || property == 'cssFloat') ? - (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') : - property] = styles[property]; - - return element; - }, - - setOpacity: function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - return element; - }, - - getDimensions: function(element) { - element = $(element); - var display = $(element).getStyle('display'); - if (display != 'none' && display != null) // Safari bug - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - var originalDisplay = els.display; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = 'block'; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = originalDisplay; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - return element; - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - return element; - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return element; - element._overflow = element.style.overflow || 'auto'; - if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') - element.style.overflow = 'hidden'; - return element; - }, - - undoClipping: function(element) { - element = $(element); - if (!element._overflow) return element; - element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; - element._overflow = null; - return element; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - if (element.tagName == 'BODY') break; - var p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - absolutize: function(element) { - element = $(element); - if (element.getStyle('position') == 'absolute') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - var offsets = element.positionedOffset(); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - return element; - }, - - relativize: function(element) { - element = $(element); - if (element.getStyle('position') == 'relative') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - return element; - }, - - cumulativeScrollOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - getOffsetParent: function(element) { - if (element.offsetParent) return $(element.offsetParent); - if (element == document.body) return $(element); - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return $(element); - - return $(document.body); - }, - - viewportOffset: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent == document.body && - Element.getStyle(element, 'position') == 'absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - if (!Prototype.Browser.Opera || element.tagName == 'BODY') { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } - } while (element = element.parentNode); - - return Element._returnOffset(valueL, valueT); - }, - - clonePosition: function(element, source) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || { }); - - // find page position of source - source = $(source); - var p = source.viewportOffset(); - - // find coordinate system to use - element = $(element); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(element, 'position') == 'absolute') { - parent = element.getOffsetParent(); - delta = parent.viewportOffset(); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if (options.setWidth) element.style.width = source.offsetWidth + 'px'; - if (options.setHeight) element.style.height = source.offsetHeight + 'px'; - return element; - } -}; - -Element.Methods.identify.counter = 1; - -if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ - function iter(name) { - return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; - } - - instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? - function(element, className) { - className = className.toString().strip(); - var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); - return cond ? document._getElementsByXPath('.//*' + cond, element) : []; - } : function(element, className) { - className = className.toString().strip(); - var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); - if (!classNames && !className) return elements; - - var nodes = $(element).getElementsByTagName('*'); - className = ' ' + className + ' '; - - for (var i = 0, child, cn; child = nodes[i]; i++) { - if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || - (classNames && classNames.all(function(name) { - return !name.toString().blank() && cn.include(' ' + name + ' '); - })))) - elements.push(Element.extend(child)); - } - return elements; - }; - - return function(className, parentElement) { - return $(parentElement || document.body).getElementsByClassName(className); - }; -}(Element.Methods); - -Object.extend(Element.Methods, { - getElementsBySelector: Element.Methods.select, - childElements: Element.Methods.immediateDescendants -}); - -Element._attributeTranslations = { - write: { - names: { - className: 'class', - htmlFor: 'for' - }, - values: { } - } -}; - - -if (!document.createRange || Prototype.Browser.Opera) { - Element.Methods.insert = function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = { bottom: insertions }; - - var t = Element._insertionTranslations, content, position, pos, tagName; - - for (position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - pos = t[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - pos.insert(element, content); - continue; - } - - content = Object.toHTML(content); - tagName = ((position == 'before' || position == 'after') - ? element.parentNode : element).tagName.toUpperCase(); - - if (t.tags[tagName]) { - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - if (position == 'top' || position == 'after') fragments.reverse(); - fragments.each(pos.insert.curry(element)); - } - else element.insertAdjacentHTML(pos.adjacency, content.stripScripts()); - - content.evalScripts.bind(content).defer(); - } - - return element; - }; -} - -if (Prototype.Browser.Opera) { - Element.Methods._getStyle = Element.Methods.getStyle; - Element.Methods.getStyle = function(element, style) { - switch(style) { - case 'left': - case 'top': - case 'right': - case 'bottom': - if (Element._getStyle(element, 'position') == 'static') return null; - default: return Element._getStyle(element, style); - } - }; - Element.Methods._readAttribute = Element.Methods.readAttribute; - Element.Methods.readAttribute = function(element, attribute) { - if (attribute == 'title') return element.title; - return Element._readAttribute(element, attribute); - }; -} - -else if (Prototype.Browser.IE) { - $w('positionedOffset getOffsetParent viewportOffset').each(function(method) { - Element.Methods[method] = Element.Methods[method].wrap( - function(proceed, element) { - element = $(element); - var position = element.getStyle('position'); - if (position != 'static') return proceed(element); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - }); - - Element.Methods.getStyle = function(element, style) { - element = $(element); - style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); - var value = element.style[style]; - if (!value && element.currentStyle) value = element.currentStyle[style]; - - if (style == 'opacity') { - if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) - if (value[1]) return parseFloat(value[1]) / 100; - return 1.0; - } - - if (value == 'auto') { - if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) - return element['offset' + style.capitalize()] + 'px'; - return null; - } - return value; - }; - - Element.Methods.setOpacity = function(element, value) { - function stripAlpha(filter){ - return filter.replace(/alpha\([^\)]*\)/gi,''); - } - element = $(element); - var filter = element.getStyle('filter'), style = element.style; - if (value == 1 || value === '') { - (filter = stripAlpha(filter)) ? - style.filter = filter : style.removeAttribute('filter'); - return element; - } else if (value < 0.00001) value = 0; - style.filter = stripAlpha(filter) + - 'alpha(opacity=' + (value * 100) + ')'; - return element; - }; - - Element._attributeTranslations = { - read: { - names: { - 'class': 'className', - 'for': 'htmlFor' - }, - values: { - _getAttr: function(element, attribute) { - return element.getAttribute(attribute, 2); - }, - _getAttrNode: function(element, attribute) { - var node = element.getAttributeNode(attribute); - return node ? node.value : ""; - }, - _getEv: function(element, attribute) { - var attribute = element.getAttribute(attribute); - return attribute ? attribute.toString().slice(23, -2) : null; - }, - _flag: function(element, attribute) { - return $(element).hasAttribute(attribute) ? attribute : null; - }, - style: function(element) { - return element.style.cssText.toLowerCase(); - }, - title: function(element) { - return element.title; - } - } - } - }; - - Element._attributeTranslations.write = { - names: Object.clone(Element._attributeTranslations.read.names), - values: { - checked: function(element, value) { - element.checked = !!value; - }, - - style: function(element, value) { - element.style.cssText = value ? value : ''; - } - } - }; - - Element._attributeTranslations.has = {}; - - $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + - 'encType maxLength readOnly longDesc').each(function(attr) { - Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; - Element._attributeTranslations.has[attr.toLowerCase()] = attr; - }); - - (function(v) { - Object.extend(v, { - href: v._getAttr, - src: v._getAttr, - type: v._getAttr, - action: v._getAttrNode, - disabled: v._flag, - checked: v._flag, - readonly: v._flag, - multiple: v._flag, - onload: v._getEv, - onunload: v._getEv, - onclick: v._getEv, - ondblclick: v._getEv, - onmousedown: v._getEv, - onmouseup: v._getEv, - onmouseover: v._getEv, - onmousemove: v._getEv, - onmouseout: v._getEv, - onfocus: v._getEv, - onblur: v._getEv, - onkeypress: v._getEv, - onkeydown: v._getEv, - onkeyup: v._getEv, - onsubmit: v._getEv, - onreset: v._getEv, - onselect: v._getEv, - onchange: v._getEv - }); - })(Element._attributeTranslations.read.values); -} - -else if (Prototype.Browser.Gecko) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1) ? 0.999999 : - (value === '') ? '' : (value < 0.00001) ? 0 : value; - return element; - }; -} - -else if (Prototype.Browser.WebKit) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - - if (value == 1) - if(element.tagName == 'IMG' && element.width) { - element.width++; element.width--; - } else try { - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch (e) { } - - return element; - }; - - // Safari returns margins on body which is incorrect if the child is absolutely - // positioned. For performance reasons, redefine Position.cumulativeOffset for - // KHTML/WebKit only. - Element.Methods.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return Element._returnOffset(valueL, valueT); - }; -} - -if (Prototype.Browser.IE || Prototype.Browser.Opera) { - // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements - Element.Methods.update = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - - content = Object.toHTML(content); - var tagName = element.tagName.toUpperCase(); - - if (tagName in Element._insertionTranslations.tags) { - $A(element.childNodes).each(function(node) { element.removeChild(node) }); - Element._getContentFromAnonymousElement(tagName, content.stripScripts()) - .each(function(node) { element.appendChild(node) }); - } - else element.innerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -if (document.createElement('div').outerHTML) { - Element.Methods.replace = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - element.parentNode.replaceChild(content, element); - return element; - } - - content = Object.toHTML(content); - var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); - - if (Element._insertionTranslations.tags[tagName]) { - var nextSibling = element.next(); - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - parent.removeChild(element); - if (nextSibling) - fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); - else - fragments.each(function(node) { parent.appendChild(node) }); - } - else element.outerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -Element._returnOffset = function(l, t) { - var result = [l, t]; - result.left = l; - result.top = t; - return result; -}; - -Element._getContentFromAnonymousElement = function(tagName, html) { - var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; - div.innerHTML = t[0] + html + t[1]; - t[2].times(function() { div = div.firstChild }); - return $A(div.childNodes); -}; - -Element._insertionTranslations = { - before: { - adjacency: 'beforeBegin', - insert: function(element, node) { - element.parentNode.insertBefore(node, element); - }, - initializeRange: function(element, range) { - range.setStartBefore(element); - } - }, - top: { - adjacency: 'afterBegin', - insert: function(element, node) { - element.insertBefore(node, element.firstChild); - }, - initializeRange: function(element, range) { - range.selectNodeContents(element); - range.collapse(true); - } - }, - bottom: { - adjacency: 'beforeEnd', - insert: function(element, node) { - element.appendChild(node); - } - }, - after: { - adjacency: 'afterEnd', - insert: function(element, node) { - element.parentNode.insertBefore(node, element.nextSibling); - }, - initializeRange: function(element, range) { - range.setStartAfter(element); - } - }, - tags: { - TABLE: ['', '
', 1], - TBODY: ['', '
', 2], - TR: ['', '
', 3], - TD: ['
', '
', 4], - SELECT: ['', 1] - } -}; - -(function() { - this.bottom.initializeRange = this.top.initializeRange; - Object.extend(this.tags, { - THEAD: this.tags.TBODY, - TFOOT: this.tags.TBODY, - TH: this.tags.TD - }); -}).call(Element._insertionTranslations); - -Element.Methods.Simulated = { - hasAttribute: function(element, attribute) { - attribute = Element._attributeTranslations.has[attribute] || attribute; - var node = $(element).getAttributeNode(attribute); - return node && node.specified; - } -}; - -Element.Methods.ByTag = { }; - -Object.extend(Element, Element.Methods); - -if (!Prototype.BrowserFeatures.ElementExtensions && - document.createElement('div').__proto__) { - window.HTMLElement = { }; - window.HTMLElement.prototype = document.createElement('div').__proto__; - Prototype.BrowserFeatures.ElementExtensions = true; -} - -Element.extend = (function() { - if (Prototype.BrowserFeatures.SpecificElementExtensions) - return Prototype.K; - - var Methods = { }, ByTag = Element.Methods.ByTag; - - var extend = Object.extend(function(element) { - if (!element || element._extendedByPrototype || - element.nodeType != 1 || element == window) return element; - - var methods = Object.clone(Methods), - tagName = element.tagName, property, value; - - // extend methods for specific tags - if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - - for (property in methods) { - value = methods[property]; - if (Object.isFunction(value) && !(property in element)) - element[property] = value.methodize(); - } - - element._extendedByPrototype = Prototype.emptyFunction; - return element; - - }, { - refresh: function() { - // extend methods for all tags (Safari doesn't need this) - if (!Prototype.BrowserFeatures.ElementExtensions) { - Object.extend(Methods, Element.Methods); - Object.extend(Methods, Element.Methods.Simulated); - } - } - }); - - extend.refresh(); - return extend; -})(); - -Element.hasAttribute = function(element, attribute) { - if (element.hasAttribute) return element.hasAttribute(attribute); - return Element.Methods.Simulated.hasAttribute(element, attribute); -}; - -Element.addMethods = function(methods) { - var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; - - if (!methods) { - Object.extend(Form, Form.Methods); - Object.extend(Form.Element, Form.Element.Methods); - Object.extend(Element.Methods.ByTag, { - "FORM": Object.clone(Form.Methods), - "INPUT": Object.clone(Form.Element.Methods), - "SELECT": Object.clone(Form.Element.Methods), - "TEXTAREA": Object.clone(Form.Element.Methods) - }); - } - - if (arguments.length == 2) { - var tagName = methods; - methods = arguments[1]; - } - - if (!tagName) Object.extend(Element.Methods, methods || { }); - else { - if (Object.isArray(tagName)) tagName.each(extend); - else extend(tagName); - } - - function extend(tagName) { - tagName = tagName.toUpperCase(); - if (!Element.Methods.ByTag[tagName]) - Element.Methods.ByTag[tagName] = { }; - Object.extend(Element.Methods.ByTag[tagName], methods); - } - - function copy(methods, destination, onlyIfAbsent) { - onlyIfAbsent = onlyIfAbsent || false; - for (var property in methods) { - var value = methods[property]; - if (!Object.isFunction(value)) continue; - if (!onlyIfAbsent || !(property in destination)) - destination[property] = value.methodize(); - } - } - - function findDOMClass(tagName) { - var klass; - var trans = { - "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", - "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", - "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", - "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", - "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": - "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": - "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": - "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": - "FrameSet", "IFRAME": "IFrame" - }; - if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName.capitalize() + 'Element'; - if (window[klass]) return window[klass]; - - window[klass] = { }; - window[klass].prototype = document.createElement(tagName).__proto__; - return window[klass]; - } - - if (F.ElementExtensions) { - copy(Element.Methods, HTMLElement.prototype); - copy(Element.Methods.Simulated, HTMLElement.prototype, true); - } - - if (F.SpecificElementExtensions) { - for (var tag in Element.Methods.ByTag) { - var klass = findDOMClass(tag); - if (Object.isUndefined(klass)) continue; - copy(T[tag], klass.prototype); - } - } - - Object.extend(Element, Element.Methods); - delete Element.ByTag; - - if (Element.extend.refresh) Element.extend.refresh(); - Element.cache = { }; -}; - -document.viewport = { - getDimensions: function() { - var dimensions = { }; - $w('width height').each(function(d) { - var D = d.capitalize(); - dimensions[d] = self['inner' + D] || - (document.documentElement['client' + D] || document.body['client' + D]); - }); - return dimensions; - }, - - getWidth: function() { - return this.getDimensions().width; - }, - - getHeight: function() { - return this.getDimensions().height; - }, - - getScrollOffsets: function() { - return Element._returnOffset( - window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, - window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); - } -}; -/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license. Please see http://www.yui-ext.com/ for more information. */ - -var Selector = Class.create(); - -Selector.prototype = { - initialize: function(expression) { - this.expression = expression.strip(); - this.compileMatcher(); - }, - - compileMatcher: function() { - // Selectors with namespaced attributes can't use the XPath version - if (Prototype.BrowserFeatures.XPath && !(/\[[\w-]*?:/).test(this.expression)) - return this.compileXPathMatcher(); - - var e = this.expression, ps = Selector.patterns, h = Selector.handlers, - c = Selector.criteria, le, p, m; - - if (Selector._cache[e]) { - this.matcher = Selector._cache[e]; - return; - } - - this.matcher = ["this.matcher = function(root) {", - "var r = root, h = Selector.handlers, c = false, n;"]; - - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : - new Template(c[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.matcher.push("return h.unique(n);\n}"); - eval(this.matcher.join('\n')); - Selector._cache[this.expression] = this.matcher; - }, - - compileXPathMatcher: function() { - var e = this.expression, ps = Selector.patterns, - x = Selector.xpath, le, m; - - if (Selector._cache[e]) { - this.xpath = Selector._cache[e]; return; - } - - this.matcher = ['.//*']; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - if (m = e.match(ps[i])) { - this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : - new Template(x[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.xpath = this.matcher.join(''); - Selector._cache[this.expression] = this.xpath; - }, - - findElements: function(root) { - root = root || document; - if (this.xpath) return document._getElementsByXPath(this.xpath, root); - return this.matcher(root); - }, - - match: function(element) { - this.tokens = []; - - var e = this.expression, ps = Selector.patterns, as = Selector.assertions; - var le, p, m; - - while (e && le !== e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - // use the Selector.assertions methods unless the selector - // is too complex. - if (as[i]) { - this.tokens.push([i, Object.clone(m)]); - e = e.replace(m[0], ''); - } else { - // reluctantly do a document-wide search - // and look for a match in the array - return this.findElements(document).include(element); - } - } - } - } - - var match = true, name, matches; - for (var i = 0, token; token = this.tokens[i]; i++) { - name = token[0], matches = token[1]; - if (!Selector.assertions[name](element, matches)) { - match = false; break; - } - } - - return match; - }, - - toString: function() { - return this.expression; - }, - - inspect: function() { - return "#"; - } -}; - -Object.extend(Selector, { - _cache: { }, - - xpath: { - descendant: "//*", - child: "/*", - adjacent: "/following-sibling::*[1]", - laterSibling: '/following-sibling::*', - tagName: function(m) { - if (m[1] == '*') return ''; - return "[local-name()='" + m[1].toLowerCase() + - "' or local-name()='" + m[1].toUpperCase() + "']"; - }, - className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", - id: "[@id='#{1}']", - attrPresence: "[@#{1}]", - attr: function(m) { - m[3] = m[5] || m[6]; - return new Template(Selector.xpath.operators[m[2]]).evaluate(m); - }, - pseudo: function(m) { - var h = Selector.xpath.pseudos[m[1]]; - if (!h) return ''; - if (Object.isFunction(h)) return h(m); - return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); - }, - operators: { - '=': "[@#{1}='#{3}']", - '!=': "[@#{1}!='#{3}']", - '^=': "[starts-with(@#{1}, '#{3}')]", - '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", - '*=': "[contains(@#{1}, '#{3}')]", - '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", - '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" - }, - pseudos: { - 'first-child': '[not(preceding-sibling::*)]', - 'last-child': '[not(following-sibling::*)]', - 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', - 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", - 'checked': "[@checked]", - 'disabled': "[@disabled]", - 'enabled': "[not(@disabled)]", - 'not': function(m) { - var e = m[6], p = Selector.patterns, - x = Selector.xpath, le, m, v; - - var exclusion = []; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in p) { - if (m = e.match(p[i])) { - v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); - exclusion.push("(" + v.substring(1, v.length - 1) + ")"); - e = e.replace(m[0], ''); - break; - } - } - } - return "[not(" + exclusion.join(" and ") + ")]"; - }, - 'nth-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); - }, - 'nth-last-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); - }, - 'nth-of-type': function(m) { - return Selector.xpath.pseudos.nth("position() ", m); - }, - 'nth-last-of-type': function(m) { - return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); - }, - 'first-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); - }, - 'last-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); - }, - 'only-of-type': function(m) { - var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); - }, - nth: function(fragment, m) { - var mm, formula = m[6], predicate; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - if (mm = formula.match(/^(\d+)$/)) // digit only - return '[' + fragment + "= " + mm[1] + ']'; - if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (mm[1] == "-") mm[1] = -1; - var a = mm[1] ? Number(mm[1]) : 1; - var b = mm[2] ? Number(mm[2]) : 0; - predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + - "((#{fragment} - #{b}) div #{a} >= 0)]"; - return new Template(predicate).evaluate({ - fragment: fragment, a: a, b: b }); - } - } - } - }, - - criteria: { - tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', - className: 'n = h.className(n, r, "#{1}", c); c = false;', - id: 'n = h.id(n, r, "#{1}", c); c = false;', - attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;', - attr: function(m) { - m[3] = (m[5] || m[6]); - return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m); - }, - pseudo: function(m) { - if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); - return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); - }, - descendant: 'c = "descendant";', - child: 'c = "child";', - adjacent: 'c = "adjacent";', - laterSibling: 'c = "laterSibling";' - }, - - patterns: { - // combinators must be listed first - // (and descendant needs to be last combinator) - laterSibling: /^\s*~\s*/, - child: /^\s*>\s*/, - adjacent: /^\s*\+\s*/, - descendant: /^\s/, - - // selectors follow - tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, - id: /^#([\w\-\*]+)(\b|$)/, - className: /^\.([\w\-\*]+)(\b|$)/, - pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|\s|(?=:))/, - attrPresence: /^\[([\w]+)\]/, - attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ - }, - - // for Selector.match and Element#match - assertions: { - tagName: function(element, matches) { - return matches[1].toUpperCase() == element.tagName.toUpperCase(); - }, - - className: function(element, matches) { - return Element.hasClassName(element, matches[1]); - }, - - id: function(element, matches) { - return element.id === matches[1]; - }, - - attrPresence: function(element, matches) { - return Element.hasAttribute(element, matches[1]); - }, - - attr: function(element, matches) { - var nodeValue = Element.readAttribute(element, matches[1]); - return Selector.operators[matches[2]](nodeValue, matches[3]); - } - }, - - handlers: { - // UTILITY FUNCTIONS - // joins two collections - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - a.push(node); - return a; - }, - - // marks an array of nodes for counting - mark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._counted = true; - return nodes; - }, - - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._counted = undefined; - return nodes; - }, - - // mark each child node with its position (for nth calls) - // "ofType" flag indicates whether we're indexing for nth-of-type - // rather than nth-child - index: function(parentNode, reverse, ofType) { - parentNode._counted = true; - if (reverse) { - for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { - node = nodes[i]; - if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; - } - } else { - for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) - if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; - } - }, - - // filters out duplicates and extends all nodes - unique: function(nodes) { - if (nodes.length == 0) return nodes; - var results = [], n; - for (var i = 0, l = nodes.length; i < l; i++) - if (!(n = nodes[i])._counted) { - n._counted = true; - results.push(Element.extend(n)); - } - return Selector.handlers.unmark(results); - }, - - // COMBINATOR FUNCTIONS - descendant: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName('*')); - return results; - }, - - child: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) { - for (var j = 0, children = [], child; child = node.childNodes[j]; j++) - if (child.nodeType == 1 && child.tagName != '!') results.push(child); - } - return results; - }, - - adjacent: function(nodes) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - var next = this.nextElementSibling(node); - if (next) results.push(next); - } - return results; - }, - - laterSibling: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, Element.nextSiblings(node)); - return results; - }, - - nextElementSibling: function(node) { - while (node = node.nextSibling) - if (node.nodeType == 1) return node; - return null; - }, - - previousElementSibling: function(node) { - while (node = node.previousSibling) - if (node.nodeType == 1) return node; - return null; - }, - - // TOKEN FUNCTIONS - tagName: function(nodes, root, tagName, combinator) { - tagName = tagName.toUpperCase(); - var results = [], h = Selector.handlers; - if (nodes) { - if (combinator) { - // fastlane for ordinary descendant combinators - if (combinator == "descendant") { - for (var i = 0, node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName(tagName)); - return results; - } else nodes = this[combinator](nodes); - if (tagName == "*") return nodes; - } - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName.toUpperCase() == tagName) results.push(node); - return results; - } else return root.getElementsByTagName(tagName); - }, - - id: function(nodes, root, id, combinator) { - var targetNode = $(id), h = Selector.handlers; - if (!targetNode) return []; - if (!nodes && root == document) return [targetNode]; - if (nodes) { - if (combinator) { - if (combinator == 'child') { - for (var i = 0, node; node = nodes[i]; i++) - if (targetNode.parentNode == node) return [targetNode]; - } else if (combinator == 'descendant') { - for (var i = 0, node; node = nodes[i]; i++) - if (Element.descendantOf(targetNode, node)) return [targetNode]; - } else if (combinator == 'adjacent') { - for (var i = 0, node; node = nodes[i]; i++) - if (Selector.handlers.previousElementSibling(targetNode) == node) - return [targetNode]; - } else nodes = h[combinator](nodes); - } - for (var i = 0, node; node = nodes[i]; i++) - if (node == targetNode) return [targetNode]; - return []; - } - return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; - }, - - className: function(nodes, root, className, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - return Selector.handlers.byClassName(nodes, root, className); - }, - - byClassName: function(nodes, root, className) { - if (!nodes) nodes = Selector.handlers.descendant([root]); - var needle = ' ' + className + ' '; - for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { - nodeClassName = node.className; - if (nodeClassName.length == 0) continue; - if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) - results.push(node); - } - return results; - }, - - attrPresence: function(nodes, root, attr) { - var results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (Element.hasAttribute(node, attr)) results.push(node); - return results; - }, - - attr: function(nodes, root, attr, value, operator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - var handler = Selector.operators[operator], results = []; - for (var i = 0, node; node = nodes[i]; i++) { - var nodeValue = Element.readAttribute(node, attr); - if (nodeValue === null) continue; - if (handler(nodeValue, value)) results.push(node); - } - return results; - }, - - pseudo: function(nodes, name, value, root, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - if (!nodes) nodes = root.getElementsByTagName("*"); - return Selector.pseudos[name](nodes, value, root); - } - }, - - pseudos: { - 'first-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.previousElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'last-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.nextElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'only-child': function(nodes, value, root) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) - results.push(node); - return results; - }, - 'nth-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root); - }, - 'nth-last-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true); - }, - 'nth-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, false, true); - }, - 'nth-last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true, true); - }, - 'first-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, false, true); - }, - 'last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, true, true); - }, - 'only-of-type': function(nodes, formula, root) { - var p = Selector.pseudos; - return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); - }, - - // handles the an+b logic - getIndices: function(a, b, total) { - if (a == 0) return b > 0 ? [b] : []; - return $R(1, total).inject([], function(memo, i) { - if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); - return memo; - }); - }, - - // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type - nth: function(nodes, formula, root, reverse, ofType) { - if (nodes.length == 0) return []; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - var h = Selector.handlers, results = [], indexed = [], m; - h.mark(nodes); - for (var i = 0, node; node = nodes[i]; i++) { - if (!node.parentNode._counted) { - h.index(node.parentNode, reverse, ofType); - indexed.push(node.parentNode); - } - } - if (formula.match(/^\d+$/)) { // just a number - formula = Number(formula); - for (var i = 0, node; node = nodes[i]; i++) - if (node.nodeIndex == formula) results.push(node); - } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (m[1] == "-") m[1] = -1; - var a = m[1] ? Number(m[1]) : 1; - var b = m[2] ? Number(m[2]) : 0; - var indices = Selector.pseudos.getIndices(a, b, nodes.length); - for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { - for (var j = 0; j < l; j++) - if (node.nodeIndex == indices[j]) results.push(node); - } - } - h.unmark(nodes); - h.unmark(indexed); - return results; - }, - - 'empty': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - // IE treats comments as element nodes - if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; - results.push(node); - } - return results; - }, - - 'not': function(nodes, selector, root) { - var h = Selector.handlers, selectorType, m; - var exclusions = new Selector(selector).findElements(root); - h.mark(exclusions); - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node._counted) results.push(node); - h.unmark(exclusions); - return results; - }, - - 'enabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node.disabled) results.push(node); - return results; - }, - - 'disabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.disabled) results.push(node); - return results; - }, - - 'checked': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.checked) results.push(node); - return results; - } - }, - - operators: { - '=': function(nv, v) { return nv == v; }, - '!=': function(nv, v) { return nv != v; }, - '^=': function(nv, v) { return nv.startsWith(v); }, - '$=': function(nv, v) { return nv.endsWith(v); }, - '*=': function(nv, v) { return nv.include(v); }, - '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, - '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } - }, - - matchElements: function(elements, expression) { - var matches = new Selector(expression).findElements(), h = Selector.handlers; - h.mark(matches); - for (var i = 0, results = [], element; element = elements[i]; i++) - if (element._counted) results.push(element); - h.unmark(matches); - return results; - }, - - findElement: function(elements, expression, index) { - if (Object.isNumber(expression)) { - index = expression; expression = false; - } - return Selector.matchElements(elements, expression || '*')[index || 0]; - }, - - findChildElements: function(element, expressions) { - var exprs = expressions.join(','), expressions = []; - exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { - expressions.push(m[1].strip()); - }); - var results = [], h = Selector.handlers; - for (var i = 0, l = expressions.length, selector; i < l; i++) { - selector = new Selector(expressions[i].strip()); - h.concat(results, selector.findElements(element)); - } - return (l > 1) ? h.unique(results) : results; - } -}); - -function $$() { - return Selector.findChildElements(document, $A(arguments)); -} -var Form = { - reset: function(form) { - $(form).reset(); - return form; - }, - - serializeElements: function(elements, options) { - if (typeof options != 'object') options = { hash: !!options }; - else if (options.hash === undefined) options.hash = true; - var key, value, submitted = false, submit = options.submit; - - var data = elements.inject({ }, function(result, element) { - if (!element.disabled && element.name) { - key = element.name; value = $(element).getValue(); - if (value != null && (element.type != 'submit' || (!submitted && - submit !== false && (!submit || key == submit) && (submitted = true)))) { - if (key in result) { - // a key is already present; construct an array of values - if (!Object.isArray(result[key])) result[key] = [result[key]]; - result[key].push(value); - } - else result[key] = value; - } - } - return result; - }); - - return options.hash ? data : Hash.toQueryString(data); - } -}; - -Form.Methods = { - serialize: function(form, options) { - return Form.serializeElements(Form.getElements(form), options); - }, - - getElements: function(form) { - return $A($(form).getElementsByTagName('*')).inject([], - function(elements, child) { - if (Form.Element.Serializers[child.tagName.toLowerCase()]) - elements.push(Element.extend(child)); - return elements; - } - ); - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) return $A(inputs).map(Element.extend); - - for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || (name && input.name != name)) - continue; - matchingInputs.push(Element.extend(input)); - } - - return matchingInputs; - }, - - disable: function(form) { - form = $(form); - Form.getElements(form).invoke('disable'); - return form; - }, - - enable: function(form) { - form = $(form); - Form.getElements(form).invoke('enable'); - return form; - }, - - findFirstElement: function(form) { - var elements = $(form).getElements().findAll(function(element) { - return 'hidden' != element.type && !element.disabled; - }); - var firstByIndex = elements.findAll(function(element) { - return element.hasAttribute('tabIndex') && element.tabIndex >= 0; - }).sortBy(function(element) { return element.tabIndex }).first(); - - return firstByIndex ? firstByIndex : elements.find(function(element) { - return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - form = $(form); - form.findFirstElement().activate(); - return form; - }, - - request: function(form, options) { - form = $(form), options = Object.clone(options || { }); - - var params = options.parameters, action = form.readAttribute('action') || ''; - if (action.blank()) action = window.location.href; - options.parameters = form.serialize(true); - - if (params) { - if (Object.isString(params)) params = params.toQueryParams(); - Object.extend(options.parameters, params); - } - - if (form.hasAttribute('method') && !options.method) - options.method = form.method; - - return new Ajax.Request(action, options); - } -}; - -/*--------------------------------------------------------------------------*/ - -Form.Element = { - focus: function(element) { - $(element).focus(); - return element; - }, - - select: function(element) { - $(element).select(); - return element; - } -}; - -Form.Element.Methods = { - serialize: function(element) { - element = $(element); - if (!element.disabled && element.name) { - var value = element.getValue(); - if (value != undefined) { - var pair = { }; - pair[element.name] = value; - return Hash.toQueryString(pair); - } - } - return ''; - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - return Form.Element.Serializers[method](element); - }, - - setValue: function(element, value) { - element = $(element); - var method = element.tagName.toLowerCase(); - Form.Element.Serializers[method](element, value); - return element; - }, - - clear: function(element) { - $(element).value = ''; - return element; - }, - - present: function(element) { - return $(element).value != ''; - }, - - activate: function(element) { - element = $(element); - try { - element.focus(); - if (element.select && (element.tagName.toLowerCase() != 'input' || - !['button', 'reset', 'submit'].include(element.type))) - element.select(); - } catch (e) { } - return element; - }, - - disable: function(element) { - element = $(element); - element.blur(); - element.disabled = true; - return element; - }, - - enable: function(element) { - element = $(element); - element.disabled = false; - return element; - } -}; - -/*--------------------------------------------------------------------------*/ - -var Field = Form.Element; -var $F = Form.Element.Methods.getValue; - -/*--------------------------------------------------------------------------*/ - -Form.Element.Serializers = { - input: function(element, value) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element, value); - default: - return Form.Element.Serializers.textarea(element, value); - } - }, - - inputSelector: function(element, value) { - if (value === undefined) return element.checked ? element.value : null; - else element.checked = !!value; - }, - - textarea: function(element, value) { - if (value === undefined) return element.value; - else element.value = value; - }, - - select: function(element, index) { - if (index === undefined) - return this[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - else { - var opt, value, single = !Object.isArray(index); - for (var i = 0, length = element.length; i < length; i++) { - opt = element.options[i]; - value = this.optionValue(opt); - if (single) { - if (value == index) { - opt.selected = true; - return; - } - } - else opt.selected = index.include(value); - } - } - }, - - selectOne: function(element) { - var index = element.selectedIndex; - return index >= 0 ? this.optionValue(element.options[index]) : null; - }, - - selectMany: function(element) { - var values, length = element.length; - if (!length) return null; - - for (var i = 0, values = []; i < length; i++) { - var opt = element.options[i]; - if (opt.selected) values.push(this.optionValue(opt)); - } - return values; - }, - - optionValue: function(opt) { - // extend element because hasAttribute may not be native - return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; - } -}; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = function() { }; -Abstract.TimedObserver.prototype = { - initialize: function(element, frequency, callback) { - this.frequency = frequency; - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - var value = this.getValue(); - var changed = (Object.isString(this.lastValue) && Object.isString(value) - ? this.lastValue != value : String(this.lastValue) != String(value)); - if (changed) { - this.callback(this.element, value); - this.lastValue = value; - } - } -}; - -Form.Element.Observer = Class.create(); -Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(); -Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = function() { }; -Abstract.EventObserver.prototype = { - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - Form.getElements(this.element).each(this.registerCallback.bind(this)); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - default: - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -}; - -Form.Element.EventObserver = Class.create(); -Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(); -Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) var Event = { }; - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - KEY_HOME: 36, - KEY_END: 35, - KEY_PAGEUP: 33, - KEY_PAGEDOWN: 34, - KEY_INSERT: 45, - - DOMEvents: ['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', - 'mousemove', 'mouseout', 'keypress', 'keydown', 'keyup', - 'load', 'unload', 'abort', 'error', 'resize', 'scroll', - 'select', 'change', 'submit', 'reset', 'focus', 'blur'], - - cache: { }, - - relatedTarget: function(event) { - var element; - switch(event.type) { - case 'mouseover': element = event.fromElement; break; - case 'mouseout': element = event.toElement; break; - default: return null; - } - return Element.extend(element); - } -}); - -Event.Methods = { - element: function(event) { - var node = event.target; - return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); - }, - - findElement: function(event, expression) { - var element = Event.element(event); - return element.match(expression) ? element : element.up(expression); - }, - - isLeftClick: function(event) { - return (((event.which) && (event.which == 1)) || - ((event.button) && (event.button == 1))); - }, - - pointer: function(event) { - return { - x: event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)), - y: event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)) - }; - }, - - pointerX: function(event) { return Event.pointer(event).x }, - pointerY: function(event) { return Event.pointer(event).y }, - - stop: function(event) { - event.preventDefault(); - event.stopPropagation(); - } -}; - -Event.extend = (function() { - var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { - m[name] = Event.Methods[name].methodize(); - return m; - }); - - if (Prototype.Browser.IE) { - Object.extend(methods, { - stopPropagation: function() { this.cancelBubble = true }, - preventDefault: function() { this.returnValue = false }, - inspect: function() { return "[object Event]" } - }); - - return function(event) { - if (!event) return false; - if (event._extendedByPrototype) return event; - - event._extendedByPrototype = Prototype.emptyFunction; - var pointer = Event.pointer(event); - Object.extend(event, { - target: event.srcElement, - relatedTarget: Event.relatedTarget(event), - pageX: pointer.x, - pageY: pointer.y - }); - return Object.extend(event, methods); - }; - - } else { - Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; - Object.extend(Event.prototype, methods); - return Prototype.K; - } -})(); - -Object.extend(Event, (function() { - var cache = Event.cache; - - function getEventID(element) { - if (element._eventID) return element._eventID; - arguments.callee.id = arguments.callee.id || 1; - return element._eventID = ++arguments.callee.id; - } - - function getDOMEventName(eventName) { - if (!Event.DOMEvents.include(eventName)) return "dataavailable"; - return { keypress: "keydown" }[eventName] || eventName; - } - - function getCacheForID(id) { - return cache[id] = cache[id] || { }; - } - - function getWrappersForEventName(id, eventName) { - var c = getCacheForID(id); - return c[eventName] = c[eventName] || []; - } - - function createWrapper(id, eventName, handler) { - var c = getWrappersForEventName(id, eventName); - if (c.pluck("handler").include(handler)) return false; - - var wrapper = function(event) { - if (event.eventName && event.eventName != eventName) - return false; - - Event.extend(event); - handler.call(event.target, event); - }; - - wrapper.handler = handler; - c.push(wrapper); - return wrapper; - } - - function findWrapper(id, eventName, handler) { - var c = getWrappersForEventName(id, eventName); - return c.find(function(wrapper) { return wrapper.handler == handler }); - } - - function destroyWrapper(id, eventName, handler) { - var c = getCacheForID(id); - if (!c[eventName]) return false; - c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); - } - - function destroyCache() { - for (var id in cache) - for (var eventName in cache[id]) - cache[id][eventName] = null; - } - - if (window.attachEvent) { - window.attachEvent("onunload", destroyCache); - } - - return { - observe: function(element, eventName, handler) { - element = $(element); - var id = getEventID(element), name = getDOMEventName(eventName); - - var wrapper = createWrapper(id, eventName, handler); - if (!wrapper) return element; - - if (element.addEventListener) { - element.addEventListener(name, wrapper, false); - } else { - element.attachEvent("on" + name, wrapper); - } - - return element; - }, - - stopObserving: function(element, eventName, handler) { - element = $(element); - var id = getEventID(element), name = getDOMEventName(eventName); - - if (!handler && eventName) { - getWrappersForEventName(id, eventName).each(function(wrapper) { - element.stopObserving(eventName, wrapper.handler); - }); - return element; - - } else if (!eventName) { - Object.keys(getCacheForID(id)).each(function(eventName) { - element.stopObserving(eventName); - }); - return element; - } - - var wrapper = findWrapper(id, eventName, handler); - if (!wrapper) return element; - - if (element.removeEventListener) { - element.removeEventListener(name, wrapper, false); - } else { - element.detachEvent("on" + name, wrapper); - } - - destroyWrapper(id, eventName, handler); - - return element; - }, - - fire: function(element, eventName, memo) { - element = $(element); - if (element == document && document.createEvent && !element.dispatchEvent) - element = document.documentElement; - - if (document.createEvent) { - var event = document.createEvent("HTMLEvents"); - event.initEvent("dataavailable", true, true); - } else { - var event = document.createEventObject(); - event.eventType = "ondataavailable"; - } - - event.eventName = eventName; - event.memo = memo || { }; - - if (document.createEvent) { - element.dispatchEvent(event); - } else { - element.fireEvent(event.eventType, event); - } - - return event; - } - }; -})()); - -Object.extend(Event, Event.Methods); - -Element.addMethods({ - fire: Event.fire, - observe: Event.observe, - stopObserving: Event.stopObserving -}); - -Object.extend(document, { - fire: Element.Methods.fire.methodize(), - observe: Element.Methods.observe.methodize(), - stopObserving: Element.Methods.stopObserving.methodize() -}); - -(function() { - /* Support for the DOMContentLoaded event is based on work by Dan Webb, - Matthias Miller, Dean Edwards and John Resig. */ - - var timer, fired = false; - - function fireContentLoadedEvent() { - if (fired) return; - if (timer) window.clearInterval(timer); - document.fire("contentloaded"); - fired = true; - } - - if (document.addEventListener) { - if (Prototype.Browser.WebKit) { - timer = window.setInterval(function() { - if (/loaded|complete/.test(document.readyState)) - fireContentLoadedEvent(); - }, 0); - - Event.observe(window, "load", fireContentLoadedEvent); - - } else { - document.addEventListener("DOMContentLoaded", - fireContentLoadedEvent, false); - } - - } else { - document.write("'); - }, - REQUIRED_PROTOTYPE: '1.5.1', - load: function() { - function convertVersionString(versionString){ - var r = versionString.split('.'); - return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]); - } - - if((typeof Prototype=='undefined') || - (typeof Element == 'undefined') || - (typeof Element.Methods=='undefined') || - (convertVersionString(Prototype.Version) < - convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE))) - throw("script.aculo.us requires the Prototype JavaScript framework >= " + - Scriptaculous.REQUIRED_PROTOTYPE); - - $A(document.getElementsByTagName("script")).findAll( function(s) { - return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) - }).each( function(s) { - var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); - var includes = s.src.match(/\?.*load=([a-z,]*)/); - (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each( - function(include) { Scriptaculous.require(path+include+'.js') }); - }); - } -} - -Scriptaculous.load(); \ No newline at end of file diff --git a/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/slider.js b/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/slider.js deleted file mode 100644 index c1a84eb..0000000 --- a/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/slider.js +++ /dev/null @@ -1,277 +0,0 @@ -// script.aculo.us slider.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007 - -// Copyright (c) 2005-2007 Marty Haught, Thomas Fuchs -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -if(!Control) var Control = {}; -Control.Slider = Class.create(); - -// options: -// axis: 'vertical', or 'horizontal' (default) -// -// callbacks: -// onChange(value) -// onSlide(value) -Control.Slider.prototype = { - initialize: function(handle, track, options) { - var slider = this; - - if(handle instanceof Array) { - this.handles = handle.collect( function(e) { return $(e) }); - } else { - this.handles = [$(handle)]; - } - - this.track = $(track); - this.options = options || {}; - - this.axis = this.options.axis || 'horizontal'; - this.increment = this.options.increment || 1; - this.step = parseInt(this.options.step || '1'); - this.range = this.options.range || $R(0,1); - - this.value = 0; // assure backwards compat - this.values = this.handles.map( function() { return 0 }); - this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false; - this.options.startSpan = $(this.options.startSpan || null); - this.options.endSpan = $(this.options.endSpan || null); - - this.restricted = this.options.restricted || false; - - this.maximum = this.options.maximum || this.range.end; - this.minimum = this.options.minimum || this.range.start; - - // Will be used to align the handle onto the track, if necessary - this.alignX = parseInt(this.options.alignX || '0'); - this.alignY = parseInt(this.options.alignY || '0'); - - this.trackLength = this.maximumOffset() - this.minimumOffset(); - - this.handleLength = this.isVertical() ? - (this.handles[0].offsetHeight != 0 ? - this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : - (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : - this.handles[0].style.width.replace(/px$/,"")); - - this.active = false; - this.dragging = false; - this.disabled = false; - - if(this.options.disabled) this.setDisabled(); - - // Allowed values array - this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; - if(this.allowedValues) { - this.minimum = this.allowedValues.min(); - this.maximum = this.allowedValues.max(); - } - - this.eventMouseDown = this.startDrag.bindAsEventListener(this); - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.update.bindAsEventListener(this); - - // Initialize handles in reverse (make sure first handle is active) - this.handles.each( function(h,i) { - i = slider.handles.length-1-i; - slider.setValue(parseFloat( - (slider.options.sliderValue instanceof Array ? - slider.options.sliderValue[i] : slider.options.sliderValue) || - slider.range.start), i); - Element.makePositioned(h); // fix IE - Event.observe(h, "mousedown", slider.eventMouseDown); - }); - - Event.observe(this.track, "mousedown", this.eventMouseDown); - Event.observe(document, "mouseup", this.eventMouseUp); - Event.observe(document, "mousemove", this.eventMouseMove); - - this.initialized = true; - }, - dispose: function() { - var slider = this; - Event.stopObserving(this.track, "mousedown", this.eventMouseDown); - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - this.handles.each( function(h) { - Event.stopObserving(h, "mousedown", slider.eventMouseDown); - }); - }, - setDisabled: function(){ - this.disabled = true; - }, - setEnabled: function(){ - this.disabled = false; - }, - getNearestValue: function(value){ - if(this.allowedValues){ - if(value >= this.allowedValues.max()) return(this.allowedValues.max()); - if(value <= this.allowedValues.min()) return(this.allowedValues.min()); - - var offset = Math.abs(this.allowedValues[0] - value); - var newValue = this.allowedValues[0]; - this.allowedValues.each( function(v) { - var currentOffset = Math.abs(v - value); - if(currentOffset <= offset){ - newValue = v; - offset = currentOffset; - } - }); - return newValue; - } - if(value > this.range.end) return this.range.end; - if(value < this.range.start) return this.range.start; - return value; - }, - setValue: function(sliderValue, handleIdx){ - if(!this.active) { - this.activeHandleIdx = handleIdx || 0; - this.activeHandle = this.handles[this.activeHandleIdx]; - this.updateStyles(); - } - handleIdx = handleIdx || this.activeHandleIdx || 0; - if(this.initialized && this.restricted) { - if((handleIdx>0) && (sliderValuethis.values[handleIdx+1])) - sliderValue = this.values[handleIdx+1]; - } - sliderValue = this.getNearestValue(sliderValue); - this.values[handleIdx] = sliderValue; - this.value = this.values[0]; // assure backwards compat - - this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = - this.translateToPx(sliderValue); - - this.drawSpans(); - if(!this.dragging || !this.event) this.updateFinished(); - }, - setValueBy: function(delta, handleIdx) { - this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, - handleIdx || this.activeHandleIdx || 0); - }, - translateToPx: function(value) { - return Math.round( - ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * - (value - this.range.start)) + "px"; - }, - translateToValue: function(offset) { - return ((offset/(this.trackLength-this.handleLength) * - (this.range.end-this.range.start)) + this.range.start); - }, - getRange: function(range) { - var v = this.values.sortBy(Prototype.K); - range = range || 0; - return $R(v[range],v[range+1]); - }, - minimumOffset: function(){ - return(this.isVertical() ? this.alignY : this.alignX); - }, - maximumOffset: function(){ - return(this.isVertical() ? - (this.track.offsetHeight != 0 ? this.track.offsetHeight : - this.track.style.height.replace(/px$/,"")) - this.alignY : - (this.track.offsetWidth != 0 ? this.track.offsetWidth : - this.track.style.width.replace(/px$/,"")) - this.alignY); - }, - isVertical: function(){ - return (this.axis == 'vertical'); - }, - drawSpans: function() { - var slider = this; - if(this.spans) - $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) }); - if(this.options.startSpan) - this.setSpan(this.options.startSpan, - $R(0, this.values.length>1 ? this.getRange(0).min() : this.value )); - if(this.options.endSpan) - this.setSpan(this.options.endSpan, - $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum)); - }, - setSpan: function(span, range) { - if(this.isVertical()) { - span.style.top = this.translateToPx(range.start); - span.style.height = this.translateToPx(range.end - range.start + this.range.start); - } else { - span.style.left = this.translateToPx(range.start); - span.style.width = this.translateToPx(range.end - range.start + this.range.start); - } - }, - updateStyles: function() { - this.handles.each( function(h){ Element.removeClassName(h, 'selected') }); - Element.addClassName(this.activeHandle, 'selected'); - }, - startDrag: function(event) { - if(Event.isLeftClick(event)) { - if(!this.disabled){ - this.active = true; - - var handle = Event.element(event); - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var track = handle; - if(track==this.track) { - var offsets = Position.cumulativeOffset(this.track); - this.event = event; - this.setValue(this.translateToValue( - (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2) - )); - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } else { - // find the handle (prevents issues with Safari) - while((this.handles.indexOf(handle) == -1) && handle.parentNode) - handle = handle.parentNode; - - if(this.handles.indexOf(handle)!=-1) { - this.activeHandle = handle; - this.activeHandleIdx = this.handles.indexOf(this.activeHandle); - this.updateStyles(); - - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } - } - } - Event.stop(event); - } - }, - update: function(event) { - if(this.active) { - if(!this.dragging) this.dragging = true; - this.draw(event); - if(Prototype.Browser.WebKit) window.scrollBy(0,0); - Event.stop(event); - } - }, - draw: function(event) { - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var offsets = Position.cumulativeOffset(this.track); - pointer[0] -= this.offsetX + offsets[0]; - pointer[1] -= this.offsetY + offsets[1]; - this.event = event; - this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] )); - if(this.initialized && this.options.onSlide) - this.options.onSlide(this.values.length>1 ? this.values : this.value, this); - }, - endDrag: function(event) { - if(this.active && this.dragging) { - this.finishDrag(event, true); - Event.stop(event); - } - this.active = false; - this.dragging = false; - }, - finishDrag: function(event, success) { - this.active = false; - this.dragging = false; - this.updateFinished(); - }, - updateFinished: function() { - if(this.initialized && this.options.onChange) - this.options.onChange(this.values.length>1 ? this.values : this.value, this); - this.event = null; - } -} \ No newline at end of file diff --git a/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/sound.js b/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/sound.js deleted file mode 100644 index 164c79a..0000000 --- a/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/sound.js +++ /dev/null @@ -1,60 +0,0 @@ -// script.aculo.us sound.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// Based on code created by Jules Gravinese (http://www.webveteran.com/) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -Sound = { - tracks: {}, - _enabled: true, - template: - new Template(''), - enable: function(){ - Sound._enabled = true; - }, - disable: function(){ - Sound._enabled = false; - }, - play: function(url){ - if(!Sound._enabled) return; - var options = Object.extend({ - track: 'global', url: url, replace: false - }, arguments[1] || {}); - - if(options.replace && this.tracks[options.track]) { - $R(0, this.tracks[options.track].id).each(function(id){ - var sound = $('sound_'+options.track+'_'+id); - sound.Stop && sound.Stop(); - sound.remove(); - }) - this.tracks[options.track] = null; - } - - if(!this.tracks[options.track]) - this.tracks[options.track] = { id: 0 } - else - this.tracks[options.track].id++; - - options.id = this.tracks[options.track].id; - if (Prototype.Browser.IE) { - var sound = document.createElement('bgsound'); - sound.setAttribute('id','sound_'+options.track+'_'+options.id); - sound.setAttribute('src',options.url); - sound.setAttribute('loop','1'); - sound.setAttribute('autostart','true'); - $$('body')[0].appendChild(sound); - } - else - new Insertion.Bottom($$('body')[0], Sound.template.evaluate(options)); - } -}; - -if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){ - if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 })) - Sound.template = new Template('') - else - Sound.play = function(){} -} diff --git a/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/unittest.js b/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/unittest.js deleted file mode 100644 index d2dff8b..0000000 --- a/main/NOVA_0.4.4/templates/static/javascripts/scriptaculous/unittest.js +++ /dev/null @@ -1,564 +0,0 @@ -// script.aculo.us unittest.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com) -// (c) 2005-2007 Michael Schuerig (http://www.schuerig.de/michael/) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// experimental, Firefox-only -Event.simulateMouse = function(element, eventName) { - var options = Object.extend({ - pointerX: 0, - pointerY: 0, - buttons: 0, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false - }, arguments[2] || {}); - var oEvent = document.createEvent("MouseEvents"); - oEvent.initMouseEvent(eventName, true, true, document.defaultView, - options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element)); - - if(this.mark) Element.remove(this.mark); - this.mark = document.createElement('div'); - this.mark.appendChild(document.createTextNode(" ")); - document.body.appendChild(this.mark); - this.mark.style.position = 'absolute'; - this.mark.style.top = options.pointerY + "px"; - this.mark.style.left = options.pointerX + "px"; - this.mark.style.width = "5px"; - this.mark.style.height = "5px;"; - this.mark.style.borderTop = "1px solid red;" - this.mark.style.borderLeft = "1px solid red;" - - if(this.step) - alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options)); - - $(element).dispatchEvent(oEvent); -}; - -// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2. -// You need to downgrade to 1.0.4 for now to get this working -// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much -Event.simulateKey = function(element, eventName) { - var options = Object.extend({ - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: 0, - charCode: 0 - }, arguments[2] || {}); - - var oEvent = document.createEvent("KeyEvents"); - oEvent.initKeyEvent(eventName, true, true, window, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode ); - $(element).dispatchEvent(oEvent); -}; - -Event.simulateKeys = function(element, command) { - for(var i=0; i' + - '' + - '' + - '' + - '
StatusTestMessage
'; - this.logsummary = $('logsummary') - this.loglines = $('loglines'); - }, - _toHTML: function(txt) { - return txt.escapeHTML().replace(/\n/g,"
"); - }, - addLinksToResults: function(){ - $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log - td.title = "Run only this test" - Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;}); - }); - $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log - td.title = "Run all tests" - Event.observe(td, 'click', function(){ window.location.search = "";}); - }); - } -} - -Test.Unit.Runner = Class.create(); -Test.Unit.Runner.prototype = { - initialize: function(testcases) { - this.options = Object.extend({ - testLog: 'testlog' - }, arguments[1] || {}); - this.options.resultsURL = this.parseResultsURLQueryParameter(); - this.options.tests = this.parseTestsQueryParameter(); - if (this.options.testLog) { - this.options.testLog = $(this.options.testLog) || null; - } - if(this.options.tests) { - this.tests = []; - for(var i = 0; i < this.options.tests.length; i++) { - if(/^test/.test(this.options.tests[i])) { - this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"])); - } - } - } else { - if (this.options.test) { - this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])]; - } else { - this.tests = []; - for(var testcase in testcases) { - if(/^test/.test(testcase)) { - this.tests.push( - new Test.Unit.Testcase( - this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, - testcases[testcase], testcases["setup"], testcases["teardown"] - )); - } - } - } - } - this.currentTest = 0; - this.logger = new Test.Unit.Logger(this.options.testLog); - setTimeout(this.runTests.bind(this), 1000); - }, - parseResultsURLQueryParameter: function() { - return window.location.search.parseQuery()["resultsURL"]; - }, - parseTestsQueryParameter: function(){ - if (window.location.search.parseQuery()["tests"]){ - return window.location.search.parseQuery()["tests"].split(','); - }; - }, - // Returns: - // "ERROR" if there was an error, - // "FAILURE" if there was a failure, or - // "SUCCESS" if there was neither - getResult: function() { - var hasFailure = false; - for(var i=0;i 0) { - return "ERROR"; - } - if (this.tests[i].failures > 0) { - hasFailure = true; - } - } - if (hasFailure) { - return "FAILURE"; - } else { - return "SUCCESS"; - } - }, - postResults: function() { - if (this.options.resultsURL) { - new Ajax.Request(this.options.resultsURL, - { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false }); - } - }, - runTests: function() { - var test = this.tests[this.currentTest]; - if (!test) { - // finished! - this.postResults(); - this.logger.summary(this.summary()); - return; - } - if(!test.isWaiting) { - this.logger.start(test.name); - } - test.run(); - if(test.isWaiting) { - this.logger.message("Waiting for " + test.timeToWait + "ms"); - setTimeout(this.runTests.bind(this), test.timeToWait || 1000); - } else { - this.logger.finish(test.status(), test.summary()); - this.currentTest++; - // tail recursive, hopefully the browser will skip the stackframe - this.runTests(); - } - }, - summary: function() { - var assertions = 0; - var failures = 0; - var errors = 0; - var messages = []; - for(var i=0;i 0) return 'failed'; - if (this.errors > 0) return 'error'; - return 'passed'; - }, - assert: function(expression) { - var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"'; - try { expression ? this.pass() : - this.fail(message); } - catch(e) { this.error(e); } - }, - assertEqual: function(expected, actual) { - var message = arguments[2] || "assertEqual"; - try { (expected == actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertInspect: function(expected, actual) { - var message = arguments[2] || "assertInspect"; - try { (expected == actual.inspect()) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertEnumEqual: function(expected, actual) { - var message = arguments[2] || "assertEnumEqual"; - try { $A(expected).length == $A(actual).length && - expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ? - this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + - ', actual ' + Test.Unit.inspect(actual)); } - catch(e) { this.error(e); } - }, - assertNotEqual: function(expected, actual) { - var message = arguments[2] || "assertNotEqual"; - try { (expected != actual) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertIdentical: function(expected, actual) { - var message = arguments[2] || "assertIdentical"; - try { (expected === actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNotIdentical: function(expected, actual) { - var message = arguments[2] || "assertNotIdentical"; - try { !(expected === actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNull: function(obj) { - var message = arguments[1] || 'assertNull' - try { (obj==null) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); } - catch(e) { this.error(e); } - }, - assertMatch: function(expected, actual) { - var message = arguments[2] || 'assertMatch'; - var regex = new RegExp(expected); - try { (regex.exec(actual)) ? this.pass() : - this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertHidden: function(element) { - var message = arguments[1] || 'assertHidden'; - this.assertEqual("none", element.style.display, message); - }, - assertNotNull: function(object) { - var message = arguments[1] || 'assertNotNull'; - this.assert(object != null, message); - }, - assertType: function(expected, actual) { - var message = arguments[2] || 'assertType'; - try { - (actual.constructor == expected) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + (actual.constructor) + '"'); } - catch(e) { this.error(e); } - }, - assertNotOfType: function(expected, actual) { - var message = arguments[2] || 'assertNotOfType'; - try { - (actual.constructor != expected) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + (actual.constructor) + '"'); } - catch(e) { this.error(e); } - }, - assertInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertInstanceOf'; - try { - (actual instanceof expected) ? this.pass() : - this.fail(message + ": object was not an instance of the expected type"); } - catch(e) { this.error(e); } - }, - assertNotInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertNotInstanceOf'; - try { - !(actual instanceof expected) ? this.pass() : - this.fail(message + ": object was an instance of the not expected type"); } - catch(e) { this.error(e); } - }, - assertRespondsTo: function(method, obj) { - var message = arguments[2] || 'assertRespondsTo'; - try { - (obj[method] && typeof obj[method] == 'function') ? this.pass() : - this.fail(message + ": object doesn't respond to [" + method + "]"); } - catch(e) { this.error(e); } - }, - assertReturnsTrue: function(method, obj) { - var message = arguments[2] || 'assertReturnsTrue'; - try { - var m = obj[method]; - if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; - m() ? this.pass() : - this.fail(message + ": method returned false"); } - catch(e) { this.error(e); } - }, - assertReturnsFalse: function(method, obj) { - var message = arguments[2] || 'assertReturnsFalse'; - try { - var m = obj[method]; - if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; - !m() ? this.pass() : - this.fail(message + ": method returned true"); } - catch(e) { this.error(e); } - }, - assertRaise: function(exceptionName, method) { - var message = arguments[2] || 'assertRaise'; - try { - method(); - this.fail(message + ": exception expected but none was raised"); } - catch(e) { - ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); - } - }, - assertElementsMatch: function() { - var expressions = $A(arguments), elements = $A(expressions.shift()); - if (elements.length != expressions.length) { - this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions'); - return false; - } - elements.zip(expressions).all(function(pair, index) { - var element = $(pair.first()), expression = pair.last(); - if (element.match(expression)) return true; - this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect()); - }.bind(this)) && this.pass(); - }, - assertElementMatches: function(element, expression) { - this.assertElementsMatch([element], expression); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - }, - _isVisible: function(element) { - element = $(element); - if(!element.parentNode) return true; - this.assertNotNull(element); - if(element.style && Element.getStyle(element, 'display') == 'none') - return false; - - return this._isVisible(element.parentNode); - }, - assertNotVisible: function(element) { - this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1])); - }, - assertVisible: function(element) { - this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1])); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - } -} - -Test.Unit.Testcase = Class.create(); -Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), { - initialize: function(name, test, setup, teardown) { - Test.Unit.Assertions.prototype.initialize.bind(this)(); - this.name = name; - - if(typeof test == 'string') { - test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,'); - test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)'); - this.test = function() { - eval('with(this){'+test+'}'); - } - } else { - this.test = test || function() {}; - } - - this.setup = setup || function() {}; - this.teardown = teardown || function() {}; - this.isWaiting = false; - this.timeToWait = 1000; - }, - wait: function(time, nextPart) { - this.isWaiting = true; - this.test = nextPart; - this.timeToWait = time; - }, - run: function() { - try { - try { - if (!this.isWaiting) this.setup.bind(this)(); - this.isWaiting = false; - this.test.bind(this)(); - } finally { - if(!this.isWaiting) { - this.teardown.bind(this)(); - } - } - } - catch(e) { this.error(e); } - } -}); - -// *EXPERIMENTAL* BDD-style testing to please non-technical folk -// This draws many ideas from RSpec http://rspec.rubyforge.org/ - -Test.setupBDDExtensionMethods = function(){ - var METHODMAP = { - shouldEqual: 'assertEqual', - shouldNotEqual: 'assertNotEqual', - shouldEqualEnum: 'assertEnumEqual', - shouldBeA: 'assertType', - shouldNotBeA: 'assertNotOfType', - shouldBeAn: 'assertType', - shouldNotBeAn: 'assertNotOfType', - shouldBeNull: 'assertNull', - shouldNotBeNull: 'assertNotNull', - - shouldBe: 'assertReturnsTrue', - shouldNotBe: 'assertReturnsFalse', - shouldRespondTo: 'assertRespondsTo' - }; - Test.BDDMethods = {}; - for(m in METHODMAP) { - Test.BDDMethods[m] = eval( - 'function(){'+ - 'var args = $A(arguments);'+ - 'var scope = args.shift();'+ - 'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }'); - } - [Array.prototype, String.prototype, Number.prototype].each( - function(p){ Object.extend(p, Test.BDDMethods) } - ); -} - -Test.context = function(name, spec, log){ - Test.setupBDDExtensionMethods(); - - var compiledSpec = {}; - var titles = {}; - for(specName in spec) { - switch(specName){ - case "setup": - case "teardown": - compiledSpec[specName] = spec[specName]; - break; - default: - var testName = 'test'+specName.gsub(/\s+/,'-').camelize(); - var body = spec[specName].toString().split('\n').slice(1); - if(/^\{/.test(body[0])) body = body.slice(1); - body.pop(); - body = body.map(function(statement){ - return statement.strip() - }); - compiledSpec[testName] = body.join('\n'); - titles[testName] = specName; - } - } - new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name }); -}; \ No newline at end of file diff --git a/main/NOVA_0.4.4/templates/static/stylesheets/default.css b/main/NOVA_0.4.4/templates/static/stylesheets/default.css deleted file mode 100644 index 7afc756..0000000 --- a/main/NOVA_0.4.4/templates/static/stylesheets/default.css +++ /dev/null @@ -1,218 +0,0 @@ -body { - background-color: #000; - color: #FFF; - font-family: 'Verdana', 'Helvetica', 'Sans-serif', 'sans'; - font-size: 12px; - line-height: 18px; - padding: 15px; - margin: 0px; -} - -a { - text-decoration: none; - color: #000000; -} - -form { - margin: 0px; - padding: 0px; - border: none; - display: inline: -} -legend { - font-weight: bold; - color: #c32ee4; -} -div.EntryBlock { - display: inline; -} -div.EntryBlock form { - display: inline; -} -fieldset.EntryFieldSet { - vertical-align: top; - display: inline; - padding: 7px; - margin: 5px; -} -.MainMenu a { - font-weight: bold; - color: #4e4e4e; - padding: 1px; - text-decoration: none; - border: 1px solid #eeeeee; - margin: 9px; -} - -.SubMenu a { - font-weight: bold; - color: #000000; - padding: 1px; - text-decoration: none; - border: 1px solid #b5b5b5; - margin: 9px; -} -a:hover { - background-color: #F0E68C; -} - -a.current { - color: #fff; - border: none; - background-color: #b5b5b5; - padding: 3px; - padding-bottom: 7px; -} -a.current:hover { - border: none; - background-color: #b5b5b5; -} - - -.block { - padding: 10px; -} - -.blockWithBorder { - display: block; - border-width: thin; - border-style: solid; - border-color: #b5b5b5; - background-color: #eeeeee; - padding: 5px; -} - -.MainMenu { - display: block; - border-width: 1px; - border-style: solid; - border-color: #b5b5b5; - background-color: #eeeeee; - padding: 5px; - -} -.SubMenu { - display: block; - background-color: #b5b5b5; - padding: 5px; -} - -table { - font-size: 9pt; - color: black; - margin: 0px; -} -td, td { - padding: 5px; -} -th { - background: #b5b5b5; - color: white; - font-weight: bold; -} - -tr.even{ - background-color: #cdf; -} - -tr.evenLine { - background-color: #eee; -} - -tr.odd { - background-color: #99bbff; -} - -tr.oddLine { - background-color: #f8f8f8; -} - -tr.active { - font-weight: bold; -} - -tr.finished { - font-weight: normal; -} - -tr.waiting { - font-style: italic; -} - -td.pre { - font-size: 13px; - font-family: 'courier new',courier,serif; - font-weight: bold; -} - -h1 { - text-align: left; - font-size: 19px; - font-weight: normal; - border-bottom: 1px solid #b5b5b5; - padding-bottom: 0px; -} -* html h1 { - padding-bottom: 2px; -} -h2 { - font-size: 18px; - font-weight: bold; -} -#first { - font-size: 33px; - font-family: Arial, Helvetica, sans-serif; - font-weight: bold ; - color: #c32ee4; - text-transform: uppercase; - padding-left: 20px; -} - -#second { - font-size: 30px; - font-family: Arial, Helvetica, sans-serif; - font-style: italic; - color: #99bbff; - text-transform: lowercase; -} - -#catchfrase { - display: block; - position: relative; - top: -18px; - float: right; - text-align: right; - font-size: 10px; - font-weight: normal; -} -.footer { - text-align: center; - background-color: #000; -border:1px; - padding-bottom: 5px; - margin-top: 20px; - border-top: 1px solid #b5b5b5; -} - -#progressBar { - background-color: #cdf; - border: 1px solid blue; - height: 6px; - width: 90%; - margin: 0px; - margin-left: auto; - margin-right: auto; - padding: 0px; - text-align: left; -} - -* html #progressBar { - height: 8px; - he\ight: 6px; -} - -#percentageBar { - position: relative; - background-color: #9bf; - height: 6px; -} diff --git a/main/NOVA_0.4.4/templates/static/stylesheets/nova.css b/main/NOVA_0.4.4/templates/static/stylesheets/nova.css deleted file mode 100644 index 6b15479..0000000 --- a/main/NOVA_0.4.4/templates/static/stylesheets/nova.css +++ /dev/null @@ -1,514 +0,0 @@ -/* ------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------- - - - Filename: master.css - Author: Dana Woodman - Site: www.sabnzbd.organixdesign.com - Date: 06/15/2007 - Version: 0.4 - Notes: - - - - - - - ---------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------- */ - - -/* =================================================================================================================== - - H T M L - -=================================================================================================================== */ - - -/* Universal Selector -------------------------------------------------------------------- */ -* {margin: 0; padding: 0; border: none;} - - -/* Body -------------------------------------------------------------------- */ -body { - font: small Arial, Helvetica, sans-serif; - background-image: url(../images/bg_lonelyhearts.png); - background-repeat: repeat; - cursor:default; -} -html, body { - margin: 0; - padding: 0; - height: 100%; -} - - -/* Links -------------------------------------------------------------------- */ -a {color: #BBD0DF;} -a:hover {} - - -/* Forms -------------------------------------------------------------------- */ -input, textarea, select, option { - padding: 1px; -} -input[type="submit"] {} - -input.button { - padding: 2px 4px; - font-weight: bold; - color: #032F54; - background: none url(none); -} - - -/* Headings -------------------------------------------------------------------- */ -h1 {} -h2 {} -h3 { - color: #FFFFFF; - margin-bottom: 5px; - text-transform: uppercase; -} -h4 {} -h5 {} -h6 {} - - - - -/* =================================================================================================================== - - L A Y O U T - -=================================================================================================================== */ - - -/* Container -------------------------------------------------------------------- */ -#container { - height: 100%; -} - - -/* Top Bar -------------------------------------------------------------------- */ -div .topBar { - background: #021D33 url(../images/bg_topBar.png) repeat-x left bottom; - text-align: right; - float: left; - width: 100%; - border-bottom: 1px solid #000000; - border-top: 1px solid #033258; -} - - -/* Top Bar -------------------------------------------------------------------- */ -#logo { - float: left; - padding: 3px; - font-weight: bold; - color: #F78614; - margin-left: 20px; - display: inline; - font-size: 135%; -} -#logo a { - font-size: 140%; - color: #F78614; - text-decoration: none; - line-height: 1em; - font-weight: bold; -} -#logo a:hover { - background:#000; -} - - -/* Top Bar Links -------------------------------------------------------------------- */ -#topLinks {float: right;} -#topLinks a { - color: #00CCFF; - padding: 5px 15px; - display: block; - float: left; - text-decoration: none; - font-weight: bold; - font-style: italic; -} -#topLinks span { - color: #00CCFF; - padding: 5px 15px; - display: block; - float: left; - text-decoration: none; - font-weight: bold; - font-style: italic; -} -#topLinks a:hover { - color: #0099FF; - text-decoration: none; - background: #000000; - cursor:pointer; -} -#topLinks a b { - color: #FFFFFF; - position: relative; -} -#topLinks a b em { - color: #00FF00; - font-weight: bold; - font-size: 180%; - line-height: 0; -} -#topLinks a:hover b {color: #D0E9FD;} -#topLinks a strong {color: #FFCC00;} -#topLinks a:hover strong {color: #FF9900;} - - -/* Data Bar -------------------------------------------------------------------- */ -#dataBar { - background: #074273 url(../images/bg_dataBar.png) repeat-x left bottom; - float: left; - width: 100%; - border-top: 1px solid #0C6BBA; - border-bottom: 2px solid #000000; -} -#dataBar strong {letter-spacing: .15em;} -#dataBar b {letter-spacing: .1em;} - - -/* Download Info -------------------------------------------------------------------- */ -#downloadInfo { - color: #91CAF9; - padding-left: 14px; - padding-top: 6px; - float: left;05px; -} -#downloadInfo p { - margin-top: 3px; - margin-bottom: 3px; -} -#downloadInfo strong { - color: #FFCC00; - margin-right: 15px; -} -#downloadInfo b { - color: #FFFEFB; -} - - -/* Download Statistics -------------------------------------------------------------------- */ -#downloadStats { - padding: 5px; - float: left; - margin-left: 0px; - width: 600px; - padding-left: 40px; -} -/* Download Bar */ -#downloadBar { - height: 20px; - border: 1px solid #BFDFF9; - background: #031D32; - margin-bottom: 4px; - float: left; - width: 100%; -} -#statusbar { - height: 20px; - background: #F78614 url(../images/bg_downloaded.png) repeat left bottom; - border-right: 1px solid #BFDFF9; - font-weight: bold; -} -/* The percentage downloaded within the download bar */ -#downloadBar span { - color: #FFFFFF; - float: right; - margin-top: -3px; - font-size: 210%; - line-height: 1em; - font-weight: bold; - font-style: italic; -} -/* Download data - the speed and time left */ -#downloadData { - color: #91CAF9; - float: left; - width: 600px; - margin-left: -30px; - margin-right: -40px; -} -.dlSpeed { - float: left; -} -.dlSpeed b { - margin-left: 3px; - color: #FFFFFF; -} -.dlMB { -} -.dlMB b { - margin-left: 3px; - color: #FFFFFF; -} -.dlTime { - float: right; -} -.dlTime b { - margin-left: 3px; - color: #FFFFFF; -} - - -/* Layout Switcher -------------------------------------------------------------------- */ -#layoutSwitcher { - float: left; - padding: 4px; - margin-left: 6px; -} -#layoutSwitcher a img {padding: 2px;} - - - -/* Download Table -------------------------------------------------------------------- */ -#downloadContainer { - float: left; - width: 100%; -} -#downloadTable td {vertical-align: middle;} - - -/* Queue and History -------------------------------------------------------------------- */ -#queue_container, #history_container {float:left; padding-left:3px; padding-top:3px; } - - - - - -/* =================================================================================================================== - - C L A S S E S - -=================================================================================================================== */ - - -/* Tables -------------------------------------------------------------------- */ -.table { -} -.table input, table select {font-size: 90%; margin: 0; padding: 0;} -.table form {display: inline;} -.table thead {} -.table thead tr { - background: #021D33 url(../images/bg_thead_tr.png) repeat-x left bottom; - color: #FFF; - text-align: left; -} -.table thead td, thead th { - width: 400px; - white-space: nowrap; -} -.table thead a { - color: #FFF; - text-decoration: none; - padding: 5px 5px; - font-weight: bold; - font-style: italic; - float: right; -} -.table thead a:hover { - color: #FFF; - text-decoration: dotted; - background: #000000; - cursor:pointer; -} -.table thead div.heading { - background: #021D33 url(../images/bg_thead_tr_heading.png) repeat-x left bottom; - float: left; - padding: 3px; - font-weight: bold; - color: #FFF; - display: inline; - font-size: 140%; - text-decoration: none; - line-height: 1em; -} -.table thead a.toggled { - background: #021D33 url(../images/bg_thead_tr_heading.png) repeat-x left bottom; -} -.table thead a.untoggled { -} -.table tbody {} -.table tbody tr { -} -.table tbody tr:hover {background: #FFF url(../images/bg_tr_hover.png) repeat-x left bottom;} -.table tbody td { - border-bottom: 1px solid #B4DFFB; - border-right: 1px solid #B4DFFB; - white-space: nowrap; - padding: 0 4px; - vertical-align: middle; - text-align: left; - -} -.table tbody td strong { - font-family: "Trebuchet MS", Arial, Helvetica, Sans-serif; - color: #FF4900; -} -.table tbody td b { - color: #2B4D80; -} -.table tbody td small { - color: #A899AB; -} -.table tbody .odd {background: #FFFFFF url(../images/bg_tr_odd.png) repeat-x left bottom;} -.table tbody .even {background: #012F54;} -.table tbody a { - color: #fff; - font-weight: bold; - text-decoration: none; - position: relative; -} -.table tbody a:hover {color: #FFCC00;} - - - -/* TOOLTIPS - -.table tbody a .tooltip { - display: none; - color: #0D8DF7; - border: 2px solid #63B6FA; -} -.table tbody .tooltip b {color: #032F54;} -.table tbody a:hover .tooltip { - background: #fff; - display: block; - padding: 10px; - float: left; - position: absolute; - top: 15px; - left: 0; - z-index: 20; -} -*/ - - -.table tbody .title { - color: #EFD18D; - font-size: 115%; -} -.table tbody .title:hover {color: #FF6600;} -.table tbody strong {} -.table tbody b {color: #FFF;} -.table tbody em {} -.table tbody i {} - -.table tfoot {} -.table tfoot tr {} -.table tfoot td, tfoot td {} - - - - -/* Queue Progress Bar -------------------------------------------------------------------- */ -.queueBarOuter { - width: 100%; - height: 5px !important; - height: 2px; - margin-top: 5px; - margin-bottom: 5px; - padding: 0px; - border: 1px solid #186B98; - background: #FFF; - text-align: left; -} -.queueBarInner { - background: #2399D8 url(../images/bg_downloaded_minibar.png) repeat left top; - height: 5px !important; - height: 2px; - margin: 0; - padding: 0; -} - - -/* Action Panel -------------------------------------------------------------------- */ -.actionPanel span {padding-top: 5px;} - - -/* Content Padding -------------------------------------------------------------------- */ -.contentPad {padding: 5px;} - - -/* Alignment -------------------------------------------------------------------- */ -.textCenter {text-align: center;} -.textLeft {text-align: left;} -.textRight {text-align: right;} - - -/* Display Helpers -------------------------------------------------------------------- */ -.block {display: block;} - - - - - - - - - - - - -/* Clearfix -------------------------------------------------------------------- */ -#container:after, -.subMenu:after, -#dataBar:after, -#downloadTable:after { - content: " "; - display: block; - clear: both; -} - -li { - margin: -1px auto; - margin-left:0px; - padding: 0px; - border: 1px dotted #3DABF5; - background-color: #F2F6FF; - color: #2B4D80; - clear:both; - list-style-type: none; -} -.nzb_mb { - float: right; - font-style: italic; - cursor: crosshair; -} -.nzbfile { - font-size: 10px; - margin: -1px auto; - padding: 0px; - width: 100%; - background-color: #DBFFAA; - border: 1px dotted #2B4D80; - clear:both; -} \ No newline at end of file diff --git a/main/NOVA_0.4.5/LICENCE.TXT b/main/NOVA_0.4.5/LICENCE.TXT new file mode 100644 index 0000000..ad5f44f --- /dev/null +++ b/main/NOVA_0.4.5/LICENCE.TXT @@ -0,0 +1,63 @@ +http://creativecommons.org/licenses/by/3.0/ +http://creativecommons.org/licenses/by/3.0/legalcode + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + 4. to Distribute and Publicly Perform Adaptations. + 5. + + For the avoidance of doubt: + 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. + 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/main/NOVA_0.4.5/README.TXT b/main/NOVA_0.4.5/README.TXT new file mode 100644 index 0000000..9125c55 --- /dev/null +++ b/main/NOVA_0.4.5/README.TXT @@ -0,0 +1,98 @@ +================================ +NOVA 0.4.5 README - Oct 26, 2007 +http://sabnzbd.organixdesign.com + +======= +AUTHORS +* Nathan => complete rewrite of NOVA for version 0.4 +* Dana Woodman => original NOVA + concept design +* ShyPike => modified for SABnzbd-0.2.7up + +============ +INTRODUCTION +We view this release very much as a public test. NOVA 0.3 preview 2 returned such a great response that we did not feel it was necessary to provide a final revision, and instead jumped straight to this one. Hope you all enjoy & happy downloading. + +=========== +WHAT IS NEW +* "Nighttime" concept design (NOTE: Dana hasn't had a chance to go over the new graphic design yet! If you think it looks good now, just you wait.) +* No more iFrames, layout is much more adaptive now +* AJAX Queue Components: Drag & drop sort, Post-processing, Drop, Pause, Verbosity, Sort by average age +* AJAX History Components: Verbosity, Purge +* AJAX refresh rate slider +* AJAX enqueueing of nzbs by report id & URL +* Many structural enhancements to the main statistics +* Standardized Queue & History JSON +* Compatible with multiple browser sessions opened concurrently +* Special care taken in terms of explanations that pop up when hovering items with your cursor +* Not to mention all the good parts from NOVA 0.3p2 +* Much much more! + +================== +NOVA 0.4.5 UPDATES +* Added +Script Dirscan options in Config->Switches for SABnzbdPlus (blackhole directory) +* New Cleanup icon for History Verbosity +* Updated integrated components +* Didn't do any testing, good luck! + +================== +NOVA 0.4.4 UPDATES +* History Verbosity has been drastically cleaned up +(1) Details are now hidden behind icons (hover icon with cursor to view) +(2) Exceptions are processing stages & errors +* Options bar now has its own menu item +* "Shutdown SAB" feature now in Options (+confirmation) +* Fixed queue menu width for Windows +* SABnzbdPlus 0.2.7 compatible (hopefully) - if installed, will use D+ (Delete+Script) as default post-processing option + +================== +NOVA 0.4.3 UPDATES +* Added "Toggle Shutdown" back in + alert box (Windows only) +* Queue & History reverted to NOVA v0.3p2 look +* Queue Verbosity is now a two-step process: +(1) Toggle Verbosity -ON- +(2) Click the 'v' on an enqueued nzb to see its files +* Double-click nzb filename to jump to top of queue +* Drag & drop on filename column to sort enqueued nzbs +* Queue & History menus no longer get scrunched +* Overall % now stays visible on screen +* Better labeling in Stats & Queue (more wording/icons for explanation) +* "MB downloaded" replaced "MB remaining" in Queue & Stats +* Better "broken nzb set" detection +* Non-Newzbin nzbs won't show a 'View Report' icon anymore +* (Very) minor optimizations - long way to go on this one +* Default refresh rate increased to 8 seconds from 4 +* Current version number now visible in NOVA options + +================== +NOVA 0.4.2 UPDATES +* Config & Connections now use Lytebox (pop up over content) +* History verbosity has a new icon to indicate an unzip + +================== +NOVA 0.4.1 UPDATES +* Layout settings & Refresh rate now saved +* Fixed 'View Report' (the i icon) sometimes being unclickable +* History verbosity now has a new icon to indicate a join +* Queue verbosity now colored slightly better +* Stats more precise for free space & history + +========= +DRAWBACKS +* Only works with Firefox 2+, Safari 3, & Opera 9.5 +* Not optimized yet; it's okay, but not great + +=== +FAQ + +Q: Can I contribute? +A: Yes; while we do not have a subversion repository set up, we encourage any suggestions. The good stuff will definitely get added in. Our goal is to turn this into a community project, if that wasn't obvious. + +Q: How else can I help? +A: Visit our official site and donate Usenet access. + +Q: Can you provide more information?! +A: Yes, stay tuned. Our ultimate goal is to allow for straightforward customization. + +============== +SPECIAL THANKS +* Everyone in the community who left so much valuable feedback - we appreciate it greatly! \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/config.tmpl b/main/NOVA_0.4.5/templates/config.tmpl new file mode 100644 index 0000000..e1dc4f4 --- /dev/null +++ b/main/NOVA_0.4.5/templates/config.tmpl @@ -0,0 +1,27 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + +

SABnzbdThe automatic usenet download tool

+ +NOVA | +Connections | +Config + +General | Directories | Switches | Servers | Scheduling | RSS +

Configuration

+

+Configfile: $configfn +

+ + + diff --git a/main/NOVA_0.4.5/templates/config_directories.tmpl b/main/NOVA_0.4.5/templates/config_directories.tmpl new file mode 100644 index 0000000..c1b67fe --- /dev/null +++ b/main/NOVA_0.4.5/templates/config_directories.tmpl @@ -0,0 +1,89 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + +

SABnzbdThe automatic usenet download tool

+ +NOVA | +Connections | +Config + + +General | +Directories | +Switches | +Servers | +Scheduling | +RSS + +

Directory configuration

+

NOTE: Directories won't be created automatically.

+
+
+
+ User directories + Download Directory:
+ Location to put downloads to.
+ +
+
+ Minimum free space for Download Directory:
+ Auto-pause when free space is beneath this value (MB).
+ +
+
+ Complete Directory:
+ Location to put completed downloads to.
+ +
+
+ OPTIONAL: Dirscan Directory:
+ Specify a directory to scan for .nzb files.
+ +
+
+ OPTIONAL: Dirscan Speed:
+ Specify number of seconds between scans for .nzb files.
+ +
+
+ OPTIONAL: External post-processing script:
+ Specify an external post-processing script.
+ +
+
+ System directories + Cache Directory:
+ Location of cache directories for SABnzbd.
+ +
+
+ Log Directory:
+ Location of log files for SABnzbd.
+ +
+
+ Template Directory:
+ Location of the template directory.
+ +
+
+ OPTIONAL: .nzb Backup Directory:
+ Specify a directory to backup .nzb files to.
+ +
+

+ +
+ + + diff --git a/main/NOVA_0.4.5/templates/config_general.tmpl b/main/NOVA_0.4.5/templates/config_general.tmpl new file mode 100644 index 0000000..89db1c9 --- /dev/null +++ b/main/NOVA_0.4.5/templates/config_general.tmpl @@ -0,0 +1,97 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + +

SABnzbdThe automatic usenet download tool

+ +NOVA | +Connections | +Config + + +General | +Directories | +Switches | +Servers | +Scheduling | +RSS + +

General configuration

+
+
+
+SABnzbd server +SABnzbd Host:
+Host SABnzbd should listen on.
+ +
+
+SABnzbd Port:
+Post SABnzbd should listen on.
+ +
+
+SABnzbd Username:
+Authentication Username.
+ +
+
+SABnzbd Password:
+Authentication Password.
+ +
+
+
+
+SABnzbd tuning +SABnzbd RSS checking rate:
+Checking rate (times per hour 1, 2, 3, 4)
+ +
+
+SABnzbd Bandwith Limit:
+Slowdown factor, try values between 0.01 and 1.0.
+ +
+
+SABnzbd Article Cache Limit:
+Cache articles in memory. See SABnzbd.ini
+ +
+
+Cleanup List:
+List of file (extensions) that should be deleted at the cleanup stage.
+For example: ".nfo," or ".nfo, .sfv"
+ +
+
+
+
+Newzbin settings +OPTIONAL: Newzbin Username:
+Set your www.newzbin.com username here.
+ +
+
+OPTIONAL: Newzbin Password:
+Set your www.newzbin.com password here.
+ +
+
+

+ +

+
+ + + + diff --git a/main/NOVA_0.4.5/templates/config_rss.tmpl b/main/NOVA_0.4.5/templates/config_rss.tmpl new file mode 100644 index 0000000..1d4c685 --- /dev/null +++ b/main/NOVA_0.4.5/templates/config_rss.tmpl @@ -0,0 +1,113 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + +

SABnzbdThe automatic usenet download tool

+ +NOVA | +Connections | +Config + + +General | +Directories | +Switches | +Servers | +Scheduling | +RSS + +

EXPERIMENTAL RSS Configuration

+ +
+
+
+ RSS feed settings + RSS-Feed URI:
+

+ + Text Filter:
+ (Basic) text based filter. A single '*' matches everything. +
+ +
+
+ + Regex Filter:
+ Regular Expression filter. Overwrites text filter. +
+ +
+
+ + Match Multiple:
+ Match this filter more than once? +
+ No + Yes +
+
+ + Unpack Opts:
+ None + +Repair + +Unpack + +Delete + Repair+Script + Unpack+Script + Delete+Script +
+
+ + +
+
+
+
+
+ + + + + + + "> + + + + + + + active"> + + + + active"> + + + + active"> + + + + + +
URL/Match Name
Remove$uri
RemoveFilter: $filter[0]
Unpack-opts: $filter[1]
Match Multiple: $filter[2]
+ + + +

+ feedparser module missing +

+ + + + diff --git a/main/NOVA_0.4.5/templates/config_scheduling.tmpl b/main/NOVA_0.4.5/templates/config_scheduling.tmpl new file mode 100644 index 0000000..5f60d85 --- /dev/null +++ b/main/NOVA_0.4.5/templates/config_scheduling.tmpl @@ -0,0 +1,74 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + +

SABnzbdThe automatic usenet download tool

+ +NOVA | +Connections | +Config + + +General | +Directories | +Switches | +Servers | +Scheduling | +RSS + +

Scheduling configuration

+
+
+
+Add schedule + + + + +

+
+
+
+

Current Schedules:

+
+ +
+
+ +Task $schednum +$line + + +
+
+ +
+ + + diff --git a/main/NOVA_0.4.5/templates/config_server.tmpl b/main/NOVA_0.4.5/templates/config_server.tmpl new file mode 100644 index 0000000..bfa1077 --- /dev/null +++ b/main/NOVA_0.4.5/templates/config_server.tmpl @@ -0,0 +1,65 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + +

SABnzbdThe automatic usenet download tool

+ +NOVA | +Connections | +Config + + +General | +Directories | +Switches | +Servers | +Scheduling | +RSS + +

Server configuration

+
+
+
+ Add server + Host:

+ Port:

+ Username:

+ Password:

+ Connections:

+ Fillserver:
No + Yes +
+

+
+
+ +
+
+ $server + Host:

+ Port:

+ Username:

+ Password:

+ Connections:

+ Fillserver:
/> No + /> Yes +
+ +

+

+
+
+ +
+ + + diff --git a/main/NOVA_0.4.5/templates/config_switches.tmpl b/main/NOVA_0.4.5/templates/config_switches.tmpl new file mode 100644 index 0000000..3e0494c --- /dev/null +++ b/main/NOVA_0.4.5/templates/config_switches.tmpl @@ -0,0 +1,120 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + +

SABnzbdThe automatic usenet download tool

+ +NOVA | +Connections | +Config + + +General | +Directories | +Switches | +Servers | +Scheduling | +RSS + +

Configuration switches

+
+
+
+ Processing switches + Enable Unrar:
+ Enable built-in unrar functionality.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Enable Unzip:
+ Enable built-in unzip functionality.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Enable Filejoin:
+ Enable built-in filejoin functionality.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Enable Par Cleanup:
+ Cleanup par files (if verifiying/repairing succeded).
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Fail on yenc crc Errors:
+ Use fill servers on yenc crc errors.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Top Only:
+ Only fetch Articles from topmost collection. Enable for less memory usage.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Dirscan Options:
+ Use following post process option on .nzb files imported by the dirscanner.
+ /> None + /> +Repair + /> +Unpack + /> +Delete + /> R+Script + /> U+Script + /> D+Script +
+
+
+
+ Other switches + Enable periodic Save:
+ Enabling will make the queue save it's state after every completed file.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Create group Folders:
+ Place downloads into group folders.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Create Category Folders:
+ Place downloads into newzbin.com category folders.
+ /> No + /> Root + /> Root+Sub +
+
+ Send Group
+ Send group command before requesting articles.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+ Auto Sort:
+ Automatically sort items by (average) age.
+ /> No + 0 then "checked=1" else ""#--> /> Yes +
+
+
+
+

+
+ + + diff --git a/main/NOVA_0.4.5/templates/connection_info.tmpl b/main/NOVA_0.4.5/templates/connection_info.tmpl new file mode 100644 index 0000000..ab4dbf4 --- /dev/null +++ b/main/NOVA_0.4.5/templates/connection_info.tmpl @@ -0,0 +1,40 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + +

SABnzbdThe automatic usenet download tool

+ +NOVA | +Connections | +Config + + +Force Disconnect + +

Connections

+ +
    + +
  • + $server[0]:$server[1]: $server[2] +
      + +
    • Thread #$thrd[0] -> $thrd[1] -> $thrd[2] -> $thrd[3]
    • + +
    +
  • + +
+ + + + diff --git a/main/NOVA_0.4.5/templates/history.tmpl b/main/NOVA_0.4.5/templates/history.tmpl new file mode 100644 index 0000000..1c63842 --- /dev/null +++ b/main/NOVA_0.4.5/templates/history.tmpl @@ -0,0 +1,23 @@ +{ + "bytes_beginning": $bytes_beginning, + "total_bytes": $total_bytes, + + "lines": [ + { + "added": "$line.added", + "filename": "$line.filename", + "loaded": "$line.loaded", + "stages": [ + { + "name": "$stage.name", + "actions": [ + { + "name": "$action.name", + "value": '$action.value' + }, + ] + }, + ] + }, + ] +} \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/main.tmpl b/main/NOVA_0.4.5/templates/main.tmpl new file mode 100644 index 0000000..7939d1a --- /dev/null +++ b/main/NOVA_0.4.5/templates/main.tmpl @@ -0,0 +1,192 @@ + + + + + + + + + + + NOVA (Loading...?) + + + + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + +
+
+
+
+ +
+
+
+ Time Left + KB/s +   of  MB Downloaded ( GB Left) +
+
+
+

  GB Free In Temp

+

  GB Free In Done

+
+
+

  GB Downloaded

+

  GB In History

+
+
+ + +
+ + +
+ + + + +
+
 QUEUE  
+ Shutdown + SortAge + Verbosity + Pause +
+
+ + +
+ + + + + + + + +
+
 HISTORY  
+ Purge + Verbosity +
+
+
+ +
+ + \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/nzo.tmpl b/main/NOVA_0.4.5/templates/nzo.tmpl new file mode 100644 index 0000000..e8449f0 --- /dev/null +++ b/main/NOVA_0.4.5/templates/nzo.tmpl @@ -0,0 +1,98 @@ + + + + SABnzbd-$version - Uptime: $uptime + + + + + + + + +

SABnzbdThe automatic usenet download tool

+ +Home | +Queue | +History | +Config | +Connections + + +Toggle verbosity + +
+
+
+ +
+ + + + +
+ selection:all + none + invert + + + + + + active"> + + + + + + +
Filename/SubjectSizeAge
>$file.filename$file.mb MB$file.age
+
+ + + diff --git a/main/NOVA_0.4.5/templates/queue.tmpl b/main/NOVA_0.4.5/templates/queue.tmpl new file mode 100644 index 0000000..1e76563 --- /dev/null +++ b/main/NOVA_0.4.5/templates/queue.tmpl @@ -0,0 +1,49 @@ +{ + "uptime": "$uptime", + "diskspace1": $diskspace1, + "diskspace2": $diskspace2, + "kbpersec": $kbpersec, + "mbleft": $mbleft, + "mb": $mb, + "paused": "$paused", + "shutdown": "$shutdown", + "noofslots": "$noofslots", + "jobs": [ + { + "index": $slot.index, + "unpackopts": $slot.unpackopts, + "nzo_id": "$slot.nzo_id", + "filename": "$slot.filename", + "mbleft": $slot.mbleft, + "mb": $slot.mb, + "eta": "$slot.eta", + "avg_age": "$slot.avg_age", + "finished": [ + { + "filename": "$line.filename", + "age": "$line.age", + "mbleft": "$line.mbleft", + "mb": "$line.mb" + }, + ], + "active": [ + { + "filename": "$line.filename", + "age": "$line.age", + "mbleft": "$line.mbleft", + "mb": "$line.mb", + "nzf_id": "$line.nzf_id" + }, + ], + "queued": [ + { + "filename": "$line.filename", + "age": "$line.age", + "mbleft": "$line.mbleft", + "mb": "$line.mb", + "set": "$line.set" + }, + ] + }, + ] +} \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/static/images/bg_dataBar.png b/main/NOVA_0.4.5/templates/static/images/bg_dataBar.png new file mode 100644 index 0000000000000000000000000000000000000000..8296047b878e11c8688feeb69a67a41f66dd1701 GIT binary patch literal 469 zcmV;`0V@89P);%sL<1|>1b{@W9PSH8CTX>nh;6!kV4SqbwbCSIbGdaV=?>ev+&f|bv~KyT z7A>?Ty@h5HG3)m01=-H7McZZo)UW4kO^O!&hSDG_R&zU4Y3#Ah0F;L+8QXGJ4hOts zEw-s`7ctaMtyoUNQnG#HV(~_{+eUTQKDBaqu^6*;Z0};u*6f5O-8E?*P}2EGA_hR= zJpkG3lFeSro`?a^5B5@vW{;Z=!!m6hNyMz%O`q9%Hr!3v_ItLsn+(|cVJQ)FlRj8~tHBtJV@R z02+Q~wfi-+{Pnj)4Ao85?l-oF|Is}3knQEcMt-ng6pihk?C{(;AF>^tTX#OZWBa~Y zNW=i7=ukB6{Rm5mSpIx#e_-uhu-%~gu4$iba8vdGUi+79*VXzRR@=qRA|LKbTH21I<1y-A^-rqfF&@*CN)H+c!4KH(zMV0j*m=mi$%4!tV)6e{ zyl_>;OHWGT(t-J&q}{dzQ@*6|+=6K(={;i|w@`Ty!%uS*fNcv$+|XcI?t~DkK5r`o zTN}3v7gam-xvfk|y$@`;EqMu3OEa)e!zW&Bz)qV!?M^n9Thvq(K3{`%TNJ5gE3jT0 zPNVpD>K}tmmX@YA=zxt=E9$WbA%>lR+bAt4{Oknm`=_AZ2lllncnSSJ6R`6rApS^l zZWocJ-S2a-%dV#Iw;9+~PgC#LDcE(adHHwmdfmh!x0k7*q2Bhvo+n1^|J1ty*wfhT i!Ygq<1bZBr{qrweUU26e2%L5R0000`00Uh~L_t(|+U!}~daEE1^rxn^u~;D{ z;r(Cq?81V(3wnCxm3*zq=T2s3#{k+kZQI~5=5`y$`~9PBKf*5@$I%$O4PyWh3ZV=y zdL;?)fQW0NK0nR54U@#dF5P_j>3DA;-O~H}^X#@phnTKRyQy8;F8wl>K zfzV{?A(X8Jk1hMWwg62C4V41*z!lmt#v5Y3HS7BGGfm$6crG3cYTS%@g|Wn8EnJ+G zJsfTUux!KO#j_hC09ZW`H0%NbKoS7M#*YL|vn&!|?O!b<)S@hK1zS;Q`KOO8P!AH| zDk(&Z(*#*BSKwy{KF@vs`T0A~x7#ql8N2{1jPLITPH!UtsEl<9=zE%28KMAllL3SP zfFx*w!X5zv62Tg*?pvsOM1o8n-{>ZV0x&csU`WNEn#b5f)^LtB2}w^^;AaO;?@>;hcDkQE+X2KcIlNV02z0Ip);ut{Gw ziOa%LS2#?8Slku(*@4G5u$#o~kq&6=&Bi=C=Y2xJQ1t*{<$?eKfdD}@01>2e0KDq} zQrWSPNlFVYTR3hqK@Kbgz)_PsDO`b{9{AVS`wep`&w(gqZMY84IB>2}B@)3@dDHdBQ_-v3Y#tBVY<3BdVcXgR zfdGX4?sdfA3Xht=>Lv@oVUx6BGK#WEdX9->nskg2a0PyL;P@8@>7>|f2Co6N&8Gfv z6$u8h9#ja{|0oP1u5vpY3P5c;6Hkzb0Av2pWNpLL53#(5;PDFl?7)qYGhrCivlHFS z=bfMg_#*&r$zr-s(}1_41%Pi?B|s7=2Aa(Ru&)rdGo>IGJ^T`C3)8WMvWHbG#Q!>6 ffu9`sKLG{+BXTE4cD7{h00000NkvXXu0mjflS|s` literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/bg_lonelyhearts.png b/main/NOVA_0.4.5/templates/static/images/bg_lonelyhearts.png new file mode 100644 index 0000000000000000000000000000000000000000..3eafdacf76f11d1f2e6f351ee5e7c46609714df6 GIT binary patch literal 3434 zcmV-w4VChVP)!0YiLpeNDaM6kuEAR2@p!akN_e!L{xA@ zQIVzyGAQ7HqeGFgB8r6pQL*a;8AQ}^a1n6@-c&M->OB3XhmR+Dq` zEL(i`nPm?-^D=}y8Ow9d;$`sU+$ZCWITF5%kzg4Y=Lq<@GQK8bgLFxTK*n$6u^D_$ zHUKD++%D#GQ)Fx{W0EK`f-U2D0N_Z;U+~f|Sj^88%MZoQ%vvrIB&UcOCR|g7jgu3L z;m^-a=ZnS6Fb+43BjPdGnHgCe;c@_G&-_^wd2Jc8B0JbPIXEzFEp5Ii)PG(4o09i- zmR^K^?ioZM_`~*Bewhsbu%>0T+4_fVX%zrn>j6-^{fEt9F93?NzI6_LaUQySUQ)#3 zEN3gL+}vDC0iSCrFX-?3pALURUwqF}zTNNTVR-YCIFfWRLtZy-W_qSX#K_L#aQO`8 zpNIG#2mW;)77_d;zKAcBMMTS{Odw2_wOhy&hy|HKhCukAn)naH{-oKtmWkT<5zv-c z0;M4uKz<$oC@K*k343HK(C>W<#zzDB&5O~Qn4SC2g8qG1xJ>@Y79@X;V@E_XxDrv$ z?3(;q0yH21ML+}UKpW@-6Tk$vz!A6r58wj=K`4j>abPjvf)tPeL?9OwfVH3)l!C2b zC#VK>pb<2KHgFhpfn(q_I0r6)%U}fD0a7pyo`5Ov3d}$dgoVfu6;g+EAVbI;vV~ZX z8{`88LlICMln5n5LP!D?K>Y--nTj(fs8oB@tL${z&XcGDrdIuvg38ukX zun}wpvtUm+2#$mo!O8G4I3F&8x4@Nf1AGwfgiphl;1O5~KY^zafDjQnqKhyQ7Q#kC zk$5Bt5h1IP5~KoYK-!QVq#wD8NRg+=TNDOGMKMrJlncrq6@}uWmZ4UmHlwOh2T+}; zKGapzC~6Az5lu#GqRr9H=m2yqIvJgdE=E_No6sHTv*;1@IQkU^gP~)LF^(92OdKW^ zvjVdjvm4WnIfWUY%#V9dk}jPdj&g=eS;(7ba1vfUtBy+ zh%3ZZ;977ea93~>xEZ_>-VpDM55@EF%kgFSMtl!`2tSUWAt)1!39f`lLMmY`p_0%> zI7_%octIo*^@vWyaH4>?hFD2FL_AL%CB7w5NMLy&#jxMr03i zJXuWMLT)CXA>SvzQJ^YVDg-F-6jm$LD0C`ZQFx|^S2R@gR9vi>uUMgYL~%&*sS;kv zNQte)QCg)`qjXg1hSIb$RoO;4R5?R=vvP~_1?5K+EX9c8L*Y@1DEla9C}UKFs!wH8 zxzu&kM(SDWI1NKHrUlSaX{EGpXoIvV6^e?TO0-IzN{z~K6)7E|8_@&k>GU%CVfuCY zJ5?=JPgTC^Ce=38E2^*6=BRn7@zqMy+SNwX-l;Rxebm#`x2boj-_t;8m}!J-V#`E~|8t09<>bY`U>s_U847WtLy>3!> zU3ZRqgZl#yeGi^TlgEUosb{L^LC^t4d)BzcZGt`fY9xs_ri?BmW6#EjtLJ7uL*w`VG~gh(Z7JYV9A1(1+OB# zBFiH0M43cMqI#nhqZ6W=qhH5($CSrNW36IW#$Jlkh!ezh$7AE8xdr`1lgVC7dNk648kso~Qb!)}_8q3r*Xf_9;Cky*&e$ zk(hB*ND-z9`!cmN^D>9C%(IHKq|2O_?OZk`3KBJCL)nY6yTvrw&(wg#M6zBon&XyJ zlk+AwI`>GPa-J}6V7b}yP0J_pee=Iwfm*>`(OaNfu(n`yrRU1}RnV%Xt9n=KuP$0W zzQ%9OfwhFSX={Hdv@R?!e7P=WT~Co#(VC*M^?vJHixrAR#Wyy%Y^d9a+9=pKxM}XD zs!bnDcqJE0txGFP-*4t_zW9~RSCwCV+LE+ou*{)s&sNM<;nwTh+_xPlS1!*lAKMka+N6C(tJD2RdP+?b5w~Me#vP)VST-jY^P_?z{eRWFpNR3xbd#z^errOuLdAqOd z@z~Q=r&U*4_inFX@6CF@`pyQUhKhZdeL4FcHbyu0f6e;3xk;m`wCTfs;eP3Xhy#7i zj?K+2nk{9maI2(s@?gTj%inl^)7{2wt8b^bmmUI#B!?bmEKDc(k|2rKjV2%kTFe(>+#mT;+J#3Brk@6Q54zpPW9G zb?WKqB=X}qd>G$kEdEWK>u?x-@j$UM4?7HM|sdK=7 zpyLPoA36pd20Mowhq^C2UG5p4H+rvNl-blD1y~(@z z=vMlz=eKii&)iva7k#(np3=RF`@L<7%J7e6jCqHHX^nSeP zA^Bm&gw90sBil#ECVeL_KVJBF{7Kf6nWx1+EB{>k%;ed3zj*vIFcmvB{#^9@)32Lf zsK40%((YyNblCL$R~fHnUYER4e{uvwLn0FI1x$m*>D?gZi==m7*@$RRLPoI7R z_k{EN8U*;`00009a7bBm000kR000kR0jNKxX#fBKA#_DpbW?9;ba!ELWdKKVVQ^?^ zV?%Flc4cyOWpW@WNp5syY$Hb$& zY+)fJfiaIJGfc;JFgm^x66!RW`#g?6;=;}YuDc9a8P|8?^E@4H+&YXGV<8HgtUUF| zb~-(KVzF_!PM?>^G)gsNWz_om9f@`GSad{cNvYjC-PK}-oCznGbl-|)!#ju!OsB^v zEdTM>5c1Km3l?1YFIeU|AcxgA)601Hf#ZPt`xaPcJqXMPx^&$gg2loJAA(K}$YB{#?EeXi*@H?j>$Lh#9zNx5 ze<$J*!>nQMeRoSHix%a!r9$_GbYO!{^vF+(nrTb6MIL0g^S)bST%t&<3bF$C#Ye|E zq|Q-1W&Bm0X7^#CRH`s4;wUU?0CpcuQK^0|+*b9Q+bGmnMk-m3s9M;qg#D2Xxcyic zMHoyR@+UkK_ry}22)B5!R{I6KMJ$$YJ7dv3$SRU_Xw=^ADF8)Iq)Xs2fqPKfjM$xH zz!fI5{a9Mh>6^Jn^p=-u>9iPeE0z?T^=j?{`d}}KjjZBN zxWt5lRZ+8!TF*(hp8R$5gK2)L#G>Y-Cy7xK9`s=i5aWS`8+0keb1>%(imIE^+?y$3QMMHnozH<)5o`PqO5CO#-@spjUA91 z?jkw0FIGk#)WUaDi}y;MGJ=Vk^WD_V=VxW=Acaz7UZ-<(sMNopJD*&Q#<=e~ZK(Hr z(jc-_?PE;%lk(a)hsrg>KYZfWBY|ZHVudhYGJ<3>_dfst0RR630Q|*~yrql}3;+NC M07*qoM6N<$g6*4-CIA2c literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/bg_thead_tr.png b/main/NOVA_0.4.5/templates/static/images/bg_thead_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..e17c7794daa62525d00b6de01cef8eb09e307c73 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{M!3-pCdAEE8QfUD`A+G=b|NFny@P8pAh}@+A ze}nG-bvpl7YyDrT`G2|k|D~$`7peSTp!9#9;{Q4F|7XhnpDy!%s?`6lk3T=-0`g3@nXL{eaQx9uaaybcD!I^hy95YEL<_*8j+he1<`bFeR69s53He(G{ zk&h~3fD}H(wOz=fVk7fi?I%`yH>21vMJ>dJ@N9%6Wh1@ z7sf1^aw_$DsgQ(1V``qHLZhvlcdKWnX0Ol;x7AV4rZF~eFVvYnu~f-9(K~yuU$}1Z zX$H~q(FlnF`vTcg`s`d6XxWl5CYnzfl*Kw|q$vom*2I1n-S z%DVXN-(t=4ffhWBt~R*F`&vk%>RQ$`bASHgY-uT7gPQDXmk!4;U4FR==zzNh8_U+e zmzCJJwRK}&u2N&>mQ_Hv87w(^=2qIyDF-eksR3=dYP6ka!hsKKYxf&_UZ3xgAhkAY zW;B~e!jIbtwWrngPCZ}}1yUlh=WPDzr7YKSb40fv{B!KqHY7hhGe4TUVPo>!sO77t z?M!W8X|vD%er(stK9*&dU)E*ihA-aA^I~J@l(zh{QM=}QCA`QrxVgD(>1>F-XM0L# zSHpa<**p99>g%@O;y0OqeDWp;4UGhHZR zm-X}mCA%Q*-f`{NZDZl;*B(rlGeS?_FIg z`RZ>Hx+mXpXa9dS4dg2$wQ7A8gWj;MXLOl=xorB@9m!@E_g5JydSd_OPI~uW3mS(P zrk_un^Dw{pukh?In^~4!Tm=dD{I`c@$jlMhe(Xv$lSG6kI4R zvuDe<>Cl)1hQLlk%NotbmtQLWUA(0Y@>Kcxc(23T({gS8Ycww0e(+&-cKxeoy38uT zbd`SW$&0NlZS%IydV2QwX8vpU*2H~(_tQHQ6a?w=Dh6}cN&PglsLFoJf7b}8eEG2_ wKh{EB<}hEZ{Mx;lsR@r?z89JSw!T4r_k{5J|1(#g24+JBPgg&ebxsLQ0IiSHHvj+t literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/bg_topBar.png b/main/NOVA_0.4.5/templates/static/images/bg_topBar.png new file mode 100644 index 0000000000000000000000000000000000000000..083b1553f43084f797e53ac98f7861babf12ec60 GIT binary patch literal 324 zcmV-K0lWT*P)K2BJG-~6%(|co|a_}*6eF>S$u-E24NjhlA>i0&HhAg z53Tw6Sf|FFeX!ZvZ*L(Y?i`@KZlj6t?jhLMi}tSD^ckX|J=raHkCgr75v+Htr+xka z)<4nWKEFpBg>_VWqdYjpXm)DZ86^F#_`Tza+|NZv={q+C+^Z)$u|NQU&{OxnSgVE$;wpe}rY=2`+1BIUL RMRx!I002ovPDHLkV1gSEsJ{RJ literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/bg_tr_odd.png b/main/NOVA_0.4.5/templates/static/images/bg_tr_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..d3cb9655ff79d4a737347beedddb673770a6b8bb GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!3-ohG7?;YR7-$Qi0l9V|Nj5~|K>B0`2X)8 z2>k`3zyJS$(eFS1f#??){rvqOh<*Ukum9h{=-bc#K=c)Ye*FIeMxVd`2cl0v^zHvg zF#7QA|A(*t--FS+FaLq)Ef9SMSqee(K1nD8-Q(ox;uyj)ll35{kQ0!5VD3caPM4)Z zic|jEZ-{N28=x}nhPP}=Us3DiOOZ><3QI5VsIJJ`TT+$ZeDO*0wusulIrYgt%&qg@ Sx|RdAGkCiCxvXWdJZTFEKVRFgFh^6@~x+ z1_((+K~z|U<(O?qQ*R%~KU=2L6U@{xGX!P1#D|%h6>Ih!LJ7lG1UL-0{$dMMn-<0k1P{ZRaHgG%E}@=Jv~eEJv}{})zaI~N3a_wF4Ihl4k7-YCUy-@cvP+*|-|-n_~9_&66XT=;G=LqkJ6dGZ8F zl9X6cQ4tjt6=*aX07OxwySqCkPenxqSy@^1_4U!$*SF-_OXYRBTpT}s9F0bUUav=` zQUNeEHAN^C;?SW(+`D%VK@dnwO9NnjejcCCha^d~wY3ok;C8!dZ*NDV(NJ1iibkX1 z_3PKn%*-gsW@l$(8vAd!-EQvOxx<<@YdCP=0Evl-3=9nL;>8QTeEGtWBS!$Zefu_E zuNSk~tjvqLWNvN_Ns=fjDIqyI`MbHI$j{HmZntBz*$4yz=yWFMdH)oL;`Gh@bu!(k>SCI|+D*zI=8%gX^!4-XF$2m~lDE>@af3bHJJSAb8S zJ~25tNp5bg(o7U3B_&9b#L&UkcDorK9tMaRA9cX|{QNI9A4Pe2Id;39Kp?>M z^fW71u3U6YPEIar9zZ=lK8_?w6ciNvFv*V`;P?BHBnhonyNF9pPDYX>g25mFhYue{ ztyXjS@?|bvx}@v{u;2i@-A;XdJ@xhVJbLu#mqf5wELg2prl+TgkB?t;1p)!ARx1{Z zC1ze+I2=ZnWqx)T%+1Xq%kq+3BoaZEWy0a`Pr3E$*VEF{LPtjj{r&yCdi9FBx;iWt z3(;CE7K^fJ<>ci2k^uev{d9G8q0{MzkB?u(>-BoNy1FPWEsYUDy?XU(L{VgHZ0v^# zWLZWO#U;7S%uGa4WOQ_N5jQqAhA4`xUAtC^B_$e`{D6+D$$jQlJVqyY7 zalr5F0fU2s*laekva%>FEF>{85w%*)=;$bYeSLU59@J_zNl8f*6%~=5o{r6CV{mW~ zfH*-AIC$_N?d|QHI(3S@d-oCy2I=YPK@bFP+_(WOIH0|~J*I%d!a__Y6UUAnqp7J0 zo6W|aJ$nFn{`@%~KYrx&>C*^;0Km0t*YNp#m`o;oJ|9k}lPz1e01FOy`t+%?X+}{~ zQ?sb~w{PEa=FAy%Ivqx%Q90^dE*F!NlhoGMa_iPDJRT3l#l--aOeUO8Cuh%|U3d?u zsi`3?EsX~c9?;g-27uXYrna_LNfvcLl#k-*(W975CQK$1EiElvxpIZOckcpVFc>(0 z{ybZ^ZdJx>G#Wm9_<+;tL=Xga?AXD{lP7@%2RwfKcu})U31BoDDJUqw<#O@$>sMB- zTE)o72tJ>W*49=wZ{AFCaWRdJjd(mB^7Hcv1OoW|eoQ74Mx*hcc@_S*QD0w=%jF^^ zC56wQKhxUU%BD@56yD)*(Ad~WYHBJ|Q&Z&U=X3q~^>5@q_<{DXqM@N7Vm6y24u@k& z-r;aW%w}_>p`jrrzAPLN#pviL>(;INEq+-E@K>-b{s;UW{0A(en&Fl&+g|_x002ov JPDHLkV1k5(A1eR= literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/favicon.ico b/main/NOVA_0.4.5/templates/static/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..904532cd80f1429fd891ded9161a0bf632c7a106 GIT binary patch literal 15086 zcmeHOS9Fv|vYtJ=@4FBCu(muZ1cXd^bM)N1l zpEV;!XsEQ(gbvbZ#%eSgD=XdKf7581>9fC4$=@&ji$=4Z8rV=9>Y`ad#Gi|Q1C>Jk z|8Kwjrg`+}k%r6T+9=z&y|bFVR}O^x(ti-Wpre1l;*wy%U=MK&x+rlyosme&v;mN?nFEfkL4CP8e#9! zdG(x)lzpnlJT159evJ3dy~Rn!QuO(f{C%ox$r!a-REgp{wK5%wtlOu zaQLVG2w2q*fvcG;5WJ>8j!0Td^slKwG-aYB4n*{(fr#HcsMnO?IuY%s z@_|PWKst$EfBjXI=IX!VA)2*8NOcjofb%>ekXwnpIk zp$N5q1(BO<5WB?&aa(PW;5YdL%|h4JGe(#hcW>x2%{h1fB-4C| ze+p6JwjoG#RPaSR*w8#)L5STe2wL|F{C^&RsLjI=yY)3BY#WZ0ox_o~YdF%KUPGqy z>&PO?-lHQE^`nQT;96^m9=nt~m%XWj*5P7(0&-kN8Tc?i9q$ank-qyiq!O;A9m5gt zI2i91Fib@wQwJC8=zo;Q%~G8%bq3gz#81LmkX-?i5| z^Eh2P7WHip9?U4QS9Xm>>Yg`|>GCFW+}=dq zFK;1#|Jx`y@HUDLnx_(v$+&;}ieBH<@@A}^7muMi-w930t8qGa2d8maHCDD?<28uzx!Pss0o{E z)Sh`Wj-o@8PYht_vG$`32VGOP4AO>JdfCim!rJJ-zi zX`nT`-*s8vPp$!%XYzL&^(*&NFq9FNQlIH4^7;_@9v=v-nfs<8b?-DpJB~rF$4ngc znu%hcnb02o1m*sppd#QCR0e*EDyE=MQEh_GR~**sf?9WOU8)uBxv%Ue>vd5Jaqs4N zJ$~7b@wXK0F>23!Dg!=6IbkXD`vj%FAEVHFCh|S$Za*{=83#T>^tQ3c_x>D(zOztD z=XhDbEK~-~LRIjWs6O&f)P#I#mM&BV80n1EpPT2(&GxB}`H#S_mbU18nS-j(IjAN&7B&a9 z;pXX7#s*xh4(>s%g>Gj1HO4Q+z0M1I`Ah6vo-H}hqaR~nEL9E(0@O!w`3>rI^tifguk=y+ zs_Q4y?ZlZY_pVxh+DhF8FWH{?)DnNjQcakuLKmR?$b6Ip&Bsyyc{u9#HQ|2?CBe2R z3tfcD@I|PJT!dp$i%=K+AMjc;H9P~U`>E?K1ul4WzsuzLbFR!=@RIGhtRt!=JdCM2 zVi79B7C{?gi=rS~6a*|3^3V7F4CUdAQ604e$6}VCE_MkT;+CR;)|%J5FR9~rib?E> z{v7PVi!s#4DVS=am!L9o31R)7?AOI&{|1vS7rV(CS$ij-ob;zIZaL}`R-hqq1)36n zL{k!#NnAdE{Z!^gJh*dJe`ZPDXC2}@;Y{AH9=sX}M+4zuOto<520&bBK$82{0W3Vb*lw3wpk+AX|TAz8WWb`WcvE2 zB9`&Fa$j6;EhJ25gk8Y+q^!-=+v}rE@;Q;V9>-JHkq#|I!NEyL*=mLOP5l-8YbE}E zP~*?uVS(ITRw&#%92JK@Ktt?eoJd;-#%7>R-Rhgb`>(6L!N@)^brZ>QSy>3gHKWQGfE;rz8 z@qRRuZGDQy;l0W-Dmge-@L}2IksOWjTj=E<`Z)ceIpa^ z{Za7qJmeY}>Q_#to3w!xydd2^jVmWJNWUV;zI39!^ewdRZxhy6RI*Xa$xv71Zyx`% z=?{&sn@5@FJ4QOAmh}UAmo>&Op|*1UxZhLOpF)55{Fmov_D(u~RQkhmP%taD#l^nKz%~ivCOdhW#6&-@nTJYb1Zw`KiacVw@f+6dkJBH19~QU_*3H3Ke`>?$ z;^EyJCiRDHpWjn|>Z5Ii9Mv+Ey3i2!9pSgu;ZgLVV9y}1olh#G*BROV;oY04@O|H? zJ@4P1_m|=Pf8O(_c;5(NcgnM0J&(KB&yub4oqiok4~;`>p({9Up>8MZofoRf?i};X z`eStd>+OH#{(an8-CiFfBpX0)|LEkune6|K%KKN! zpW|H#^d?T(!tZwrWNlaG%zYWFf>$@Duuros z4)Nx9EWZac2~!&R7m~Z-4_RkTzQlhu^P8UE#{5Rk+^%{9(;VbGjNilN>iKlmR0n^7 zjuWXm|G09-NbGVwc>mtLd5+#+A@ru6M7ly}l++bf$+BZ&Jz#yvApEIY$<8GFaU}nU z_5Hx|Pj~-kb4x|2ZTu!nB++*~N3jOfhwWDJj@OOFZ&5j}xq80yAbNLyf|D8Kk0|%S z6`Bv*6CF*-Xe;w2|IQke`%=7N_shaIR>osK3SJ(U>&#b?y&}(a(hJrPey6a%DtsN` zUu%ie<>9s@BTY&0LM@*`$<#*7f!2WMEs6Iu&qtxh)z#n0_D@%`zDT~TH;kS4Cd-%g zB-*|o!q)bqxc&kyV`sX3%4U~j#{o1?WgWO5uLY06I@Nnp^i}EiY<1?##QMzG zh29hP*bV(CzHW`m1P7O{>*q!OhMWVJZ8b5rB>}UW({~OL{kSi$M;eXuyAtta-mEiH z?um5H6lXt4=*oY3s8%cu9M67r8$qJEME~SF)eGuC-DO zf2-jP+zIuDm6kqjc4=F#Y#Ak+n3?4I^a#=E+IUi*t5-6uCdJD;&a#fO@D96K9 z$)z~De>~+Rj7RYyW72xRZ{$a3UUw;8&G&H~#o$^B+$d${o{?-WREHSGp)m^%j2Af@ z*=}zkZO>as*foyw97a-}!zAP#m_j)Y@1n%>U6grG?LkdRKN*e9{7<3o2VS9@0K>n_R#w(|>wZ1bb-(WiB8hnV1{U0K3*8~x#FFyP^ z#q+VgI|DI9A$9Fipf|biS4eW1N^$0YQ~cHzH4(NH)3rr?^dixZ`#ueE?7)cstxFVV zqBtv$Lu1y_yZl(BEvmw8DOUV%6b3Ftvg`jK*L^xFBNn4JmfCV$IN^t9pk?B{rRIP4 zMjORySLnxTi2s3Npi5B`y%ZG@OOfyMzX+ooz1WRpgE@~N*~~*@(n^Yvt|EK3_jDq4 z4KCG1_IS&3PLh5c8nY>B6~#MOiFj?k#|%VKeq_+md7F)N__~&Y$BLlzI$~S8@(Swln4Qkxk8Sh3@?MUBPdU;{Bt<-eDa4 z2A9NRD(`kf9;M_dOTGu#S10>$+>zJ5_~4uL=CT&{;^X-9TT1_Sqjw?4&8lf1^ZqtB zU&;I7{aa{nh^2GUj&cpYqrE>9g>FN|TS~k;=eKL-Sa?p7k1Y8d>by`zvBDIJ z)9*wToii*uj={-(T=HA)dH8ER#`oae(UjDKkD8~t{=EF_BIfttU+y#2XpU-r-RsZG zzn=DllsT8`SV(tXrvC10{_JZu#mC%dea-*Y#hM=ctAjo>lF=PHABx<_|I`Qi*IoX6 z_H>^s$6(cK)R+8gBjy>6O~w%U)`lBl;5;ief8lR;9?&QAFFEiA`B)zrjenskP{H8* zvhbC$POACyogiiOyz9^7@P1d1FYA2f$+|4rpTzpmd;a}}KZ5-z-Opb+Mw!=S@SQ4o zJgz)n;iu=#{pI}Ge0^<`tRwJL7^kFGwf!lDhDVEcnAB~&m z%D{V(V}oZ)4hcImZ@0C|pQiKI(Re&Jo+JB#V#!w*Msec8kY$lwS6gk!9&R@H87&14 zZr>LqeOAm{%$@Fj_EjbAnbh2QrB(QP?%wM7dv(lDkr}&&>HRwFr|J{Z`G};SFKOGW zB=Z%KcRD-7`#YDs1`fiL(A_ie-~F3;<`QrAQ?OgYib(ILpx>Hx|JT-(H!XO>$aeM< z$lo)W`wbR<&+XW65okZM{cL02v`EKs?V;JW7}i5QcnG@*NlF9(N<+_bMv0;ynLK~Uob|rQ%dWl>|e(ztVJ5uZMj`)t-@!7{`d+fGR?esga hY1yu0+xZ;qjn7@4mnpl)wA22a=0LvAXZ^>0{||6c94Y_+ literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-blank.png b/main/NOVA_0.4.5/templates/static/images/icon-blank.png new file mode 100644 index 0000000000000000000000000000000000000000..3e985d301b20c2e91d5faa96d9ccd619596af442 GIT binary patch literal 1171 zcmd^;-A_^h7>7@}RdaK#i?%*4s*74}b<@_?)>Wk$TXUwiwP_&~ijDjrQp23BITh2f z+02Y^egO)Fm?DT8APES}_(lXo3zd|aajl=1_T`6x$HKYOg2V?RDTiY;h#4@BpL!g);gHov2k4Sv5#ucKf6XMl4ws*E> z%=+|`xJ8$+_;>goq(u{@3H97Hq;gcJ4x+nYYQo^(PJj}76igwsF%`!af1}tESi-&5 znAi~|Osr4aBh!u@p6Tzvg7abLxIYRn1VQRtfUDm$2jVM%$cWb0rEm&t+YP$pE0!Yv zixNRm+>oYI7wMW`V|mdPZ>V4G_C!D;*U-MWjpyij=CDY+ta8W7`sKAe4RzAeIBDfN zK=B$#VG27fkleaX=#%36H;_1*CW(_}+Ja!Dn9hGE4=Q~ySzxUgQhl?>jlKkVP`2O*KmWe`dtZZuS1Kgo&)hVy0rox=9ymTlv2}>!UPVGL`^ILQm6t zNMZl;WWrxBc9jjQN7Sp$LQ@-mu|s4mVH;rt{b}9UhhUB)=?o`I*-HZ&KaOj`j;+>- zT~mIfWyaZKi>uaSgDVh@DQi^kO1$uO;?=Yg2bQzfE~2+MErCoSkk4PnR8k0}D|M~O)9K@rnC#m{^pfT9{;&=|5oFFCgx5C zCdU5^zkvGwFf#xI5F^9@Mj&PZ>i;XIDz1EIW7#HNO(``7Wbpj`D~6DkIEG`Fj~g>E zv7BT0%MMh}%m5HTKwUu1|AE&0`w6t2L0CglgBzr|=0G*WndfI1m|2+_WcXznrnpXK zFxRwXICk!k9K(Oca|}%X!CCZghWKjC@{mZ}K|9&$aet3l8(A`4} z3_y#NM3or6{{6!6{l|9(hVS2X7}(iA0KNK@fra@tKmf4-8BwZIYO@XHj5z=N`2F8h z!HkKOiG_iOjfa7mgPDPijg5hqofqgzMg|KtBZgP5QB79zkL@az9?F#YcPyZ^3>T>rDQvi#@l=KQZeU;qEDcej8t|Nj34Vi0)x=H-9m zRJUIM0mPyts?4V;rOD8+yMbZvjlB#koIpo0{bjiO@h$^58#ge#m>6Dvd(DusJA;9f zos;1k5E_WURn1feKaiAuu1|BaZK*xijMU?6_J&-MoG9!s-C zzdQA+U}|%2STXXENpkw6Jq=WB#30h**Zqx80G7xg2LKoZVN&=1FEccT3xQkve43;n zjZvX^?*P{BPNoA(9dqA2RbK$HFf%bTgA}R?sWRwG>M<~LvjC&_AH(x+&l!FKqZXu* zgNcJdK|q0lm5r6*+rMuN%KXYeyO>(c-8{PO?x|MdU-|N8&%^z#2WXiNJ7h~@6v zdzJqE0h7#>E!qD3`omx(tIv?@mCeAx!U6Ut*b6}K$qC3ZY&&|8VcW@F4D1|S3|H@7 z|9AS=o?ccaRt6&pBZl99|1dDI zGBU^m{m;e1#lXV}Oi-MhCxK>dW&i~p&}9Gt!~zOUV9)~%0Wtr6y!+zLuZM3QbN0IR zG5i5SP>3@F;m5C^8P4814U9_G7Yt0G+{*~gyZ`~j$dJs4lARg<{>{>s*6r4l)n@}` z=l}m08CV!u816i~$8h@Qg}#6P7^{HU`5(hCMsRip2rvLwO?vxoke4F>0000Gx} zk@W)v5DS=md6s{T)R1KTwR32}0l81~vr4#SHvcfrdB& znMXke00a=kfG@8Y7+&9C*tmEq12F*Tz5Osl00IbNz}Ht`&Ddk0ssOG0Gwde-7a@U^8f$<07*qoM6N<$f(3WEX8-^I literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-header-freespacecom.png b/main/NOVA_0.4.5/templates/static/images/icon-header-freespacecom.png new file mode 100644 index 0000000000000000000000000000000000000000..7246a187e0b62a76df18f7f20e402425b7d7b6e7 GIT binary patch literal 552 zcmV+@0@wYCP)P3_cnEkincmelH=H0R#}(fY1LwfF=L^|Hr_@$ONWO{MZXN1RVek zy$UqM5y(6WG5{cezy`ek`-b7spF0e5*3V!d1^~UcA7%(Z06`4+_XeyPn~k^t&?O*4 zEC2!sZU6|J|9K4J6=0zMW%$GJ`~Pns{>AW{;U~kd|387^{}{G@TgKqZ84NSW6(E4X z27LVYmH`$POhEYO{~wTcux5zHzhE{E8#K0gM0vgl51;hW|jV|A7#s31r02|382(`VBVh57bK_SHJ*306`6S z&wvPv|6n$IXUD0ub*72q0L-0MYDF!-xT( q-1!R>Q~&|Q`2YWZ21)=xfB^u%B?@tfyd%B<0000aF literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-header-freespaceinc.png b/main/NOVA_0.4.5/templates/static/images/icon-header-freespaceinc.png new file mode 100644 index 0000000000000000000000000000000000000000..5225e28858a1f99c49a3561755c29ce6655db557 GIT binary patch literal 623 zcmV-#0+9WQP)^argH%3RRzCy140hF*%fE}B&i^_SAb`LIy#MzGuHf;X zdtl9TGM6*(F$v-fys)VreL(6OKmdUa`26n!!k@n{g6SK-FEIT6{|gvu{}}%K{|$8E zABH{O*D=_0cq5ym2M|DD13vwS81VGZ1BPcSzA$7b=Ku};2-Nx)Y{*{_{QrmH=l>rJ zpMaLFTeuMvpc_CA1_&S&7rgoKngPOxX#NG%46^+{m(^9REI`5)Q#!yqL90R%Pxq*=_5lfh8H0%*WzhJXM6K@Is24Md1R zAazjNLFs@Sq!%E77=c&|7`Im$hy*|b`hiq05I+Oi01!YR13;wDt4-xTMRr-7)H#XFZLHu* zlh8ej%|?;WR+`g7f3iW2&Rm|=PL%|L{`RhiMX#L#`1u2z@L zowCC)fWz?e^gD*eP>jA%in%Xxs@UP_N`0us)#5^m#4UKX@bdFroz%L=(k^6?hoibR zfWCW_sngx&FnPAs-Q!o5$~JqpM}V(foz#AyyHk$8uD;AIdAO##%&WZ1;^*sQjjyG$ zyiJqNMTEIKe6u%qtv`6FOpU@ufwNC|nlyd7^7Qvkk;via>r;iVi>SYiqO(67yy52Rn6k$&gUMf@)^@e(|NsA=9y0s@ z008DmL_t(|+Cz4EyB)?jgl^t#StbUk$-s_XeDdEbtH#%C+F7VRekfZB*ZF~xs@poj#4;chO z*qp_|<7z(!Rs;syK3<_ht<<%kwsaqEwYOV-CG&yiybfO{+P^UzOdO#$diJZJ|Cr zgs<`w(_~OvZh_A8I_!_Bs>&d(@8F~T`Un$)k|Z%usw;OtayR_FSRmplhnjj~zMwBQ w9ehe8LNXa)&ySlYTtQ;Q|9{^f5sLy006BF={5dU6?EnA(07*qoM6N<$g5h9j^Z)<= literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-header-knowndownloaded.png b/main/NOVA_0.4.5/templates/static/images/icon-header-knowndownloaded.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9d2c82f41b52185acbe046976d43d541b15f18 GIT binary patch literal 576 zcmV-G0>Ax&n?(!;z`G+54^)t}RU{{@c!B8~iEW=EI0D>Cu3Zdf7EwJXquJsHIoI&<#Kxj{yP*#RVVVy@nX{14%Q?6+r&a z-+vj{e}015{s@Q<0R#}#fHw?3Kfh&IcM}+WVZIOpp_;&kfY?C%510bxZ#)RI{WuW6 z0tg_m0q@_vW!P|w0bx5x0|>yJ4#hwIFd*B07>NG>1Q6H&kmfK=1_o|bTLuP@6QMRj zT=5TX07xCwc2GLt2I&O|AVwh80>xXaEEd_P4T O0000KF literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-header-mbleft.png b/main/NOVA_0.4.5/templates/static/images/icon-header-mbleft.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd2ab262febdbf7073241e08719ded751aa303a GIT binary patch literal 986 zcmV<0110>4P);fisW@Z@$ZU#vyW(KaW%qRwcfB+8zgS0Fc0|N^OH^Z-=K*mq70RRES!obE1 z6a*T=!Se6Lm;VfRUokLz{>*?d;6KRu3=E<`Pks6ca?XE{_uyUx2p|>)L7-p001e}0 zX88PTwZAom;8-#`WItPu8v+YAinZvACoU}PAb^+|{(QLf_2sh*ckci6mR8f^ zP*-4Q`2P=~`45o&2k0VTkT84)y6*SG9Sr}^7hGp}b21K10~wm|H_z`&&d3_)R_mlSvyHIff&mtXtO@6!91fr)nxD77$P0RRES2sS{_ z0_+%u?+<{k0H$LOexTdGaxkz-Ol0_U=RL#UPZbO}06>5N06eiO3M)PuG5`Po07*qo IM6N<$f@0x$iEP)1riOp)M-B+L7VWQYIILK!3DZkG)Wp&RCbsFMhvPnbJdmvrBfGLUy7n zZ>GY_(oU4nGkLW%g~(Ep$VP*-T%FY6=Ic0z$xMQ;KZ?j&n9DMS$}fY-cD3sN|Np6~ zwrl_Z0O?6YK~#9!M9*bc0s#<(;o07$I}I?fyAu@*FtEED><--f+ns~w;QMW!FZT?I zKBrmE=@Uuvx}(G2Q@wkK$^EF?E0GY+j`nTW0Em5Fzl8-dZ4;f*Q=^ov`iZY!(&{>+Pv1b0zIW^43jfZtQ*JHe&j9!0fxB);Pwbg zBRaP1c80O$2Ao$s0Lt!HB*Gv!)%~s3o-N2SgZlB*{tgTPgR82_K=j-_bf4)NPj4;} zpMs-UYB3nhuNNHxNv_aOxsdCIM2qMDeUC-_6<`2jOH1+gjyewj0000Dbf*ROy70|XGu$IpKm;C; z;QAO;Zp`u!KI8EgR11^O0*L7^P!T)<02z#ou($>iz(4|d;Xlw7|Np_l0ciW5 zKj44`B{+Zp9FxHg03ZlLNp02o|GyQBIyv7s$b_I?fd{}JkdVKJhNT8Eo!C;rb^b~9 zKzlE&R?-`;0Ak_f;bhu>pNZl2oA?HP_%(l z6$2z-z(EAe6ikc^-(Efg2q4D)|8d13aR4B|0Czrax+2O1p#T5?07*qoM6N<$f_15H Awg3PC literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-header-speed.png b/main/NOVA_0.4.5/templates/static/images/icon-header-speed.png new file mode 100644 index 0000000000000000000000000000000000000000..c16368c87cd1ab0fa9d6515b7f40df76748cbf26 GIT binary patch literal 679 zcmV;Y0$BZtP)tC zGBAT2`-6eu@7Lc94FA~dIrzm&0Ro7HH0u}{{{H;I!SJ6kJ}NY{i-V1q9Uy?18BBo^ ze}QuU85#cn0kZ!wF))HK6AO^f2<9^YUB~bbDF5Y~3^%`EPf-b2sGVm}kym|M9;s0N3X@G$NAb?m9P6oR9`+r>?QJyAKe~kcD8wrMQzkV~k z{rDXmeJCzOVgm#a3pAh@{{Q?RqiiZw?+~P?BC5>K@aE%JhF?GaGB7bS0;3d!8Nh)C zay~NQ{QL9gUkrbM3Fr^d&mj8uum23c zfeGx-Z$<_^E?ovOMloQ*VqxH9;$psV?d~gp0Ai#xHv$9@#kmn6zyNpTs)@xCe6|1p N002ovPDHLkV1ns5CdB{% literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-header-timeleft.png b/main/NOVA_0.4.5/templates/static/images/icon-header-timeleft.png new file mode 100644 index 0000000000000000000000000000000000000000..f81357ead0d17b00c89a04f64ceca4d358108636 GIT binary patch literal 1211 zcmX9+TTl}R6urBNNl2Cf0WlH9D3(#mz>)}3iIP}AG8LqvA~UE-B%<}fXsM`!B#1>y z>uZV_v5K|rv||yhwYH23lpshz<0vhP4@f~2v>`9EdF^gf{kZqc`8ap(Irn~%lf68U zJA(@Vf%43>RelWqzc?&^pKYg=eqa{KvSa|ww--&R8TWHRN&32y+~Un8rOMrEkQElI z)I#|VWs!Q7T3NVnSC3la*JR1lWUKcMf(%+|~8NfI&SUL`UxRQuU9lq>ccvqt(xY7>tJcsRTN??3z@5$B1DX zIsq?Wb8QL9R7>~e({JMSr4egbo75>8EY=YXHql70DLHy&&!uy>U+#988~9pKy&f2@ zKOxDTcQ()Q!Mz(p81}n1+tb@_$*MS3@p)ctg=tZgeyFrqkQ{llNHNMZj57jNN`>pn zk(1xH5ynrn@Xk%=(a1L``3To^!34Zn0Ac?4C{{L*;rRfZxj@qZ6fp`+(~rO$YXXPe z0S*!YelQBRn`p1!%?o=&sj<p&Fb+Kf0t_kpqJPvG)+ zFf}9yJcJ8ePaguw<$!CN6aokZDVByNhrxbm@z5}aRtNkvJn-EEtaoR#($y6+XlSP>A%k}ctJGeN(H|x@3R=s_9?Prv zdvvS{3!&pgmh!ENKMqU~Z4uK2n;8eJvxHjRO>GiR7VWi+;f!Ao`SKz@*6-+>*_O;N zr%y7Y=k8%eXJoMA>f$j`-x&dO>2#6giQQr}EWkoHmML{;zX5`!vGh6tpI^~Klf_j} z#Leeo5Tfeu%bi5r*KmB@O@@~H?tPy2j_!ioXcOeAQaT@Z%iA@hIV4;l=HHQ*>FQ*JAMnVzTU(<@JQRDr@Bi@e|v&O}d@` z7>{eVChC<*JFAR#in4@FuK3NI<&lM xGALDi!^I7I*57W)lvOBW#6gvDIcC08i@;*_iD=QwaR0RcS#@)vN0mNeCVJPEJ z6w31O8AQV`82*F6KcV>dABfzK-wX_F+zbqiD>sS&1Q5%+Pyhby-}9E?)B7I`%*+f7 z|A0392igEc5DX;#{YQwg00~|o{gs)6;p^AG{{aGs<>TkS4DnhF3=Uet42%p=0B3-h zj8LNxQjCoM8Ma^k&5*wN9|J%DvHWIaV&LRpWf0`!V893d1D*B{=#+mznw9N813NpA z57Y|~KrDa%Gl2sJ8vtqe4|MxqpaKy7_YZ zFHrH{zd#yj0FY*5_{DJUtpLy<76yO-VqsurWqA1fGsBmcpMeenYWfS)_!q3{Kal?S z8^rztbT*I%I-T|JH--lc(m)q5F#rS*gJ$Tak2@}W`A-=91ESymfB*UkWPks^>HN3< z98Nnv0t65^48DB-1M%Yj|L~Ch`xg{=f1v^Rm*Ef4=0ATRG&k#Ch7a$7K?w{DfB*s- zz>E^_AVVPdA0+Dj{)Za^!~Yn8-uVX%SfJ$q0XQauBmiIt1}eGq|KCNsT%06hY@$Jd zEz;V6D0;tb&axxa;7U5dd`SrO=dU*I{Lk_E+aI9I8NoU29~6TP0QwIY x5lEQ>l)^xn0+>j?y?h4{K#U;&QUU-13;^jivpYYu_xb<;002ovPDHLkV1m$HRlooM literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-history-cleanup.png b/main/NOVA_0.4.5/templates/static/images/icon-history-cleanup.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3ccb91e6811bb6ac336e3f8cf1365734789e8b GIT binary patch literal 3655 zcmV-N4!H4&P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00093P)t-s0HAJ(iHVV!VZzdx^77I!ARq6ciK{6%`g178e&67#J8C85tTH8XFrM92^`S9UUGX9v>ec zARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7EiEoCE-x=HFfcGN zF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w-7 zLPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuyP*6}&QBhJ-Qd3h? zR8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?WjVPRroVq;@tWMpJz zWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2Ta&vQYbaZreb#-=j zc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyDgoK2Jg@uNOhKGlT zh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z}m6ev3mY0{8n3$NE znVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5(rl+T;sHmu^si~@} zs;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#pxVX5vxw*Q!y1To( zyu7@dCU$jHda$;ryf%FD~k%*@Qq z&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UF?(gsK z@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg={r&#_{{R2~VQJ`4 z00001bW%=J06^y0W&i*HSxH1eRCwBak1-MhK?uVfuTBFoU(ZqMDn#3odJz^eKltSqdkvU>G&&n_`e?)skd;7UZfBJ6M Z&j87011B3ZP?-P#002ovPDHLkV1lL0+<5>1 literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-history-fucked.png b/main/NOVA_0.4.5/templates/static/images/icon-history-fucked.png new file mode 100644 index 0000000000000000000000000000000000000000..408ea7ab5a845385135dfd96278f989f557e63b2 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!3+@$Um3FbS9KKtMHEY1 zBT9nv(@M${i&7cfixLYmGLxP2^U6|-N>YmyG(7W4QgbxR+kZ&{73X-mIEGZrSu)9y zi$Q^dr8Z6f#iifY*BuS+nrRAg3N4TI(cEjhbV5)M&xJlKCnmLh(ou}u4Q1+F$2e^G zd-m%om^WuJsBp1Zc(NYeKkZB#E8~kP-yA1z{B?P^`hSOX)~WAfcip+h$-wacKQqGx XZ|PO%W~!Y5+RNbS>gTe~DWM4fCbmma literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-history-join.png b/main/NOVA_0.4.5/templates/static/images/icon-history-join.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a3834abc93ce96f5847af4f43d36e06da5187a GIT binary patch literal 980 zcmV;_11tQAP)P*KqkyKv!*%&%YHSA$#uatJyG2q0!pPybDkkxACK zZe5qUb?aL0g9mq1)YUcAMMXt`hKMpee*9GY+O8;s6g13;+rW2mlcg5eNGE`WpND`vCg- z`2hL(_yG9$_yG0w_5k+w_5cEi<=wm2-`~D{%ONc-%aEE{==JQ`BQI-fTLu=E{|v0G z%nZMO|6zLn{=G0TsDL*91{&}a=z{+YA3uHss$pUP2q0!oPIhG-9eraN8Cjr{#TX0? z4S=?D0b_-k;nSyY4C?A?Y;WJbGrxNE%4wjVAA8g@+Fx zx~i&biAhUK0-encw3!uX!xsjSVp&-+1`7*ofk%&?`dz<%<f1iR30J(&TiHQLq zfS9GFr9M4>{&d^1V+UpK-McSz<;vB+M~)n2QdL!FR#K7#M-|YO43?JGT)+SgymIC8 zUZ6{!1H%Pu06+jS=&j;__ zdlY14Wyi(9zyb`H&kO4Fi2)B_WMl$*i}}>1O>6wi%JN@)`t%hT zOWZ&iCWd?W9xyzA{^A-y0O2(N1VDiW1V`7cTM?9(m+^{~l?@mkUl<}Hf)5`$v_BLe zfLIua2gf&WUgwpN@N4IX5AQEszI-tnn8BU{1Q-C6K6#RDCBsJm0000U@Soua19n#c1P~L@+1DO!z0mb) z*G>lM^fm^gg)ub3%%KbnE;4p1GxYnb z_*lh&?)kNuf#JtB2ByEv3|xY&46>q3yq|7-@%Zrm|2|FzhWo5g*T67905R@T=6M4Q zFyTKO0t}yT9AS|209x{gfnit4V}@@`Rty&|Uw!!a!IS#ij2v6Pef#$2?{8E`00a=j zI$`!bYc&OK&k|r**u}=MIGVzz9Tu z0Ag6l$;>#9osnq*kkbfE6LWRB-+Y{{{y$4b;4UK@`lNlaypmNlNlQbm-92 zPoF-WM>YT;fS5yBnHc_p5(UtJ??8e7e;H1{diVdt2S$!V|AhEYzh`2+ziaz;KSf1F z=H%pL-#vTwy!`(C`x%%4009Iy;1ke*-;l)e9~i%PzO!?Df6d3s@b&-yODxRHPj~Iw z<)fma!jzbp=(%_A-j_dq{5T6T03d*v7zhAR>SJSLo5#-1p5EHp`sdQ6OU%=!PoE(u zD3}J42M8dz3qB%T0LI_gI2hjY^D?~u^PAz%pFa$L|NcD>#7}|Y;H{;l#gvec;C=Gs z$tM5-M3e!4fd>2r#{a*6|3HR3IC$`&ud%T)v%0#v4?qC1Fpv%wgY2lUub(L)A#oER ZzyP%9MqS-0YG?oe002ovPDHLkV1gT+wr>Cc literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-history-postprocessing.gif b/main/NOVA_0.4.5/templates/static/images/icon-history-postprocessing.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc57632e24e1cc9502bbe63858ae3f654ebc453c GIT binary patch literal 2947 zcmciEdr(tX9tZHtB@glrHz6+)%!|AU+D)-txX+OjTK$I_0|qP4ABRCJ|lE!$e_IJVP0-GhJZFthaEJ%8N4 z?#%su=6lZX+`1LD&dT*%jEgcDc6Gs#5jZ*uj~s!S41DuVc=RY78-q?KOsC5Z9v+&tx;jh2K zyLaKt44j^Z=gz@I0zP~Q@85?%`~YWX;gu`!!UfpY2IuGD&71JjCAfMueEMm4?;gB$ z3tqbh*RF-Ft?mJ)33%oVOeW#C-@=O*VMPVpxDmFr zzzrK%|{|is8fAOhS`Cp!Su}!}I z+4V1N+_b*c{LFJtZ^9J6kZ5%DmT4j3LWvmlWIL8j;-Ir5je$bBJXr>|;`u_UqARIi zj(6ZRV(0GHERLGN44pS59nd=r&Otnvad=3Pw2b-d0Ex*wPDnBRnAKVd$mjmfATYxx z9#05RE?uT*XRc}imBnJSIbxmB=Bf?^KpvaV5s8&Lld;McTycz3aNpJAJ)b;Fm)ja? z?JWvFHNQA=qGj?)&>PRl+wPVrZ@wzACtK9&*<2b=x9(E9KRvR)7sGRw(wthPp%IAj zIO60o=)5jP%+!QD4J0OmM@VCoWLY*7CJ)nzJ=IBl7O$sL!laRy;JAJ{V6mvwaf0w; zdW*vW_CU55i`2$ zV-jZ*5Qt8)!i;xV@qM^he3ru^n8qEr>>G)=K-HnYsRv4>N~KoEosJ(I77J)B)(dYYVnA|N3^xW#PkY3RSSJICS9rJ(82i7ikqV)h}dqKh0!Mpn{PjGu& z>E_=4bdO?J$I=D8x2PZ#oJ`6^8ZL*;>OwRc-q9~8;17_QbRLnP%}B(eT@(^yR4B~i z%Zg-2*_1=bEG-0TmGVOlg)t#jDC9s>T&z}#Da2>;ne(`A_J($A3NI}+mza!NgMJ5I zQEsvuZCb0rqW`h%eY?A9etNT#$}Vs`c#Gh+l6%C}jSqV^->vO_JhSbbt|lJg=}NV2_~5^g}ftW_&z;;u)=y_twcy{mxz z2HJgl@s-iHR5B4Oe4I|F0kgR@s!{SEk;cXGG~HTIkr_0Q(i3yk^b8+n>_Z z!p$@3UYt@_gO8=g&--J_{?0}`kF=C$a*?M|StJpxL7tV7VwFrRD&XfKQAMdvGaxQN zZPo9~l$)amWrD*jDrFz;v%jrV%S8P5!{G*yNZ3tgjet!JlgT6!@P2J{m#7$I=5+=G z*n)E|ZCog%&(DME>OkD%$D%PILGXBBRb2b>R3vAXlFOA|3{HW7ysJ=;VZB5$_mw7m z?3QR4A0DFcg-KWPz>@(iKC-cmT;I;^#*T#Q15?xId|S};```I?Vv%Ygzj_%``RwJ} zi&aGuE<)8B-6pfH7^u+%RJ&|OotVRB zqX_}Dm#=6kSFce($m6NB8Zd&vB$59G=B!SG9+MLEJKuvk|2<1mVGa$nZ}OV|>bRYQ zP5R`%m6_B`dOtUi?j#6r;-de?=~soyjcPU4Dd);75az;k2wNJnc)UHakb5Pt$0;E3Tpgr{m<86FVKdVr7 zqYsf*YvbFi687>6B&w?nX#+v8+f-s+na%jE!*Q4Q_0p&=i`N*O{z|ROXe!l3G;4vw zVHmdt646MpTCD<>OPBOmiSk;}EYN?`VWt)c#1e_DucL|-BT+d8qVGTx7UIX`Jmwzz zP=r%s&X0{ee*zn8-?D|XmNtrS*iRxe^6ZtqIQd5S|t)7r?$fa`3jYL_y_e^fyq3!lm zG_vH)vv|NQgtpcp3Cd{cvU;?ukff=@;^_9o11qu_O~>x;P{0+;;)OAKBB?i2#$C3m zTA)zGVyyTs4=UD}0MZN6vqe^${qkiXyoye}oT`bGmi!Z3=ke$aGE1b=M5CpEHqT&^ zDSScEy&?DhgPZ=egTgOsLuwj zm@hWGqqE@;2Hav#)57ImgFKI$JGu?dI;1I#@f^u+RMhIhj8qYm9dJ0Um7&3fzahCI zgjoz$Pe{885QI<|V<(;O!~@lU_r=FCFIM@v>l;94(613Jt!?gG!2FIx4wH(__Jq;s z1r6VascexfVlKD8L^}NCnf6mufxAC_uRCbSslOi`?U~G_>6j-+VyX7ixlD;^kN2lm UrP8N~Gg@CdVvJ8T{tPsSoXz{WTA&Gn`g=y0mE?#7qIFSL! zE)mhm7EnhfV`P<~8vg(PfAshnpq?rwZ=h3=d#SuGX`l` zyKdu;-~UgazY5ediz{h?Kn7NFDo1=9Q*e%wI)j>;+PU+W{`>{m0~7*U_syD@qgp# z|7A!2XYKzVzw>|a=KuV5Q7C?3h*%Ev1CRuv@I?$^^TB8iL&!8Rn!=Cf2L|5`pdT1) z(s3b>4aEC_hldB<4~)&Ac-Z~*VbA-sMXwLVz1$V~Vu#bybvlohirt^haA%Ud6F(?b z0nLW`p}=G3P6mdqD29#*bkrUWG!EnkNRoo+VMuoZ`a#kUCxY4lK@JWM`27F`KxF^` d009600{~lb39RHA!}S0F002ovPDHLkV1hqt@EQOB literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-history-unzip.gif b/main/NOVA_0.4.5/templates/static/images/icon-history-unzip.gif new file mode 100644 index 0000000000000000000000000000000000000000..36dfbfbd4c025a3c405241c0ec8f423dbc0b8bd4 GIT binary patch literal 180 zcmZ?wbhEHb6krfw*v!x1arpNC{~!LJpMQQn!~g&D84L^<=AZu$;sc2UhJ^Y5&l~&) z0tP5h{K>+|z`)O-1LA|sU|>o7aPsGzy{+3~ry4qNr1(2?coweZnv`3x$B^&Q6dqxj z^i4W^vv{{Z{#keM*4jW7l|F}uMbBH@rmD)l`Yx@~zD&3L!PIGC8Q$G4g%u7;W=or< Xoxk1o`_5Z~52984Ts3vgf(+IGT`f&b literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-newzbin.png b/main/NOVA_0.4.5/templates/static/images/icon-newzbin.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed988fc533b9f019fb806a319c32f921e514229 GIT binary patch literal 1061 zcmdUt>rYb$7{<>8i8#n0(;?f388f%&Ha~1xbWx{O*d&=90|!dcQbwUN7=smrGUg?& z+6t?~RD`AkL<&+UbhJ>5wUn+`s`h#+y>M#_g?3yDt@d)xS+o5Wdz1I~1T=A6~)9$ zxGFq=Dyk^N@6IU4mEg1RxT3mB75)eSY>CbM`b;_uBaLEvqbWRM^pv!Vu`NP|4W=5P zDwaII$M6eR$FM`BA#L?Tby=t6mOfO!+U_AK1A=Kk zw)Ju4Ab8=ffUF6aTL$%v^Tceo1F<+f9m<)xwIHESM^&vB_GsBg@95+U#mq)=hopwB zCh<%SJh0Ci6wC&ROn#FoECJ{7?c&0AiNfl>K58yxj^C6nmUl_R5F(rjsBP{C@|pD@ zGGg1LnM0#<;b)GQl^k7JkNUFE)@@h`LokNMxgv4Polw;fc(F^-Kjqgu16B9OWma#| zz>DXLFH2Y&`k0>j*iM^5uymft8TpB&sAnr0cqR$x_|xPibgM8-=@__7<4@k;{B=+3 zqnJY*fnXVb?(&33I<<6u*i|dA7e7$;DyOgW4L3Qe#!-DfOAo=w6L9fW80xWxY~DZt z>shDTh3hk62d6Iy>?1CiJZ5V#`xWyW_bp)@bG$*hDRe-{zvHZ>z7;J^KQRlP{h#x{ zAh4CblNs!eVVjF7_%H9{zlU+t7Y-oxt}^);@?qz?(WYy52jcNqP9+Sj_}YI z*Q_G2nwp6jFO36t_&ajGg!a~av}ga5Hg@XW=lLR1d&2iOT9=khJ4Nz@JC>^>uTDE} zT@d9}NMiSq_kXzi*ua&8_5KrK)85pC>5q^9dT&pQA<})EyzAue@wf9-?|zbUiZYC{ ziSw@R6A-GK-#ctP#-hZ3tjI2a@9J^Tadz=W8ci>Xzg+y%TA2fWTDPA|#c*F>WO N8R_UW&WVC+{{RY_!+Zb$ literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-queue-1downarrow.png b/main/NOVA_0.4.5/templates/static/images/icon-queue-1downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f8e50f06aef4dfe51f4bb32b78c1a0d3118dfb GIT binary patch literal 808 zcmV+@1K0eCP)rUz&k| z5vb_zKMjWeOxs!5IVAqGurmB(X1n!onTkF@0D%oqlH#@KDz#$x!OX<4{rF3%`HOB& zU|?l*VPIkV4A%YkA2;*gf78`;q!j-13Nw88!pQLY^#?tWUVs1sd*RiKulKo`m>5DW zWEj#?3>geeWXu>o|F2}=6a?xA8u0Z`j*+T>gNczW0|OTi!!HJAhQEIqUxM@k1Q6JO zcW-|br8OUCxb^%i0~agMplAaIelgx$hM#|o82Vkh3|jo zW_bFRf#K7;PYnP6{aePs#JmKg6(E2h2Cy(QFbHxsuHOCZ%KE)e8Ki+Bs;Dl*ATBRz z#wQ|R|6fpo;lXPLhR+|rG5q=d;~oPuOFhsDV66ZF1To;>U!Y(AzxvP4Qr*4q?w?mL zzA?xOF)}FXDKkiGC^9^K&&crZ!yks9pMhb@%-jgnaR(AL3=9AP1Tlb(8;F6{vaxM? z`|0n2vn=@qgy# zgC7~befk1YF%M|+c5F!*Ab=P_nTav_F1j$tC7i%SzK@ZWo%25vqdidQBf94QbA%WG m0*H~)+z1dr6z4{O00RJC?d9TwiNbpT0000WdP)GHU<_>Mg~3!1_nM!1O@_t0K)EtAAih*g*h|3 zO05_IqAeMC#Q0Mfe*Jb~0EHJa1_FQp!ZhIDe>R5izo$1Anu#!p3o~5$!porJX2s3O zz&IHw#|zf@?=J)c0YCsj4fqeie}HcP{Ikv9UCGEhK$l_TH3o(UFBlk@B~=;NeF zJq89Y-ed+QmIwxRZUzQ+Ua%H`0D>662n@Kt|Am-;|Lv&Avt<9kC(N+-#y^IG8;&vD zJ$izHhv^@~KNfBVCMivzLdGVb^W_-+{{w3U2q1_7e}T?_|Gh5ATg^bjQiEadO$LVZ zNAEDaeDLD@ua6&(D>FP|5CK}qA}G$lE-a-AbZG+v6GSUO071ylKfDx_1apF8Eg4Qc zV`8{+{UgJ*V^_a3u(D=-{==4hz{-4rf%*USXRm+ty}tj1L0taD zwdG~wV_;!sX5i%Gk_PDo2p~pKW@0s)eTJElRr?P!JHuZlmX8c9tdT%J?gz)Yuo43} zz?j%{8QHkDva)lCGO%(o{9$3g|92|87C-V+> literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-queue-2downarrow.png b/main/NOVA_0.4.5/templates/static/images/icon-queue-2downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..67913cec9698ae85c7ee244ed47f035b0b1910e8 GIT binary patch literal 1063 zcmV+?1laqDP))u00ssI101;Ef(o6soB#<8000FC008{~00094RsseD zlK%n&5ex_c0r>j>;QEgMCIX0s0SMSx*mw)VeFS?W>tjUi=pUN_8;& zXJBAtWXO~fVeb3-kA;Jehk=2IlY!yxQwBbeUVs2%0ue7i{0%If^!U=bGoKi2)Y%!_ zoTQi}WO&*c{{3%aVP>e%Q(&FK&CSZe2Xqi88w10=rwn&~{$dCQ=>-TNMvxa6y-om~ z$*#gBz_+q8THHupg@2r25SWfAcz6~egloa4D{R?28PGyKQVA{Mb6pFwBX7E1_mi$ zP`!Tnf6ad;h9HJFk6tmnxdXK9A;i@{01!anSOA7I0|N^O1H;GH3=F?M0lmZZlR@4j zea%^h2f#q&VBlnIVt8}!JHyB4K)mSK4Ig03K^ zI9Pru>#C_eW)NiHXZ^$Q?9Lm8cW-|*GqAAMgY*If5F`+pf&S!T>pimn#pf@7&Q7c- zG30Qv6J>bxiCy9Q4+e%ifA|>q*?uv+dhq7=$9KQVfGKJMGz=L40tga~(1-v^%(`&? zV`4+wmAAS=pBX%D`50LF_!zhue=xkf_v*{X_rJ1$>LxHC0e}EvVn7G1Oe=2O{1MjB zbMKL<*k=Z3^&bo`ZoYi|_0#VdU~-&;t{fnMSQxMY4#s^?UjGeloBLuZJ10B)uRs6e hf!;ibO({Tt0RXSeLpuOuej literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-queue-2uparrow.png b/main/NOVA_0.4.5/templates/static/images/icon-queue-2uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..57fe9d471fb8d4997591174bd1c6ef8512d8cf8c GIT binary patch literal 1037 zcmV+o1oHcdP)F8u>s{+ z85lUY7#P?&8UF8ZVgLvrCI)Qa+aEJA0oDzb)sFg>p>FCdY+P#@{`_&qrW7E6Fb(+q z*IQAEZ$o2`yV?y#MTY&)q!^@J-Q>80g;z2B`x}X_93X%Y2K)!&KmTJiwFQ^8_IXI& zW0YlBzx^%4w->J&zHx~$NZ2?C@raAfWBB(k4cP#I0D>6s52*Y5?+hbziTUll9(+$( z#2I$(dd~3q%&zBLxAs0#`tzLO2fHAHq_qu)fQ-aUU|5wh{QnQu3J^eG1DOB)%MS`s zn?850H_LBcL52f6A2Hn7weQitAK$z`e*NwG=;X26!k?cqd}iQgkhQaB5Lc7$V*3BT z2Ba4tfEYosAnvyGe@&?+0|O@)!@(187`CoCf9=PQU*Qa#+*g3n!ocwNj|z_f=hA;t zT4rn_A`GHje;J-!y~Xfttra6c0D%o)GoM|}!NBbL^DpDSKmY$f`p3*v&%ns`kb#*4 z7;QiUSbz@w_g9jEg|(i6g-wl_g@x%q6Z4V3TWo6p0tjpXqtQ$ThR?ql8JK|zxj6qb zu(AUKl!XPTF@u?nh2t+f*JK99e?P$i&G3&A>?$^n|NpnyF#rS*3nT`B35SgZs1ax* zJ1;0502Tf1_w`W9dH0u<;pmaax(uA0sSNDwzkuHP4|EOCoPS`g009Jv1y()=1|EI} z25x>(3Iryx|BGV7)pIO7j2PaF>oW*zD#tPY`?~@t&JVVL1E`LJ53Cg+fS?9&0;2+$ zMF0F@XZrVVO>UZYjHRa`!`!1x4A&k49jBnlAf=-g$i&F75$FOzaJaB>g0%t!5X1mb zoc{PD$V!3@snyqGX!Y`2q3TlqCy<&Cp4Oyx%w(H9J~3AVb7*Z49{*pX<^`CEBXDGsrJIv z*X2K--1+c`I)Pro)Y zFf;eT-1v`ysq4|x&+nMu-|zhRl#7d(o0<7P6Duo78X&*`0qs1I;1~-^00000NkvXX Hu0mjfF@@)N literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-queue-drop.png b/main/NOVA_0.4.5/templates/static/images/icon-queue-drop.png new file mode 100644 index 0000000000000000000000000000000000000000..2997461b2191b95d954b41f766752d3249c810ea GIT binary patch literal 1150 zcmV-^1cCdBP))u00bMdO00RB}K{Dv*srmW&2A}`{b@l!In*{#;03!nf05}B&00;d100H{?6d?%- zyA%rxDwF2sr{VqmVBr7&00IC(0KWeNEf^RBIxKZ(&pwO*#H2t0suh(zW)PY0|U%qDJc;W zhK2wHJv{&>-`@iP;NV8n|NrO;0s_t*0Rape|Np->G&C?EYH9%gI5+?x6chm{<>fBD z=jR6k06_r0{{;2<`3MIA0RZ{j+yM9w4*(8YS^!x1_y+yR$dtzd0u>Yi0a7t1CommV zRRI40008&V(Etee_y7e31pxv7|1<)K`7s~gtFKR)bh@pZ~vp z?W*(mF$*KmfIq-MV+Cs9`T3JkR9TsUgO?Yqnd9kGhFiyuF%(_8^y1Lpzi~hZ?FI-S zW&uu4hA)5ro;}0B@Pg&jCpYC6FIfKl`o+NX^CtrrH#Y+d(6B!*UNHQA{hHz0ty>J` zH*UN*`uA@XQ1f0OW&j8vW^HkC20>s{@h~%=d&SB5TkzK}7qO>L8Gn8J$nfX=dxl>? zjXyqrX7~m)u>Ib>cSnBz4iIEuILrgo3#tYPZABX`0h*=L9U_bx==aKsH zz`#>QYFCB-7i%Bqn~jZGkDHtMFECZI0L7Vs zt}#_mV3GLu&u!n^w+{gVh)L%2XKihu=D$FV|A3eu7@&`Vn!CS!d$IG~JHLgmUuT~G z`SX_uP$Ls4!2x511(;sU<>c4|nVFLS0*LuF7ncG*C#QinFwR+lwwwlPuK)i1#rcmP zqu3Z353w^aoWK6%%S$m97B?LsAr?Vkn)n2aou;#Af9(AFbt*srF~|Z#S4UiY(JC>q zf1AX`|LgJdKLpF literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/icon-queue-order.png b/main/NOVA_0.4.5/templates/static/images/icon-queue-order.png new file mode 100644 index 0000000000000000000000000000000000000000..ed18d2a5097453454c8c48d6b76fe232d320556b GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^96-#?!2~4F{){dHQfwtbe!&bk82&Lhx38)F2^3K* zag8Vm&QB{TPb^Aha4$+M$jD4~&d)1LEhEaktF(+xq z$MZ8+KeiEIlswVFsJHRgqxup~1*Wc~=?7eRoKN!sRWkhl&&;r{d2@Dh;PIUxzNf37 J%Q~loCIEUeHM{@- literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/images/loading.gif b/main/NOVA_0.4.5/templates/static/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..f864d5fd38b7466c76b5a36dc0e3e9455c0126e2 GIT binary patch literal 2767 zcmeH``%_bA0*1eHPVNawNVtR;Fkp-nQj8edfS`v<5L7TgR6wi;WfgH-0}4fE+c_uU zB6tf6auF}FAcDdgg|bMU&H)LR5jARM!8$tuwd$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9 z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I= zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8 zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_} zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$ zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+` z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80 literal 0 HcmV?d00001 diff --git a/main/NOVA_0.4.5/templates/static/javascripts/builder.js b/main/NOVA_0.4.5/templates/static/javascripts/builder.js new file mode 100644 index 0000000..301087d --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/builder.js @@ -0,0 +1,136 @@ +// script.aculo.us builder.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 + +// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +var Builder = { + NODEMAP: { + AREA: 'map', + CAPTION: 'table', + COL: 'table', + COLGROUP: 'table', + LEGEND: 'fieldset', + OPTGROUP: 'select', + OPTION: 'select', + PARAM: 'object', + TBODY: 'table', + TD: 'table', + TFOOT: 'table', + TH: 'table', + THEAD: 'table', + TR: 'table' + }, + // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, + // due to a Firefox bug + node: function(elementName) { + elementName = elementName.toUpperCase(); + + // try innerHTML approach + var parentTag = this.NODEMAP[elementName] || 'div'; + var parentElement = document.createElement(parentTag); + try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 + parentElement.innerHTML = "<" + elementName + ">"; + } catch(e) {} + var element = parentElement.firstChild || null; + + // see if browser added wrapping tags + if(element && (element.tagName.toUpperCase() != elementName)) + element = element.getElementsByTagName(elementName)[0]; + + // fallback to createElement approach + if(!element) element = document.createElement(elementName); + + // abort if nothing could be created + if(!element) return; + + // attributes (or text) + if(arguments[1]) + if(this._isStringOrNumber(arguments[1]) || + (arguments[1] instanceof Array) || + arguments[1].tagName) { + this._children(element, arguments[1]); + } else { + var attrs = this._attributes(arguments[1]); + if(attrs.length) { + try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 + parentElement.innerHTML = "<" +elementName + " " + + attrs + ">"; + } catch(e) {} + element = parentElement.firstChild || null; + // workaround firefox 1.0.X bug + if(!element) { + element = document.createElement(elementName); + for(attr in arguments[1]) + element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; + } + if(element.tagName.toUpperCase() != elementName) + element = parentElement.getElementsByTagName(elementName)[0]; + } + } + + // text, or array of children + if(arguments[2]) + this._children(element, arguments[2]); + + return element; + }, + _text: function(text) { + return document.createTextNode(text); + }, + + ATTR_MAP: { + 'className': 'class', + 'htmlFor': 'for' + }, + + _attributes: function(attributes) { + var attrs = []; + for(attribute in attributes) + attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + + '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'"') + '"'); + return attrs.join(" "); + }, + _children: function(element, children) { + if(children.tagName) { + element.appendChild(children); + return; + } + if(typeof children=='object') { // array can hold nodes and text + children.flatten().each( function(e) { + if(typeof e=='object') + element.appendChild(e) + else + if(Builder._isStringOrNumber(e)) + element.appendChild(Builder._text(e)); + }); + } else + if(Builder._isStringOrNumber(children)) + element.appendChild(Builder._text(children)); + }, + _isStringOrNumber: function(param) { + return(typeof param=='string' || typeof param=='number'); + }, + build: function(html) { + var element = this.node('div'); + $(element).update(html.strip()); + return element.down(); + }, + dump: function(scope) { + if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope + + var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " + + "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " + + "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ + "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ + "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ + "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); + + tags.each( function(tag){ + scope[tag] = function() { + return Builder.node.apply(Builder, [tag].concat($A(arguments))); + } + }); + } +} diff --git a/main/NOVA_0.4.5/templates/static/javascripts/controls.js b/main/NOVA_0.4.5/templates/static/javascripts/controls.js new file mode 100644 index 0000000..9cbeae9 --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/controls.js @@ -0,0 +1,972 @@ +// script.aculo.us controls.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 + +// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan) +// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com) +// Contributors: +// Richard Livsey +// Rahul Bhargava +// Rob Wills +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// Autocompleter.Base handles all the autocompletion functionality +// that's independent of the data source for autocompletion. This +// includes drawing the autocompletion menu, observing keyboard +// and mouse events, and similar. +// +// Specific autocompleters need to provide, at the very least, +// a getUpdatedChoices function that will be invoked every time +// the text inside the monitored textbox changes. This method +// should get the text for which to provide autocompletion by +// invoking this.getToken(), NOT by directly accessing +// this.element.value. This is to allow incremental tokenized +// autocompletion. Specific auto-completion logic (AJAX, etc) +// belongs in getUpdatedChoices. +// +// Tokenized incremental autocompletion is enabled automatically +// when an autocompleter is instantiated with the 'tokens' option +// in the options parameter, e.g.: +// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); +// will incrementally autocomplete with a comma as the token. +// Additionally, ',' in the above example can be replaced with +// a token array, e.g. { tokens: [',', '\n'] } which +// enables autocompletion on multiple tokens. This is most +// useful when one of the tokens is \n (a newline), as it +// allows smart autocompletion after linebreaks. +// +// vim:expandtab ts=8 sw=2 + +if(typeof Effect == 'undefined') + throw("controls.js requires including script.aculo.us' effects.js library"); + +var Autocompleter = { } +Autocompleter.Base = function() { }; +Autocompleter.Base.prototype = { + baseInitialize: function(element, update, options) { + element = $(element) + this.element = element; + this.update = $(update); + this.hasFocus = false; + this.changed = false; + this.active = false; + this.index = 0; + this.entryCount = 0; + this.oldElementValue = this.element.value; + + if(this.setOptions) + this.setOptions(options); + else + this.options = options || { }; + + this.options.paramName = this.options.paramName || this.element.name; + this.options.tokens = this.options.tokens || []; + this.options.frequency = this.options.frequency || 0.4; + this.options.minChars = this.options.minChars || 1; + this.options.onShow = this.options.onShow || + function(element, update){ + if(!update.style.position || update.style.position=='absolute') { + update.style.position = 'absolute'; + Position.clone(element, update, { + setHeight: false, + offsetTop: element.offsetHeight + }); + } + Effect.Appear(update,{duration:0.15}); + }; + this.options.onHide = this.options.onHide || + function(element, update){ new Effect.Fade(update,{duration:0.15}) }; + + if(typeof(this.options.tokens) == 'string') + this.options.tokens = new Array(this.options.tokens); + // Force carriage returns as token delimiters anyway + if (!this.options.tokens.include('\n')) + this.options.tokens.push('\n'); + + this.observer = null; + + this.element.setAttribute('autocomplete','off'); + + Element.hide(this.update); + + Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this)); + Event.observe(this.element, 'keypress', this.onKeyPress.bindAsEventListener(this)); + }, + + show: function() { + if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); + if(!this.iefix && + (Prototype.Browser.IE) && + (Element.getStyle(this.update, 'position')=='absolute')) { + new Insertion.After(this.update, + ''); + this.iefix = $(this.update.id+'_iefix'); + } + if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); + }, + + fixIEOverlapping: function() { + Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); + this.iefix.style.zIndex = 1; + this.update.style.zIndex = 2; + Element.show(this.iefix); + }, + + hide: function() { + this.stopIndicator(); + if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); + if(this.iefix) Element.hide(this.iefix); + }, + + startIndicator: function() { + if(this.options.indicator) Element.show(this.options.indicator); + }, + + stopIndicator: function() { + if(this.options.indicator) Element.hide(this.options.indicator); + }, + + onKeyPress: function(event) { + if(this.active) + switch(event.keyCode) { + case Event.KEY_TAB: + case Event.KEY_RETURN: + this.selectEntry(); + Event.stop(event); + case Event.KEY_ESC: + this.hide(); + this.active = false; + Event.stop(event); + return; + case Event.KEY_LEFT: + case Event.KEY_RIGHT: + return; + case Event.KEY_UP: + this.markPrevious(); + this.render(); + if(Prototype.Browser.WebKit) Event.stop(event); + return; + case Event.KEY_DOWN: + this.markNext(); + this.render(); + if(Prototype.Browser.WebKit) Event.stop(event); + return; + } + else + if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || + (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return; + + this.changed = true; + this.hasFocus = true; + + if(this.observer) clearTimeout(this.observer); + this.observer = + setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); + }, + + activate: function() { + this.changed = false; + this.hasFocus = true; + this.getUpdatedChoices(); + }, + + onHover: function(event) { + var element = Event.findElement(event, 'LI'); + if(this.index != element.autocompleteIndex) + { + this.index = element.autocompleteIndex; + this.render(); + } + Event.stop(event); + }, + + onClick: function(event) { + var element = Event.findElement(event, 'LI'); + this.index = element.autocompleteIndex; + this.selectEntry(); + this.hide(); + }, + + onBlur: function(event) { + // needed to make click events working + setTimeout(this.hide.bind(this), 250); + this.hasFocus = false; + this.active = false; + }, + + render: function() { + if(this.entryCount > 0) { + for (var i = 0; i < this.entryCount; i++) + this.index==i ? + Element.addClassName(this.getEntry(i),"selected") : + Element.removeClassName(this.getEntry(i),"selected"); + if(this.hasFocus) { + this.show(); + this.active = true; + } + } else { + this.active = false; + this.hide(); + } + }, + + markPrevious: function() { + if(this.index > 0) this.index-- + else this.index = this.entryCount-1; + this.getEntry(this.index).scrollIntoView(true); + }, + + markNext: function() { + if(this.index < this.entryCount-1) this.index++ + else this.index = 0; + this.getEntry(this.index).scrollIntoView(false); + }, + + getEntry: function(index) { + return this.update.firstChild.childNodes[index]; + }, + + getCurrentEntry: function() { + return this.getEntry(this.index); + }, + + selectEntry: function() { + this.active = false; + this.updateElement(this.getCurrentEntry()); + }, + + updateElement: function(selectedElement) { + if (this.options.updateElement) { + this.options.updateElement(selectedElement); + return; + } + var value = ''; + if (this.options.select) { + var nodes = document.getElementsByClassName(this.options.select, selectedElement) || []; + if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); + } else + value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); + + var bounds = this.getTokenBounds(); + if (bounds[0] != -1) { + var newValue = this.element.value.substr(0, bounds[0]); + var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/); + if (whitespace) + newValue += whitespace[0]; + this.element.value = newValue + value + this.element.value.substr(bounds[1]); + } else { + this.element.value = value; + } + this.oldElementValue = this.element.value; + this.element.focus(); + + if (this.options.afterUpdateElement) + this.options.afterUpdateElement(this.element, selectedElement); + }, + + updateChoices: function(choices) { + if(!this.changed && this.hasFocus) { + this.update.innerHTML = choices; + Element.cleanWhitespace(this.update); + Element.cleanWhitespace(this.update.down()); + + if(this.update.firstChild && this.update.down().childNodes) { + this.entryCount = + this.update.down().childNodes.length; + for (var i = 0; i < this.entryCount; i++) { + var entry = this.getEntry(i); + entry.autocompleteIndex = i; + this.addObservers(entry); + } + } else { + this.entryCount = 0; + } + + this.stopIndicator(); + this.index = 0; + + if(this.entryCount==1 && this.options.autoSelect) { + this.selectEntry(); + this.hide(); + } else { + this.render(); + } + } + }, + + addObservers: function(element) { + Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); + Event.observe(element, "click", this.onClick.bindAsEventListener(this)); + }, + + onObserverEvent: function() { + this.changed = false; + this.tokenBounds = null; + if(this.getToken().length>=this.options.minChars) { + this.getUpdatedChoices(); + } else { + this.active = false; + this.hide(); + } + this.oldElementValue = this.element.value; + }, + + getToken: function() { + var bounds = this.getTokenBounds(); + return this.element.value.substring(bounds[0], bounds[1]).strip(); + }, + + getTokenBounds: function() { + if (null != this.tokenBounds) return this.tokenBounds; + var value = this.element.value; + if (value.strip().empty()) return [-1, 0]; + var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue); + var offset = (diff == this.oldElementValue.length ? 1 : 0); + var prevTokenPos = -1, nextTokenPos = value.length; + var tp; + for (var index = 0, l = this.options.tokens.length; index < l; ++index) { + tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1); + if (tp > prevTokenPos) prevTokenPos = tp; + tp = value.indexOf(this.options.tokens[index], diff + offset); + if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp; + } + return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]); + } +} + +Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) { + var boundary = Math.min(newS.length, oldS.length); + for (var index = 0; index < boundary; ++index) + if (newS[index] != oldS[index]) + return index; + return boundary; +}; + +Ajax.Autocompleter = Class.create(); +Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), { + initialize: function(element, update, url, options) { + this.baseInitialize(element, update, options); + this.options.asynchronous = true; + this.options.onComplete = this.onComplete.bind(this); + this.options.defaultParams = this.options.parameters || null; + this.url = url; + }, + + getUpdatedChoices: function() { + this.startIndicator(); + + var entry = encodeURIComponent(this.options.paramName) + '=' + + encodeURIComponent(this.getToken()); + + this.options.parameters = this.options.callback ? + this.options.callback(this.element, entry) : entry; + + if(this.options.defaultParams) + this.options.parameters += '&' + this.options.defaultParams; + + new Ajax.Request(this.url, this.options); + }, + + onComplete: function(request) { + this.updateChoices(request.responseText); + } + +}); + +// The local array autocompleter. Used when you'd prefer to +// inject an array of autocompletion options into the page, rather +// than sending out Ajax queries, which can be quite slow sometimes. +// +// The constructor takes four parameters. The first two are, as usual, +// the id of the monitored textbox, and id of the autocompletion menu. +// The third is the array you want to autocomplete from, and the fourth +// is the options block. +// +// Extra local autocompletion options: +// - choices - How many autocompletion choices to offer +// +// - partialSearch - If false, the autocompleter will match entered +// text only at the beginning of strings in the +// autocomplete array. Defaults to true, which will +// match text at the beginning of any *word* in the +// strings in the autocomplete array. If you want to +// search anywhere in the string, additionally set +// the option fullSearch to true (default: off). +// +// - fullSsearch - Search anywhere in autocomplete array strings. +// +// - partialChars - How many characters to enter before triggering +// a partial match (unlike minChars, which defines +// how many characters are required to do any match +// at all). Defaults to 2. +// +// - ignoreCase - Whether to ignore case when autocompleting. +// Defaults to true. +// +// It's possible to pass in a custom function as the 'selector' +// option, if you prefer to write your own autocompletion logic. +// In that case, the other options above will not apply unless +// you support them. + +Autocompleter.Local = Class.create(); +Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), { + initialize: function(element, update, array, options) { + this.baseInitialize(element, update, options); + this.options.array = array; + }, + + getUpdatedChoices: function() { + this.updateChoices(this.options.selector(this)); + }, + + setOptions: function(options) { + this.options = Object.extend({ + choices: 10, + partialSearch: true, + partialChars: 2, + ignoreCase: true, + fullSearch: false, + selector: function(instance) { + var ret = []; // Beginning matches + var partial = []; // Inside matches + var entry = instance.getToken(); + var count = 0; + + for (var i = 0; i < instance.options.array.length && + ret.length < instance.options.choices ; i++) { + + var elem = instance.options.array[i]; + var foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase()) : + elem.indexOf(entry); + + while (foundPos != -1) { + if (foundPos == 0 && elem.length != entry.length) { + ret.push("
  • " + elem.substr(0, entry.length) + "" + + elem.substr(entry.length) + "
  • "); + break; + } else if (entry.length >= instance.options.partialChars && + instance.options.partialSearch && foundPos != -1) { + if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { + partial.push("
  • " + elem.substr(0, foundPos) + "" + + elem.substr(foundPos, entry.length) + "" + elem.substr( + foundPos + entry.length) + "
  • "); + break; + } + } + + foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : + elem.indexOf(entry, foundPos + 1); + + } + } + if (partial.length) + ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)) + return "
      " + ret.join('') + "
    "; + } + }, options || { }); + } +}); + +// AJAX in-place editor and collection editor +// Full rewrite by Christophe Porteneuve (April 2007). + +// Use this if you notice weird scrolling problems on some browsers, +// the DOM might be a bit confused when this gets called so do this +// waits 1 ms (with setTimeout) until it does the activation +Field.scrollFreeActivate = function(field) { + setTimeout(function() { + Field.activate(field); + }, 1); +} + +Ajax.InPlaceEditor = Class.create(); +Object.extend(Ajax.InPlaceEditor, { + DefaultOptions: { + ajaxOptions: { }, + autoRows: 3, // Use when multi-line w/ rows == 1 + cancelControl: 'link', // 'link'|'button'|false + cancelText: 'cancel', + clickToEditText: 'Click to edit', + externalControl: null, // id|elt + externalControlOnly: false, + fieldPostCreation: 'activate', // 'activate'|'focus'|false + formClassName: 'inplaceeditor-form', + formId: null, // id|elt + highlightColor: '#ffff99', + highlightEndColor: '#ffffff', + hoverClassName: '', + htmlResponse: true, + loadingClassName: 'inplaceeditor-loading', + loadingText: 'Loading...', + okControl: 'button', // 'link'|'button'|false + okText: 'ok', + paramName: 'value', + rows: 1, // If 1 and multi-line, uses autoRows + savingClassName: 'inplaceeditor-saving', + savingText: 'Saving...', + size: 0, + stripLoadedTextTags: false, + submitOnBlur: false, + textAfterControls: '', + textBeforeControls: '', + textBetweenControls: '' + }, + DefaultCallbacks: { + callback: function(form) { + return Form.serialize(form); + }, + onComplete: function(transport, element) { + // For backward compatibility, this one is bound to the IPE, and passes + // the element directly. It was too often customized, so we don't break it. + new Effect.Highlight(element, { + startcolor: this.options.highlightColor, keepBackgroundImage: true }); + }, + onEnterEditMode: null, + onEnterHover: function(ipe) { + ipe.element.style.backgroundColor = ipe.options.highlightColor; + if (ipe._effect) + ipe._effect.cancel(); + }, + onFailure: function(transport, ipe) { + alert('Error communication with the server: ' + transport.responseText.stripTags()); + }, + onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls. + onLeaveEditMode: null, + onLeaveHover: function(ipe) { + ipe._effect = new Effect.Highlight(ipe.element, { + startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor, + restorecolor: ipe._originalBackground, keepBackgroundImage: true + }); + } + }, + Listeners: { + click: 'enterEditMode', + keydown: 'checkForEscapeOrReturn', + mouseover: 'enterHover', + mouseout: 'leaveHover' + } +}); +Ajax.InPlaceEditor.prototype = { + initialize: function(element, url, options) { + this.url = url; + this.element = element = $(element); + this.prepareOptions(); + this._controls = { }; + arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!! + Object.extend(this.options, options || { }); + if (!this.options.formId && this.element.id) { + this.options.formId = this.element.id + '-inplaceeditor'; + if ($(this.options.formId)) + this.options.formId = ''; + } + if (this.options.externalControl) + this.options.externalControl = $(this.options.externalControl); + if (!this.options.externalControl) + this.options.externalControlOnly = false; + this._originalBackground = this.element.getStyle('background-color') || 'transparent'; + this.element.title = this.options.clickToEditText; + this._boundCancelHandler = this.handleFormCancellation.bind(this); + this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); + this._boundFailureHandler = this.handleAJAXFailure.bind(this); + this._boundSubmitHandler = this.handleFormSubmission.bind(this); + this._boundWrapperHandler = this.wrapUp.bind(this); + this.registerListeners(); + }, + checkForEscapeOrReturn: function(e) { + if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return; + if (Event.KEY_ESC == e.keyCode) + this.handleFormCancellation(e); + else if (Event.KEY_RETURN == e.keyCode) + this.handleFormSubmission(e); + }, + createControl: function(mode, handler, extraClasses) { + var control = this.options[mode + 'Control']; + var text = this.options[mode + 'Text']; + if ('button' == control) { + var btn = document.createElement('input'); + btn.type = 'submit'; + btn.value = text; + btn.className = 'editor_' + mode + '_button'; + if ('cancel' == mode) + btn.onclick = this._boundCancelHandler; + this._form.appendChild(btn); + this._controls[mode] = btn; + } else if ('link' == control) { + var link = document.createElement('a'); + link.href = '#'; + link.appendChild(document.createTextNode(text)); + link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler; + link.className = 'editor_' + mode + '_link'; + if (extraClasses) + link.className += ' ' + extraClasses; + this._form.appendChild(link); + this._controls[mode] = link; + } + }, + createEditField: function() { + var text = (this.options.loadTextURL ? this.options.loadingText : this.getText()); + var fld; + if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { + fld = document.createElement('input'); + fld.type = 'text'; + var size = this.options.size || this.options.cols || 0; + if (0 < size) fld.size = size; + } else { + fld = document.createElement('textarea'); + fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); + fld.cols = this.options.cols || 40; + } + fld.name = this.options.paramName; + fld.value = text; // No HTML breaks conversion anymore + fld.className = 'editor_field'; + if (this.options.submitOnBlur) + fld.onblur = this._boundSubmitHandler; + this._controls.editor = fld; + if (this.options.loadTextURL) + this.loadExternalText(); + this._form.appendChild(this._controls.editor); + }, + createForm: function() { + var ipe = this; + function addText(mode, condition) { + var text = ipe.options['text' + mode + 'Controls']; + if (!text || condition === false) return; + ipe._form.appendChild(document.createTextNode(text)); + }; + this._form = $(document.createElement('form')); + this._form.id = this.options.formId; + this._form.addClassName(this.options.formClassName); + this._form.onsubmit = this._boundSubmitHandler; + this.createEditField(); + if ('textarea' == this._controls.editor.tagName.toLowerCase()) + this._form.appendChild(document.createElement('br')); + if (this.options.onFormCustomization) + this.options.onFormCustomization(this, this._form); + addText('Before', this.options.okControl || this.options.cancelControl); + this.createControl('ok', this._boundSubmitHandler); + addText('Between', this.options.okControl && this.options.cancelControl); + this.createControl('cancel', this._boundCancelHandler, 'editor_cancel'); + addText('After', this.options.okControl || this.options.cancelControl); + }, + destroy: function() { + if (this._oldInnerHTML) + this.element.innerHTML = this._oldInnerHTML; + this.leaveEditMode(); + this.unregisterListeners(); + }, + enterEditMode: function(e) { + if (this._saving || this._editing) return; + this._editing = true; + this.triggerCallback('onEnterEditMode'); + if (this.options.externalControl) + this.options.externalControl.hide(); + this.element.hide(); + this.createForm(); + this.element.parentNode.insertBefore(this._form, this.element); + if (!this.options.loadTextURL) + this.postProcessEditField(); + if (e) Event.stop(e); + }, + enterHover: function(e) { + if (this.options.hoverClassName) + this.element.addClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onEnterHover'); + }, + getText: function() { + return this.element.innerHTML; + }, + handleAJAXFailure: function(transport) { + this.triggerCallback('onFailure', transport); + if (this._oldInnerHTML) { + this.element.innerHTML = this._oldInnerHTML; + this._oldInnerHTML = null; + } + }, + handleFormCancellation: function(e) { + this.wrapUp(); + if (e) Event.stop(e); + }, + handleFormSubmission: function(e) { + var form = this._form; + var value = $F(this._controls.editor); + this.prepareSubmission(); + var params = this.options.callback(form, value); + params = (params ? params + '&' : '?') + 'editorId=' + this.element.id; + if (this.options.htmlResponse) { + var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Updater({ success: this.element }, this.url, options); + } else { + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.url, options); + } + if (e) Event.stop(e); + }, + leaveEditMode: function() { + this.element.removeClassName(this.options.savingClassName); + this.removeForm(); + this.leaveHover(); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + if (this.options.externalControl) + this.options.externalControl.show(); + this._saving = false; + this._editing = false; + this._oldInnerHTML = null; + this.triggerCallback('onLeaveEditMode'); + }, + leaveHover: function(e) { + if (this.options.hoverClassName) + this.element.removeClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onLeaveHover'); + }, + loadExternalText: function() { + this._form.addClassName(this.options.loadingClassName); + this._controls.editor.disabled = true; + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._form.removeClassName(this.options.loadingClassName); + var text = transport.responseText; + if (this.options.stripLoadedTextTags) + text = text.stripTags(); + this._controls.editor.value = text; + this._controls.editor.disabled = false; + this.postProcessEditField(); + }.bind(this), + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + postProcessEditField: function() { + var fpc = this.options.fieldPostCreation; + if (fpc) + $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate'](); + }, + prepareOptions: function() { + this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); + Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); + [this._extraDefaultOptions].flatten().compact().each(function(defs) { + Object.extend(this.options, defs); + }.bind(this)); + }, + prepareSubmission: function() { + this._saving = true; + this.removeForm(); + this.leaveHover(); + this.showSaving(); + }, + registerListeners: function() { + this._listeners = { }; + var listener; + $H(Ajax.InPlaceEditor.Listeners).each(function(pair) { + listener = this[pair.value].bind(this); + this._listeners[pair.key] = listener; + if (!this.options.externalControlOnly) + this.element.observe(pair.key, listener); + if (this.options.externalControl) + this.options.externalControl.observe(pair.key, listener); + }.bind(this)); + }, + removeForm: function() { + if (!this._form) return; + this._form.remove(); + this._form = null; + this._controls = { }; + }, + showSaving: function() { + this._oldInnerHTML = this.element.innerHTML; + this.element.innerHTML = this.options.savingText; + this.element.addClassName(this.options.savingClassName); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + }, + triggerCallback: function(cbName, arg) { + if ('function' == typeof this.options[cbName]) { + this.options[cbName](this, arg); + } + }, + unregisterListeners: function() { + $H(this._listeners).each(function(pair) { + if (!this.options.externalControlOnly) + this.element.stopObserving(pair.key, pair.value); + if (this.options.externalControl) + this.options.externalControl.stopObserving(pair.key, pair.value); + }.bind(this)); + }, + wrapUp: function(transport) { + this.leaveEditMode(); + // Can't use triggerCallback due to backward compatibility: requires + // binding + direct element + this._boundComplete(transport, this.element); + } +}; +Object.extend(Ajax.InPlaceEditor.prototype, { + dispose: Ajax.InPlaceEditor.prototype.destroy +}); + + +Ajax.InPlaceCollectionEditor = Class.create(); +Ajax.InPlaceCollectionEditor.DefaultOptions = { + loadingCollectionText: 'Loading options...' +}; +Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype); +Object.extend(Ajax.InPlaceCollectionEditor.prototype, { + initialize: function(element, url, options) { + this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; + Ajax.InPlaceEditor.prototype.initialize.call(this, element, url, options); + }, + + createEditField: function() { + var list = document.createElement('select'); + list.name = this.options.paramName; + list.size = 1; + this._controls.editor = list; + this._collection = this.options.collection || []; + if (this.options.loadCollectionURL) + this.loadCollection(); + else + this.checkForExternalText(); + this._form.appendChild(this._controls.editor); + }, + + loadCollection: function() { + this._form.addClassName(this.options.loadingClassName); + this.showLoadingText(this.options.loadingCollectionText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + var js = transport.responseText.strip(); + if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check + throw 'Server returned an invalid collection representation.'; + this._collection = eval(js); + this.checkForExternalText(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadCollectionURL, options); + }, + + showLoadingText: function(text) { + this._controls.editor.disabled = true; + var tempOption = this._controls.editor.firstChild; + if (!tempOption) { + tempOption = document.createElement('option'); + tempOption.value = ''; + this._controls.editor.appendChild(tempOption); + tempOption.selected = true; + } + tempOption.update((text || '').stripScripts().stripTags()); + }, + + checkForExternalText: function() { + this._text = this.getText(); + if (this.options.loadTextURL) + this.loadExternalText(); + else + this.buildOptionList(); + }, + + loadExternalText: function() { + this.showLoadingText(this.options.loadingText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._text = transport.responseText.strip(); + this.buildOptionList(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + + buildOptionList: function() { + this._form.removeClassName(this.options.loadingClassName); + this._collection = this._collection.map(function(entry) { + return 2 === entry.length ? entry : [entry, entry].flatten(); + }); + var marker = ('value' in this.options) ? this.options.value : this._text; + var textFound = this._collection.any(function(entry) { + return entry[0] == marker; + }.bind(this)); + this._controls.editor.update(''); + var option; + this._collection.each(function(entry, index) { + option = document.createElement('option'); + option.value = entry[0]; + option.selected = textFound ? entry[0] == marker : 0 == index; + option.appendChild(document.createTextNode(entry[1])); + this._controls.editor.appendChild(option); + }.bind(this)); + this._controls.editor.disabled = false; + Field.scrollFreeActivate(this._controls.editor); + } +}); + +//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! **** +//**** This only exists for a while, in order to let **** +//**** users adapt to the new API. Read up on the new **** +//**** API and convert your code to it ASAP! **** + +Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) { + if (!options) return; + function fallback(name, expr) { + if (name in options || expr === undefined) return; + options[name] = expr; + }; + fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' : + options.cancelLink == options.cancelButton == false ? false : undefined))); + fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' : + options.okLink == options.okButton == false ? false : undefined))); + fallback('highlightColor', options.highlightcolor); + fallback('highlightEndColor', options.highlightendcolor); +}; + + +// Delayed observer, like Form.Element.Observer, +// but waits for delay after last key input +// Ideal for live-search fields + +Form.Element.DelayedObserver = Class.create(); +Form.Element.DelayedObserver.prototype = { + initialize: function(element, delay, callback) { + this.delay = delay || 0.5; + this.element = $(element); + this.callback = callback; + this.timer = null; + this.lastValue = $F(this.element); + Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); + }, + delayedListener: function(event) { + if(this.lastValue == $F(this.element)) return; + if(this.timer) clearTimeout(this.timer); + this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); + this.lastValue = $F(this.element); + }, + onTimerEvent: function() { + this.timer = null; + this.callback(this.element, $F(this.element)); + } +}; diff --git a/main/NOVA_0.4.5/templates/static/javascripts/dragdrop.js b/main/NOVA_0.4.5/templates/static/javascripts/dragdrop.js new file mode 100644 index 0000000..96eba90 --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/dragdrop.js @@ -0,0 +1,976 @@ +// script.aculo.us dragdrop.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 + +// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +if(Object.isUndefined(Effect)) + throw("dragdrop.js requires including script.aculo.us' effects.js library"); + +var Droppables = { + drops: [], + + remove: function(element) { + this.drops = this.drops.reject(function(d) { return d.element==$(element) }); + }, + + add: function(element) { + element = $(element); + var options = Object.extend({ + greedy: true, + hoverclass: null, + tree: false + }, arguments[1] || { }); + + // cache containers + if(options.containment) { + options._containers = []; + var containment = options.containment; + if(Object.isArray(containment)) { + containment.each( function(c) { options._containers.push($(c)) }); + } else { + options._containers.push($(containment)); + } + } + + if(options.accept) options.accept = [options.accept].flatten(); + + Element.makePositioned(element); // fix IE + options.element = element; + + this.drops.push(options); + }, + + findDeepestChild: function(drops) { + deepest = drops[0]; + + for (i = 1; i < drops.length; ++i) + if (Element.isParent(drops[i].element, deepest.element)) + deepest = drops[i]; + + return deepest; + }, + + isContained: function(element, drop) { + var containmentNode; + if(drop.tree) { + containmentNode = element.treeNode; + } else { + containmentNode = element.parentNode; + } + return drop._containers.detect(function(c) { return containmentNode == c }); + }, + + isAffected: function(point, element, drop) { + return ( + (drop.element!=element) && + ((!drop._containers) || + this.isContained(element, drop)) && + ((!drop.accept) || + (Element.classNames(element).detect( + function(v) { return drop.accept.include(v) } ) )) && + Position.within(drop.element, point[0], point[1]) ); + }, + + deactivate: function(drop) { + if(drop.hoverclass) + Element.removeClassName(drop.element, drop.hoverclass); + this.last_active = null; + }, + + activate: function(drop) { + if(drop.hoverclass) + Element.addClassName(drop.element, drop.hoverclass); + this.last_active = drop; + }, + + show: function(point, element) { + if(!this.drops.length) return; + var drop, affected = []; + + this.drops.each( function(drop) { + if(Droppables.isAffected(point, element, drop)) + affected.push(drop); + }); + + if(affected.length>0) + drop = Droppables.findDeepestChild(affected); + + if(this.last_active && this.last_active != drop) this.deactivate(this.last_active); + if (drop) { + Position.within(drop.element, point[0], point[1]); + if(drop.onHover) + drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); + + if (drop != this.last_active) Droppables.activate(drop); + } + }, + + fire: function(event, element) { + if(!this.last_active) return; + Position.prepare(); + + if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) + if (this.last_active.onDrop) { + this.last_active.onDrop(element, this.last_active.element, event); + return true; + } + }, + + reset: function() { + if(this.last_active) + this.deactivate(this.last_active); + } +} + +var Draggables = { + drags: [], + observers: [], + + register: function(draggable) { + if(this.drags.length == 0) { + this.eventMouseUp = this.endDrag.bindAsEventListener(this); + this.eventMouseMove = this.updateDrag.bindAsEventListener(this); + this.eventKeypress = this.keyPress.bindAsEventListener(this); + + Event.observe(document, "mouseup", this.eventMouseUp); + Event.observe(document, "mousemove", this.eventMouseMove); + Event.observe(document, "keypress", this.eventKeypress); + } + this.drags.push(draggable); + }, + + unregister: function(draggable) { + this.drags = this.drags.reject(function(d) { return d==draggable }); + if(this.drags.length == 0) { + Event.stopObserving(document, "mouseup", this.eventMouseUp); + Event.stopObserving(document, "mousemove", this.eventMouseMove); + Event.stopObserving(document, "keypress", this.eventKeypress); + } + }, + + activate: function(draggable) { + if(draggable.options.delay) { + this._timeout = setTimeout(function() { + Draggables._timeout = null; + window.focus(); + Draggables.activeDraggable = draggable; + }.bind(this), draggable.options.delay); + } else { + window.focus(); // allows keypress events if window isn't currently focused, fails for Safari + this.activeDraggable = draggable; + } + }, + + deactivate: function() { + this.activeDraggable = null; + }, + + updateDrag: function(event) { + if(!this.activeDraggable) return; + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + // Mozilla-based browsers fire successive mousemove events with + // the same coordinates, prevent needless redrawing (moz bug?) + if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; + this._lastPointer = pointer; + + this.activeDraggable.updateDrag(event, pointer); + }, + + endDrag: function(event) { + if(this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + } + if(!this.activeDraggable) return; + this._lastPointer = null; + this.activeDraggable.endDrag(event); + this.activeDraggable = null; + }, + + keyPress: function(event) { + if(this.activeDraggable) + this.activeDraggable.keyPress(event); + }, + + addObserver: function(observer) { + this.observers.push(observer); + this._cacheObserverCallbacks(); + }, + + removeObserver: function(element) { // element instead of observer fixes mem leaks + this.observers = this.observers.reject( function(o) { return o.element==element }); + this._cacheObserverCallbacks(); + }, + + notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' + if(this[eventName+'Count'] > 0) + this.observers.each( function(o) { + if(o[eventName]) o[eventName](eventName, draggable, event); + }); + if(draggable.options[eventName]) draggable.options[eventName](draggable, event); + }, + + _cacheObserverCallbacks: function() { + ['onStart','onEnd','onDrag'].each( function(eventName) { + Draggables[eventName+'Count'] = Draggables.observers.select( + function(o) { return o[eventName]; } + ).length; + }); + } +} + +/*--------------------------------------------------------------------------*/ + +var Draggable = Class.create(); +Draggable._dragging = { }; + +Draggable.prototype = { + initialize: function(element) { + var defaults = { + handle: false, + reverteffect: function(element, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; + new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, + queue: {scope:'_draggable', position:'end'} + }); + }, + endeffect: function(element) { + var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; + new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, + queue: {scope:'_draggable', position:'end'}, + afterFinish: function(){ + Draggable._dragging[element] = false + } + }); + }, + zindex: 1000, + revert: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } + delay: 0 + }; + + if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) + Object.extend(defaults, { + starteffect: function(element) { + element._opacity = Element.getOpacity(element); + Draggable._dragging[element] = true; + new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); + } + }); + + var options = Object.extend(defaults, arguments[1] || { }); + + this.element = $(element); + + if(options.handle && Object.isString(options.handle)) + this.handle = this.element.down('.'+options.handle, 0); + + if(!this.handle) this.handle = $(options.handle); + if(!this.handle) this.handle = this.element; + + if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { + options.scroll = $(options.scroll); + this._isScrollChild = Element.childOf(this.element, options.scroll); + } + + Element.makePositioned(this.element); // fix IE + + this.options = options; + this.dragging = false; + + this.eventMouseDown = this.initDrag.bindAsEventListener(this); + Event.observe(this.handle, "mousedown", this.eventMouseDown); + + Draggables.register(this); + }, + + destroy: function() { + Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); + Draggables.unregister(this); + }, + + currentDelta: function() { + return([ + parseInt(Element.getStyle(this.element,'left') || '0'), + parseInt(Element.getStyle(this.element,'top') || '0')]); + }, + + initDrag: function(event) { + if(!Object.isUndefined(Draggable._dragging[this.element]) && + Draggable._dragging[this.element]) return; + if(Event.isLeftClick(event)) { + // abort on form elements, fixes a Firefox issue + var src = Event.element(event); + if((tag_name = src.tagName.toUpperCase()) && ( + tag_name=='INPUT' || + tag_name=='SELECT' || + tag_name=='OPTION' || + tag_name=='BUTTON' || + tag_name=='TEXTAREA')) return; + + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var pos = Position.cumulativeOffset(this.element); + this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); + + Draggables.activate(this); + Event.stop(event); + } + }, + + startDrag: function(event) { + this.dragging = true; + if(!this.delta) + this.delta = this.currentDelta(); + + if(this.options.zindex) { + this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); + this.element.style.zIndex = this.options.zindex; + } + + if(this.options.ghosting) { + this._clone = this.element.cloneNode(true); + this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); + if (!this.element._originallyAbsolute) + Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + if(this.options.scroll) { + if (this.options.scroll == window) { + var where = this._getWindowScroll(this.options.scroll); + this.originalScrollLeft = where.left; + this.originalScrollTop = where.top; + } else { + this.originalScrollLeft = this.options.scroll.scrollLeft; + this.originalScrollTop = this.options.scroll.scrollTop; + } + } + + Draggables.notify('onStart', this, event); + + if(this.options.starteffect) this.options.starteffect(this.element); + }, + + updateDrag: function(event, pointer) { + if(!this.dragging) this.startDrag(event); + + if(!this.options.quiet){ + Position.prepare(); + Droppables.show(pointer, this.element); + } + + Draggables.notify('onDrag', this, event); + + this.draw(pointer); + if(this.options.change) this.options.change(this); + + if(this.options.scroll) { + this.stopScrolling(); + + var p; + if (this.options.scroll == window) { + with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } + } else { + p = Position.page(this.options.scroll); + p[0] += this.options.scroll.scrollLeft + Position.deltaX; + p[1] += this.options.scroll.scrollTop + Position.deltaY; + p.push(p[0]+this.options.scroll.offsetWidth); + p.push(p[1]+this.options.scroll.offsetHeight); + } + var speed = [0,0]; + if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); + if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); + if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); + if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); + this.startScrolling(speed); + } + + // fix AppleWebKit rendering + if(Prototype.Browser.WebKit) window.scrollBy(0,0); + + Event.stop(event); + }, + + finishDrag: function(event, success) { + this.dragging = false; + + if(this.options.quiet){ + Position.prepare(); + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + Droppables.show(pointer, this.element); + } + + if(this.options.ghosting) { + if (!this.element._originallyAbsolute) + Position.relativize(this.element); + delete this.element._originallyAbsolute; + Element.remove(this._clone); + this._clone = null; + } + + var dropped = false; + if(success) { + dropped = Droppables.fire(event, this.element); + if (!dropped) dropped = false; + } + if(dropped && this.options.onDropped) this.options.onDropped(this.element); + Draggables.notify('onEnd', this, event); + + var revert = this.options.revert; + if(revert && Object.isFunction(revert)) revert = revert(this.element); + + var d = this.currentDelta(); + if(revert && this.options.reverteffect) { + if (dropped == 0 || revert != 'failure') + this.options.reverteffect(this.element, + d[1]-this.delta[1], d[0]-this.delta[0]); + } else { + this.delta = d; + } + + if(this.options.zindex) + this.element.style.zIndex = this.originalZ; + + if(this.options.endeffect) + this.options.endeffect(this.element); + + Draggables.deactivate(this); + Droppables.reset(); + }, + + keyPress: function(event) { + if(event.keyCode!=Event.KEY_ESC) return; + this.finishDrag(event, false); + Event.stop(event); + }, + + endDrag: function(event) { + if(!this.dragging) return; + this.stopScrolling(); + this.finishDrag(event, true); + Event.stop(event); + }, + + draw: function(point) { + var pos = Position.cumulativeOffset(this.element); + if(this.options.ghosting) { + var r = Position.realOffset(this.element); + pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; + } + + var d = this.currentDelta(); + pos[0] -= d[0]; pos[1] -= d[1]; + + if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { + pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; + pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; + } + + var p = [0,1].map(function(i){ + return (point[i]-pos[i]-this.offset[i]) + }.bind(this)); + + if(this.options.snap) { + if(Object.isFunction(this.options.snap)) { + p = this.options.snap(p[0],p[1],this); + } else { + if(Object.isArray(this.options.snap)) { + p = p.map( function(v, i) { + return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)) + } else { + p = p.map( function(v) { + return (v/this.options.snap).round()*this.options.snap }.bind(this)) + } + }} + + var style = this.element.style; + if((!this.options.constraint) || (this.options.constraint=='horizontal')) + style.left = p[0] + "px"; + if((!this.options.constraint) || (this.options.constraint=='vertical')) + style.top = p[1] + "px"; + + if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering + }, + + stopScrolling: function() { + if(this.scrollInterval) { + clearInterval(this.scrollInterval); + this.scrollInterval = null; + Draggables._lastScrollPointer = null; + } + }, + + startScrolling: function(speed) { + if(!(speed[0] || speed[1])) return; + this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; + this.lastScrolled = new Date(); + this.scrollInterval = setInterval(this.scroll.bind(this), 10); + }, + + scroll: function() { + var current = new Date(); + var delta = current - this.lastScrolled; + this.lastScrolled = current; + if(this.options.scroll == window) { + with (this._getWindowScroll(this.options.scroll)) { + if (this.scrollSpeed[0] || this.scrollSpeed[1]) { + var d = delta / 1000; + this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); + } + } + } else { + this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; + this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; + } + + Position.prepare(); + Droppables.show(Draggables._lastPointer, this.element); + Draggables.notify('onDrag', this); + if (this._isScrollChild) { + Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); + Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; + Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; + if (Draggables._lastScrollPointer[0] < 0) + Draggables._lastScrollPointer[0] = 0; + if (Draggables._lastScrollPointer[1] < 0) + Draggables._lastScrollPointer[1] = 0; + this.draw(Draggables._lastScrollPointer); + } + + if(this.options.change) this.options.change(this); + }, + + _getWindowScroll: function(w) { + var T, L, W, H; + with (w.document) { + if (w.document.documentElement && documentElement.scrollTop) { + T = documentElement.scrollTop; + L = documentElement.scrollLeft; + } else if (w.document.body) { + T = body.scrollTop; + L = body.scrollLeft; + } + if (w.innerWidth) { + W = w.innerWidth; + H = w.innerHeight; + } else if (w.document.documentElement && documentElement.clientWidth) { + W = documentElement.clientWidth; + H = documentElement.clientHeight; + } else { + W = body.offsetWidth; + H = body.offsetHeight + } + } + return { top: T, left: L, width: W, height: H }; + } +} + +/*--------------------------------------------------------------------------*/ + +var SortableObserver = Class.create(); +SortableObserver.prototype = { + initialize: function(element, observer) { + this.element = $(element); + this.observer = observer; + this.lastValue = Sortable.serialize(this.element); + }, + + onStart: function() { + this.lastValue = Sortable.serialize(this.element); + }, + + onEnd: function() { + Sortable.unmark(); + if(this.lastValue != Sortable.serialize(this.element)) + this.observer(this.element) + } +} + +var Sortable = { + SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, + + sortables: { }, + + _findRootElement: function(element) { + while (element.tagName.toUpperCase() != "BODY") { + if(element.id && Sortable.sortables[element.id]) return element; + element = element.parentNode; + } + }, + + options: function(element) { + element = Sortable._findRootElement($(element)); + if(!element) return; + return Sortable.sortables[element.id]; + }, + + destroy: function(element){ + var s = Sortable.options(element); + + if(s) { + Draggables.removeObserver(s.element); + s.droppables.each(function(d){ Droppables.remove(d) }); + s.draggables.invoke('destroy'); + + delete Sortable.sortables[s.element.id]; + } + }, + + create: function(element) { + element = $(element); + var options = Object.extend({ + element: element, + tag: 'li', // assumes li children, override with tag: 'tagname' + dropOnEmpty: false, + tree: false, + treeTag: 'ul', + overlap: 'vertical', // one of 'vertical', 'horizontal' + constraint: 'vertical', // one of 'vertical', 'horizontal', false + containment: element, // also takes array of elements (or id's); or false + handle: false, // or a CSS class + only: false, + delay: 0, + hoverclass: null, + ghosting: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + format: this.SERIALIZE_RULE, + + // these take arrays of elements or ids and can be + // used for better initialization performance + elements: false, + handles: false, + + onChange: Prototype.emptyFunction, + onUpdate: Prototype.emptyFunction + }, arguments[1] || { }); + + // clear any old sortable with same element + this.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + quiet: options.quiet, + scroll: options.scroll, + scrollSpeed: options.scrollSpeed, + scrollSensitivity: options.scrollSensitivity, + delay: options.delay, + ghosting: options.ghosting, + constraint: options.constraint, + handle: options.handle }; + + if(options.starteffect) + options_for_draggable.starteffect = options.starteffect; + + if(options.reverteffect) + options_for_draggable.reverteffect = options.reverteffect; + else + if(options.ghosting) options_for_draggable.reverteffect = function(element) { + element.style.top = 0; + element.style.left = 0; + }; + + if(options.endeffect) + options_for_draggable.endeffect = options.endeffect; + + if(options.zindex) + options_for_draggable.zindex = options.zindex; + + // build options for the droppables + var options_for_droppable = { + overlap: options.overlap, + containment: options.containment, + tree: options.tree, + hoverclass: options.hoverclass, + onHover: Sortable.onHover + } + + var options_for_tree = { + onHover: Sortable.onEmptyHover, + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass + } + + // fix for gecko engine + Element.cleanWhitespace(element); + + options.draggables = []; + options.droppables = []; + + // drop on empty handling + if(options.dropOnEmpty || options.tree) { + Droppables.add(element, options_for_tree); + options.droppables.push(element); + } + + (options.elements || this.findElements(element, options) || []).each( function(e,i) { + var handle = options.handles ? $(options.handles[i]) : + (options.handle ? $(e).getElementsByClassName(options.handle)[0] : e); + options.draggables.push( + new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); + Droppables.add(e, options_for_droppable); + if(options.tree) e.treeNode = element; + options.droppables.push(e); + }); + + if(options.tree) { + (Sortable.findTreeElements(element, options) || []).each( function(e) { + Droppables.add(e, options_for_tree); + e.treeNode = element; + options.droppables.push(e); + }); + } + + // keep reference + this.sortables[element.id] = options; + + // for onupdate + Draggables.addObserver(new SortableObserver(element, options.onUpdate)); + + }, + + // return all suitable-for-sortable elements in a guaranteed order + findElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.tag); + }, + + findTreeElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.treeTag); + }, + + onHover: function(element, dropon, overlap) { + if(Element.isParent(dropon, element)) return; + + if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { + return; + } else if(overlap>0.5) { + Sortable.mark(dropon, 'before'); + if(dropon.previousSibling != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, dropon); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } else { + Sortable.mark(dropon, 'after'); + var nextElement = dropon.nextSibling || null; + if(nextElement != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, nextElement); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } + }, + + onEmptyHover: function(element, dropon, overlap) { + var oldParentNode = element.parentNode; + var droponOptions = Sortable.options(dropon); + + if(!Element.isParent(dropon, element)) { + var index; + + var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); + var child = null; + + if(children) { + var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); + + for (index = 0; index < children.length; index += 1) { + if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { + offset -= Element.offsetSize (children[index], droponOptions.overlap); + } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { + child = index + 1 < children.length ? children[index + 1] : null; + break; + } else { + child = children[index]; + break; + } + } + } + + dropon.insertBefore(element, child); + + Sortable.options(oldParentNode).onChange(element); + droponOptions.onChange(element); + } + }, + + unmark: function() { + if(Sortable._marker) Sortable._marker.hide(); + }, + + mark: function(dropon, position) { + // mark on ghosting only + var sortable = Sortable.options(dropon.parentNode); + if(sortable && !sortable.ghosting) return; + + if(!Sortable._marker) { + Sortable._marker = + ($('dropmarker') || Element.extend(document.createElement('DIV'))). + hide().addClassName('dropmarker').setStyle({position:'absolute'}); + document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); + } + var offsets = Position.cumulativeOffset(dropon); + Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); + + if(position=='after') + if(sortable.overlap == 'horizontal') + Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); + else + Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); + + Sortable._marker.show(); + }, + + _tree: function(element, options, parent) { + var children = Sortable.findElements(element, options) || []; + + for (var i = 0; i < children.length; ++i) { + var match = children[i].id.match(options.format); + + if (!match) continue; + + var child = { + id: encodeURIComponent(match ? match[1] : null), + element: element, + parent: parent, + children: [], + position: parent.children.length, + container: $(children[i]).down(options.treeTag) + } + + /* Get the element containing the children and recurse over it */ + if (child.container) + this._tree(child.container, options, child) + + parent.children.push (child); + } + + return parent; + }, + + tree: function(element) { + element = $(element); + var sortableOptions = this.options(element); + var options = Object.extend({ + tag: sortableOptions.tag, + treeTag: sortableOptions.treeTag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format + }, arguments[1] || { }); + + var root = { + id: null, + parent: null, + children: [], + container: element, + position: 0 + } + + return Sortable._tree(element, options, root); + }, + + /* Construct a [i] index for a particular node */ + _constructIndex: function(node) { + var index = ''; + do { + if (node.id) index = '[' + node.position + ']' + index; + } while ((node = node.parent) != null); + return index; + }, + + sequence: function(element) { + element = $(element); + var options = Object.extend(this.options(element), arguments[1] || { }); + + return $(this.findElements(element, options) || []).map( function(item) { + return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; + }); + }, + + setSequence: function(element, new_sequence) { + element = $(element); + var options = Object.extend(this.options(element), arguments[2] || { }); + + var nodeMap = { }; + this.findElements(element, options).each( function(n) { + if (n.id.match(options.format)) + nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; + n.parentNode.removeChild(n); + }); + + new_sequence.each(function(ident) { + var n = nodeMap[ident]; + if (n) { + n[1].appendChild(n[0]); + delete nodeMap[ident]; + } + }); + }, + + serialize: function(element) { + element = $(element); + var options = Object.extend(Sortable.options(element), arguments[1] || { }); + var name = encodeURIComponent( + (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); + + if (options.tree) { + return Sortable.tree(element, arguments[1]).children.map( function (item) { + return [name + Sortable._constructIndex(item) + "[id]=" + + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); + }).flatten().join('&'); + } else { + return Sortable.sequence(element, arguments[1]).map( function(item) { + return name + "[]=" + encodeURIComponent(item); + }).join('&'); + } + } +} + +// Returns true if child is contained within element +Element.isParent = function(child, element) { + if (!child.parentNode || child == element) return false; + if (child.parentNode == element) return true; + return Element.isParent(child.parentNode, element); +} + +Element.findChildren = function(element, only, recursive, tagName) { + if(!element.hasChildNodes()) return null; + tagName = tagName.toUpperCase(); + if(only) only = [only].flatten(); + var elements = []; + $A(element.childNodes).each( function(e) { + if(e.tagName && e.tagName.toUpperCase()==tagName && + (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) + elements.push(e); + if(recursive) { + var grandchildren = Element.findChildren(e, only, recursive, tagName); + if(grandchildren) elements.push(grandchildren); + } + }); + + return (elements.length>0 ? elements.flatten() : []); +} + +Element.offsetSize = function (element, type) { + return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; +} diff --git a/main/NOVA_0.4.5/templates/static/javascripts/effects.js b/main/NOVA_0.4.5/templates/static/javascripts/effects.js new file mode 100644 index 0000000..2862f6f --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/effects.js @@ -0,0 +1,1117 @@ +// script.aculo.us effects.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 + +// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() { + var color = '#'; + if (this.slice(0,4) == 'rgb(') { + var cols = this.slice(4,this.length-1).split(','); + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); + } else { + if (this.slice(0,1) == '#') { + if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); + if (this.length==7) color = this.toLowerCase(); + } + } + return (color.length==7 ? color : (arguments[0] || this)); +}; + +/*--------------------------------------------------------------------------*/ + +Element.collectTextNodes = function(element) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); + }).flatten().join(''); +}; + +Element.collectTextNodesIgnoreClass = function(element, className) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? + Element.collectTextNodesIgnoreClass(node, className) : '')); + }).flatten().join(''); +}; + +Element.setContentZoom = function(element, percent) { + element = $(element); + element.setStyle({fontSize: (percent/100) + 'em'}); + if (Prototype.Browser.WebKit) window.scrollBy(0,0); + return element; +}; + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +}; + +Element.forceRerendering = function(element) { + try { + element = $(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { } +}; + +/*--------------------------------------------------------------------------*/ + +var Effect = { + _elementDoesNotExistError: { + name: 'ElementDoesNotExistError', + message: 'The specified DOM element does not exist, but is required for this effect to operate' + }, + Transitions: { + linear: Prototype.K, + sinoidal: function(pos) { + return (-Math.cos(pos*Math.PI)/2) + 0.5; + }, + reverse: function(pos) { + return 1-pos; + }, + flicker: function(pos) { + var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; + return pos > 1 ? 1 : pos; + }, + wobble: function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; + }, + pulse: function(pos, pulses) { + pulses = pulses || 5; + return ( + ((pos % (1/pulses)) * pulses).round() == 0 ? + ((pos * pulses * 2) - (pos * pulses * 2).floor()) : + 1 - ((pos * pulses * 2) - (pos * pulses * 2).floor()) + ); + }, + spring: function(pos) { + return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); + }, + none: function(pos) { + return 0; + }, + full: function(pos) { + return 1; + } + }, + DefaultOptions: { + duration: 1.0, // seconds + fps: 100, // 100= assume 66fps max. + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' + }, + tagifyText: function(element) { + var tagifyStyle = 'position:relative'; + if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; + + element = $(element); + $A(element.childNodes).each( function(child) { + if (child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + new Element('span', {style: tagifyStyle}).update( + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if (((typeof element == 'object') || + Object.isFunction(element)) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || { }); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + }, + PAIRS: { + 'slide': ['SlideDown','SlideUp'], + 'blind': ['BlindDown','BlindUp'], + 'appear': ['Appear','Fade'] + }, + toggle: function(element, effect) { + element = $(element); + effect = (effect || 'appear').toLowerCase(); + var options = Object.extend({ + queue: { position:'end', scope:(element.id || 'global'), limit: 1 } + }, arguments[2] || { }); + Effect[element.visible() ? + Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); + } +}; + +Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; + +/* ------------- core effects ------------- */ + +Effect.ScopedQueue = Class.create(Enumerable, { + initialize: function() { + this.effects = []; + this.interval = null; + }, + _each: function(iterator) { + this.effects._each(iterator); + }, + add: function(effect) { + var timestamp = new Date().getTime(); + + var position = Object.isString(effect.options.queue) ? + effect.options.queue : effect.options.queue.position; + + switch(position) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'with-last': + timestamp = this.effects.pluck('startOn').max() || timestamp; + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + + if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) + this.effects.push(effect); + + if (!this.interval) + this.interval = setInterval(this.loop.bind(this), 15); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if (this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + for(var i=0, len=this.effects.length;i= this.startOn) { + if (timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if (this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / this.totalTime, + frame = (pos * this.totalFrames).round(); + if (frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + cancel: function() { + if (!this.options.sync) + Effect.Queues.get(Object.isString(this.options.queue) ? + 'global' : this.options.queue.scope).remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if (this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + var data = $H(); + for(property in this) + if (!Object.isFunction(this[property])) data[property] = this[property]; + return '#'; + } +}; + +Effect.Parallel = Class.create(Effect.Base, { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if (effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Tween = Class.create(Effect.Base, { + initialize: function(object, from, to) { + object = Object.isString(object) ? $(object) : object; + var args = $A(arguments), method = args.last(), + options = args.length == 5 ? args[3] : null; + this.method = Object.isFunction(method) ? method.bind(object) : + Object.isFunction(object[method]) ? object[method].bind(object) : + function(value) { object[method] = value }; + this.start(Object.extend({ from: from, to: to }, options || { })); + }, + update: function(position) { + this.method(position); + } +}); + +Effect.Event = Class.create(Effect.Base, { + initialize: function() { + this.start(Object.extend({ duration: 0 }, arguments[0] || { })); + }, + update: Prototype.emptyFunction +}); + +Effect.Opacity = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + // make this work on IE on elements without 'layout' + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + var options = Object.extend({ + from: this.element.getOpacity() || 0.0, + to: 1.0 + }, arguments[1] || { }); + this.start(options); + }, + update: function(position) { + this.element.setOpacity(position); + } +}); + +Effect.Move = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + x: 0, + y: 0, + mode: 'relative' + }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + this.element.makePositioned(); + this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); + this.originalTop = parseFloat(this.element.getStyle('top') || '0'); + if (this.options.mode == 'absolute') { + this.options.x = this.options.x - this.originalLeft; + this.options.y = this.options.y - this.originalTop; + } + }, + update: function(position) { + this.element.setStyle({ + left: (this.options.x * position + this.originalLeft).round() + 'px', + top: (this.options.y * position + this.originalTop).round() + 'px' + }); + } +}); + +// for backwards compatibility +Effect.MoveBy = function(element, toTop, toLeft) { + return new Effect.Move(element, + Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); +}; + +Effect.Scale = Class.create(Effect.Base, { + initialize: function(element, percent) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or { } with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || { }); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = this.element.getStyle('position'); + + this.originalStyle = { }; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = this.element.getStyle('font-size') || '100%'; + ['em','px','%','pt'].each( function(fontSizeType) { + if (fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if (this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if (/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if (!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if (this.options.scaleContent && this.fontSize) + this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); + }, + setDimensions: function(height, width) { + var d = { }; + if (this.options.scaleX) d.width = width.round() + 'px'; + if (this.options.scaleY) d.height = height.round() + 'px'; + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if (this.options.scaleY) d.top = -topd + 'px'; + if (this.options.scaleX) d.left = -leftd + 'px'; + } + } + this.element.setStyle(d); + } +}); + +Effect.Highlight = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if (this.element.getStyle('display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = { }; + if (!this.options.keepBackgroundImage) { + this.oldStyle.backgroundImage = this.element.getStyle('background-image'); + this.element.setStyle({backgroundImage: 'none'}); + } + if (!this.options.endcolor) + this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); + if (!this.options.restorecolor) + this.options.restorecolor = this.element.getStyle('background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); + }, + finish: function() { + this.element.setStyle(Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = function(element) { + var options = arguments[1] || { }, + scrollOffsets = document.viewport.getScrollOffsets(), + elementOffsets = $(element).cumulativeOffset(), + max = (window.height || document.body.scrollHeight) - document.viewport.getHeight(); + + if (options.offset) elementOffsets[1] += options.offset; + + return new Effect.Tween(null, + scrollOffsets.top, + elementOffsets[1] > max ? max : elementOffsets[1], + options, + function(p){ scrollTo(scrollOffsets.left, p.round()) } + ); +}; + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + var options = Object.extend({ + from: element.getOpacity() || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { + if (effect.options.to!=0) return; + effect.element.hide().setStyle({opacity: oldOpacity}); + } + }, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Appear = function(element) { + element = $(element); + var options = Object.extend({ + from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function(effect) { + effect.element.forceRerendering(); + }, + beforeSetup: function(effect) { + effect.element.setOpacity(effect.options.from).show(); + }}, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { + opacity: element.getInlineOpacity(), + position: element.getStyle('position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { + Position.absolutize(effect.effects[0].element) + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().setStyle(oldStyle); } + }, arguments[1] || { }) + ); +}; + +Effect.BlindUp = function(element) { + element = $(element); + element.makeClipping(); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }, arguments[1] || { }) + ); +}; + +Effect.BlindDown = function(element) { + element = $(element); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping(); + } + }, arguments[1] || { })); +}; + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + return new Effect.Appear(element, Object.extend({ + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); + } + }) + } + }, arguments[1] || { })); +}; + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left'), + opacity: element.getInlineOpacity() }; + return new Effect.Parallel( + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { + effect.effects[0].element.makePositioned(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); + } + }, arguments[1] || { })); +}; + +Effect.Shake = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left') }; + return new Effect.Move(element, + { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { + effect.element.undoPositioned().setStyle(oldStyle); + }}) }}) }}) }}) }}) }}); +}; + +Effect.SlideDown = function(element) { + element = $(element).cleanWhitespace(); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: window.opera ? 0 : 1, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } + }, arguments[1] || { }) + ); +}; + +Effect.SlideUp = function(element) { + element = $(element).cleanWhitespace(); + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, window.opera ? 0 : 1, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); + } + }, arguments[1] || { }) + ); +}; + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, { + restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }); +}; + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetup: function(effect) { + effect.element.hide().makeClipping().makePositioned(); + }, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { + effect.effects[0].element.setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); + } + }, options) + ) + } + }); +}; + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { + effect.effects[0].element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } + }, options) + ); +}; + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || { }; + var oldOpacity = element.getInlineOpacity(); + var transition = options.transition || Effect.Transitions.sinoidal; + var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; + reverser.bind(transition); + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 2.0, from: 0, + afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } + }, options), {transition: reverser})); +}; + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + element.makeClipping(); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().setStyle(oldStyle); + } }); + }}, arguments[1] || { })); +}; + +Effect.Morph = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + style: { } + }, arguments[1] || { }); + + if (!Object.isString(options.style)) this.style = $H(options.style); + else { + if (options.style.include(':')) + this.style = options.style.parseStyle(); + else { + this.element.addClassName(options.style); + this.style = $H(this.element.getStyles()); + this.element.removeClassName(options.style); + var css = this.element.getStyles(); + this.style = this.style.reject(function(style) { + return style.value == css[style.key]; + }); + options.afterFinishInternal = function(effect) { + effect.element.addClassName(effect.options.style); + effect.transforms.each(function(transform) { + effect.element.style[transform.style] = ''; + }); + } + } + } + this.start(options); + }, + + setup: function(){ + function parseColor(color){ + if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; + color = color.parseColor(); + return $R(0,2).map(function(i){ + return parseInt( color.slice(i*2+1,i*2+3), 16 ) + }); + } + this.transforms = this.style.map(function(pair){ + var property = pair[0], value = pair[1], unit = null; + + if (value.parseColor('#zzzzzz') != '#zzzzzz') { + value = value.parseColor(); + unit = 'color'; + } else if (property == 'opacity') { + value = parseFloat(value); + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + } else if (Element.CSS_LENGTH.test(value)) { + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + unit = (components.length == 3) ? components[2] : null; + } + + var originalValue = this.element.getStyle(property); + return { + style: property.camelize(), + originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), + targetValue: unit=='color' ? parseColor(value) : value, + unit: unit + }; + }.bind(this)).reject(function(transform){ + return ( + (transform.originalValue == transform.targetValue) || + ( + transform.unit != 'color' && + (isNaN(transform.originalValue) || isNaN(transform.targetValue)) + ) + ) + }); + }, + update: function(position) { + var style = { }, transform, i = this.transforms.length; + while(i--) + style[(transform = this.transforms[i]).style] = + transform.unit=='color' ? '#'+ + (Math.round(transform.originalValue[0]+ + (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + + (Math.round(transform.originalValue[1]+ + (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + + (Math.round(transform.originalValue[2]+ + (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : + (transform.originalValue + + (transform.targetValue - transform.originalValue) * position).toFixed(3) + + (transform.unit === null ? '' : transform.unit); + this.element.setStyle(style, true); + } +}); + +Effect.Transform = Class.create({ + initialize: function(tracks){ + this.tracks = []; + this.options = arguments[1] || { }; + this.addTracks(tracks); + }, + addTracks: function(tracks){ + tracks.each(function(track){ + var data = $H(track).values().first(); + this.tracks.push($H({ + ids: $H(track).keys().first(), + effect: Effect.Morph, + options: { style: data } + })); + }.bind(this)); + return this; + }, + play: function(){ + return new Effect.Parallel( + this.tracks.map(function(track){ + var elements = [$(track.ids) || $$(track.ids)].flatten(); + return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) }); + }).flatten(), + this.options + ); + } +}); + +Element.CSS_PROPERTIES = $w( + 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + + 'fontSize fontWeight height left letterSpacing lineHeight ' + + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + + 'right textIndent top width wordSpacing zIndex'); + +Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +String.__parseStyleElement = document.createElement('div'); +String.prototype.parseStyle = function(){ + var style, styleRules = $H(); + if (Prototype.Browser.WebKit) + style = new Element('div',{style:this}).style; + else { + String.__parseStyleElement.innerHTML = '
    '; + style = String.__parseStyleElement.childNodes[0].style; + } + + Element.CSS_PROPERTIES.each(function(property){ + if (style[property]) styleRules[property] = style[property]; + }); + + if (Prototype.Browser.IE && this.include('opacity')) + styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]; + + return styleRules; +}; + +if (document.defaultView && document.defaultView.getComputedStyle) { + Element.getStyles = function(element) { + var css = document.defaultView.getComputedStyle($(element), null); + return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { + styles[property] = css[property]; + return styles; + }); + }; +} else { + Element.getStyles = function(element) { + element = $(element); + var css = element.currentStyle, styles; + styles = Element.CSS_PROPERTIES.inject({ }, function(hash, property) { + hash[property] = css[property]; + return hash; + }); + if (!styles.opacity) styles.opacity = element.getOpacity(); + return styles; + }; +}; + +Effect.Methods = { + morph: function(element, style) { + element = $(element); + new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); + return element; + }, + visualEffect: function(element, effect, options) { + element = $(element) + var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); + new Effect[klass](element, options); + return element; + }, + highlight: function(element, options) { + element = $(element); + new Effect.Highlight(element, options); + return element; + } +}; + +$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ + 'pulsate shake puff squish switchOff dropOut').each( + function(effect) { + Effect.Methods[effect] = function(element, options){ + element = $(element); + Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); + return element; + } + } +); + +$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( + function(f) { Effect.Methods[f] = Element[f]; } +); + +Element.addMethods(Effect.Methods); \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/static/javascripts/lytebox.js b/main/NOVA_0.4.5/templates/static/javascripts/lytebox.js new file mode 100644 index 0000000..78b389a --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/lytebox.js @@ -0,0 +1,843 @@ +//***********************************************************************************************************************************/ +// LyteBox v3.22 +// +// Author: Markus F. Hay +// Website: http://www.dolem.com/lytebox +// Date: October 2, 2007 +// License: Creative Commons Attribution 3.0 License (http://creativecommons.org/licenses/by/3.0/) +// Browsers: Tested successfully on WinXP with the following browsers (using no DOCTYPE and Strict/Transitional/Loose DOCTYPES): +// * Firefox: 2.0.0.7, 1.5.0.12 +// * Internet Explorer: 7.0, 6.0 SP2, 5.5 SP2 +// * Opera: 9.23 +// +// Releases: For up-to-date and complete release information, visit http://www.dolem.com/forum/showthread.php?tid=62 +// * v3.22 (10/02/07) +// * v3.21 (09/30/07) +// * v3.20 (07/12/07) +// * v3.10 (05/28/07) +// * v3.00 (05/15/07) +// * v2.02 (11/13/06) +// +// Credit: LyteBox was originally derived from the Lightbox class (v2.02) that was written by Lokesh Dhakar. For more +// information please visit http://huddletogether.com/projects/lightbox2/ +//***********************************************************************************************************************************/ +Array.prototype.removeDuplicates = function () { for (var i = 1; i < this.length; i++) { if (this[i][0] == this[i-1][0]) { this.splice(i,1); } } } +Array.prototype.empty = function () { for (var i = 0; i <= this.length; i++) { this.shift(); } } +String.prototype.trim = function () { return this.replace(/^\s+|\s+$/g, ''); } + +function LyteBox() { + /*** Start Global Configuration ***/ + this.theme = 'grey'; // themes: grey (default), red, green, blue, gold + this.hideFlash = true; // controls whether or not Flash objects should be hidden + this.outerBorder = false; // controls whether to show the outer grey (or theme) border + this.resizeSpeed = 10; // controls the speed of the image resizing (1=slowest and 10=fastest) + this.maxOpacity = 80; // higher opacity = darker overlay, lower opacity = lighter overlay + this.navType = 1; // 1 = "Prev/Next" buttons on top left and left (default), 2 = "<< prev | next >>" links next to image number + this.autoResize = false; // controls whether or not images should be resized if larger than the browser window dimensions + this.doAnimations = false; // controls whether or not "animate" Lytebox, i.e. resize transition between images, fade in/out effects, etc. + + this.borderSize = 12; // if you adjust the padding in the CSS, you will need to update this variable -- otherwise, leave this alone... + /*** End Global Configuration ***/ + + /*** Configure Slideshow Options ***/ + this.slideInterval = 0; // Change value (milliseconds) to increase/decrease the time between "slides" (10000 = 10 seconds) + this.showNavigation = false; // true to display Next/Prev buttons/text during slideshow, false to hide + this.showClose = true; // true to display the Close button, false to hide + this.showDetails = true; // true to display image details (caption, count), false to hide + this.showPlayPause = true; // true to display pause/play buttons next to close button, false to hide + this.autoEnd = true; // true to automatically close Lytebox after the last image is reached, false to keep open + this.pauseOnNextClick = false; // true to pause the slideshow when the "Next" button is clicked + this.pauseOnPrevClick = true; // true to pause the slideshow when the "Prev" button is clicked + /*** End Slideshow Configuration ***/ + + if(this.resizeSpeed > 10) { this.resizeSpeed = 10; } + if(this.resizeSpeed < 1) { resizeSpeed = 1; } + this.resizeDuration = (11 - this.resizeSpeed) * 0.15; + this.resizeWTimerArray = new Array(); + this.resizeWTimerCount = 0; + this.resizeHTimerArray = new Array(); + this.resizeHTimerCount = 0; + this.showContentTimerArray = new Array(); + this.showContentTimerCount = 0; + this.overlayTimerArray = new Array(); + this.overlayTimerCount = 0; + this.imageTimerArray = new Array(); + this.imageTimerCount = 0; + this.timerIDArray = new Array(); + this.timerIDCount = 0; + this.slideshowIDArray = new Array(); + this.slideshowIDCount = 0; + this.imageArray = new Array(); + this.activeImage = null; + this.slideArray = new Array(); + this.activeSlide = null; + this.frameArray = new Array(); + this.activeFrame = null; + this.checkFrame(); + this.isSlideshow = false; + this.isLyteframe = false; + /*@cc_on + /*@if (@_jscript) + this.ie = (document.all && !window.opera) ? true : false; + /*@else @*/ + this.ie = false; + /*@end + @*/ + this.ie7 = (this.ie && window.XMLHttpRequest); + this.initialize(); +} +LyteBox.prototype.initialize = function() { + this.updateLyteboxItems(); + var objBody = this.doc.getElementsByTagName("body").item(0); + if (this.doc.getElementById('lbOverlay')) { + objBody.removeChild(this.doc.getElementById("lbOverlay")); + objBody.removeChild(this.doc.getElementById("lbMain")); + } + var objOverlay = this.doc.createElement("div"); + objOverlay.setAttribute('id','lbOverlay'); + objOverlay.setAttribute((this.ie ? 'className' : 'class'), this.theme); + if ((this.ie && !this.ie7) || (this.ie7 && this.doc.compatMode == 'BackCompat')) { + objOverlay.style.position = 'absolute'; + } + objOverlay.style.display = 'none'; + objBody.appendChild(objOverlay); + var objLytebox = this.doc.createElement("div"); + objLytebox.setAttribute('id','lbMain'); + objLytebox.style.display = 'none'; + objBody.appendChild(objLytebox); + var objOuterContainer = this.doc.createElement("div"); + objOuterContainer.setAttribute('id','lbOuterContainer'); + objOuterContainer.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objLytebox.appendChild(objOuterContainer); + var objIframeContainer = this.doc.createElement("div"); + objIframeContainer.setAttribute('id','lbIframeContainer'); + objIframeContainer.style.display = 'none'; + objOuterContainer.appendChild(objIframeContainer); + var objIframe = this.doc.createElement("iframe"); + objIframe.setAttribute('id','lbIframe'); + objIframe.setAttribute('name','lbIframe'); + objIframe.style.display = 'none'; + objIframeContainer.appendChild(objIframe); + var objImageContainer = this.doc.createElement("div"); + objImageContainer.setAttribute('id','lbImageContainer'); + objOuterContainer.appendChild(objImageContainer); + var objLyteboxImage = this.doc.createElement("img"); + objLyteboxImage.setAttribute('id','lbImage'); + objImageContainer.appendChild(objLyteboxImage); + var objLoading = this.doc.createElement("div"); + objLoading.setAttribute('id','lbLoading'); + objOuterContainer.appendChild(objLoading); + var objDetailsContainer = this.doc.createElement("div"); + objDetailsContainer.setAttribute('id','lbDetailsContainer'); + objDetailsContainer.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objLytebox.appendChild(objDetailsContainer); + var objDetailsData =this.doc.createElement("div"); + objDetailsData.setAttribute('id','lbDetailsData'); + objDetailsData.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objDetailsContainer.appendChild(objDetailsData); + var objDetails = this.doc.createElement("div"); + objDetails.setAttribute('id','lbDetails'); + objDetailsData.appendChild(objDetails); + var objCaption = this.doc.createElement("span"); + objCaption.setAttribute('id','lbCaption'); + objDetails.appendChild(objCaption); + var objHoverNav = this.doc.createElement("div"); + objHoverNav.setAttribute('id','lbHoverNav'); + objImageContainer.appendChild(objHoverNav); + var objBottomNav = this.doc.createElement("div"); + objBottomNav.setAttribute('id','lbBottomNav'); + objDetailsData.appendChild(objBottomNav); + var objPrev = this.doc.createElement("a"); + objPrev.setAttribute('id','lbPrev'); + objPrev.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objPrev.setAttribute('href','#'); + objHoverNav.appendChild(objPrev); + var objNext = this.doc.createElement("a"); + objNext.setAttribute('id','lbNext'); + objNext.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objNext.setAttribute('href','#'); + objHoverNav.appendChild(objNext); + var objNumberDisplay = this.doc.createElement("span"); + objNumberDisplay.setAttribute('id','lbNumberDisplay'); + objDetails.appendChild(objNumberDisplay); + var objNavDisplay = this.doc.createElement("span"); + objNavDisplay.setAttribute('id','lbNavDisplay'); + objNavDisplay.style.display = 'none'; + objDetails.appendChild(objNavDisplay); + var objClose = this.doc.createElement("a"); + objClose.setAttribute('id','lbClose'); + objClose.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objClose.setAttribute('href','#'); + objBottomNav.appendChild(objClose); + var objPause = this.doc.createElement("a"); + objPause.setAttribute('id','lbPause'); + objPause.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objPause.setAttribute('href','#'); + objPause.style.display = 'none'; + objBottomNav.appendChild(objPause); + var objPlay = this.doc.createElement("a"); + objPlay.setAttribute('id','lbPlay'); + objPlay.setAttribute((this.ie ? 'className' : 'class'), this.theme); + objPlay.setAttribute('href','#'); + objPlay.style.display = 'none'; + objBottomNav.appendChild(objPlay); +}; +LyteBox.prototype.updateLyteboxItems = function() { + var anchors = (this.isFrame) ? window.parent.frames[window.name].document.getElementsByTagName('a') : document.getElementsByTagName('a'); + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + var relAttribute = String(anchor.getAttribute('rel')); + if (anchor.getAttribute('href')) { + if (relAttribute.toLowerCase().match('lytebox')) { + anchor.onclick = function () { myLytebox.start(this, false, false); return false; } + } else if (relAttribute.toLowerCase().match('lyteshow')) { + anchor.onclick = function () { myLytebox.start(this, true, false); return false; } + } else if (relAttribute.toLowerCase().match('lyteframe')) { + anchor.onclick = function () { myLytebox.start(this, false, true); return false; } + } + } + } +}; +LyteBox.prototype.start = function(imageLink, doSlide, doFrame) { + if (this.ie && !this.ie7) { this.toggleSelects('hide'); } + if (this.hideFlash) { this.toggleFlash('hide'); } + this.isLyteframe = (doFrame ? true : false); + var pageSize = this.getPageSize(); + var objOverlay = this.doc.getElementById('lbOverlay'); + var objBody = this.doc.getElementsByTagName("body").item(0); + objOverlay.style.height = pageSize[1] + "px"; + objOverlay.style.display = ''; + this.appear('lbOverlay', (this.doAnimations ? 0 : this.maxOpacity)); + var anchors = (this.isFrame) ? window.parent.frames[window.name].document.getElementsByTagName('a') : document.getElementsByTagName('a'); + if (this.isLyteframe) { + this.frameArray = []; + this.frameNum = 0; + if ((imageLink.getAttribute('rel') == 'lyteframe')) { + var rev = imageLink.getAttribute('rev'); + this.frameArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title'), (rev == null || rev == '' ? 'width: 400px; height: 400px; scrolling: auto;' : rev))); + } else { + if (imageLink.getAttribute('rel').indexOf('lyteframe') != -1) { + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { + var rev = anchor.getAttribute('rev'); + this.frameArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'), (rev == null || rev == '' ? 'width: 400px; height: 400px; scrolling: auto;' : rev))); + } + } + this.frameArray.removeDuplicates(); + while(this.frameArray[this.frameNum][0] != imageLink.getAttribute('href')) { this.frameNum++; } + } + } + } else { + this.imageArray = []; + this.imageNum = 0; + this.slideArray = []; + this.slideNum = 0; + if ((imageLink.getAttribute('rel') == 'lytebox')) { + this.imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title'))); + } else { + if (imageLink.getAttribute('rel').indexOf('lytebox') != -1) { + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { + this.imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'))); + } + } + this.imageArray.removeDuplicates(); + while(this.imageArray[this.imageNum][0] != imageLink.getAttribute('href')) { this.imageNum++; } + } + if (imageLink.getAttribute('rel').indexOf('lyteshow') != -1) { + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))) { + this.slideArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title'))); + } + } + this.slideArray.removeDuplicates(); + while(this.slideArray[this.slideNum][0] != imageLink.getAttribute('href')) { this.slideNum++; } + } + } + } + var object = this.doc.getElementById('lbMain'); + object.style.top = (this.getPageScroll() + (pageSize[3] / 15)) + "px"; + object.style.display = ''; + if (!this.outerBorder) { + this.doc.getElementById('lbOuterContainer').style.border = 'none'; + this.doc.getElementById('lbDetailsContainer').style.border = 'none'; + } else { + this.doc.getElementById('lbOuterContainer').style.borderBottom = ''; + this.doc.getElementById('lbOuterContainer').setAttribute((this.ie ? 'className' : 'class'), this.theme); + } + this.doc.getElementById('lbOverlay').onclick = function() { myLytebox.end(); return false; } + this.doc.getElementById('lbMain').onclick = function(e) { + var e = e; + if (!e) { + if (window.parent.frames[window.name] && (parent.document.getElementsByTagName('frameset').length <= 0)) { + e = window.parent.window.event; + } else { + e = window.event; + } + } + var id = (e.target ? e.target.id : e.srcElement.id); + if (id == 'lbMain') { myLytebox.end(); return false; } + } + this.doc.getElementById('lbClose').onclick = function() { myLytebox.end(); return false; } + this.doc.getElementById('lbPause').onclick = function() { myLytebox.togglePlayPause("lbPause", "lbPlay"); return false; } + this.doc.getElementById('lbPlay').onclick = function() { myLytebox.togglePlayPause("lbPlay", "lbPause"); return false; } + this.isSlideshow = doSlide; + this.isPaused = (this.slideNum != 0 ? true : false); + if (this.isSlideshow && this.showPlayPause && this.isPaused) { + this.doc.getElementById('lbPlay').style.display = ''; + this.doc.getElementById('lbPause').style.display = 'none'; + } + if (this.isLyteframe) { + this.changeContent(this.frameNum); + } else { + if (this.isSlideshow) { + this.changeContent(this.slideNum); + } else { + this.changeContent(this.imageNum); + } + } +}; +LyteBox.prototype.changeContent = function(imageNum) { + if (this.isSlideshow) { + for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } + } + this.activeImage = this.activeSlide = this.activeFrame = imageNum; + if (!this.outerBorder) { + this.doc.getElementById('lbOuterContainer').style.border = 'none'; + this.doc.getElementById('lbDetailsContainer').style.border = 'none'; + } else { + this.doc.getElementById('lbOuterContainer').style.borderBottom = ''; + this.doc.getElementById('lbOuterContainer').setAttribute((this.ie ? 'className' : 'class'), this.theme); + } + this.doc.getElementById('lbLoading').style.display = ''; + this.doc.getElementById('lbImage').style.display = 'none'; + this.doc.getElementById('lbIframe').style.display = 'none'; + this.doc.getElementById('lbPrev').style.display = 'none'; + this.doc.getElementById('lbNext').style.display = 'none'; + this.doc.getElementById('lbIframeContainer').style.display = 'none'; + this.doc.getElementById('lbDetailsContainer').style.display = 'none'; + this.doc.getElementById('lbNumberDisplay').style.display = 'none'; + if (this.navType == 2 || this.isLyteframe) { + object = this.doc.getElementById('lbNavDisplay'); + object.innerHTML = '    || '; + object.style.display = 'none'; + } + if (this.isLyteframe) { + var iframe = myLytebox.doc.getElementById('lbIframe'); + var styles = this.frameArray[this.activeFrame][2]; + var aStyles = styles.split(';'); + for (var i = 0; i < aStyles.length; i++) { + if (aStyles[i].indexOf('width:') >= 0) { + var w = aStyles[i].replace('width:', ''); + iframe.width = w.trim(); + } else if (aStyles[i].indexOf('height:') >= 0) { + var h = aStyles[i].replace('height:', ''); + iframe.height = h.trim(); + } else if (aStyles[i].indexOf('scrolling:') >= 0) { + var s = aStyles[i].replace('scrolling:', ''); + iframe.scrolling = s.trim(); + } else if (aStyles[i].indexOf('border:') >= 0) { + // Not implemented yet, as there are cross-platform issues with setting the border (from a GUI standpoint) + //var b = aStyles[i].replace('border:', ''); + //iframe.style.border = b.trim(); + } + } + this.resizeContainer(parseInt(iframe.width), parseInt(iframe.height)); + } else { + imgPreloader = new Image(); + imgPreloader.onload = function() { + var imageWidth = imgPreloader.width; + var imageHeight = imgPreloader.height; + if (myLytebox.autoResize) { + var pagesize = myLytebox.getPageSize(); + var x = pagesize[2] - 150; + var y = pagesize[3] - 150; + if (imageWidth > x) { + imageHeight = Math.round(imageHeight * (x / imageWidth)); + imageWidth = x; + if (imageHeight > y) { + imageWidth = Math.round(imageWidth * (y / imageHeight)); + imageHeight = y; + } + } else if (imageHeight > y) { + imageWidth = Math.round(imageWidth * (y / imageHeight)); + imageHeight = y; + if (imageWidth > x) { + imageHeight = Math.round(imageHeight * (x / imageWidth)); + imageWidth = x; + } + } + } + var lbImage = myLytebox.doc.getElementById('lbImage') + lbImage.src = (myLytebox.isSlideshow ? myLytebox.slideArray[myLytebox.activeSlide][0] : myLytebox.imageArray[myLytebox.activeImage][0]); + lbImage.width = imageWidth; + lbImage.height = imageHeight; + myLytebox.resizeContainer(imageWidth, imageHeight); + imgPreloader.onload = function() {}; + } + imgPreloader.src = (this.isSlideshow ? this.slideArray[this.activeSlide][0] : this.imageArray[this.activeImage][0]); + } +}; +LyteBox.prototype.resizeContainer = function(imgWidth, imgHeight) { + this.wCur = this.doc.getElementById('lbOuterContainer').offsetWidth; + this.hCur = this.doc.getElementById('lbOuterContainer').offsetHeight; + this.xScale = ((imgWidth + (this.borderSize * 2)) / this.wCur) * 100; + this.yScale = ((imgHeight + (this.borderSize * 2)) / this.hCur) * 100; + var wDiff = (this.wCur - this.borderSize * 2) - imgWidth; + var hDiff = (this.hCur - this.borderSize * 2) - imgHeight; + if (!(hDiff == 0)) { + this.hDone = false; + this.resizeH('lbOuterContainer', this.hCur, imgHeight + this.borderSize*2, this.getPixelRate(this.hCur, imgHeight)); + } else { + this.hDone = true; + } + if (!(wDiff == 0)) { + this.wDone = false; + this.resizeW('lbOuterContainer', this.wCur, imgWidth + this.borderSize*2, this.getPixelRate(this.wCur, imgWidth)); + } else { + this.wDone = true; + } + if ((hDiff == 0) && (wDiff == 0)) { + if (this.ie){ this.pause(250); } else { this.pause(100); } + } + this.doc.getElementById('lbPrev').style.height = imgHeight + "px"; + this.doc.getElementById('lbNext').style.height = imgHeight + "px"; + this.doc.getElementById('lbDetailsContainer').style.width = (imgWidth + (this.borderSize * 2) + (this.ie && this.doc.compatMode == "BackCompat" && this.outerBorder ? 2 : 0)) + "px"; + this.showContent(); +}; +LyteBox.prototype.showContent = function() { + if (this.wDone && this.hDone) { + for (var i = 0; i < this.showContentTimerCount; i++) { window.clearTimeout(this.showContentTimerArray[i]); } + if (this.outerBorder) { + this.doc.getElementById('lbOuterContainer').style.borderBottom = 'none'; + } + this.doc.getElementById('lbLoading').style.display = 'none'; + if (this.isLyteframe) { + this.doc.getElementById('lbIframe').style.display = ''; + this.appear('lbIframe', (this.doAnimations ? 0 : 100)); + } else { + this.doc.getElementById('lbImage').style.display = ''; + this.appear('lbImage', (this.doAnimations ? 0 : 100)); + this.preloadNeighborImages(); + } + if (this.isSlideshow) { + if(this.activeSlide == (this.slideArray.length - 1)) { + if (this.autoEnd) { + this.slideshowIDArray[this.slideshowIDCount++] = setTimeout("myLytebox.end('slideshow')", this.slideInterval); + } + } else { + if (!this.isPaused) { + this.slideshowIDArray[this.slideshowIDCount++] = setTimeout("myLytebox.changeContent("+(this.activeSlide+1)+")", this.slideInterval); + } + } + this.doc.getElementById('lbHoverNav').style.display = (this.showNavigation && this.navType == 1 ? '' : 'none'); + this.doc.getElementById('lbClose').style.display = (this.showClose ? '' : 'none'); + this.doc.getElementById('lbDetails').style.display = (this.showDetails ? '' : 'none'); + this.doc.getElementById('lbPause').style.display = (this.showPlayPause && !this.isPaused ? '' : 'none'); + this.doc.getElementById('lbPlay').style.display = (this.showPlayPause && !this.isPaused ? 'none' : ''); + this.doc.getElementById('lbNavDisplay').style.display = (this.showNavigation && this.navType == 2 ? '' : 'none'); + } else { + this.doc.getElementById('lbHoverNav').style.display = (this.navType == 1 && !this.isLyteframe ? '' : 'none'); + if ((this.navType == 2 && !this.isLyteframe && this.imageArray.length > 1) || (this.frameArray.length > 1 && this.isLyteframe)) { + this.doc.getElementById('lbNavDisplay').style.display = ''; + } else { + this.doc.getElementById('lbNavDisplay').style.display = 'none'; + } + this.doc.getElementById('lbClose').style.display = ''; + this.doc.getElementById('lbDetails').style.display = ''; + this.doc.getElementById('lbPause').style.display = 'none'; + this.doc.getElementById('lbPlay').style.display = 'none'; + } + this.doc.getElementById('lbImageContainer').style.display = (this.isLyteframe ? 'none' : ''); + this.doc.getElementById('lbIframeContainer').style.display = (this.isLyteframe ? '' : 'none'); + try { + this.doc.getElementById('lbIframe').src = this.frameArray[this.activeFrame][0]; + } catch(e) { } + } else { + this.showContentTimerArray[this.showContentTimerCount++] = setTimeout("myLytebox.showContent()", 200); + } +}; +LyteBox.prototype.updateDetails = function() { + var object = this.doc.getElementById('lbCaption'); + var sTitle = (this.isSlideshow ? this.slideArray[this.activeSlide][1] : (this.isLyteframe ? this.frameArray[this.activeFrame][1] : this.imageArray[this.activeImage][1])); + object.style.display = ''; + object.innerHTML = (sTitle == null ? '' : sTitle); + this.updateNav(); + this.doc.getElementById('lbDetailsContainer').style.display = ''; + object = this.doc.getElementById('lbNumberDisplay'); + if (this.isSlideshow && this.slideArray.length > 1) { + object.style.display = ''; + object.innerHTML = "Image " + eval(this.activeSlide + 1) + " of " + this.slideArray.length; + this.doc.getElementById('lbNavDisplay').style.display = (this.navType == 2 && this.showNavigation ? '' : 'none'); + } else if (this.imageArray.length > 1 && !this.isLyteframe) { + object.style.display = ''; + object.innerHTML = "Image " + eval(this.activeImage + 1) + " of " + this.imageArray.length; + this.doc.getElementById('lbNavDisplay').style.display = (this.navType == 2 ? '' : 'none'); + } else if (this.frameArray.length > 1 && this.isLyteframe) { + object.style.display = ''; + object.innerHTML = "Page " + eval(this.activeFrame + 1) + " of " + this.frameArray.length; + this.doc.getElementById('lbNavDisplay').style.display = ''; + } else { + this.doc.getElementById('lbNavDisplay').style.display = 'none'; + } + this.appear('lbDetailsContainer', (this.doAnimations ? 0 : 100)); +}; +LyteBox.prototype.updateNav = function() { + if (this.isSlideshow) { + if (this.activeSlide != 0) { + var object = (this.navType == 2 ? this.doc.getElementById('lbPrev2') : this.doc.getElementById('lbPrev')); + object.style.display = ''; + object.onclick = function() { + if (myLytebox.pauseOnPrevClick) { myLytebox.togglePlayPause("lbPause", "lbPlay"); } + myLytebox.changeContent(myLytebox.activeSlide - 1); return false; + } + } else { + if (this.navType == 2) { this.doc.getElementById('lbPrev2_Off').style.display = ''; } + } + if (this.activeSlide != (this.slideArray.length - 1)) { + var object = (this.navType == 2 ? this.doc.getElementById('lbNext2') : this.doc.getElementById('lbNext')); + object.style.display = ''; + object.onclick = function() { + if (myLytebox.pauseOnNextClick) { myLytebox.togglePlayPause("lbPause", "lbPlay"); } + myLytebox.changeContent(myLytebox.activeSlide + 1); return false; + } + } else { + if (this.navType == 2) { this.doc.getElementById('lbNext2_Off').style.display = ''; } + } + } else if (this.isLyteframe) { + if(this.activeFrame != 0) { + var object = this.doc.getElementById('lbPrev2'); + object.style.display = ''; + object.onclick = function() { + myLytebox.changeContent(myLytebox.activeFrame - 1); return false; + } + } else { + this.doc.getElementById('lbPrev2_Off').style.display = ''; + } + if(this.activeFrame != (this.frameArray.length - 1)) { + var object = this.doc.getElementById('lbNext2'); + object.style.display = ''; + object.onclick = function() { + myLytebox.changeContent(myLytebox.activeFrame + 1); return false; + } + } else { + this.doc.getElementById('lbNext2_Off').style.display = ''; + } + } else { + if(this.activeImage != 0) { + var object = (this.navType == 2 ? this.doc.getElementById('lbPrev2') : this.doc.getElementById('lbPrev')); + object.style.display = ''; + object.onclick = function() { + myLytebox.changeContent(myLytebox.activeImage - 1); return false; + } + } else { + if (this.navType == 2) { this.doc.getElementById('lbPrev2_Off').style.display = ''; } + } + if(this.activeImage != (this.imageArray.length - 1)) { + var object = (this.navType == 2 ? this.doc.getElementById('lbNext2') : this.doc.getElementById('lbNext')); + object.style.display = ''; + object.onclick = function() { + myLytebox.changeContent(myLytebox.activeImage + 1); return false; + } + } else { + if (this.navType == 2) { this.doc.getElementById('lbNext2_Off').style.display = ''; } + } + } + this.enableKeyboardNav(); +}; +LyteBox.prototype.enableKeyboardNav = function() { document.onkeydown = this.keyboardAction; }; +LyteBox.prototype.disableKeyboardNav = function() { document.onkeydown = ''; }; +LyteBox.prototype.keyboardAction = function(e) { + var keycode = key = escape = null; + keycode = (e == null) ? event.keyCode : e.which; + key = String.fromCharCode(keycode).toLowerCase(); + escape = (e == null) ? 27 : e.DOM_VK_ESCAPE; + if ((key == 'x') || (key == 'c') || (keycode == escape)) { + myLytebox.end(); + } else if ((key == 'p') || (keycode == 37)) { + if (myLytebox.isSlideshow) { + if(myLytebox.activeSlide != 0) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeSlide - 1); + } + } else if (myLytebox.isLyteframe) { + if(myLytebox.activeFrame != 0) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeFrame - 1); + } + } else { + if(myLytebox.activeImage != 0) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeImage - 1); + } + } + } else if ((key == 'n') || (keycode == 39)) { + if (myLytebox.isSlideshow) { + if(myLytebox.activeSlide != (myLytebox.slideArray.length - 1)) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeSlide + 1); + } + } else if (myLytebox.isLyteframe) { + if(myLytebox.activeFrame != (myLytebox.frameArray.length - 1)) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeFrame + 1); + } + } else { + if(myLytebox.activeImage != (myLytebox.imageArray.length - 1)) { + myLytebox.disableKeyboardNav(); + myLytebox.changeContent(myLytebox.activeImage + 1); + } + } + } +}; +LyteBox.prototype.preloadNeighborImages = function() { + if (this.isSlideshow) { + if ((this.slideArray.length - 1) > this.activeSlide) { + preloadNextImage = new Image(); + preloadNextImage.src = this.slideArray[this.activeSlide + 1][0]; + } + if(this.activeSlide > 0) { + preloadPrevImage = new Image(); + preloadPrevImage.src = this.slideArray[this.activeSlide - 1][0]; + } + } else { + if ((this.imageArray.length - 1) > this.activeImage) { + preloadNextImage = new Image(); + preloadNextImage.src = this.imageArray[this.activeImage + 1][0]; + } + if(this.activeImage > 0) { + preloadPrevImage = new Image(); + preloadPrevImage.src = this.imageArray[this.activeImage - 1][0]; + } + } +}; +LyteBox.prototype.togglePlayPause = function(hideID, showID) { + if (this.isSlideshow && hideID == "lbPause") { + for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } + } + this.doc.getElementById(hideID).style.display = 'none'; + this.doc.getElementById(showID).style.display = ''; + if (hideID == "lbPlay") { + this.isPaused = false; + if (this.activeSlide == (this.slideArray.length - 1)) { + this.end(); + } else { + this.changeContent(this.activeSlide + 1); + } + } else { + this.isPaused = true; + } +}; +LyteBox.prototype.end = function(caller) { + var closeClick = (caller == 'slideshow' ? false : true); + if (this.isSlideshow && this.isPaused && !closeClick) { return; } + this.disableKeyboardNav(); + this.doc.getElementById('lbMain').style.display = 'none'; + this.fade('lbOverlay', (this.doAnimations ? this.maxOpacity : 0)); + this.toggleSelects('visible'); + if (this.hideFlash) { this.toggleFlash('visible'); } + if (this.isSlideshow) { + for (var i = 0; i < this.slideshowIDCount; i++) { window.clearTimeout(this.slideshowIDArray[i]); } + } + if (this.isLyteframe) { + this.initialize(); + } +}; +LyteBox.prototype.checkFrame = function() { + if (window.parent.frames[window.name] && (parent.document.getElementsByTagName('frameset').length <= 0)) { + this.isFrame = true; + this.lytebox = "window.parent." + window.name + ".myLytebox"; + this.doc = parent.document; + } else { + this.isFrame = false; + this.lytebox = "myLytebox"; + this.doc = document; + } +}; +LyteBox.prototype.getPixelRate = function(cur, img) { + var diff = (img > cur) ? img - cur : cur - img; + if (diff >= 0 && diff <= 100) { return 10; } + if (diff > 100 && diff <= 200) { return 15; } + if (diff > 200 && diff <= 300) { return 20; } + if (diff > 300 && diff <= 400) { return 25; } + if (diff > 400 && diff <= 500) { return 30; } + if (diff > 500 && diff <= 600) { return 35; } + if (diff > 600 && diff <= 700) { return 40; } + if (diff > 700) { return 45; } +}; +LyteBox.prototype.appear = function(id, opacity) { + var object = this.doc.getElementById(id).style; + object.opacity = (opacity / 100); + object.MozOpacity = (opacity / 100); + object.KhtmlOpacity = (opacity / 100); + object.filter = "alpha(opacity=" + (opacity + 10) + ")"; + if (opacity == 100 && (id == 'lbImage' || id == 'lbIframe')) { + try { object.removeAttribute("filter"); } catch(e) {} /* Fix added for IE Alpha Opacity Filter bug. */ + this.updateDetails(); + } else if (opacity >= this.maxOpacity && id == 'lbOverlay') { + for (var i = 0; i < this.overlayTimerCount; i++) { window.clearTimeout(this.overlayTimerArray[i]); } + return; + } else if (opacity >= 100 && id == 'lbDetailsContainer') { + try { object.removeAttribute("filter"); } catch(e) {} /* Fix added for IE Alpha Opacity Filter bug. */ + for (var i = 0; i < this.imageTimerCount; i++) { window.clearTimeout(this.imageTimerArray[i]); } + this.doc.getElementById('lbOverlay').style.height = this.getPageSize()[1] + "px"; + } else { + if (id == 'lbOverlay') { + this.overlayTimerArray[this.overlayTimerCount++] = setTimeout("myLytebox.appear('" + id + "', " + (opacity+20) + ")", 1); + } else { + this.imageTimerArray[this.imageTimerCount++] = setTimeout("myLytebox.appear('" + id + "', " + (opacity+10) + ")", 1); + } + } +}; +LyteBox.prototype.fade = function(id, opacity) { + var object = this.doc.getElementById(id).style; + object.opacity = (opacity / 100); + object.MozOpacity = (opacity / 100); + object.KhtmlOpacity = (opacity / 100); + object.filter = "alpha(opacity=" + opacity + ")"; + if (opacity <= 0) { + try { + object.display = 'none'; + } catch(err) { } + } else if (id == 'lbOverlay') { + this.overlayTimerArray[this.overlayTimerCount++] = setTimeout("myLytebox.fade('" + id + "', " + (opacity-20) + ")", 1); + } else { + this.timerIDArray[this.timerIDCount++] = setTimeout("myLytebox.fade('" + id + "', " + (opacity-10) + ")", 1); + } +}; +LyteBox.prototype.resizeW = function(id, curW, maxW, pixelrate, speed) { + if (!this.hDone) { + this.resizeWTimerArray[this.resizeWTimerCount++] = setTimeout("myLytebox.resizeW('" + id + "', " + curW + ", " + maxW + ", " + pixelrate + ")", 100); + return; + } + var object = this.doc.getElementById(id); + var timer = speed ? speed : (this.resizeDuration/2); + var newW = (this.doAnimations ? curW : maxW); + object.style.width = (newW) + "px"; + if (newW < maxW) { + newW += (newW + pixelrate >= maxW) ? (maxW - newW) : pixelrate; + } else if (newW > maxW) { + newW -= (newW - pixelrate <= maxW) ? (newW - maxW) : pixelrate; + } + this.resizeWTimerArray[this.resizeWTimerCount++] = setTimeout("myLytebox.resizeW('" + id + "', " + newW + ", " + maxW + ", " + pixelrate + ", " + (timer+0.02) + ")", timer+0.02); + if (parseInt(object.style.width) == maxW) { + this.wDone = true; + for (var i = 0; i < this.resizeWTimerCount; i++) { window.clearTimeout(this.resizeWTimerArray[i]); } + } +}; +LyteBox.prototype.resizeH = function(id, curH, maxH, pixelrate, speed) { + var timer = speed ? speed : (this.resizeDuration/2); + var object = this.doc.getElementById(id); + var newH = (this.doAnimations ? curH : maxH); + object.style.height = (newH) + "px"; + if (newH < maxH) { + newH += (newH + pixelrate >= maxH) ? (maxH - newH) : pixelrate; + } else if (newH > maxH) { + newH -= (newH - pixelrate <= maxH) ? (newH - maxH) : pixelrate; + } + this.resizeHTimerArray[this.resizeHTimerCount++] = setTimeout("myLytebox.resizeH('" + id + "', " + newH + ", " + maxH + ", " + pixelrate + ", " + (timer+.02) + ")", timer+.02); + if (parseInt(object.style.height) == maxH) { + this.hDone = true; + for (var i = 0; i < this.resizeHTimerCount; i++) { window.clearTimeout(this.resizeHTimerArray[i]); } + } +}; +LyteBox.prototype.getPageScroll = function() { + if (self.pageYOffset) { + return this.isFrame ? parent.pageYOffset : self.pageYOffset; + } else if (this.doc.documentElement && this.doc.documentElement.scrollTop){ + return this.doc.documentElement.scrollTop; + } else if (document.body) { + return this.doc.body.scrollTop; + } +}; +LyteBox.prototype.getPageSize = function() { + var xScroll, yScroll, windowWidth, windowHeight; + if (window.innerHeight && window.scrollMaxY) { + xScroll = this.doc.scrollWidth; + yScroll = (this.isFrame ? parent.innerHeight : self.innerHeight) + (this.isFrame ? parent.scrollMaxY : self.scrollMaxY); + } else if (this.doc.body.scrollHeight > this.doc.body.offsetHeight){ + xScroll = this.doc.body.scrollWidth; + yScroll = this.doc.body.scrollHeight; + } else { + xScroll = this.doc.getElementsByTagName("html").item(0).offsetWidth; + yScroll = this.doc.getElementsByTagName("html").item(0).offsetHeight; + xScroll = (xScroll < this.doc.body.offsetWidth) ? this.doc.body.offsetWidth : xScroll; + yScroll = (yScroll < this.doc.body.offsetHeight) ? this.doc.body.offsetHeight : yScroll; + } + if (self.innerHeight) { + windowWidth = (this.isFrame) ? parent.innerWidth : self.innerWidth; + windowHeight = (this.isFrame) ? parent.innerHeight : self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { + windowWidth = this.doc.documentElement.clientWidth; + windowHeight = this.doc.documentElement.clientHeight; + } else if (document.body) { + windowWidth = this.doc.getElementsByTagName("html").item(0).clientWidth; + windowHeight = this.doc.getElementsByTagName("html").item(0).clientHeight; + windowWidth = (windowWidth == 0) ? this.doc.body.clientWidth : windowWidth; + windowHeight = (windowHeight == 0) ? this.doc.body.clientHeight : windowHeight; + } + var pageHeight = (yScroll < windowHeight) ? windowHeight : yScroll; + var pageWidth = (xScroll < windowWidth) ? windowWidth : xScroll; + return new Array(pageWidth, pageHeight, windowWidth, windowHeight); +}; +LyteBox.prototype.toggleFlash = function(state) { + var objects = this.doc.getElementsByTagName("object"); + for (var i = 0; i < objects.length; i++) { + objects[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + var embeds = this.doc.getElementsByTagName("embed"); + for (var i = 0; i < embeds.length; i++) { + embeds[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + if (this.isFrame) { + for (var i = 0; i < parent.frames.length; i++) { + try { + objects = parent.frames[i].window.document.getElementsByTagName("object"); + for (var j = 0; j < objects.length; j++) { + objects[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + } catch(e) { } + try { + embeds = parent.frames[i].window.document.getElementsByTagName("embed"); + for (var j = 0; j < embeds.length; j++) { + embeds[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + } catch(e) { } + } + } +}; +LyteBox.prototype.toggleSelects = function(state) { + var selects = this.doc.getElementsByTagName("select"); + for (var i = 0; i < selects.length; i++ ) { + selects[i].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + if (this.isFrame) { + for (var i = 0; i < parent.frames.length; i++) { + try { + selects = parent.frames[i].window.document.getElementsByTagName("select"); + for (var j = 0; j < selects.length; j++) { + selects[j].style.visibility = (state == "hide") ? 'hidden' : 'visible'; + } + } catch(e) { } + } + } +}; +LyteBox.prototype.pause = function(numberMillis) { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) { return; } + } +}; +if (window.addEventListener) { + window.addEventListener("load",initLytebox,false); +} else if (window.attachEvent) { + window.attachEvent("onload",initLytebox); +} else { + window.onload = function() {initLytebox();} +} +function initLytebox() { myLytebox = new LyteBox(); } \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/static/javascripts/nova.js b/main/NOVA_0.4.5/templates/static/javascripts/nova.js new file mode 100644 index 0000000..b025bae --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/nova.js @@ -0,0 +1,582 @@ +// globals +var queue; // contains parsed json +var histore; // chokes when this is named 'history'??? +var changingOrder = false; // when you are mid-drag the container will serialize at current position; this is how NOVA knows not to redraw +var lastQueueOrder = new Array(); // know when to reset container ids (to be replaced I believe) + +// queue drag & drop sort effect +var myStartEffect = function(element) { new Effect.Opacity(element, {duration:0, from:0.2, to:0.6}); } + +// called upon page load -- restore previous layout & initiate data updates +window.onload=function(){ + if (ReadCookie('Layout_Orientation')=='TopToBottom') + $("history_container").style.clear = $("queue_container").style.clear ='both'; + if (ReadCookie('Layout_Stats')=='hide') $("dataBar").style.display ='none'; + if (ReadCookie('Layout_Queue')=='hide') $("queue_container").style.display ='none'; + if (ReadCookie('Layout_History')=='hide') $("history_container").style.display='none'; + if (ReadCookie('RefreshRate')) { + refreshTime = ReadCookie('RefreshRate'); + $('refresh_handle').innerHTML='  '+refreshTime+' sec'; + } + MainLoop(); +} + +// called every refresh (calls itself) +function MainLoop(){ + + // handle queue json + new Ajax.Request('queue', { + method:'get', + requestHeaders: {Accept: 'application/json'}, + onSuccess: function(transport){ + queue = transport.responseText.evalJSON(); + RefreshQueueOrder(); + // main stats + document.title= 'NOVA ' + Math.round(queue.kbpersec) + ' KB/s '+queue.noofslots+' Queued'; + $("logo").title = "Uptime: "+queue.uptime; + $("kbpersec").innerHTML = Math.round(queue.kbpersec); + $("mbdone").innerHTML = Math.round(queue.mb-queue.mbleft); + $("mb").innerHTML = Math.round(queue.mb); + $("mbleft").innerHTML = Math.round(queue.mbleft/1024*100)/100; + $("statusbar").style.width = + $("statusbartext").innerHTML = (queue.mb > 0) ? Math.round((1-queue.mbleft/queue.mb)*100)+'%' : "0%"; + if ($("diskspace1").innerHTML !=queue.diskspace1) + $("diskspace1").innerHTML = queue.diskspace1; + if ($("diskspace2").innerHTML !=queue.diskspace2) + $("diskspace2").innerHTML = queue.diskspace2; + $("timeleft").innerHTML = " "+TimeLeft(queue.kbpersec, queue.mbleft, queue.mb)+""; + if (queue.paused=='True' && $("queue_pause").innerHTML != 'Paused!') { + $("queue_pause").innerHTML = 'Paused!'; + $("queue_pause").setAttribute("class", "toggled"); + $("queue_pause").setAttribute("onclick", "NOVAction('queue_resume')"); + } else if (queue.paused=='False' && $("queue_pause").innerHTML != 'Pause') { + $("queue_pause").innerHTML = 'Pause'; + $("queue_pause").setAttribute("class", "untoggled"); + $("queue_pause").setAttribute("onclick", "NOVAction('queue_pause')"); + } + if (queue.noofslots>0 && + ( queue.jobs[0].finished.length>0 + ||queue.jobs[0].active.length>0 + ||queue.jobs[0].queued.length>0) && $("queue_tog_verbose").innerHTML != 'Verbosity!') { + $("queue_tog_verbose").innerHTML = 'Verbosity!'; + $("queue_tog_verbose").setAttribute("class", "toggled"); + } else if (queue.noofslots>0 && + ( queue.jobs[0].finished.length==0 + &&queue.jobs[0].active.length==0 + &&queue.jobs[0].queued.length==0) && $("queue_tog_verbose").innerHTML != 'Verbosity') { + $("queue_tog_verbose").innerHTML = 'Verbosity'; + $("queue_tog_verbose").setAttribute("class", "untoggled"); + } + if (queue.shutdown=='True' && $("queue_tog_shutdown").innerHTML != 'Shutdown!') { + $("queue_tog_shutdown").innerHTML = 'Shutdown!'; + $("queue_tog_shutdown").setAttribute("class", "toggled"); + } else if (queue.shutdown=='False' && $("queue_tog_shutdown") && $("queue_tog_shutdown").innerHTML != 'Shutdown') { + $("queue_tog_shutdown").innerHTML = 'Shutdown'; + $("queue_tog_shutdown").setAttribute("class", "untoggled"); + } + for(var i=0; i
    of '+Math.round(queue.jobs[i].mb)+' MB'; + // time left + nzb.childNodes[1].childNodes[1].innerHTML = " "+TimeLeft(queue.kbpersec, queue.jobs[i].mbleft, queue.jobs[i].mb)+""; + nzb.childNodes[1].title = "ETA: "+queue.jobs[i].eta+" ... Average Age: "+queue.jobs[i].avg_age; + // hop + if (hop!="" && nzb.childNodes[2].childNodes[1].href != hop) { + nzb.childNodes[2].childNodes[1].href = hop; + nzb.childNodes[2].childNodes[1].target = "_blank"; + nzb.childNodes[2].childNodes[1].childNodes[0].src = 'static/images/icon-newzbin.png'; + } + // post-processing options + nzb.childNodes[2].childNodes[2].selectedIndex = queue.jobs[i].unpackopts; + // verbosity + if ($("queue_tog_verbose").innerHTML == 'Verbosity!' && nzb.childNodes[0].childNodes[2].style.display != 'none') { + var verbosity_names=''; + var verbosity_sizes=''; + var verbosity_icons=''; + // finished files + verbosity_names = '
    .: Finished
    '; + verbosity_sizes = '
    '; + verbosity_icons = '

    '; + for (var j=0; j'+queue.jobs[i].finished[j].filename+'
    '; + verbosity_sizes += Math.round((queue.jobs[i].finished[j].mb - queue.jobs[i].finished[j].mbleft)*100)/100 +' of '+ queue.jobs[i].finished[j].mb +' MB
    '; + verbosity_icons += '
    '; + } + // active files + verbosity_names += '
    .: Active
    '; + verbosity_sizes += '

    '; + verbosity_icons += '
    '; + for (var j=0; j'+queue.jobs[i].active[j].filename+'
    '; + verbosity_sizes += Math.round((queue.jobs[i].active[j].mb - queue.jobs[i].active[j].mbleft)*100)/100 +' of '+ queue.jobs[i].active[j].mb +' MB
    '; + verbosity_icons += '' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +'' + +'
    '; + } + // queued files + verbosity_names += '
    .: Queued
    '; + verbosity_sizes += '

    '; + verbosity_icons += '
    '; + for (var j=0; j'+queue.jobs[i].queued[j].filename+'
    '; + verbosity_sizes += Math.round((queue.jobs[i].queued[j].mb - queue.jobs[i].queued[j].mbleft)*100)/100 +' of '+ queue.jobs[i].queued[j].mb +' MB
    '; + verbosity_icons += '
    '; + } + verbosity_names += '
    '; + verbosity_sizes += '
    '; + // and update + if (nzb.childNodes[0].childNodes[2].innerHTML !=verbosity_names) + nzb.childNodes[0].childNodes[2].innerHTML = verbosity_names; + if (nzb.childNodes[1].childNodes[5].innerHTML !=verbosity_sizes) + nzb.childNodes[1].childNodes[5].innerHTML = verbosity_sizes; + if (nzb.childNodes[2].childNodes[4].innerHTML !=verbosity_icons) + nzb.childNodes[2].childNodes[4].innerHTML = verbosity_icons; + } + + }}}); + + // handle history json + new Ajax.Request('history', { + method:'get', + requestHeaders: {Accept: 'application/json'}, + onSuccess: function(transport){ + histore = transport.responseText.evalJSON(); // it didnt work when i called it 'history' + $("bytes_beginning").innerHTML = histore.bytes_beginning; // main stats + $("total_bytes").innerHTML = histore.total_bytes; // main stats + if (histore.lines.length>0 && + histore.lines[0].stages.length>0 && $("history_tog_verbose").innerHTML != 'Verbosity!') { + $("history_tog_verbose").innerHTML = 'Verbosity!'; + $("history_tog_verbose").setAttribute("class", "toggled"); + } else if ( histore.lines.length>0 && + histore.lines[0].stages.length==0 && $("history_tog_verbose").innerHTML != 'Verbosity!') { + $("history_tog_verbose").innerHTML = 'Verbosity'; + $("history_tog_verbose").setAttribute("class", "untoggled"); + } + var numnodes = $("history").getElementsByTagName("tr").length; + var nzb; + var verbosity; + while (numnodes'); + numnodes++; + } + while (numnodes-->histore.lines.length) // need less node(s) + $("history").removeChild($("history").lastChild); + for (var i=0; i^N '; + goodname = goodname.substr(14); + } + if (histore.lines[i].loaded=="True") + loading = '... '; + // verbosity + if (histore.lines[i].stages.length>0) { + verbosity='
    '; + for (var j=0; j'; + break; + case "RAR": + verbosity += ''; + break; + case "ZIP": + verbosity += ''; + break; + case "DEL": + verbosity += ''; + break; + case "FJN": + verbosity += ''; + break; + default: + verbosity += '['+ histore.lines[i].stages[j].actions[k].name.substr(1,3) +']'; + }; + switch (histore.lines[i].stages[j].actions[k].value.substr(3,8)) { + case 'Scanning': + case 'Verified': + case 'Repaired': + case 'Unpacked': + case 'Unzipped': + case 'Deleted ': + break; // clean verbosity + default: + verbosity += ' '+ histore.lines[i].stages[j].actions[k].value.substr(3) +''; + break; + }; + if (histore.lines[i].stages[j].actions[k].value.substr(0,9) == "=> ERROR:" || histore.lines[i].stages[j].actions[k].value.substr(0,6) == "=> Not") + sick = '... '; + } + } + } else verbosity=''; + if ($("history").childNodes[i].childNodes[0].innerHTML !=hop+loading+sick+''+goodname+''+verbosity) { + $("history").childNodes[i].childNodes[0].innerHTML = hop+loading+sick+''+goodname+''+verbosity; + $("history").childNodes[i].title = 'Done @ '+histore.lines[i].added+' :: '+histore.lines[i].filename; + } + } + }}); + + setTimeout("MainLoop()",refreshTime*1000); // loop +} + +// determine time left in HH:MM:SS +// replace this with parsed ETA for queued items +// will still be necessary for overall ETA +function TimeLeft (kbpersec, mbleft, mb) { + var timeleft = '∞'; + if (kbpersec >= 1 && mb > 0) { + var kbleft = mbleft * 1024; + var hoursleft = 0; + var minsleft = 0; + var secsleft = Math.round(kbleft / kbpersec); + if (secsleft>=60) { + minsleft = Math.round(secsleft/60); + secsleft = secsleft%60; + } + if (minsleft>=60) { + hoursleft = Math.round(minsleft/60); + minsleft = minsleft%60; + } + timeleft = ((hoursleft < 10) ? "0" : "") + hoursleft; + timeleft += ((minsleft < 10) ? ":0" : ":") + minsleft; + timeleft += ((secsleft < 10) ? ":0" : ":") + secsleft; + } + return timeleft; +} + +// append an empty enqueued nzb container +function AppendNZBSlot(nzo_id) { + + if (sabplus=='F') // 0.2.5 + $("queue").insert('' + +'' + +':
    ' + +'' + +'
    ' + +'' + +'' + +'' + +'' + +'' + +'
    ' + +''); + else // 0.2.7+ + $("queue").insert('' + +'' + +':
    ' + +'' + +'
    ' + +'' + +'' + +'' + +'' + +'' + +'
    ' + +''); +} + +// called from MainLoop, resets node ids & appends/removes rows +function RefreshQueueOrder() { + if (changingOrder) + return false; + var numnodes = $("queue").getElementsByTagName("tr").length; + while (numnodesqueue.noofslots) // need less node(s) + $("queue").removeChild($("queue").lastChild); + var orderedNodes = $("queue").getElementsByTagName("tr"); + for (var i=0; i 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + }, + + sub: function(pattern, replacement, count) { + replacement = this.gsub.prepareReplacement(replacement); + count = count === undefined ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + }, + + scan: function(pattern, iterator) { + this.gsub(pattern, iterator); + return String(this); + }, + + truncate: function(length, truncation) { + length = length || 30; + truncation = truncation === undefined ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : String(this); + }, + + strip: function() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + }, + + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(function(script) { return eval(script) }); + }, + + escapeHTML: function() { + var self = arguments.callee; + self.text.data = this; + return self.div.innerHTML; + }, + + unescapeHTML: function() { + var div = new Element('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? (div.childNodes.length > 1 ? + $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : + div.childNodes[0].nodeValue) : ''; + }, + + toQueryParams: function(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return { }; + + return match[1].split(separator || '&').inject({ }, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()); + var value = pair.length > 1 ? pair.join('=') : pair[0]; + if (value != undefined) value = decodeURIComponent(value); + + if (key in hash) { + if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; + hash[key].push(value); + } + else hash[key] = value; + } + return hash; + }); + }, + + toArray: function() { + return this.split(''); + }, + + succ: function() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + }, + + times: function(count) { + return count < 1 ? '' : new Array(count + 1).join(this); + }, + + camelize: function() { + var parts = this.split('-'), len = parts.length; + if (len == 1) return parts[0]; + + var camelized = this.charAt(0) == '-' + ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) + : parts[0]; + + for (var i = 1; i < len; i++) + camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); + + return camelized; + }, + + capitalize: function() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + }, + + underscore: function() { + return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); + }, + + dasherize: function() { + return this.gsub(/_/,'-'); + }, + + inspect: function(useDoubleQuotes) { + var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { + var character = String.specialChar[match[0]]; + return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + }, + + toJSON: function() { + return this.inspect(true); + }, + + unfilterJSON: function(filter) { + return this.sub(filter || Prototype.JSONFilter, '#{1}'); + }, + + isJSON: function() { + var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); + return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); + }, + + evalJSON: function(sanitize) { + var json = this.unfilterJSON(); + try { + if (!sanitize || json.isJSON()) return eval('(' + json + ')'); + } catch (e) { } + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + }, + + include: function(pattern) { + return this.indexOf(pattern) > -1; + }, + + startsWith: function(pattern) { + return this.indexOf(pattern) === 0; + }, + + endsWith: function(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.lastIndexOf(pattern) === d; + }, + + empty: function() { + return this == ''; + }, + + blank: function() { + return /^\s*$/.test(this); + }, + + interpolate: function(object, pattern) { + return new Template(this, pattern).evaluate(object); + } +}); + +if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { + escapeHTML: function() { + return this.replace(/&/g,'&').replace(//g,'>'); + }, + unescapeHTML: function() { + return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); + } +}); + +String.prototype.gsub.prepareReplacement = function(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; +}; + +String.prototype.parseQuery = String.prototype.toQueryParams; + +Object.extend(String.prototype.escapeHTML, { + div: document.createElement('div'), + text: document.createTextNode('') +}); + +with (String.prototype.escapeHTML) div.appendChild(text); + +var Template = Class.create({ + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + if (Object.isFunction(object.toTemplateReplacements)) + object = object.toTemplateReplacements(); + + return this.template.gsub(this.pattern, function(match) { + if (object == null) return ''; + + var before = match[1] || ''; + if (before == '\\') return match[2]; + + var ctx = object, expr = match[3]; + var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr); + if (match == null) return ''; + + while (match != null) { + var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; + ctx = ctx[comp]; + if (null == ctx || '' == match[3]) break; + expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); + match = pattern.exec(expr); + } + + return before + String.interpret(ctx); + }.bind(this)); + } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = { }; + +var Enumerable = { + each: function(iterator, context) { + var index = 0; + iterator = iterator.bind(context); + try { + this._each(function(value) { + iterator(value, index++); + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + }, + + eachSlice: function(number, iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var index = -number, slices = [], array = this.toArray(); + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.collect(iterator, context); + }, + + all: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result = true; + this.each(function(value, index) { + result = result && !!iterator(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result = false; + this.each(function(value, index) { + if (result = !!iterator(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var results = []; + this.each(function(value, index) { + results.push(iterator(value, index)); + }); + return results; + }, + + detect: function(iterator, context) { + iterator = iterator.bind(context); + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator, context) { + iterator = iterator.bind(context); + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(filter, iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var results = []; + + if (Object.isString(filter)) + filter = new RegExp(filter); + + this.each(function(value, index) { + if (filter.match(value)) + results.push(iterator(value, index)); + }); + return results; + }, + + include: function(object) { + if (Object.isFunction(this.indexOf)) + if (this.indexOf(object) != -1) return true; + + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inGroupsOf: function(number, fillWith) { + fillWith = fillWith === undefined ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + }, + + inject: function(memo, iterator, context) { + iterator = iterator.bind(context); + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result; + this.each(function(value, index) { + value = iterator(value, index); + if (result == undefined || value >= result) + result = value; + }); + return result; + }, + + min: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result; + this.each(function(value, index) { + value = iterator(value, index); + if (result == undefined || value < result) + result = value; + }); + return result; + }, + + partition: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var trues = [], falses = []; + this.each(function(value, index) { + (iterator(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator, context) { + iterator = iterator.bind(context); + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator, context) { + iterator = iterator.bind(context); + return this.map(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.map(); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (Object.isFunction(args.last())) + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + }, + + size: function() { + return this.toArray().length; + }, + + inspect: function() { + return '#'; + } +}; + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + filter: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray, + every: Enumerable.all, + some: Enumerable.any +}); +function $A(iterable) { + if (!iterable) return []; + if (iterable.toArray) return iterable.toArray(); + var length = iterable.length, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; +} + +if (Prototype.Browser.WebKit) { + function $A(iterable) { + if (!iterable) return []; + if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && + iterable.toArray) return iterable.toArray(); + var length = iterable.length, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; + } +} + +Array.from = $A; + +Object.extend(Array.prototype, Enumerable); + +if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(Object.isArray(value) ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + reduce: function() { + return this.length > 1 ? this : this[0]; + }, + + uniq: function(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + }, + + intersect: function(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + }, + + clone: function() { + return [].concat(this); + }, + + size: function() { + return this.length; + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + }, + + toJSON: function() { + var results = []; + this.each(function(object) { + var value = Object.toJSON(object); + if (value !== undefined) results.push(value); + }); + return '[' + results.join(', ') + ']'; + } +}); + +// use native browser JS 1.6 implementation if available +if (Object.isFunction(Array.prototype.forEach)) + Array.prototype._each = Array.prototype.forEach; + +if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; +}; + +if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; +}; + +Array.prototype.toArray = Array.prototype.clone; + +function $w(string) { + if (!Object.isString(string)) return []; + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +if (Prototype.Browser.Opera){ + Array.prototype.concat = function() { + var array = []; + for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); + for (var i = 0, length = arguments.length; i < length; i++) { + if (Object.isArray(arguments[i])) { + for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) + array.push(arguments[i][j]); + } else { + array.push(arguments[i]); + } + } + return array; + }; +} +Object.extend(Number.prototype, { + toColorPart: function() { + return this.toPaddedString(2, 16); + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + }, + + toPaddedString: function(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + }, + + toJSON: function() { + return isFinite(this) ? this.toString() : 'null'; + } +}); + +$w('abs round ceil floor').each(function(method){ + Number.prototype[method] = Math[method].methodize(); +}); +function $H(object) { + return new Hash(object); +}; + +var Hash = Class.create(Enumerable, (function() { + if (function() { + var i = 0, Test = function(value) { this.key = value }; + Test.prototype.key = 'foo'; + for (var property in new Test('bar')) i++; + return i > 1; + }()) { + function each(iterator) { + var cache = []; + for (var key in this._object) { + var value = this._object[key]; + if (cache.include(key)) continue; + cache.push(key); + var pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + } + } else { + function each(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + } + } + + function toQueryPair(key, value) { + if (Object.isUndefined(value)) return key; + return key + '=' + encodeURIComponent(String.interpret(value)); + } + + return { + initialize: function(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + }, + + _each: each, + + set: function(key, value) { + return this._object[key] = value; + }, + + get: function(key) { + return this._object[key]; + }, + + unset: function(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + }, + + toObject: function() { + return Object.clone(this._object); + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + index: function(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + }, + + merge: function(object) { + return this.clone().update(object); + }, + + update: function(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + }, + + toQueryString: function() { + return this.map(function(pair) { + var key = encodeURIComponent(pair.key), values = pair.value; + + if (values && typeof values == 'object') { + if (Object.isArray(values)) + return values.map(toQueryPair.curry(key)).join('&'); + } + return toQueryPair(key, values); + }).join('&'); + }, + + inspect: function() { + return '#'; + }, + + toJSON: function() { + return Object.toJSON(this.toObject()); + }, + + clone: function() { + return new Hash(this); + } + } +})()); + +Hash.from = $H; +var ObjectRange = Class.create(Enumerable, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +}; + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (Object.isFunction(responder[callback])) { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) { } + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { Ajax.activeRequestCount++ }, + onComplete: function() { Ajax.activeRequestCount-- } +}); + +Ajax.Base = Class.create({ + initialize: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '', + evalJSON: true, + evalJS: true + }; + Object.extend(this.options, options || { }); + + this.options.method = this.options.method.toLowerCase(); + if (Object.isString(this.options.parameters)) + this.options.parameters = this.options.parameters.toQueryParams(); + } +}); + +Ajax.Request = Class.create(Ajax.Base, { + _complete: false, + + initialize: function($super, url, options) { + $super(options); + this.transport = Ajax.getTransport(); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = Object.clone(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + // simulate other verbs over post + params['_method'] = this.method; + this.method = 'post'; + } + + this.parameters = params; + + if (params = Object.toQueryString(params)) { + // when GET, append parameters to URL + if (this.method == 'get') + this.url += (this.url.include('?') ? '&' : '?') + params; + else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + params += '&_='; + } + + try { + var response = new Ajax.Response(this); + if (this.options.onCreate) this.options.onCreate(response); + Ajax.Responders.dispatch('onCreate', this, response); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = this.method == 'post' ? (this.options.postBody || params) : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + // user-defined headers + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (Object.isFunction(extras.push)) + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + var status = this.getStatus(); + return !status || (status >= 200 && status < 300); + }, + + getStatus: function() { + try { + return this.transport.status || 0; + } catch (e) { return 0 } + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + response.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + var contentType = response.getHeader('Content-type'); + if (this.options.evalJS == 'force' + || (this.options.evalJS && contentType + && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); + Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + // avoid memory leak in MSIE: clean up + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name); + } catch (e) { return null } + }, + + evalResponse: function() { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Response = Class.create({ + initialize: function(request){ + this.request = request; + var transport = this.transport = request.transport, + readyState = this.readyState = transport.readyState; + + if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + this.status = this.getStatus(); + this.statusText = this.getStatusText(); + this.responseText = String.interpret(transport.responseText); + this.headerJSON = this._getHeaderJSON(); + } + + if(readyState == 4) { + var xml = transport.responseXML; + this.responseXML = xml === undefined ? null : xml; + this.responseJSON = this._getResponseJSON(); + } + }, + + status: 0, + statusText: '', + + getStatus: Ajax.Request.prototype.getStatus, + + getStatusText: function() { + try { + return this.transport.statusText || ''; + } catch (e) { return '' } + }, + + getHeader: Ajax.Request.prototype.getHeader, + + getAllHeaders: function() { + try { + return this.getAllResponseHeaders(); + } catch (e) { return null } + }, + + getResponseHeader: function(name) { + return this.transport.getResponseHeader(name); + }, + + getAllResponseHeaders: function() { + return this.transport.getAllResponseHeaders(); + }, + + _getHeaderJSON: function() { + var json = this.getHeader('X-JSON'); + try { + return json ? json.evalJSON(this.request.options.sanitizeJSON) : null; + } catch (e) { + this.request.dispatchException(e); + } + }, + + _getResponseJSON: function() { + var options = this.request.options; + try { + if (options.evalJSON == 'force' || (options.evalJSON && + (this.getHeader('Content-type') || '').include('application/json'))) + return this.transport.responseText.evalJSON(options.sanitizeJSON); + return null; + } catch (e) { + this.request.dispatchException(e); + } + } +}); + +Ajax.Updater = Class.create(Ajax.Request, { + initialize: function($super, container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + }; + + options = options || { }; + var onComplete = options.onComplete; + options.onComplete = (function(response, param) { + this.updateContent(response.responseText); + if (Object.isFunction(onComplete)) onComplete(response, param); + }).bind(this); + + $super(url, options); + }, + + updateContent: function(responseText) { + var receiver = this.container[this.success() ? 'success' : 'failure'], + options = this.options; + + if (!options.evalScripts) responseText = responseText.stripScripts(); + + if (receiver = $(receiver)) { + if (options.insertion) { + if (Object.isString(options.insertion)) { + var insertion = { }; insertion[options.insertion] = responseText; + receiver.insert(insertion); + } + else options.insertion(receiver, responseText); + } + else receiver.update(responseText); + } + + if (this.success()) { + if (this.onComplete) this.onComplete.bind(this).defer(); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { + initialize: function($super, container, url, options) { + $super(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = { }; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(response) { + if (this.options.decay) { + this.decay = (response.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = response.responseText; + } + this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (Object.isString(element)) + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(Element.extend(query.snapshotItem(i))); + return results; + }; +} + +/*--------------------------------------------------------------------------*/ + +if (!window.Node) var Node = { }; + +if (!Node.ELEMENT_NODE) { + // DOM level 2 ECMAScript Language Binding + Object.extend(Node, { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }); +} + +(function() { + var element = this.Element; + this.Element = function(tagName, attributes) { + attributes = attributes || { }; + tagName = tagName.toLowerCase(); + var cache = Element.cache; + if (Prototype.Browser.IE && attributes.name) { + tagName = '<' + tagName + ' name="' + attributes.name + '">'; + delete attributes.name; + return Element.writeAttribute(document.createElement(tagName), attributes); + } + if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); + }; + Object.extend(this.Element, element || { }); +}).call(window); + +Element.cache = { }; + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + hide: function(element) { + $(element).style.display = 'none'; + return element; + }, + + show: function(element) { + $(element).style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) return element.update().insert(content); + content = Object.toHTML(content); + element.innerHTML = content.stripScripts(); + content.evalScripts.bind(content).defer(); + return element; + }, + + replace: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + else if (!Object.isElement(content)) { + content = Object.toHTML(content); + var range = element.ownerDocument.createRange(); + range.selectNode(element); + content.evalScripts.bind(content).defer(); + content = range.createContextualFragment(content.stripScripts()); + } + element.parentNode.replaceChild(content, element); + return element; + }, + + insert: function(element, insertions) { + element = $(element); + + if (Object.isString(insertions) || Object.isNumber(insertions) || + Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) + insertions = {bottom:insertions}; + + var content, t, range; + + for (position in insertions) { + content = insertions[position]; + position = position.toLowerCase(); + t = Element._insertionTranslations[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + t.insert(element, content); + continue; + } + + content = Object.toHTML(content); + + range = element.ownerDocument.createRange(); + t.initializeRange(element, range); + t.insert(element, range.createContextualFragment(content.stripScripts())); + + content.evalScripts.bind(content).defer(); + } + + return element; + }, + + wrap: function(element, wrapper, attributes) { + element = $(element); + if (Object.isElement(wrapper)) + $(wrapper).writeAttribute(attributes || { }); + else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); + else wrapper = new Element('div', wrapper); + if (element.parentNode) + element.parentNode.replaceChild(wrapper, element); + wrapper.appendChild(element); + return wrapper; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), attribute = pair.last(); + var value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property) { + element = $(element); + var elements = []; + while (element = element[property]) + if (element.nodeType == 1) + elements.push(Element.extend(element)); + return elements; + }, + + ancestors: function(element) { + return $(element).recursivelyCollect('parentNode'); + }, + + descendants: function(element) { + return $A($(element).getElementsByTagName('*')).each(Element.extend); + }, + + firstDescendant: function(element) { + element = $(element).firstChild; + while (element && element.nodeType != 1) element = element.nextSibling; + return $(element); + }, + + immediateDescendants: function(element) { + if (!(element = $(element).firstChild)) return []; + while (element && element.nodeType != 1) element = element.nextSibling; + if (element) return [element].concat($(element).nextSiblings()); + return []; + }, + + previousSiblings: function(element) { + return $(element).recursivelyCollect('previousSibling'); + }, + + nextSiblings: function(element) { + return $(element).recursivelyCollect('nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return element.previousSiblings().reverse().concat(element.nextSiblings()); + }, + + match: function(element, selector) { + if (Object.isString(selector)) + selector = new Selector(selector); + return selector.match($(element)); + }, + + up: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(element.parentNode); + var ancestors = element.ancestors(); + return expression ? Selector.findElement(ancestors, expression, index) : + ancestors[index || 0]; + }, + + down: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + var descendants = element.descendants(); + return expression ? Selector.findElement(descendants, expression, index) : + descendants[index || 0]; + }, + + previous: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); + var previousSiblings = element.previousSiblings(); + return expression ? Selector.findElement(previousSiblings, expression, index) : + previousSiblings[index || 0]; + }, + + next: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); + var nextSiblings = element.nextSiblings(); + return expression ? Selector.findElement(nextSiblings, expression, index) : + nextSiblings[index || 0]; + }, + + select: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element, args); + }, + + adjacent: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element.parentNode, args).without(element); + }, + + identify: function(element) { + element = $(element); + var id = element.readAttribute('id'), self = arguments.callee; + if (id) return id; + do { id = 'anonymous_element_' + self.counter++ } while ($(id)); + element.writeAttribute('id', id); + return id; + }, + + readAttribute: function(element, name) { + element = $(element); + if (Prototype.Browser.IE) { + var t = Element._attributeTranslations.read; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + if (name.include(':')) { + return (!element.attributes || !element.attributes[name]) ? null : + element.attributes[name].value; + } + } + return element.getAttribute(name); + }, + + writeAttribute: function(element, name, value) { + element = $(element); + var attributes = { }, t = Element._attributeTranslations.write; + + if (typeof name == 'object') attributes = name; + else attributes[name] = value === undefined ? true : value; + + for (var attr in attributes) { + var name = t.names[attr] || attr, value = attributes[attr]; + if (t.values[attr]) name = t.values[attr](element, value); + if (value === false || value === null) + element.removeAttribute(name); + else if (value === true) + element.setAttribute(name, name); + else element.setAttribute(name, value); + } + return element; + }, + + getHeight: function(element) { + return $(element).getDimensions().height; + }, + + getWidth: function(element) { + return $(element).getDimensions().width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || + elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + if (!element.hasClassName(className)) + element.className += (element.className ? ' ' : '') + className; + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + element.className = element.className.replace( + new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + return element[element.hasClassName(className) ? + 'removeClassName' : 'addClassName'](className); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.blank(); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + while (element = element.parentNode) + if (element == ancestor) return true; + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = element.cumulativeOffset(); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + style = style == 'float' ? 'cssFloat' : style.camelize(); + var value = element.style[style]; + if (!value) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + if (style == 'opacity') return value ? parseFloat(value) : 1.0; + return value == 'auto' ? null : value; + }, + + getOpacity: function(element) { + return $(element).getStyle('opacity'); + }, + + setStyle: function(element, styles) { + element = $(element); + var elementStyle = element.style, match; + if (Object.isString(styles)) { + element.style.cssText += ';' + styles; + return styles.include('opacity') ? + element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; + } + for (var property in styles) + if (property == 'opacity') element.setOpacity(styles[property]); + else + elementStyle[(property == 'float' || property == 'cssFloat') ? + (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') : + property] = styles[property]; + + return element; + }, + + setOpacity: function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + return element; + }, + + getDimensions: function(element) { + element = $(element); + var display = $(element).getStyle('display'); + if (display != 'none' && display != null) // Safari bug + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + var originalDisplay = els.display; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = 'block'; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = originalDisplay; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = Element.getStyle(element, 'overflow') || 'auto'; + if (element._overflow !== 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName == 'BODY') break; + var p = Element.getStyle(element, 'position'); + if (p == 'relative' || p == 'absolute') break; + } + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + absolutize: function(element) { + element = $(element); + if (element.getStyle('position') == 'absolute') return; + // Position.prepare(); // To be done manually by Scripty when it needs it. + + var offsets = element.positionedOffset(); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + return element; + }, + + relativize: function(element) { + element = $(element); + if (element.getStyle('position') == 'relative') return; + // Position.prepare(); // To be done manually by Scripty when it needs it. + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + return element; + }, + + cumulativeScrollOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + getOffsetParent: function(element) { + if (element.offsetParent) return $(element.offsetParent); + if (element == document.body) return $(element); + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return $(element); + + return $(document.body); + }, + + viewportOffset: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent == document.body && + Element.getStyle(element, 'position') == 'absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!Prototype.Browser.Opera || element.tagName == 'BODY') { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return Element._returnOffset(valueL, valueT); + }, + + clonePosition: function(element, source) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || { }); + + // find page position of source + source = $(source); + var p = source.viewportOffset(); + + // find coordinate system to use + element = $(element); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(element, 'position') == 'absolute') { + parent = element.getOffsetParent(); + delta = parent.viewportOffset(); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if (options.setWidth) element.style.width = source.offsetWidth + 'px'; + if (options.setHeight) element.style.height = source.offsetHeight + 'px'; + return element; + } +}; + +Element.Methods.identify.counter = 1; + +Object.extend(Element.Methods, { + getElementsBySelector: Element.Methods.select, + childElements: Element.Methods.immediateDescendants +}); + +Element._attributeTranslations = { + write: { + names: { + className: 'class', + htmlFor: 'for' + }, + values: { } + } +}; + + +if (!document.createRange || Prototype.Browser.Opera) { + Element.Methods.insert = function(element, insertions) { + element = $(element); + + if (Object.isString(insertions) || Object.isNumber(insertions) || + Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) + insertions = { bottom: insertions }; + + var t = Element._insertionTranslations, content, position, pos, tagName; + + for (position in insertions) { + content = insertions[position]; + position = position.toLowerCase(); + pos = t[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + pos.insert(element, content); + continue; + } + + content = Object.toHTML(content); + tagName = ((position == 'before' || position == 'after') + ? element.parentNode : element).tagName.toUpperCase(); + + if (t.tags[tagName]) { + var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + if (position == 'top' || position == 'after') fragments.reverse(); + fragments.each(pos.insert.curry(element)); + } + else element.insertAdjacentHTML(pos.adjacency, content.stripScripts()); + + content.evalScripts.bind(content).defer(); + } + + return element; + }; +} + +if (Prototype.Browser.Opera) { + Element.Methods._getStyle = Element.Methods.getStyle; + Element.Methods.getStyle = function(element, style) { + switch(style) { + case 'left': + case 'top': + case 'right': + case 'bottom': + if (Element._getStyle(element, 'position') == 'static') return null; + default: return Element._getStyle(element, style); + } + }; + Element.Methods._readAttribute = Element.Methods.readAttribute; + Element.Methods.readAttribute = function(element, attribute) { + if (attribute == 'title') return element.title; + return Element._readAttribute(element, attribute); + }; +} + +else if (Prototype.Browser.IE) { + $w('positionedOffset getOffsetParent viewportOffset').each(function(method) { + Element.Methods[method] = Element.Methods[method].wrap( + function(proceed, element) { + element = $(element); + var position = element.getStyle('position'); + if (position != 'static') return proceed(element); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + }); + + Element.Methods.getStyle = function(element, style) { + element = $(element); + style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); + var value = element.style[style]; + if (!value && element.currentStyle) value = element.currentStyle[style]; + + if (style == 'opacity') { + if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if (value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + + if (value == 'auto') { + if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) + return element['offset' + style.capitalize()] + 'px'; + return null; + } + return value; + }; + + Element.Methods.setOpacity = function(element, value) { + function stripAlpha(filter){ + return filter.replace(/alpha\([^\)]*\)/gi,''); + } + element = $(element); + if (!element.currentStyle.hasLayout) element.style.zoom = 1; + var filter = element.getStyle('filter'), style = element.style; + if (value == 1 || value === '') { + (filter = stripAlpha(filter)) ? + style.filter = filter : style.removeAttribute('filter'); + return element; + } else if (value < 0.00001) value = 0; + style.filter = stripAlpha(filter) + + 'alpha(opacity=' + (value * 100) + ')'; + return element; + }; + + Element._attributeTranslations = { + read: { + names: { + 'class': 'className', + 'for': 'htmlFor' + }, + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: function(element, attribute) { + var attribute = element.getAttribute(attribute); + return attribute ? attribute.toString().slice(23, -2) : null; + }, + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } + } + } + }; + + Element._attributeTranslations.write = { + names: Object.clone(Element._attributeTranslations.read.names), + values: { + checked: function(element, value) { + element.checked = !!value; + }, + + style: function(element, value) { + element.style.cssText = value ? value : ''; + } + } + }; + + Element._attributeTranslations.has = {}; + + $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + + 'encType maxLength readOnly longDesc').each(function(attr) { + Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; + Element._attributeTranslations.has[attr.toLowerCase()] = attr; + }); + + (function(v) { + Object.extend(v, { + href: v._getAttr, + src: v._getAttr, + type: v._getAttr, + action: v._getAttrNode, + disabled: v._flag, + checked: v._flag, + readonly: v._flag, + multiple: v._flag, + onload: v._getEv, + onunload: v._getEv, + onclick: v._getEv, + ondblclick: v._getEv, + onmousedown: v._getEv, + onmouseup: v._getEv, + onmouseover: v._getEv, + onmousemove: v._getEv, + onmouseout: v._getEv, + onfocus: v._getEv, + onblur: v._getEv, + onkeypress: v._getEv, + onkeydown: v._getEv, + onkeyup: v._getEv, + onsubmit: v._getEv, + onreset: v._getEv, + onselect: v._getEv, + onchange: v._getEv + }); + })(Element._attributeTranslations.read.values); +} + +else if (Prototype.Browser.Gecko) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1) ? 0.999999 : + (value === '') ? '' : (value < 0.00001) ? 0 : value; + return element; + }; +} + +else if (Prototype.Browser.WebKit) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + + if (value == 1) + if(element.tagName == 'IMG' && element.width) { + element.width++; element.width--; + } else try { + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch (e) { } + + return element; + }; + + // Safari returns margins on body which is incorrect if the child is absolutely + // positioned. For performance reasons, redefine Position.cumulativeOffset for + // KHTML/WebKit only. + Element.Methods.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return Element._returnOffset(valueL, valueT); + }; +} + +if (Prototype.Browser.IE || Prototype.Browser.Opera) { + // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements + Element.Methods.update = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) return element.update().insert(content); + + content = Object.toHTML(content); + var tagName = element.tagName.toUpperCase(); + + if (tagName in Element._insertionTranslations.tags) { + $A(element.childNodes).each(function(node) { element.removeChild(node) }); + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { element.appendChild(node) }); + } + else element.innerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +if (document.createElement('div').outerHTML) { + Element.Methods.replace = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + element.parentNode.replaceChild(content, element); + return element; + } + + content = Object.toHTML(content); + var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); + + if (Element._insertionTranslations.tags[tagName]) { + var nextSibling = element.next(); + var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + parent.removeChild(element); + if (nextSibling) + fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); + else + fragments.each(function(node) { parent.appendChild(node) }); + } + else element.outerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +Element._returnOffset = function(l, t) { + var result = [l, t]; + result.left = l; + result.top = t; + return result; +}; + +Element._getContentFromAnonymousElement = function(tagName, html) { + var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; + div.innerHTML = t[0] + html + t[1]; + t[2].times(function() { div = div.firstChild }); + return $A(div.childNodes); +}; + +Element._insertionTranslations = { + before: { + adjacency: 'beforeBegin', + insert: function(element, node) { + element.parentNode.insertBefore(node, element); + }, + initializeRange: function(element, range) { + range.setStartBefore(element); + } + }, + top: { + adjacency: 'afterBegin', + insert: function(element, node) { + element.insertBefore(node, element.firstChild); + }, + initializeRange: function(element, range) { + range.selectNodeContents(element); + range.collapse(true); + } + }, + bottom: { + adjacency: 'beforeEnd', + insert: function(element, node) { + element.appendChild(node); + } + }, + after: { + adjacency: 'afterEnd', + insert: function(element, node) { + element.parentNode.insertBefore(node, element.nextSibling); + }, + initializeRange: function(element, range) { + range.setStartAfter(element); + } + }, + tags: { + TABLE: ['', '
    ', 1], + TBODY: ['', '
    ', 2], + TR: ['', '
    ', 3], + TD: ['
    ', '
    ', 4], + SELECT: ['', 1] + } +}; + +(function() { + this.bottom.initializeRange = this.top.initializeRange; + Object.extend(this.tags, { + THEAD: this.tags.TBODY, + TFOOT: this.tags.TBODY, + TH: this.tags.TD + }); +}).call(Element._insertionTranslations); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + attribute = Element._attributeTranslations.has[attribute] || attribute; + var node = $(element).getAttributeNode(attribute); + return node && node.specified; + } +}; + +Element.Methods.ByTag = { }; + +Object.extend(Element, Element.Methods); + +if (!Prototype.BrowserFeatures.ElementExtensions && + document.createElement('div').__proto__) { + window.HTMLElement = { }; + window.HTMLElement.prototype = document.createElement('div').__proto__; + Prototype.BrowserFeatures.ElementExtensions = true; +} + +Element.extend = (function() { + if (Prototype.BrowserFeatures.SpecificElementExtensions) + return Prototype.K; + + var Methods = { }, ByTag = Element.Methods.ByTag; + + var extend = Object.extend(function(element) { + if (!element || element._extendedByPrototype || + element.nodeType != 1 || element == window) return element; + + var methods = Object.clone(Methods), + tagName = element.tagName, property, value; + + // extend methods for specific tags + if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + + for (property in methods) { + value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + + element._extendedByPrototype = Prototype.emptyFunction; + return element; + + }, { + refresh: function() { + // extend methods for all tags (Safari doesn't need this) + if (!Prototype.BrowserFeatures.ElementExtensions) { + Object.extend(Methods, Element.Methods); + Object.extend(Methods, Element.Methods.Simulated); + } + } + }); + + extend.refresh(); + return extend; +})(); + +Element.hasAttribute = function(element, attribute) { + if (element.hasAttribute) return element.hasAttribute(attribute); + return Element.Methods.Simulated.hasAttribute(element, attribute); +}; + +Element.addMethods = function(methods) { + var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + + if (!methods) { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + "FORM": Object.clone(Form.Methods), + "INPUT": Object.clone(Form.Element.Methods), + "SELECT": Object.clone(Form.Element.Methods), + "TEXTAREA": Object.clone(Form.Element.Methods) + }); + } + + if (arguments.length == 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) Object.extend(Element.Methods, methods || { }); + else { + if (Object.isArray(tagName)) tagName.each(extend); + else extend(tagName); + } + + function extend(tagName) { + tagName = tagName.toUpperCase(); + if (!Element.Methods.ByTag[tagName]) + Element.Methods.ByTag[tagName] = { }; + Object.extend(Element.Methods.ByTag[tagName], methods); + } + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + for (var property in methods) { + var value = methods[property]; + if (!Object.isFunction(value)) continue; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = value.methodize(); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", + "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", + "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", + "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", + "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": + "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": + "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": + "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": + "FrameSet", "IFRAME": "IFrame" + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + window[klass] = { }; + window[klass].prototype = document.createElement(tagName).__proto__; + return window[klass]; + } + + if (F.ElementExtensions) { + copy(Element.Methods, HTMLElement.prototype); + copy(Element.Methods.Simulated, HTMLElement.prototype, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (Object.isUndefined(klass)) continue; + copy(T[tag], klass.prototype); + } + } + + Object.extend(Element, Element.Methods); + delete Element.ByTag; + + if (Element.extend.refresh) Element.extend.refresh(); + Element.cache = { }; +}; + +document.viewport = { + getDimensions: function() { + var dimensions = { }; + $w('width height').each(function(d) { + var D = d.capitalize(); + dimensions[d] = self['inner' + D] || + (document.documentElement['client' + D] || document.body['client' + D]); + }); + return dimensions; + }, + + getWidth: function() { + return this.getDimensions().width; + }, + + getHeight: function() { + return this.getDimensions().height; + }, + + getScrollOffsets: function() { + return Element._returnOffset( + window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + } +}; +/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, + * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style + * license. Please see http://www.yui-ext.com/ for more information. */ + +var Selector = Class.create({ + initialize: function(expression) { + this.expression = expression.strip(); + this.compileMatcher(); + }, + + compileMatcher: function() { + // Selectors with namespaced attributes can't use the XPath version + if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression)) + return this.compileXPathMatcher(); + + var e = this.expression, ps = Selector.patterns, h = Selector.handlers, + c = Selector.criteria, le, p, m; + + if (Selector._cache[e]) { + this.matcher = Selector._cache[e]; + return; + } + + this.matcher = ["this.matcher = function(root) {", + "var r = root, h = Selector.handlers, c = false, n;"]; + + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : + new Template(c[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.matcher.push("return h.unique(n);\n}"); + eval(this.matcher.join('\n')); + Selector._cache[this.expression] = this.matcher; + }, + + compileXPathMatcher: function() { + var e = this.expression, ps = Selector.patterns, + x = Selector.xpath, le, m; + + if (Selector._cache[e]) { + this.xpath = Selector._cache[e]; return; + } + + this.matcher = ['.//*']; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + if (m = e.match(ps[i])) { + this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : + new Template(x[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.xpath = this.matcher.join(''); + Selector._cache[this.expression] = this.xpath; + }, + + findElements: function(root) { + root = root || document; + if (this.xpath) return document._getElementsByXPath(this.xpath, root); + return this.matcher(root); + }, + + match: function(element) { + this.tokens = []; + + var e = this.expression, ps = Selector.patterns, as = Selector.assertions; + var le, p, m; + + while (e && le !== e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + // use the Selector.assertions methods unless the selector + // is too complex. + if (as[i]) { + this.tokens.push([i, Object.clone(m)]); + e = e.replace(m[0], ''); + } else { + // reluctantly do a document-wide search + // and look for a match in the array + return this.findElements(document).include(element); + } + } + } + } + + var match = true, name, matches; + for (var i = 0, token; token = this.tokens[i]; i++) { + name = token[0], matches = token[1]; + if (!Selector.assertions[name](element, matches)) { + match = false; break; + } + } + + return match; + }, + + toString: function() { + return this.expression; + }, + + inspect: function() { + return "#"; + } +}); + +Object.extend(Selector, { + _cache: { }, + + xpath: { + descendant: "//*", + child: "/*", + adjacent: "/following-sibling::*[1]", + laterSibling: '/following-sibling::*', + tagName: function(m) { + if (m[1] == '*') return ''; + return "[local-name()='" + m[1].toLowerCase() + + "' or local-name()='" + m[1].toUpperCase() + "']"; + }, + className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", + id: "[@id='#{1}']", + attrPresence: "[@#{1}]", + attr: function(m) { + m[3] = m[5] || m[6]; + return new Template(Selector.xpath.operators[m[2]]).evaluate(m); + }, + pseudo: function(m) { + var h = Selector.xpath.pseudos[m[1]]; + if (!h) return ''; + if (Object.isFunction(h)) return h(m); + return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); + }, + operators: { + '=': "[@#{1}='#{3}']", + '!=': "[@#{1}!='#{3}']", + '^=': "[starts-with(@#{1}, '#{3}')]", + '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", + '*=': "[contains(@#{1}, '#{3}')]", + '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", + '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" + }, + pseudos: { + 'first-child': '[not(preceding-sibling::*)]', + 'last-child': '[not(following-sibling::*)]', + 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', + 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", + 'checked': "[@checked]", + 'disabled': "[@disabled]", + 'enabled': "[not(@disabled)]", + 'not': function(m) { + var e = m[6], p = Selector.patterns, + x = Selector.xpath, le, m, v; + + var exclusion = []; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in p) { + if (m = e.match(p[i])) { + v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); + exclusion.push("(" + v.substring(1, v.length - 1) + ")"); + e = e.replace(m[0], ''); + break; + } + } + } + return "[not(" + exclusion.join(" and ") + ")]"; + }, + 'nth-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); + }, + 'nth-last-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); + }, + 'nth-of-type': function(m) { + return Selector.xpath.pseudos.nth("position() ", m); + }, + 'nth-last-of-type': function(m) { + return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); + }, + 'first-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); + }, + 'last-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); + }, + 'only-of-type': function(m) { + var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); + }, + nth: function(fragment, m) { + var mm, formula = m[6], predicate; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + if (mm = formula.match(/^(\d+)$/)) // digit only + return '[' + fragment + "= " + mm[1] + ']'; + if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (mm[1] == "-") mm[1] = -1; + var a = mm[1] ? Number(mm[1]) : 1; + var b = mm[2] ? Number(mm[2]) : 0; + predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + + "((#{fragment} - #{b}) div #{a} >= 0)]"; + return new Template(predicate).evaluate({ + fragment: fragment, a: a, b: b }); + } + } + } + }, + + criteria: { + tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', + className: 'n = h.className(n, r, "#{1}", c); c = false;', + id: 'n = h.id(n, r, "#{1}", c); c = false;', + attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;', + attr: function(m) { + m[3] = (m[5] || m[6]); + return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m); + }, + pseudo: function(m) { + if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); + return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); + }, + descendant: 'c = "descendant";', + child: 'c = "child";', + adjacent: 'c = "adjacent";', + laterSibling: 'c = "laterSibling";' + }, + + patterns: { + // combinators must be listed first + // (and descendant needs to be last combinator) + laterSibling: /^\s*~\s*/, + child: /^\s*>\s*/, + adjacent: /^\s*\+\s*/, + descendant: /^\s/, + + // selectors follow + tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, + id: /^#([\w\-\*]+)(\b|$)/, + className: /^\.([\w\-\*]+)(\b|$)/, + pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/, + attrPresence: /^\[([\w]+)\]/, + attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ + }, + + // for Selector.match and Element#match + assertions: { + tagName: function(element, matches) { + return matches[1].toUpperCase() == element.tagName.toUpperCase(); + }, + + className: function(element, matches) { + return Element.hasClassName(element, matches[1]); + }, + + id: function(element, matches) { + return element.id === matches[1]; + }, + + attrPresence: function(element, matches) { + return Element.hasAttribute(element, matches[1]); + }, + + attr: function(element, matches) { + var nodeValue = Element.readAttribute(element, matches[1]); + return Selector.operators[matches[2]](nodeValue, matches[3]); + } + }, + + handlers: { + // UTILITY FUNCTIONS + // joins two collections + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + a.push(node); + return a; + }, + + // marks an array of nodes for counting + mark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node._counted = true; + return nodes; + }, + + unmark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node._counted = undefined; + return nodes; + }, + + // mark each child node with its position (for nth calls) + // "ofType" flag indicates whether we're indexing for nth-of-type + // rather than nth-child + index: function(parentNode, reverse, ofType) { + parentNode._counted = true; + if (reverse) { + for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { + var node = nodes[i]; + if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; + } + } else { + for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) + if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; + } + }, + + // filters out duplicates and extends all nodes + unique: function(nodes) { + if (nodes.length == 0) return nodes; + var results = [], n; + for (var i = 0, l = nodes.length; i < l; i++) + if (!(n = nodes[i])._counted) { + n._counted = true; + results.push(Element.extend(n)); + } + return Selector.handlers.unmark(results); + }, + + // COMBINATOR FUNCTIONS + descendant: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName('*')); + return results; + }, + + child: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) { + for (var j = 0, children = [], child; child = node.childNodes[j]; j++) + if (child.nodeType == 1 && child.tagName != '!') results.push(child); + } + return results; + }, + + adjacent: function(nodes) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + var next = this.nextElementSibling(node); + if (next) results.push(next); + } + return results; + }, + + laterSibling: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, Element.nextSiblings(node)); + return results; + }, + + nextElementSibling: function(node) { + while (node = node.nextSibling) + if (node.nodeType == 1) return node; + return null; + }, + + previousElementSibling: function(node) { + while (node = node.previousSibling) + if (node.nodeType == 1) return node; + return null; + }, + + // TOKEN FUNCTIONS + tagName: function(nodes, root, tagName, combinator) { + tagName = tagName.toUpperCase(); + var results = [], h = Selector.handlers; + if (nodes) { + if (combinator) { + // fastlane for ordinary descendant combinators + if (combinator == "descendant") { + for (var i = 0, node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName(tagName)); + return results; + } else nodes = this[combinator](nodes); + if (tagName == "*") return nodes; + } + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName.toUpperCase() == tagName) results.push(node); + return results; + } else return root.getElementsByTagName(tagName); + }, + + id: function(nodes, root, id, combinator) { + var targetNode = $(id), h = Selector.handlers; + if (!targetNode) return []; + if (!nodes && root == document) return [targetNode]; + if (nodes) { + if (combinator) { + if (combinator == 'child') { + for (var i = 0, node; node = nodes[i]; i++) + if (targetNode.parentNode == node) return [targetNode]; + } else if (combinator == 'descendant') { + for (var i = 0, node; node = nodes[i]; i++) + if (Element.descendantOf(targetNode, node)) return [targetNode]; + } else if (combinator == 'adjacent') { + for (var i = 0, node; node = nodes[i]; i++) + if (Selector.handlers.previousElementSibling(targetNode) == node) + return [targetNode]; + } else nodes = h[combinator](nodes); + } + for (var i = 0, node; node = nodes[i]; i++) + if (node == targetNode) return [targetNode]; + return []; + } + return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; + }, + + className: function(nodes, root, className, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + return Selector.handlers.byClassName(nodes, root, className); + }, + + byClassName: function(nodes, root, className) { + if (!nodes) nodes = Selector.handlers.descendant([root]); + var needle = ' ' + className + ' '; + for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { + nodeClassName = node.className; + if (nodeClassName.length == 0) continue; + if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) + results.push(node); + } + return results; + }, + + attrPresence: function(nodes, root, attr) { + var results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (Element.hasAttribute(node, attr)) results.push(node); + return results; + }, + + attr: function(nodes, root, attr, value, operator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + var handler = Selector.operators[operator], results = []; + for (var i = 0, node; node = nodes[i]; i++) { + var nodeValue = Element.readAttribute(node, attr); + if (nodeValue === null) continue; + if (handler(nodeValue, value)) results.push(node); + } + return results; + }, + + pseudo: function(nodes, name, value, root, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + if (!nodes) nodes = root.getElementsByTagName("*"); + return Selector.pseudos[name](nodes, value, root); + } + }, + + pseudos: { + 'first-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.previousElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'last-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.nextElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'only-child': function(nodes, value, root) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) + results.push(node); + return results; + }, + 'nth-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root); + }, + 'nth-last-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true); + }, + 'nth-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, false, true); + }, + 'nth-last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true, true); + }, + 'first-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, false, true); + }, + 'last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, true, true); + }, + 'only-of-type': function(nodes, formula, root) { + var p = Selector.pseudos; + return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); + }, + + // handles the an+b logic + getIndices: function(a, b, total) { + if (a == 0) return b > 0 ? [b] : []; + return $R(1, total).inject([], function(memo, i) { + if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); + return memo; + }); + }, + + // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type + nth: function(nodes, formula, root, reverse, ofType) { + if (nodes.length == 0) return []; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + var h = Selector.handlers, results = [], indexed = [], m; + h.mark(nodes); + for (var i = 0, node; node = nodes[i]; i++) { + if (!node.parentNode._counted) { + h.index(node.parentNode, reverse, ofType); + indexed.push(node.parentNode); + } + } + if (formula.match(/^\d+$/)) { // just a number + formula = Number(formula); + for (var i = 0, node; node = nodes[i]; i++) + if (node.nodeIndex == formula) results.push(node); + } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (m[1] == "-") m[1] = -1; + var a = m[1] ? Number(m[1]) : 1; + var b = m[2] ? Number(m[2]) : 0; + var indices = Selector.pseudos.getIndices(a, b, nodes.length); + for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { + for (var j = 0; j < l; j++) + if (node.nodeIndex == indices[j]) results.push(node); + } + } + h.unmark(nodes); + h.unmark(indexed); + return results; + }, + + 'empty': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + // IE treats comments as element nodes + if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; + results.push(node); + } + return results; + }, + + 'not': function(nodes, selector, root) { + var h = Selector.handlers, selectorType, m; + var exclusions = new Selector(selector).findElements(root); + h.mark(exclusions); + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node._counted) results.push(node); + h.unmark(exclusions); + return results; + }, + + 'enabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node.disabled) results.push(node); + return results; + }, + + 'disabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.disabled) results.push(node); + return results; + }, + + 'checked': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.checked) results.push(node); + return results; + } + }, + + operators: { + '=': function(nv, v) { return nv == v; }, + '!=': function(nv, v) { return nv != v; }, + '^=': function(nv, v) { return nv.startsWith(v); }, + '$=': function(nv, v) { return nv.endsWith(v); }, + '*=': function(nv, v) { return nv.include(v); }, + '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, + '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } + }, + + matchElements: function(elements, expression) { + var matches = new Selector(expression).findElements(), h = Selector.handlers; + h.mark(matches); + for (var i = 0, results = [], element; element = elements[i]; i++) + if (element._counted) results.push(element); + h.unmark(matches); + return results; + }, + + findElement: function(elements, expression, index) { + if (Object.isNumber(expression)) { + index = expression; expression = false; + } + return Selector.matchElements(elements, expression || '*')[index || 0]; + }, + + findChildElements: function(element, expressions) { + var exprs = expressions.join(','), expressions = []; + exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { + expressions.push(m[1].strip()); + }); + var results = [], h = Selector.handlers; + for (var i = 0, l = expressions.length, selector; i < l; i++) { + selector = new Selector(expressions[i].strip()); + h.concat(results, selector.findElements(element)); + } + return (l > 1) ? h.unique(results) : results; + } +}); + +function $$() { + return Selector.findChildElements(document, $A(arguments)); +} +var Form = { + reset: function(form) { + $(form).reset(); + return form; + }, + + serializeElements: function(elements, options) { + if (typeof options != 'object') options = { hash: !!options }; + else if (options.hash === undefined) options.hash = true; + var key, value, submitted = false, submit = options.submit; + + var data = elements.inject({ }, function(result, element) { + if (!element.disabled && element.name) { + key = element.name; value = $(element).getValue(); + if (value != null && (element.type != 'submit' || (!submitted && + submit !== false && (!submit || key == submit) && (submitted = true)))) { + if (key in result) { + // a key is already present; construct an array of values + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return options.hash ? data : Object.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, options) { + return Form.serializeElements(Form.getElements(form), options); + }, + + getElements: function(form) { + return $A($(form).getElementsByTagName('*')).inject([], + function(elements, child) { + if (Form.Element.Serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + } + ); + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function(form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function(form) { + var elements = $(form).getElements().findAll(function(element) { + return 'hidden' != element.type && !element.disabled; + }); + var firstByIndex = elements.findAll(function(element) { + return element.hasAttribute('tabIndex') && element.tabIndex >= 0; + }).sortBy(function(element) { return element.tabIndex }).first(); + + return firstByIndex ? firstByIndex : elements.find(function(element) { + return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + }, + + request: function(form, options) { + form = $(form), options = Object.clone(options || { }); + + var params = options.parameters, action = form.readAttribute('action') || ''; + if (action.blank()) action = window.location.href; + options.parameters = form.serialize(true); + + if (params) { + if (Object.isString(params)) params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(action, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +}; + +Form.Element.Methods = { + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = { }; + pair[element.name] = value; + return Object.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + setValue: function(element, value) { + element = $(element); + var method = element.tagName.toLowerCase(); + Form.Element.Serializers[method](element, value); + return element; + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + try { + element.focus(); + if (element.select && (element.tagName.toLowerCase() != 'input' || + !['button', 'reset', 'submit'].include(element.type))) + element.select(); + } catch (e) { } + return element; + }, + + disable: function(element) { + element = $(element); + element.blur(); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.disabled = false; + return element; + } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element, value) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element, value); + default: + return Form.Element.Serializers.textarea(element, value); + } + }, + + inputSelector: function(element, value) { + if (value === undefined) return element.checked ? element.value : null; + else element.checked = !!value; + }, + + textarea: function(element, value) { + if (value === undefined) return element.value; + else element.value = value; + }, + + select: function(element, index) { + if (index === undefined) + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + else { + var opt, value, single = !Object.isArray(index); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + value = this.optionValue(opt); + if (single) { + if (value == index) { + opt.selected = true; + return; + } + } + else opt.selected = index.include(value); + } + } + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + // extend element because hasAttribute may not be native + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +}; + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { + initialize: function($super, element, frequency, callback) { + $super(callback, frequency); + this.element = $(element); + this.lastValue = this.getValue(); + }, + + execute: function() { + var value = this.getValue(); + if (Object.isString(this.lastValue) && Object.isString(value) ? + this.lastValue != value : String(this.lastValue) != String(value)) { + this.callback(this.element, value); + this.lastValue = value; + } + } +}); + +Form.Element.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = Class.create({ + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + Form.getElements(this.element).each(this.registerCallback, this); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +}); + +Form.Element.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) var Event = { }; + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + cache: { }, + + relatedTarget: function(event) { + var element; + switch(event.type) { + case 'mouseover': element = event.fromElement; break; + case 'mouseout': element = event.toElement; break; + default: return null; + } + return Element.extend(element); + } +}); + +Event.Methods = (function() { + if (Prototype.Browser.IE) { + function isButton(event, code) { + return event.button == ({ 0: 1, 1: 4, 2: 2 })[code]; + } + + } else if (Prototype.Browser.WebKit) { + function isButton(event, code) { + switch (code) { + case 0: return event.which == 1 && !event.metaKey; + case 1: return event.which == 1 && event.metaKey; + default: return false; + } + } + + } else { + function isButton(event, code) { + return event.which ? (event.which === code + 1) : (event.button === code); + } + } + + return { + isLeftClick: function(event) { return isButton(event, 0) }, + isMiddleClick: function(event) { return isButton(event, 1) }, + isRightClick: function(event) { return isButton(event, 2) }, + + element: function(event) { + var node = Event.extend(event).target; + return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); + }, + + findElement: function(event, expression) { + var element = Event.element(event); + return element.match(expression) ? element : element.up(expression); + }, + + pointer: function(event) { + return { + x: event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)), + y: event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)) + }; + }, + + pointerX: function(event) { return Event.pointer(event).x }, + pointerY: function(event) { return Event.pointer(event).y }, + + stop: function(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + } + }; +})(); + +Event.extend = (function() { + var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { + m[name] = Event.Methods[name].methodize(); + return m; + }); + + if (Prototype.Browser.IE) { + Object.extend(methods, { + stopPropagation: function() { this.cancelBubble = true }, + preventDefault: function() { this.returnValue = false }, + inspect: function() { return "[object Event]" } + }); + + return function(event) { + if (!event) return false; + if (event._extendedByPrototype) return event; + + event._extendedByPrototype = Prototype.emptyFunction; + var pointer = Event.pointer(event); + Object.extend(event, { + target: event.srcElement, + relatedTarget: Event.relatedTarget(event), + pageX: pointer.x, + pageY: pointer.y + }); + return Object.extend(event, methods); + }; + + } else { + Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; + Object.extend(Event.prototype, methods); + return Prototype.K; + } +})(); + +Object.extend(Event, (function() { + var cache = Event.cache; + + function getEventID(element) { + if (element._eventID) return element._eventID; + arguments.callee.id = arguments.callee.id || 1; + return element._eventID = ++arguments.callee.id; + } + + function getDOMEventName(eventName) { + if (eventName && eventName.match(/:/)) return "dataavailable"; + return eventName; + } + + function getCacheForID(id) { + return cache[id] = cache[id] || { }; + } + + function getWrappersForEventName(id, eventName) { + var c = getCacheForID(id); + return c[eventName] = c[eventName] || []; + } + + function createWrapper(element, eventName, handler) { + var id = getEventID(element); + var c = getWrappersForEventName(id, eventName); + if (c.pluck("handler").include(handler)) return false; + + var wrapper = function(event) { + if (event.eventName && event.eventName != eventName) + return false; + + Event.extend(event); + handler.call(element, event) + }; + + wrapper.handler = handler; + c.push(wrapper); + return wrapper; + } + + function findWrapper(id, eventName, handler) { + var c = getWrappersForEventName(id, eventName); + return c.find(function(wrapper) { return wrapper.handler == handler }); + } + + function destroyWrapper(id, eventName, handler) { + var c = getCacheForID(id); + if (!c[eventName]) return false; + c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); + } + + function destroyCache() { + for (var id in cache) + for (var eventName in cache[id]) + cache[id][eventName] = null; + } + + if (window.attachEvent) { + window.attachEvent("onunload", destroyCache); + } + + return { + observe: function(element, eventName, handler) { + element = $(element); + var name = getDOMEventName(eventName); + + var wrapper = createWrapper(element, eventName, handler); + if (!wrapper) return element; + + if (element.addEventListener) { + element.addEventListener(name, wrapper, false); + } else { + element.attachEvent("on" + name, wrapper); + } + + return element; + }, + + stopObserving: function(element, eventName, handler) { + element = $(element); + var id = getEventID(element), name = getDOMEventName(eventName); + + if (!handler && eventName) { + getWrappersForEventName(id, eventName).each(function(wrapper) { + element.stopObserving(eventName, wrapper.handler); + }); + return element; + + } else if (!eventName) { + Object.keys(getCacheForID(id)).each(function(eventName) { + element.stopObserving(eventName); + }); + return element; + } + + var wrapper = findWrapper(id, eventName, handler); + if (!wrapper) return element; + + if (element.removeEventListener) { + element.removeEventListener(name, wrapper, false); + } else { + element.detachEvent("on" + name, wrapper); + } + + destroyWrapper(id, eventName, handler); + + return element; + }, + + fire: function(element, eventName, memo) { + element = $(element); + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + if (document.createEvent) { + var event = document.createEvent("HTMLEvents"); + event.initEvent("dataavailable", true, true); + } else { + var event = document.createEventObject(); + event.eventType = "ondataavailable"; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) { + element.dispatchEvent(event); + } else { + element.fireEvent(event.eventType, event); + } + + return event; + } + }; +})()); + +Object.extend(Event, Event.Methods); + +Element.addMethods({ + fire: Event.fire, + observe: Event.observe, + stopObserving: Event.stopObserving +}); + +Object.extend(document, { + fire: Element.Methods.fire.methodize(), + observe: Element.Methods.observe.methodize(), + stopObserving: Element.Methods.stopObserving.methodize() +}); + +(function() { + /* Support for the DOMContentLoaded event is based on work by Dan Webb, + Matthias Miller, Dean Edwards and John Resig. */ + + var timer, fired = false; + + function fireContentLoadedEvent() { + if (fired) return; + if (timer) window.clearInterval(timer); + document.fire("dom:loaded"); + fired = true; + } + + if (document.addEventListener) { + if (Prototype.Browser.WebKit) { + timer = window.setInterval(function() { + if (/loaded|complete/.test(document.readyState)) + fireContentLoadedEvent(); + }, 0); + + Event.observe(window, "load", fireContentLoadedEvent); + + } else { + document.addEventListener("DOMContentLoaded", + fireContentLoadedEvent, false); + } + + } else { + document.write("'); + }, + REQUIRED_PROTOTYPE: '1.6.0', + load: function() { + function convertVersionString(versionString){ + var r = versionString.split('.'); + return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]); + } + + if((typeof Prototype=='undefined') || + (typeof Element == 'undefined') || + (typeof Element.Methods=='undefined') || + (convertVersionString(Prototype.Version) < + convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE))) + throw("script.aculo.us requires the Prototype JavaScript framework >= " + + Scriptaculous.REQUIRED_PROTOTYPE); + + $A(document.getElementsByTagName("script")).findAll( function(s) { + return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) + }).each( function(s) { + var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); + var includes = s.src.match(/\?.*load=([a-z,]*)/); + (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each( + function(include) { Scriptaculous.require(path+include+'.js') }); + }); + } +} + +Scriptaculous.load(); \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/static/javascripts/slider.js b/main/NOVA_0.4.5/templates/static/javascripts/slider.js new file mode 100644 index 0000000..46c6673 --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/slider.js @@ -0,0 +1,276 @@ +// script.aculo.us slider.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 + +// Copyright (c) 2005-2007 Marty Haught, Thomas Fuchs +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +if (!Control) var Control = { }; +Control.Slider = Class.create(); + +// options: +// axis: 'vertical', or 'horizontal' (default) +// +// callbacks: +// onChange(value) +// onSlide(value) +Control.Slider.prototype = { + initialize: function(handle, track, options) { + var slider = this; + + if (Object.isArray(handle)) { + this.handles = handle.collect( function(e) { return $(e) }); + } else { + this.handles = [$(handle)]; + } + + this.track = $(track); + this.options = options || { }; + + this.axis = this.options.axis || 'horizontal'; + this.increment = this.options.increment || 1; + this.step = parseInt(this.options.step || '1'); + this.range = this.options.range || $R(0,1); + + this.value = 0; // assure backwards compat + this.values = this.handles.map( function() { return 0 }); + this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false; + this.options.startSpan = $(this.options.startSpan || null); + this.options.endSpan = $(this.options.endSpan || null); + + this.restricted = this.options.restricted || false; + + this.maximum = this.options.maximum || this.range.end; + this.minimum = this.options.minimum || this.range.start; + + // Will be used to align the handle onto the track, if necessary + this.alignX = parseInt(this.options.alignX || '0'); + this.alignY = parseInt(this.options.alignY || '0'); + + this.trackLength = this.maximumOffset() - this.minimumOffset(); + + this.handleLength = this.isVertical() ? + (this.handles[0].offsetHeight != 0 ? + this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : + (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : + this.handles[0].style.width.replace(/px$/,"")); + + this.active = false; + this.dragging = false; + this.disabled = false; + + if (this.options.disabled) this.setDisabled(); + + // Allowed values array + this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; + if (this.allowedValues) { + this.minimum = this.allowedValues.min(); + this.maximum = this.allowedValues.max(); + } + + this.eventMouseDown = this.startDrag.bindAsEventListener(this); + this.eventMouseUp = this.endDrag.bindAsEventListener(this); + this.eventMouseMove = this.update.bindAsEventListener(this); + + // Initialize handles in reverse (make sure first handle is active) + this.handles.each( function(h,i) { + i = slider.handles.length-1-i; + slider.setValue(parseFloat( + (Object.isArray(slider.options.sliderValue) ? + slider.options.sliderValue[i] : slider.options.sliderValue) || + slider.range.start), i); + h.makePositioned().observe("mousedown", slider.eventMouseDown); + }); + + this.track.observe("mousedown", this.eventMouseDown); + document.observe("mouseup", this.eventMouseUp); + document.observe("mousemove", this.eventMouseMove); + + this.initialized = true; + }, + dispose: function() { + var slider = this; + Event.stopObserving(this.track, "mousedown", this.eventMouseDown); + Event.stopObserving(document, "mouseup", this.eventMouseUp); + Event.stopObserving(document, "mousemove", this.eventMouseMove); + this.handles.each( function(h) { + Event.stopObserving(h, "mousedown", slider.eventMouseDown); + }); + }, + setDisabled: function(){ + this.disabled = true; + }, + setEnabled: function(){ + this.disabled = false; + }, + getNearestValue: function(value){ + if (this.allowedValues){ + if (value >= this.allowedValues.max()) return(this.allowedValues.max()); + if (value <= this.allowedValues.min()) return(this.allowedValues.min()); + + var offset = Math.abs(this.allowedValues[0] - value); + var newValue = this.allowedValues[0]; + this.allowedValues.each( function(v) { + var currentOffset = Math.abs(v - value); + if (currentOffset <= offset){ + newValue = v; + offset = currentOffset; + } + }); + return newValue; + } + if (value > this.range.end) return this.range.end; + if (value < this.range.start) return this.range.start; + return value; + }, + setValue: function(sliderValue, handleIdx){ + if (!this.active) { + this.activeHandleIdx = handleIdx || 0; + this.activeHandle = this.handles[this.activeHandleIdx]; + this.updateStyles(); + } + handleIdx = handleIdx || this.activeHandleIdx || 0; + if (this.initialized && this.restricted) { + if ((handleIdx>0) && (sliderValuethis.values[handleIdx+1])) + sliderValue = this.values[handleIdx+1]; + } + sliderValue = this.getNearestValue(sliderValue); + this.values[handleIdx] = sliderValue; + this.value = this.values[0]; // assure backwards compat + + this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = + this.translateToPx(sliderValue); + + this.drawSpans(); + if (!this.dragging || !this.event) this.updateFinished(); + }, + setValueBy: function(delta, handleIdx) { + this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, + handleIdx || this.activeHandleIdx || 0); + }, + translateToPx: function(value) { + return Math.round( + ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * + (value - this.range.start)) + "px"; + }, + translateToValue: function(offset) { + return ((offset/(this.trackLength-this.handleLength) * + (this.range.end-this.range.start)) + this.range.start); + }, + getRange: function(range) { + var v = this.values.sortBy(Prototype.K); + range = range || 0; + return $R(v[range],v[range+1]); + }, + minimumOffset: function(){ + return(this.isVertical() ? this.alignY : this.alignX); + }, + maximumOffset: function(){ + return(this.isVertical() ? + (this.track.offsetHeight != 0 ? this.track.offsetHeight : + this.track.style.height.replace(/px$/,"")) - this.alignY : + (this.track.offsetWidth != 0 ? this.track.offsetWidth : + this.track.style.width.replace(/px$/,"")) - this.alignY); + }, + isVertical: function(){ + return (this.axis == 'vertical'); + }, + drawSpans: function() { + var slider = this; + if (this.spans) + $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) }); + if (this.options.startSpan) + this.setSpan(this.options.startSpan, + $R(0, this.values.length>1 ? this.getRange(0).min() : this.value )); + if (this.options.endSpan) + this.setSpan(this.options.endSpan, + $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum)); + }, + setSpan: function(span, range) { + if (this.isVertical()) { + span.style.top = this.translateToPx(range.start); + span.style.height = this.translateToPx(range.end - range.start + this.range.start); + } else { + span.style.left = this.translateToPx(range.start); + span.style.width = this.translateToPx(range.end - range.start + this.range.start); + } + }, + updateStyles: function() { + this.handles.each( function(h){ Element.removeClassName(h, 'selected') }); + Element.addClassName(this.activeHandle, 'selected'); + }, + startDrag: function(event) { + if (Event.isLeftClick(event)) { + if (!this.disabled){ + this.active = true; + + var handle = Event.element(event); + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var track = handle; + if (track==this.track) { + var offsets = Position.cumulativeOffset(this.track); + this.event = event; + this.setValue(this.translateToValue( + (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2) + )); + var offsets = Position.cumulativeOffset(this.activeHandle); + this.offsetX = (pointer[0] - offsets[0]); + this.offsetY = (pointer[1] - offsets[1]); + } else { + // find the handle (prevents issues with Safari) + while((this.handles.indexOf(handle) == -1) && handle.parentNode) + handle = handle.parentNode; + + if (this.handles.indexOf(handle)!=-1) { + this.activeHandle = handle; + this.activeHandleIdx = this.handles.indexOf(this.activeHandle); + this.updateStyles(); + + var offsets = Position.cumulativeOffset(this.activeHandle); + this.offsetX = (pointer[0] - offsets[0]); + this.offsetY = (pointer[1] - offsets[1]); + } + } + } + Event.stop(event); + } + }, + update: function(event) { + if (this.active) { + if (!this.dragging) this.dragging = true; + this.draw(event); + if (Prototype.Browser.WebKit) window.scrollBy(0,0); + Event.stop(event); + } + }, + draw: function(event) { + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var offsets = Position.cumulativeOffset(this.track); + pointer[0] -= this.offsetX + offsets[0]; + pointer[1] -= this.offsetY + offsets[1]; + this.event = event; + this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] )); + if (this.initialized && this.options.onSlide) + this.options.onSlide(this.values.length>1 ? this.values : this.value, this); + }, + endDrag: function(event) { + if (this.active && this.dragging) { + this.finishDrag(event, true); + Event.stop(event); + } + this.active = false; + this.dragging = false; + }, + finishDrag: function(event, success) { + this.active = false; + this.dragging = false; + this.updateFinished(); + }, + updateFinished: function() { + if (this.initialized && this.options.onChange) + this.options.onChange(this.values.length>1 ? this.values : this.value, this); + this.event = null; + } +} \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/static/javascripts/sound.js b/main/NOVA_0.4.5/templates/static/javascripts/sound.js new file mode 100644 index 0000000..1277b63 --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/sound.js @@ -0,0 +1,55 @@ +// script.aculo.us sound.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 + +// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// Based on code created by Jules Gravinese (http://www.webveteran.com/) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +Sound = { + tracks: {}, + _enabled: true, + template: + new Template(''), + enable: function(){ + Sound._enabled = true; + }, + disable: function(){ + Sound._enabled = false; + }, + play: function(url){ + if(!Sound._enabled) return; + var options = Object.extend({ + track: 'global', url: url, replace: false + }, arguments[1] || {}); + + if(options.replace && this.tracks[options.track]) { + $R(0, this.tracks[options.track].id).each(function(id){ + var sound = $('sound_'+options.track+'_'+id); + sound.Stop && sound.Stop(); + sound.remove(); + }) + this.tracks[options.track] = null; + } + + if(!this.tracks[options.track]) + this.tracks[options.track] = { id: 0 } + else + this.tracks[options.track].id++; + + options.id = this.tracks[options.track].id; + $$('body')[0].insert( + Prototype.Browser.IE ? new Element('bgsound',{ + id: 'sound_'+options.track+'_'+options.id, + src: options.url, loop: 1, autostart: true + }) : Sound.template.evaluate(options)); + } +}; + +if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){ + if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 })) + Sound.template = new Template('') + else + Sound.play = function(){} +} diff --git a/main/NOVA_0.4.5/templates/static/javascripts/unittest.js b/main/NOVA_0.4.5/templates/static/javascripts/unittest.js new file mode 100644 index 0000000..b5e9005 --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/javascripts/unittest.js @@ -0,0 +1,568 @@ +// script.aculo.us unittest.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 + +// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com) +// (c) 2005-2007 Michael Schuerig (http://www.schuerig.de/michael/) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// experimental, Firefox-only +Event.simulateMouse = function(element, eventName) { + var options = Object.extend({ + pointerX: 0, + pointerY: 0, + buttons: 0, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false + }, arguments[2] || {}); + var oEvent = document.createEvent("MouseEvents"); + oEvent.initMouseEvent(eventName, true, true, document.defaultView, + options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, + options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element)); + + if(this.mark) Element.remove(this.mark); + this.mark = document.createElement('div'); + this.mark.appendChild(document.createTextNode(" ")); + document.body.appendChild(this.mark); + this.mark.style.position = 'absolute'; + this.mark.style.top = options.pointerY + "px"; + this.mark.style.left = options.pointerX + "px"; + this.mark.style.width = "5px"; + this.mark.style.height = "5px;"; + this.mark.style.borderTop = "1px solid red;" + this.mark.style.borderLeft = "1px solid red;" + + if(this.step) + alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options)); + + $(element).dispatchEvent(oEvent); +}; + +// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2. +// You need to downgrade to 1.0.4 for now to get this working +// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much +Event.simulateKey = function(element, eventName) { + var options = Object.extend({ + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: 0, + charCode: 0 + }, arguments[2] || {}); + + var oEvent = document.createEvent("KeyEvents"); + oEvent.initKeyEvent(eventName, true, true, window, + options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, + options.keyCode, options.charCode ); + $(element).dispatchEvent(oEvent); +}; + +Event.simulateKeys = function(element, command) { + for(var i=0; i' + + '' + + '' + + '' + + '
    StatusTestMessage
    '; + this.logsummary = $('logsummary') + this.loglines = $('loglines'); + }, + _toHTML: function(txt) { + return txt.escapeHTML().replace(/\n/g,"
    "); + }, + addLinksToResults: function(){ + $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log + td.title = "Run only this test" + Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;}); + }); + $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log + td.title = "Run all tests" + Event.observe(td, 'click', function(){ window.location.search = "";}); + }); + } +} + +Test.Unit.Runner = Class.create(); +Test.Unit.Runner.prototype = { + initialize: function(testcases) { + this.options = Object.extend({ + testLog: 'testlog' + }, arguments[1] || {}); + this.options.resultsURL = this.parseResultsURLQueryParameter(); + this.options.tests = this.parseTestsQueryParameter(); + if (this.options.testLog) { + this.options.testLog = $(this.options.testLog) || null; + } + if(this.options.tests) { + this.tests = []; + for(var i = 0; i < this.options.tests.length; i++) { + if(/^test/.test(this.options.tests[i])) { + this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"])); + } + } + } else { + if (this.options.test) { + this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])]; + } else { + this.tests = []; + for(var testcase in testcases) { + if(/^test/.test(testcase)) { + this.tests.push( + new Test.Unit.Testcase( + this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, + testcases[testcase], testcases["setup"], testcases["teardown"] + )); + } + } + } + } + this.currentTest = 0; + this.logger = new Test.Unit.Logger(this.options.testLog); + setTimeout(this.runTests.bind(this), 1000); + }, + parseResultsURLQueryParameter: function() { + return window.location.search.parseQuery()["resultsURL"]; + }, + parseTestsQueryParameter: function(){ + if (window.location.search.parseQuery()["tests"]){ + return window.location.search.parseQuery()["tests"].split(','); + }; + }, + // Returns: + // "ERROR" if there was an error, + // "FAILURE" if there was a failure, or + // "SUCCESS" if there was neither + getResult: function() { + var hasFailure = false; + for(var i=0;i 0) { + return "ERROR"; + } + if (this.tests[i].failures > 0) { + hasFailure = true; + } + } + if (hasFailure) { + return "FAILURE"; + } else { + return "SUCCESS"; + } + }, + postResults: function() { + if (this.options.resultsURL) { + new Ajax.Request(this.options.resultsURL, + { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false }); + } + }, + runTests: function() { + var test = this.tests[this.currentTest]; + if (!test) { + // finished! + this.postResults(); + this.logger.summary(this.summary()); + return; + } + if(!test.isWaiting) { + this.logger.start(test.name); + } + test.run(); + if(test.isWaiting) { + this.logger.message("Waiting for " + test.timeToWait + "ms"); + setTimeout(this.runTests.bind(this), test.timeToWait || 1000); + } else { + this.logger.finish(test.status(), test.summary()); + this.currentTest++; + // tail recursive, hopefully the browser will skip the stackframe + this.runTests(); + } + }, + summary: function() { + var assertions = 0; + var failures = 0; + var errors = 0; + var messages = []; + for(var i=0;i 0) return 'failed'; + if (this.errors > 0) return 'error'; + return 'passed'; + }, + assert: function(expression) { + var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"'; + try { expression ? this.pass() : + this.fail(message); } + catch(e) { this.error(e); } + }, + assertEqual: function(expected, actual) { + var message = arguments[2] || "assertEqual"; + try { (expected == actual) ? this.pass() : + this.fail(message + ': expected "' + Test.Unit.inspect(expected) + + '", actual "' + Test.Unit.inspect(actual) + '"'); } + catch(e) { this.error(e); } + }, + assertInspect: function(expected, actual) { + var message = arguments[2] || "assertInspect"; + try { (expected == actual.inspect()) ? this.pass() : + this.fail(message + ': expected "' + Test.Unit.inspect(expected) + + '", actual "' + Test.Unit.inspect(actual) + '"'); } + catch(e) { this.error(e); } + }, + assertEnumEqual: function(expected, actual) { + var message = arguments[2] || "assertEnumEqual"; + try { $A(expected).length == $A(actual).length && + expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ? + this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + + ', actual ' + Test.Unit.inspect(actual)); } + catch(e) { this.error(e); } + }, + assertNotEqual: function(expected, actual) { + var message = arguments[2] || "assertNotEqual"; + try { (expected != actual) ? this.pass() : + this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); } + catch(e) { this.error(e); } + }, + assertIdentical: function(expected, actual) { + var message = arguments[2] || "assertIdentical"; + try { (expected === actual) ? this.pass() : + this.fail(message + ': expected "' + Test.Unit.inspect(expected) + + '", actual "' + Test.Unit.inspect(actual) + '"'); } + catch(e) { this.error(e); } + }, + assertNotIdentical: function(expected, actual) { + var message = arguments[2] || "assertNotIdentical"; + try { !(expected === actual) ? this.pass() : + this.fail(message + ': expected "' + Test.Unit.inspect(expected) + + '", actual "' + Test.Unit.inspect(actual) + '"'); } + catch(e) { this.error(e); } + }, + assertNull: function(obj) { + var message = arguments[1] || 'assertNull' + try { (obj==null) ? this.pass() : + this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); } + catch(e) { this.error(e); } + }, + assertMatch: function(expected, actual) { + var message = arguments[2] || 'assertMatch'; + var regex = new RegExp(expected); + try { (regex.exec(actual)) ? this.pass() : + this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); } + catch(e) { this.error(e); } + }, + assertHidden: function(element) { + var message = arguments[1] || 'assertHidden'; + this.assertEqual("none", element.style.display, message); + }, + assertNotNull: function(object) { + var message = arguments[1] || 'assertNotNull'; + this.assert(object != null, message); + }, + assertType: function(expected, actual) { + var message = arguments[2] || 'assertType'; + try { + (actual.constructor == expected) ? this.pass() : + this.fail(message + ': expected "' + Test.Unit.inspect(expected) + + '", actual "' + (actual.constructor) + '"'); } + catch(e) { this.error(e); } + }, + assertNotOfType: function(expected, actual) { + var message = arguments[2] || 'assertNotOfType'; + try { + (actual.constructor != expected) ? this.pass() : + this.fail(message + ': expected "' + Test.Unit.inspect(expected) + + '", actual "' + (actual.constructor) + '"'); } + catch(e) { this.error(e); } + }, + assertInstanceOf: function(expected, actual) { + var message = arguments[2] || 'assertInstanceOf'; + try { + (actual instanceof expected) ? this.pass() : + this.fail(message + ": object was not an instance of the expected type"); } + catch(e) { this.error(e); } + }, + assertNotInstanceOf: function(expected, actual) { + var message = arguments[2] || 'assertNotInstanceOf'; + try { + !(actual instanceof expected) ? this.pass() : + this.fail(message + ": object was an instance of the not expected type"); } + catch(e) { this.error(e); } + }, + assertRespondsTo: function(method, obj) { + var message = arguments[2] || 'assertRespondsTo'; + try { + (obj[method] && typeof obj[method] == 'function') ? this.pass() : + this.fail(message + ": object doesn't respond to [" + method + "]"); } + catch(e) { this.error(e); } + }, + assertReturnsTrue: function(method, obj) { + var message = arguments[2] || 'assertReturnsTrue'; + try { + var m = obj[method]; + if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; + m() ? this.pass() : + this.fail(message + ": method returned false"); } + catch(e) { this.error(e); } + }, + assertReturnsFalse: function(method, obj) { + var message = arguments[2] || 'assertReturnsFalse'; + try { + var m = obj[method]; + if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; + !m() ? this.pass() : + this.fail(message + ": method returned true"); } + catch(e) { this.error(e); } + }, + assertRaise: function(exceptionName, method) { + var message = arguments[2] || 'assertRaise'; + try { + method(); + this.fail(message + ": exception expected but none was raised"); } + catch(e) { + ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); + } + }, + assertElementsMatch: function() { + var expressions = $A(arguments), elements = $A(expressions.shift()); + if (elements.length != expressions.length) { + this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions'); + return false; + } + elements.zip(expressions).all(function(pair, index) { + var element = $(pair.first()), expression = pair.last(); + if (element.match(expression)) return true; + this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect()); + }.bind(this)) && this.pass(); + }, + assertElementMatches: function(element, expression) { + this.assertElementsMatch([element], expression); + }, + benchmark: function(operation, iterations) { + var startAt = new Date(); + (iterations || 1).times(operation); + var timeTaken = ((new Date())-startAt); + this.info((arguments[2] || 'Operation') + ' finished ' + + iterations + ' iterations in ' + (timeTaken/1000)+'s' ); + return timeTaken; + }, + _isVisible: function(element) { + element = $(element); + if(!element.parentNode) return true; + this.assertNotNull(element); + if(element.style && Element.getStyle(element, 'display') == 'none') + return false; + + return this._isVisible(element.parentNode); + }, + assertNotVisible: function(element) { + this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1])); + }, + assertVisible: function(element) { + this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1])); + }, + benchmark: function(operation, iterations) { + var startAt = new Date(); + (iterations || 1).times(operation); + var timeTaken = ((new Date())-startAt); + this.info((arguments[2] || 'Operation') + ' finished ' + + iterations + ' iterations in ' + (timeTaken/1000)+'s' ); + return timeTaken; + } +} + +Test.Unit.Testcase = Class.create(); +Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), { + initialize: function(name, test, setup, teardown) { + Test.Unit.Assertions.prototype.initialize.bind(this)(); + this.name = name; + + if(typeof test == 'string') { + test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,'); + test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)'); + this.test = function() { + eval('with(this){'+test+'}'); + } + } else { + this.test = test || function() {}; + } + + this.setup = setup || function() {}; + this.teardown = teardown || function() {}; + this.isWaiting = false; + this.timeToWait = 1000; + }, + wait: function(time, nextPart) { + this.isWaiting = true; + this.test = nextPart; + this.timeToWait = time; + }, + run: function() { + try { + try { + if (!this.isWaiting) this.setup.bind(this)(); + this.isWaiting = false; + this.test.bind(this)(); + } finally { + if(!this.isWaiting) { + this.teardown.bind(this)(); + } + } + } + catch(e) { this.error(e); } + } +}); + +// *EXPERIMENTAL* BDD-style testing to please non-technical folk +// This draws many ideas from RSpec http://rspec.rubyforge.org/ + +Test.setupBDDExtensionMethods = function(){ + var METHODMAP = { + shouldEqual: 'assertEqual', + shouldNotEqual: 'assertNotEqual', + shouldEqualEnum: 'assertEnumEqual', + shouldBeA: 'assertType', + shouldNotBeA: 'assertNotOfType', + shouldBeAn: 'assertType', + shouldNotBeAn: 'assertNotOfType', + shouldBeNull: 'assertNull', + shouldNotBeNull: 'assertNotNull', + + shouldBe: 'assertReturnsTrue', + shouldNotBe: 'assertReturnsFalse', + shouldRespondTo: 'assertRespondsTo' + }; + var makeAssertion = function(assertion, args, object) { + this[assertion].apply(this,(args || []).concat([object])); + } + + Test.BDDMethods = {}; + $H(METHODMAP).each(function(pair) { + Test.BDDMethods[pair.key] = function() { + var args = $A(arguments); + var scope = args.shift(); + makeAssertion.apply(scope, [pair.value, args, this]); }; + }); + + [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each( + function(p){ Object.extend(p, Test.BDDMethods) } + ); +} + +Test.context = function(name, spec, log){ + Test.setupBDDExtensionMethods(); + + var compiledSpec = {}; + var titles = {}; + for(specName in spec) { + switch(specName){ + case "setup": + case "teardown": + compiledSpec[specName] = spec[specName]; + break; + default: + var testName = 'test'+specName.gsub(/\s+/,'-').camelize(); + var body = spec[specName].toString().split('\n').slice(1); + if(/^\{/.test(body[0])) body = body.slice(1); + body.pop(); + body = body.map(function(statement){ + return statement.strip() + }); + compiledSpec[testName] = body.join('\n'); + titles[testName] = specName; + } + } + new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name }); +}; \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/static/stylesheets/default.css b/main/NOVA_0.4.5/templates/static/stylesheets/default.css new file mode 100644 index 0000000..7afc756 --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/stylesheets/default.css @@ -0,0 +1,218 @@ +body { + background-color: #000; + color: #FFF; + font-family: 'Verdana', 'Helvetica', 'Sans-serif', 'sans'; + font-size: 12px; + line-height: 18px; + padding: 15px; + margin: 0px; +} + +a { + text-decoration: none; + color: #000000; +} + +form { + margin: 0px; + padding: 0px; + border: none; + display: inline: +} +legend { + font-weight: bold; + color: #c32ee4; +} +div.EntryBlock { + display: inline; +} +div.EntryBlock form { + display: inline; +} +fieldset.EntryFieldSet { + vertical-align: top; + display: inline; + padding: 7px; + margin: 5px; +} +.MainMenu a { + font-weight: bold; + color: #4e4e4e; + padding: 1px; + text-decoration: none; + border: 1px solid #eeeeee; + margin: 9px; +} + +.SubMenu a { + font-weight: bold; + color: #000000; + padding: 1px; + text-decoration: none; + border: 1px solid #b5b5b5; + margin: 9px; +} +a:hover { + background-color: #F0E68C; +} + +a.current { + color: #fff; + border: none; + background-color: #b5b5b5; + padding: 3px; + padding-bottom: 7px; +} +a.current:hover { + border: none; + background-color: #b5b5b5; +} + + +.block { + padding: 10px; +} + +.blockWithBorder { + display: block; + border-width: thin; + border-style: solid; + border-color: #b5b5b5; + background-color: #eeeeee; + padding: 5px; +} + +.MainMenu { + display: block; + border-width: 1px; + border-style: solid; + border-color: #b5b5b5; + background-color: #eeeeee; + padding: 5px; + +} +.SubMenu { + display: block; + background-color: #b5b5b5; + padding: 5px; +} + +table { + font-size: 9pt; + color: black; + margin: 0px; +} +td, td { + padding: 5px; +} +th { + background: #b5b5b5; + color: white; + font-weight: bold; +} + +tr.even{ + background-color: #cdf; +} + +tr.evenLine { + background-color: #eee; +} + +tr.odd { + background-color: #99bbff; +} + +tr.oddLine { + background-color: #f8f8f8; +} + +tr.active { + font-weight: bold; +} + +tr.finished { + font-weight: normal; +} + +tr.waiting { + font-style: italic; +} + +td.pre { + font-size: 13px; + font-family: 'courier new',courier,serif; + font-weight: bold; +} + +h1 { + text-align: left; + font-size: 19px; + font-weight: normal; + border-bottom: 1px solid #b5b5b5; + padding-bottom: 0px; +} +* html h1 { + padding-bottom: 2px; +} +h2 { + font-size: 18px; + font-weight: bold; +} +#first { + font-size: 33px; + font-family: Arial, Helvetica, sans-serif; + font-weight: bold ; + color: #c32ee4; + text-transform: uppercase; + padding-left: 20px; +} + +#second { + font-size: 30px; + font-family: Arial, Helvetica, sans-serif; + font-style: italic; + color: #99bbff; + text-transform: lowercase; +} + +#catchfrase { + display: block; + position: relative; + top: -18px; + float: right; + text-align: right; + font-size: 10px; + font-weight: normal; +} +.footer { + text-align: center; + background-color: #000; +border:1px; + padding-bottom: 5px; + margin-top: 20px; + border-top: 1px solid #b5b5b5; +} + +#progressBar { + background-color: #cdf; + border: 1px solid blue; + height: 6px; + width: 90%; + margin: 0px; + margin-left: auto; + margin-right: auto; + padding: 0px; + text-align: left; +} + +* html #progressBar { + height: 8px; + he\ight: 6px; +} + +#percentageBar { + position: relative; + background-color: #9bf; + height: 6px; +} diff --git a/main/NOVA_0.4.5/templates/static/stylesheets/lytebox.css b/main/NOVA_0.4.5/templates/static/stylesheets/lytebox.css new file mode 100644 index 0000000..76b3f6f --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/stylesheets/lytebox.css @@ -0,0 +1,93 @@ +#lbOverlay { position: fixed; top: 0; left: 0; z-index: 99998; width: 100%; height: 500px; } + #lbOverlay.grey { background-color: #000000; } + #lbOverlay.red { background-color: #330000; } + #lbOverlay.green { background-color: #003300; } + #lbOverlay.blue { background-color: #011D50; } + #lbOverlay.gold { background-color: #666600; } + +#lbMain { position: absolute; left: 0; width: 100%; z-index: 99999; text-align: center; line-height: 0; } +#lbMain a img { border: none; } + +#lbOuterContainer { position: relative; background-color: #fff; width: 200px; height: 200px; margin: 0 auto; } + #lbOuterContainer.grey { border: 3px solid #888888; } + #lbOuterContainer.red { border: 3px solid #DD0000; } + #lbOuterContainer.green { border: 3px solid #00B000; } + #lbOuterContainer.blue { border: 3px solid #5F89D8; } + #lbOuterContainer.gold { border: 3px solid #B0B000; } + +#lbDetailsContainer { font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; width: 100%; line-height: 1.4em; overflow: auto; margin: 0 auto; } + #lbDetailsContainer.grey { border: 3px solid #888888; border-top: none; } + #lbDetailsContainer.red { border: 3px solid #DD0000; border-top: none; } + #lbDetailsContainer.green { border: 3px solid #00B000; border-top: none; } + #lbDetailsContainer.blue { border: 3px solid #5F89D8; border-top: none; } + #lbDetailsContainer.gold { border: 3px solid #B0B000; border-top: none; } + +#lbImageContainer, #lbIframeContainer { padding: 10px; } +#lbLoading { + position: absolute; top: 45%; left: 0%; height: 32px; width: 100%; text-align: center; line-height: 0; background: url(../images/loading.gif) center no-repeat; +} + +#lbHoverNav { position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; } +#lbImageContainer>#lbHoverNav { left: 0; } +#lbHoverNav a { outline: none; } + +#lbPrev { width: 49%; height: 100%; background: transparent url(../images/blank.gif) no-repeat; display: block; left: 0; float: left; } + #lbPrev.grey:hover, #lbPrev.grey:visited:hover { background: url(../images/prev_grey.gif) left 15% no-repeat; } + #lbPrev.red:hover, #lbPrev.red:visited:hover { background: url(../images/prev_red.gif) left 15% no-repeat; } + #lbPrev.green:hover, #lbPrev.green:visited:hover { background: url(../images/prev_green.gif) left 15% no-repeat; } + #lbPrev.blue:hover, #lbPrev.blue:visited:hover { background: url(../images/prev_blue.gif) left 15% no-repeat; } + #lbPrev.gold:hover, #lbPrev.gold:visited:hover { background: url(../images/prev_gold.gif) left 15% no-repeat; } + +#lbNext { width: 49%; height: 100%; background: transparent url(../images/blank.gif) no-repeat; display: block; right: 0; float: right; } + #lbNext.grey:hover, #lbNext.grey:visited:hover { background: url(../images/next_grey.gif) right 15% no-repeat; } + #lbNext.red:hover, #lbNext.red:visited:hover { background: url(../images/next_red.gif) right 15% no-repeat; } + #lbNext.green:hover, #lbNext.green:visited:hover { background: url(../images/next_green.gif) right 15% no-repeat; } + #lbNext.blue:hover, #lbNext.blue:visited:hover { background: url(../images/next_blue.gif) right 15% no-repeat; } + #lbNext.gold:hover, #lbNext.gold:visited:hover { background: url(../images/next_gold.gif) right 15% no-repeat; } + +#lbPrev2, #lbNext2 { text-decoration: none; font-weight: bold; } + #lbPrev2.grey, #lbNext2.grey, #lbSpacer.grey { color: #333333; } + #lbPrev2.red, #lbNext2.red, #lbSpacer.red { color: #620000; } + #lbPrev2.green, #lbNext2.green, #lbSpacer.green { color: #003300; } + #lbPrev2.blue, #lbNext2.blue, #lbSpacer.blue { color: #01379E; } + #lbPrev2.gold, #lbNext2.gold, #lbSpacer.gold { color: #666600; } + +#lbPrev2_Off, #lbNext2_Off { font-weight: bold; } + #lbPrev2_Off.grey, #lbNext2_Off.grey { color: #CCCCCC; } + #lbPrev2_Off.red, #lbNext2_Off.red { color: #FFCCCC; } + #lbPrev2_Off.green, #lbNext2_Off.green { color: #82FF82; } + #lbPrev2_Off.blue, #lbNext2_Off.blue { color: #B7CAEE; } + #lbPrev2_Off.gold, #lbNext2_Off.gold { color: #E1E100; } + +#lbDetailsData { padding: 0 10px; } + #lbDetailsData.grey { color: #333333; } + #lbDetailsData.red { color: #620000; } + #lbDetailsData.green { color: #003300; } + #lbDetailsData.blue { color: #01379E; } + #lbDetailsData.gold { color: #666600; } + +#lbDetails { width: 60%; float: left; text-align: left; } +#lbCaption { display: block; font-weight: bold; } +#lbNumberDisplay { float: left; display: block; padding-bottom: 1.0em; } +#lbNavDisplay { float: left; display: block; padding-bottom: 1.0em; } + +#lbClose { width: 64px; height: 28px; float: right; margin-bottom: 1px; } + #lbClose.grey { background: url(../images/close_grey.png) no-repeat; } + #lbClose.red { background: url(../images/close_red.png) no-repeat; } + #lbClose.green { background: url(../images/close_green.png) no-repeat; } + #lbClose.blue { background: url(../images/close_blue.png) no-repeat; } + #lbClose.gold { background: url(../images/close_gold.png) no-repeat; } + +#lbPlay { width: 64px; height: 28px; float: right; margin-bottom: 1px; } + #lbPlay.grey { background: url(../images/play_grey.png) no-repeat; } + #lbPlay.red { background: url(../images/play_red.png) no-repeat; } + #lbPlay.green { background: url(../images/play_green.png) no-repeat; } + #lbPlay.blue { background: url(../images/play_blue.png) no-repeat; } + #lbPlay.gold { background: url(../images/play_gold.png) no-repeat; } + +#lbPause { width: 64px; height: 28px; float: right; margin-bottom: 1px; } + #lbPause.grey { background: url(../images/pause_grey.png) no-repeat; } + #lbPause.red { background: url(../images/pause_red.png) no-repeat; } + #lbPause.green { background: url(../images/pause_green.png) no-repeat; } + #lbPause.blue { background: url(../images/pause_blue.png) no-repeat; } + #lbPause.gold { background: url(../images/pause_gold.png) no-repeat; } \ No newline at end of file diff --git a/main/NOVA_0.4.5/templates/static/stylesheets/nova.css b/main/NOVA_0.4.5/templates/static/stylesheets/nova.css new file mode 100644 index 0000000..6b15479 --- /dev/null +++ b/main/NOVA_0.4.5/templates/static/stylesheets/nova.css @@ -0,0 +1,514 @@ +/* ------------------------------------------------------------------------------------------------------------------ +--------------------------------------------------------------------------------------------------------------------- + + + Filename: master.css + Author: Dana Woodman + Site: www.sabnzbd.organixdesign.com + Date: 06/15/2007 + Version: 0.4 + Notes: + - + - + - + +--------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------ */ + + +/* =================================================================================================================== + + H T M L + +=================================================================================================================== */ + + +/* Universal Selector +------------------------------------------------------------------- */ +* {margin: 0; padding: 0; border: none;} + + +/* Body +------------------------------------------------------------------- */ +body { + font: small Arial, Helvetica, sans-serif; + background-image: url(../images/bg_lonelyhearts.png); + background-repeat: repeat; + cursor:default; +} +html, body { + margin: 0; + padding: 0; + height: 100%; +} + + +/* Links +------------------------------------------------------------------- */ +a {color: #BBD0DF;} +a:hover {} + + +/* Forms +------------------------------------------------------------------- */ +input, textarea, select, option { + padding: 1px; +} +input[type="submit"] {} + +input.button { + padding: 2px 4px; + font-weight: bold; + color: #032F54; + background: none url(none); +} + + +/* Headings +------------------------------------------------------------------- */ +h1 {} +h2 {} +h3 { + color: #FFFFFF; + margin-bottom: 5px; + text-transform: uppercase; +} +h4 {} +h5 {} +h6 {} + + + + +/* =================================================================================================================== + + L A Y O U T + +=================================================================================================================== */ + + +/* Container +------------------------------------------------------------------- */ +#container { + height: 100%; +} + + +/* Top Bar +------------------------------------------------------------------- */ +div .topBar { + background: #021D33 url(../images/bg_topBar.png) repeat-x left bottom; + text-align: right; + float: left; + width: 100%; + border-bottom: 1px solid #000000; + border-top: 1px solid #033258; +} + + +/* Top Bar +------------------------------------------------------------------- */ +#logo { + float: left; + padding: 3px; + font-weight: bold; + color: #F78614; + margin-left: 20px; + display: inline; + font-size: 135%; +} +#logo a { + font-size: 140%; + color: #F78614; + text-decoration: none; + line-height: 1em; + font-weight: bold; +} +#logo a:hover { + background:#000; +} + + +/* Top Bar Links +------------------------------------------------------------------- */ +#topLinks {float: right;} +#topLinks a { + color: #00CCFF; + padding: 5px 15px; + display: block; + float: left; + text-decoration: none; + font-weight: bold; + font-style: italic; +} +#topLinks span { + color: #00CCFF; + padding: 5px 15px; + display: block; + float: left; + text-decoration: none; + font-weight: bold; + font-style: italic; +} +#topLinks a:hover { + color: #0099FF; + text-decoration: none; + background: #000000; + cursor:pointer; +} +#topLinks a b { + color: #FFFFFF; + position: relative; +} +#topLinks a b em { + color: #00FF00; + font-weight: bold; + font-size: 180%; + line-height: 0; +} +#topLinks a:hover b {color: #D0E9FD;} +#topLinks a strong {color: #FFCC00;} +#topLinks a:hover strong {color: #FF9900;} + + +/* Data Bar +------------------------------------------------------------------- */ +#dataBar { + background: #074273 url(../images/bg_dataBar.png) repeat-x left bottom; + float: left; + width: 100%; + border-top: 1px solid #0C6BBA; + border-bottom: 2px solid #000000; +} +#dataBar strong {letter-spacing: .15em;} +#dataBar b {letter-spacing: .1em;} + + +/* Download Info +------------------------------------------------------------------- */ +#downloadInfo { + color: #91CAF9; + padding-left: 14px; + padding-top: 6px; + float: left;05px; +} +#downloadInfo p { + margin-top: 3px; + margin-bottom: 3px; +} +#downloadInfo strong { + color: #FFCC00; + margin-right: 15px; +} +#downloadInfo b { + color: #FFFEFB; +} + + +/* Download Statistics +------------------------------------------------------------------- */ +#downloadStats { + padding: 5px; + float: left; + margin-left: 0px; + width: 600px; + padding-left: 40px; +} +/* Download Bar */ +#downloadBar { + height: 20px; + border: 1px solid #BFDFF9; + background: #031D32; + margin-bottom: 4px; + float: left; + width: 100%; +} +#statusbar { + height: 20px; + background: #F78614 url(../images/bg_downloaded.png) repeat left bottom; + border-right: 1px solid #BFDFF9; + font-weight: bold; +} +/* The percentage downloaded within the download bar */ +#downloadBar span { + color: #FFFFFF; + float: right; + margin-top: -3px; + font-size: 210%; + line-height: 1em; + font-weight: bold; + font-style: italic; +} +/* Download data - the speed and time left */ +#downloadData { + color: #91CAF9; + float: left; + width: 600px; + margin-left: -30px; + margin-right: -40px; +} +.dlSpeed { + float: left; +} +.dlSpeed b { + margin-left: 3px; + color: #FFFFFF; +} +.dlMB { +} +.dlMB b { + margin-left: 3px; + color: #FFFFFF; +} +.dlTime { + float: right; +} +.dlTime b { + margin-left: 3px; + color: #FFFFFF; +} + + +/* Layout Switcher +------------------------------------------------------------------- */ +#layoutSwitcher { + float: left; + padding: 4px; + margin-left: 6px; +} +#layoutSwitcher a img {padding: 2px;} + + + +/* Download Table +------------------------------------------------------------------- */ +#downloadContainer { + float: left; + width: 100%; +} +#downloadTable td {vertical-align: middle;} + + +/* Queue and History +------------------------------------------------------------------- */ +#queue_container, #history_container {float:left; padding-left:3px; padding-top:3px; } + + + + + +/* =================================================================================================================== + + C L A S S E S + +=================================================================================================================== */ + + +/* Tables +------------------------------------------------------------------- */ +.table { +} +.table input, table select {font-size: 90%; margin: 0; padding: 0;} +.table form {display: inline;} +.table thead {} +.table thead tr { + background: #021D33 url(../images/bg_thead_tr.png) repeat-x left bottom; + color: #FFF; + text-align: left; +} +.table thead td, thead th { + width: 400px; + white-space: nowrap; +} +.table thead a { + color: #FFF; + text-decoration: none; + padding: 5px 5px; + font-weight: bold; + font-style: italic; + float: right; +} +.table thead a:hover { + color: #FFF; + text-decoration: dotted; + background: #000000; + cursor:pointer; +} +.table thead div.heading { + background: #021D33 url(../images/bg_thead_tr_heading.png) repeat-x left bottom; + float: left; + padding: 3px; + font-weight: bold; + color: #FFF; + display: inline; + font-size: 140%; + text-decoration: none; + line-height: 1em; +} +.table thead a.toggled { + background: #021D33 url(../images/bg_thead_tr_heading.png) repeat-x left bottom; +} +.table thead a.untoggled { +} +.table tbody {} +.table tbody tr { +} +.table tbody tr:hover {background: #FFF url(../images/bg_tr_hover.png) repeat-x left bottom;} +.table tbody td { + border-bottom: 1px solid #B4DFFB; + border-right: 1px solid #B4DFFB; + white-space: nowrap; + padding: 0 4px; + vertical-align: middle; + text-align: left; + +} +.table tbody td strong { + font-family: "Trebuchet MS", Arial, Helvetica, Sans-serif; + color: #FF4900; +} +.table tbody td b { + color: #2B4D80; +} +.table tbody td small { + color: #A899AB; +} +.table tbody .odd {background: #FFFFFF url(../images/bg_tr_odd.png) repeat-x left bottom;} +.table tbody .even {background: #012F54;} +.table tbody a { + color: #fff; + font-weight: bold; + text-decoration: none; + position: relative; +} +.table tbody a:hover {color: #FFCC00;} + + + +/* TOOLTIPS + +.table tbody a .tooltip { + display: none; + color: #0D8DF7; + border: 2px solid #63B6FA; +} +.table tbody .tooltip b {color: #032F54;} +.table tbody a:hover .tooltip { + background: #fff; + display: block; + padding: 10px; + float: left; + position: absolute; + top: 15px; + left: 0; + z-index: 20; +} +*/ + + +.table tbody .title { + color: #EFD18D; + font-size: 115%; +} +.table tbody .title:hover {color: #FF6600;} +.table tbody strong {} +.table tbody b {color: #FFF;} +.table tbody em {} +.table tbody i {} + +.table tfoot {} +.table tfoot tr {} +.table tfoot td, tfoot td {} + + + + +/* Queue Progress Bar +------------------------------------------------------------------- */ +.queueBarOuter { + width: 100%; + height: 5px !important; + height: 2px; + margin-top: 5px; + margin-bottom: 5px; + padding: 0px; + border: 1px solid #186B98; + background: #FFF; + text-align: left; +} +.queueBarInner { + background: #2399D8 url(../images/bg_downloaded_minibar.png) repeat left top; + height: 5px !important; + height: 2px; + margin: 0; + padding: 0; +} + + +/* Action Panel +------------------------------------------------------------------- */ +.actionPanel span {padding-top: 5px;} + + +/* Content Padding +------------------------------------------------------------------- */ +.contentPad {padding: 5px;} + + +/* Alignment +------------------------------------------------------------------- */ +.textCenter {text-align: center;} +.textLeft {text-align: left;} +.textRight {text-align: right;} + + +/* Display Helpers +------------------------------------------------------------------- */ +.block {display: block;} + + + + + + + + + + + + +/* Clearfix +------------------------------------------------------------------- */ +#container:after, +.subMenu:after, +#dataBar:after, +#downloadTable:after { + content: " "; + display: block; + clear: both; +} + +li { + margin: -1px auto; + margin-left:0px; + padding: 0px; + border: 1px dotted #3DABF5; + background-color: #F2F6FF; + color: #2B4D80; + clear:both; + list-style-type: none; +} +.nzb_mb { + float: right; + font-style: italic; + cursor: crosshair; +} +.nzbfile { + font-size: 10px; + margin: -1px auto; + padding: 0px; + width: 100%; + background-color: #DBFFAA; + border: 1px dotted #2B4D80; + clear:both; +} \ No newline at end of file