Running in Drupal 7.
authorJason Skomorowski <jason@indexdata.com>
Wed, 16 Feb 2011 05:12:01 +0000 (06:12 +0100)
committerJason Skomorowski <jason@indexdata.com>
Wed, 16 Feb 2011 05:12:01 +0000 (06:12 +0100)
LICENSE [deleted file]
README [deleted file]
jquery.ba-bbq.js [deleted file]
mkdru.info
mkdru.install
mkdru.module

diff --git a/LICENSE b/LICENSE
deleted file mode 100644 (file)
index 3912109..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,340 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-\f
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-\f
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-\f
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-\f
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                           NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-\f
-           How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/README b/README
deleted file mode 100644 (file)
index 45d7fc6..0000000
--- a/README
+++ /dev/null
@@ -1,7 +0,0 @@
-A Drupal integration module providing a UI for Pazpar2.
-
-Pazpar2 is a high-performance, user interface-independent, data
-model-independent metasearching middleware featuring merging, relevance
-ranking, record sorting, and faceted results.
-
-Copyright (C) 2011 Index Data. See the file LICENSE for details.
diff --git a/jquery.ba-bbq.js b/jquery.ba-bbq.js
deleted file mode 100644 (file)
index 3a5995d..0000000
+++ /dev/null
@@ -1,1377 +0,0 @@
-/*!
- * jQuery BBQ: Back Button & Query Library - v1.3pre - 8/26/2010
- * http://benalman.com/projects/jquery-bbq-plugin/
- * 
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-
-// Script: jQuery BBQ: Back Button & Query Library
-//
-// *Version: 1.3pre, Last updated: 8/26/2010*
-// 
-// Project Home - http://benalman.com/projects/jquery-bbq-plugin/
-// GitHub       - http://github.com/cowboy/jquery-bbq/
-// Source       - http://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.js
-// (Minified)   - http://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.min.js (2.2kb gzipped)
-// 
-// About: License
-// 
-// Copyright (c) 2010 "Cowboy" Ben Alman,
-// Dual licensed under the MIT and GPL licenses.
-// http://benalman.com/about/license/
-// 
-// About: Examples
-// 
-// These working examples, complete with fully commented code, illustrate a few
-// ways in which this plugin can be used.
-// 
-// Basic AJAX     - http://benalman.com/code/projects/jquery-bbq/examples/fragment-basic/
-// Advanced AJAX  - http://benalman.com/code/projects/jquery-bbq/examples/fragment-advanced/
-// jQuery UI Tabs - http://benalman.com/code/projects/jquery-bbq/examples/fragment-jquery-ui-tabs/
-// Deparam        - http://benalman.com/code/projects/jquery-bbq/examples/deparam/
-// 
-// About: Support and Testing
-// 
-// Information about what version or versions of jQuery this plugin has been
-// tested with, what browsers it has been tested in, and where the unit tests
-// reside (so you can test it yourself).
-// 
-// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
-// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
-//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
-// Unit Tests      - http://benalman.com/code/projects/jquery-bbq/unit/
-// 
-// About: Release History
-// 
-// 1.3pre - (8/26/2010) Integrated <jQuery hashchange event> v1.3, which adds
-//         document.title and document.domain support in IE6/7, BlackBerry
-//         support, better Iframe hiding for accessibility reasons, and the new
-//         <jQuery.fn.hashchange> "shortcut" method. Added the
-//         <jQuery.param.sorted> method which reduces the possibility of
-//         extraneous hashchange event triggering. Added the
-//         <jQuery.param.fragment.ajaxCrawlable> method which can be used to
-//         enable Google "AJAX Crawlable mode."
-// 1.2.1 - (2/17/2010) Actually fixed the stale window.location Safari bug from
-//         <jQuery hashchange event> in BBQ, which was the main reason for the
-//         previous release!
-// 1.2   - (2/16/2010) Integrated <jQuery hashchange event> v1.2, which fixes a
-//         Safari bug, the event can now be bound before DOM ready, and IE6/7
-//         page should no longer scroll when the event is first bound. Also
-//         added the <jQuery.param.fragment.noEscape> method, and reworked the
-//         <hashchange event (BBQ)> internal "add" method to be compatible with
-//         changes made to the jQuery 1.4.2 special events API.
-// 1.1.1 - (1/22/2010) Integrated <jQuery hashchange event> v1.1, which fixes an
-//         obscure IE8 EmulateIE7 meta tag compatibility mode bug.
-// 1.1   - (1/9/2010) Broke out the jQuery BBQ event.special <hashchange event>
-//         functionality into a separate plugin for users who want just the
-//         basic event & back button support, without all the extra awesomeness
-//         that BBQ provides. This plugin will be included as part of jQuery BBQ,
-//         but also be available separately. See <jQuery hashchange event>
-//         plugin for more information. Also added the <jQuery.bbq.removeState>
-//         method and added additional <jQuery.deparam> examples.
-// 1.0.3 - (12/2/2009) Fixed an issue in IE 6 where location.search and
-//         location.hash would report incorrectly if the hash contained the ?
-//         character. Also <jQuery.param.querystring> and <jQuery.param.fragment>
-//         will no longer parse params out of a URL that doesn't contain ? or #,
-//         respectively.
-// 1.0.2 - (10/10/2009) Fixed an issue in IE 6/7 where the hidden IFRAME caused
-//         a "This page contains both secure and nonsecure items." warning when
-//         used on an https:// page.
-// 1.0.1 - (10/7/2009) Fixed an issue in IE 8. Since both "IE7" and "IE8
-//         Compatibility View" modes erroneously report that the browser
-//         supports the native window.onhashchange event, a slightly more
-//         robust test needed to be added.
-// 1.0   - (10/2/2009) Initial release
-
-(function($,window){
-  '$:nomunge'; // Used by YUI compressor.
-  
-  // Some convenient shortcuts.
-  var undefined,
-    aps = Array.prototype.slice,
-    decode = decodeURIComponent,
-    
-    // Method / object references.
-    jq_param = $.param,
-    jq_param_sorted,
-    jq_param_fragment,
-    jq_deparam,
-    jq_deparam_fragment,
-    jq_bbq = $.bbq = $.bbq || {},
-    jq_bbq_pushState,
-    jq_bbq_getState,
-    jq_elemUrlAttr,
-    special = $.event.special,
-    
-    // Reused strings.
-    str_hashchange = 'hashchange',
-    str_querystring = 'querystring',
-    str_fragment = 'fragment',
-    str_elemUrlAttr = 'elemUrlAttr',
-    str_href = 'href',
-    str_src = 'src',
-    
-    // Reused RegExp.
-    re_params_querystring = /^.*\?|#.*$/g,
-    re_params_fragment,
-    re_fragment,
-    re_no_escape,
-    
-    ajax_crawlable,
-    fragment_prefix,
-    
-    // Used by jQuery.elemUrlAttr.
-    elemUrlAttr_cache = {};
-  
-  // A few commonly used bits, broken out to help reduce minified file size.
-  
-  function is_string( arg ) {
-    return typeof arg === 'string';
-  };
-  
-  // Why write the same function twice? Let's curry! Mmmm, curry..
-  
-  function curry( func ) {
-    var args = aps.call( arguments, 1 );
-    
-    return function() {
-      return func.apply( this, args.concat( aps.call( arguments ) ) );
-    };
-  };
-  
-  // Get location.hash (or what you'd expect location.hash to be) sans any
-  // leading #. Thanks for making this necessary, Firefox!
-  function get_fragment( url ) {
-    return url.replace( re_fragment, '$2' );
-  };
-  
-  // Get location.search (or what you'd expect location.search to be) sans any
-  // leading #. Thanks for making this necessary, IE6!
-  function get_querystring( url ) {
-    return url.replace( /(?:^[^?#]*\?([^#]*).*$)?.*/, '$1' );
-  };
-  
-  // Section: Param (to string)
-  // 
-  // Method: jQuery.param.querystring
-  // 
-  // Retrieve the query string from a URL or if no arguments are passed, the
-  // current window.location.href.
-  // 
-  // Usage:
-  // 
-  // > jQuery.param.querystring( [ url ] );
-  // 
-  // Arguments:
-  // 
-  //  url - (String) A URL containing query string params to be parsed. If url
-  //    is not passed, the current window.location.href is used.
-  // 
-  // Returns:
-  // 
-  //  (String) The parsed query string, with any leading "?" removed.
-  //
-  
-  // Method: jQuery.param.querystring (build url)
-  // 
-  // Merge a URL, with or without pre-existing query string params, plus any
-  // object, params string or URL containing query string params into a new URL.
-  // 
-  // Usage:
-  // 
-  // > jQuery.param.querystring( url, params [, merge_mode ] );
-  // 
-  // Arguments:
-  // 
-  //  url - (String) A valid URL for params to be merged into. This URL may
-  //    contain a query string and/or fragment (hash).
-  //  params - (String) A params string or URL containing query string params to
-  //    be merged into url.
-  //  params - (Object) A params object to be merged into url.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified, and is as-follows:
-  // 
-  //    * 0: params in the params argument will override any query string
-  //         params in url.
-  //    * 1: any query string params in url will override params in the params
-  //         argument.
-  //    * 2: params argument will completely replace any query string in url.
-  // 
-  // Returns:
-  // 
-  //  (String) A URL with a urlencoded query string in the format '?a=b&c=d&e=f'.
-  
-  // Method: jQuery.param.fragment
-  // 
-  // Retrieve the fragment (hash) from a URL or if no arguments are passed, the
-  // current window.location.href.
-  // 
-  // Usage:
-  // 
-  // > jQuery.param.fragment( [ url ] );
-  // 
-  // Arguments:
-  // 
-  //  url - (String) A URL containing fragment (hash) params to be parsed. If
-  //    url is not passed, the current window.location.href is used.
-  // 
-  // Returns:
-  // 
-  //  (String) The parsed fragment (hash) string, with any leading "#" removed.
-  
-  // Method: jQuery.param.fragment (build url)
-  // 
-  // Merge a URL, with or without pre-existing fragment (hash) params, plus any
-  // object, params string or URL containing fragment (hash) params into a new
-  // URL.
-  // 
-  // Usage:
-  // 
-  // > jQuery.param.fragment( url, params [, merge_mode ] );
-  // 
-  // Arguments:
-  // 
-  //  url - (String) A valid URL for params to be merged into. This URL may
-  //    contain a query string and/or fragment (hash).
-  //  params - (String) A params string or URL containing fragment (hash) params
-  //    to be merged into url.
-  //  params - (Object) A params object to be merged into url.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified, and is as-follows:
-  // 
-  //    * 0: params in the params argument will override any fragment (hash)
-  //         params in url.
-  //    * 1: any fragment (hash) params in url will override params in the
-  //         params argument.
-  //    * 2: params argument will completely replace any query string in url.
-  // 
-  // Returns:
-  // 
-  //  (String) A URL with a urlencoded fragment (hash) in the format '#a=b&c=d&e=f'.
-  
-  function jq_param_sub( is_fragment, get_func, url, params, merge_mode ) {
-    var result,
-      qs,
-      matches,
-      url_params,
-      hash;
-    
-    if ( params !== undefined ) {
-      // Build URL by merging params into url string.
-      
-      // matches[1] = url part that precedes params, not including trailing ?/#
-      // matches[2] = params, not including leading ?/#
-      // matches[3] = if in 'querystring' mode, hash including leading #, otherwise ''
-      matches = url.match( is_fragment ? re_fragment : /^([^#?]*)\??([^#]*)(#?.*)/ );
-      
-      // Get the hash if in 'querystring' mode, and it exists.
-      hash = matches[3] || '';
-      
-      if ( merge_mode === 2 && is_string( params ) ) {
-        // If merge_mode is 2 and params is a string, merge the fragment / query
-        // string into the URL wholesale, without converting it into an object.
-        qs = params.replace( is_fragment ? re_params_fragment : re_params_querystring, '' );
-        
-      } else {
-        // Convert relevant params in url to object.
-        url_params = jq_deparam( matches[2] );
-        
-        params = is_string( params )
-          
-          // Convert passed params string into object.
-          ? jq_deparam[ is_fragment ? str_fragment : str_querystring ]( params )
-          
-          // Passed params object.
-          : params;
-        
-        qs = merge_mode === 2 ? params                              // passed params replace url params
-          : merge_mode === 1  ? $.extend( {}, params, url_params )  // url params override passed params
-          : $.extend( {}, url_params, params );                     // passed params override url params
-        
-        // Convert params object into a sorted params string.
-        qs = jq_param_sorted( qs );
-        
-        // Unescape characters specified via $.param.noEscape. Since only hash-
-        // history users have requested this feature, it's only enabled for
-        // fragment-related params strings.
-        if ( is_fragment ) {
-          qs = qs.replace( re_no_escape, decode );
-        }
-      }
-      
-      // Build URL from the base url, querystring and hash. In 'querystring'
-      // mode, ? is only added if a query string exists. In 'fragment' mode, #
-      // is always added.
-      result = matches[1] + ( is_fragment ? fragment_prefix : qs || !matches[1] ? '?' : '' ) + qs + hash;
-      
-    } else {
-      // If URL was passed in, parse params from URL string, otherwise parse
-      // params from window.location.href.
-      result = get_func( url !== undefined ? url : location.href );
-    }
-    
-    return result;
-  };
-  
-  jq_param[ str_querystring ]                  = curry( jq_param_sub, 0, get_querystring );
-  jq_param[ str_fragment ] = jq_param_fragment = curry( jq_param_sub, 1, get_fragment );
-  
-  // Method: jQuery.param.sorted
-  // 
-  // Returns a params string equivalent to that returned by the internal
-  // jQuery.param method, but sorted, which makes it suitable for use as a
-  // cache key.
-  // 
-  // For example, in most browsers jQuery.param({z:1,a:2}) returns "z=1&a=2"
-  // and jQuery.param({a:2,z:1}) returns "a=2&z=1". Even though both the
-  // objects being serialized and the resulting params strings are equivalent,
-  // if these params strings were set into the location.hash fragment
-  // sequentially, the hashchange event would be triggered unnecessarily, since
-  // the strings are different (even though the data described by them is the
-  // same). By sorting the params string, unecessary hashchange event triggering
-  // can be avoided.
-  // 
-  // Usage:
-  // 
-  // > jQuery.param.sorted( obj [, traditional ] );
-  // 
-  // Arguments:
-  // 
-  //  obj - (Object) An object to be serialized.
-  //  traditional - (Boolean) Params deep/shallow serialization mode. See the
-  //    documentation at http://api.jquery.com/jQuery.param/ for more detail.
-  // 
-  // Returns:
-  // 
-  //  (String) A sorted params string.
-  
-  jq_param.sorted = jq_param_sorted = function( a, traditional ) {
-    var arr = [],
-      obj = {};
-    
-    $.each( jq_param( a, traditional ).split( '&' ), function(i,v){
-      var key = v.replace( /(?:%5B|=).*$/, '' ),
-        key_obj = obj[ key ];
-      
-      if ( !key_obj ) {
-        key_obj = obj[ key ] = [];
-        arr.push( key );
-      }
-      
-      key_obj.push( v );
-    });
-    
-    return $.map( arr.sort(), function(v){
-      return obj[ v ];
-    }).join( '&' );
-  };
-  
-  // Method: jQuery.param.fragment.noEscape
-  // 
-  // Specify characters that will be left unescaped when fragments are created
-  // or merged using <jQuery.param.fragment>, or when the fragment is modified
-  // using <jQuery.bbq.pushState>. This option only applies to serialized data
-  // object fragments, and not set-as-string fragments. Does not affect the
-  // query string. Defaults to ",/" (comma, forward slash).
-  // 
-  // Note that this is considered a purely aesthetic option, and will help to
-  // create URLs that "look pretty" in the address bar or bookmarks, without
-  // affecting functionality in any way. That being said, be careful to not
-  // unescape characters that are used as delimiters or serve a special
-  // purpose, such as the "#?&=+" (octothorpe, question mark, ampersand,
-  // equals, plus) characters.
-  // 
-  // Usage:
-  // 
-  // > jQuery.param.fragment.noEscape( [ chars ] );
-  // 
-  // Arguments:
-  // 
-  //  chars - (String) The characters to not escape in the fragment. If
-  //    unspecified, defaults to empty string (escape all characters).
-  // 
-  // Returns:
-  // 
-  //  Nothing.
-  
-  jq_param_fragment.noEscape = function( chars ) {
-    chars = chars || '';
-    var arr = $.map( chars.split(''), encodeURIComponent );
-    re_no_escape = new RegExp( arr.join('|'), 'g' );
-  };
-  
-  // A sensible default. These are the characters people seem to complain about
-  // "uglifying up the URL" the most.
-  jq_param_fragment.noEscape( ',/' );
-  
-  // Method: jQuery.param.fragment.ajaxCrawlable
-  // 
-  // TODO: DESCRIBE
-  // 
-  // Usage:
-  // 
-  // > jQuery.param.fragment.ajaxCrawlable( [ state ] );
-  // 
-  // Arguments:
-  // 
-  //  state - (Boolean) TODO: DESCRIBE
-  // 
-  // Returns:
-  // 
-  //  (Boolean) The current ajaxCrawlable state.
-  
-  jq_param_fragment.ajaxCrawlable = function( state ) {
-    if ( state !== undefined ) {
-      if ( state ) {
-        re_params_fragment = /^.*(?:#!|#)/;
-        re_fragment = /^([^#]*)(?:#!|#)?(.*)$/;
-        fragment_prefix = '#!';
-      } else {
-        re_params_fragment = /^.*#/;
-        re_fragment = /^([^#]*)#?(.*)$/;
-        fragment_prefix = '#';
-      }
-      ajax_crawlable = !!state;
-    }
-    
-    return ajax_crawlable;
-  };
-  
-  jq_param_fragment.ajaxCrawlable( 0 );
-  
-  // Section: Deparam (from string)
-  // 
-  // Method: jQuery.deparam
-  // 
-  // Deserialize a params string into an object, optionally coercing numbers,
-  // booleans, null and undefined values; this method is the counterpart to the
-  // internal jQuery.param method.
-  // 
-  // Usage:
-  // 
-  // > jQuery.deparam( params [, coerce ] );
-  // 
-  // Arguments:
-  // 
-  //  params - (String) A params string to be parsed.
-  //  coerce - (Boolean) If true, coerces any numbers or true, false, null, and
-  //    undefined to their actual value. Defaults to false if omitted.
-  // 
-  // Returns:
-  // 
-  //  (Object) An object representing the deserialized params string.
-  
-  $.deparam = jq_deparam = function( params, coerce ) {
-    var obj = {},
-      coerce_types = { 'true': !0, 'false': !1, 'null': null };
-    
-    // Iterate over all name=value pairs.
-    $.each( params.replace( /\+/g, ' ' ).split( '&' ), function(j,v){
-      var param = v.split( '=' ),
-        key = decode( param[0] ),
-        val,
-        cur = obj,
-        i = 0,
-        
-        // If key is more complex than 'foo', like 'a[]' or 'a[b][c]', split it
-        // into its component parts.
-        keys = key.split( '][' ),
-        keys_last = keys.length - 1;
-      
-      // If the first keys part contains [ and the last ends with ], then []
-      // are correctly balanced.
-      if ( /\[/.test( keys[0] ) && /\]$/.test( keys[ keys_last ] ) ) {
-        // Remove the trailing ] from the last keys part.
-        keys[ keys_last ] = keys[ keys_last ].replace( /\]$/, '' );
-        
-        // Split first keys part into two parts on the [ and add them back onto
-        // the beginning of the keys array.
-        keys = keys.shift().split('[').concat( keys );
-        
-        keys_last = keys.length - 1;
-      } else {
-        // Basic 'foo' style key.
-        keys_last = 0;
-      }
-      
-      // Are we dealing with a name=value pair, or just a name?
-      if ( param.length === 2 ) {
-        val = decode( param[1] );
-        
-        // Coerce values.
-        if ( coerce ) {
-          val = val && !isNaN(val)            ? +val              // number
-            : val === 'undefined'             ? undefined         // undefined
-            : coerce_types[val] !== undefined ? coerce_types[val] // true, false, null
-            : val;                                                // string
-        }
-        
-        if ( keys_last ) {
-          // Complex key, build deep object structure based on a few rules:
-          // * The 'cur' pointer starts at the object top-level.
-          // * [] = array push (n is set to array length), [n] = array if n is 
-          //   numeric, otherwise object.
-          // * If at the last keys part, set the value.
-          // * For each keys part, if the current level is undefined create an
-          //   object or array based on the type of the next keys part.
-          // * Move the 'cur' pointer to the next level.
-          // * Rinse & repeat.
-          for ( ; i <= keys_last; i++ ) {
-            key = keys[i] === '' ? cur.length : keys[i];
-            cur = cur[key] = i < keys_last
-              ? cur[key] || ( keys[i+1] && isNaN( keys[i+1] ) ? {} : [] )
-              : val;
-          }
-          
-        } else {
-          // Simple key, even simpler rules, since only scalars and shallow
-          // arrays are allowed.
-          
-          if ( $.isArray( obj[key] ) ) {
-            // val is already an array, so push on the next value.
-            obj[key].push( val );
-            
-          } else if ( obj[key] !== undefined ) {
-            // val isn't an array, but since a second value has been specified,
-            // convert val into an array.
-            obj[key] = [ obj[key], val ];
-            
-          } else {
-            // val is a scalar.
-            obj[key] = val;
-          }
-        }
-        
-      } else if ( key ) {
-        // No value was defined, so set something meaningful.
-        obj[key] = coerce
-          ? undefined
-          : '';
-      }
-    });
-    
-    return obj;
-  };
-  
-  // Method: jQuery.deparam.querystring
-  // 
-  // Parse the query string from a URL or the current window.location.href,
-  // deserializing it into an object, optionally coercing numbers, booleans,
-  // null and undefined values.
-  // 
-  // Usage:
-  // 
-  // > jQuery.deparam.querystring( [ url ] [, coerce ] );
-  // 
-  // Arguments:
-  // 
-  //  url - (String) An optional params string or URL containing query string
-  //    params to be parsed. If url is omitted, the current
-  //    window.location.href is used.
-  //  coerce - (Boolean) If true, coerces any numbers or true, false, null, and
-  //    undefined to their actual value. Defaults to false if omitted.
-  // 
-  // Returns:
-  // 
-  //  (Object) An object representing the deserialized params string.
-  
-  // Method: jQuery.deparam.fragment
-  // 
-  // Parse the fragment (hash) from a URL or the current window.location.href,
-  // deserializing it into an object, optionally coercing numbers, booleans,
-  // null and undefined values.
-  // 
-  // Usage:
-  // 
-  // > jQuery.deparam.fragment( [ url ] [, coerce ] );
-  // 
-  // Arguments:
-  // 
-  //  url - (String) An optional params string or URL containing fragment (hash)
-  //    params to be parsed. If url is omitted, the current window.location.href
-  //    is used.
-  //  coerce - (Boolean) If true, coerces any numbers or true, false, null, and
-  //    undefined to their actual value. Defaults to false if omitted.
-  // 
-  // Returns:
-  // 
-  //  (Object) An object representing the deserialized params string.
-  
-  function jq_deparam_sub( is_fragment, url_or_params, coerce ) {
-    if ( url_or_params === undefined || typeof url_or_params === 'boolean' ) {
-      // url_or_params not specified.
-      coerce = url_or_params;
-      url_or_params = jq_param[ is_fragment ? str_fragment : str_querystring ]();
-    } else {
-      url_or_params = is_string( url_or_params )
-        ? url_or_params.replace( is_fragment ? re_params_fragment : re_params_querystring, '' )
-        : url_or_params;
-    }
-    
-    return jq_deparam( url_or_params, coerce );
-  };
-  
-  jq_deparam[ str_querystring ]                    = curry( jq_deparam_sub, 0 );
-  jq_deparam[ str_fragment ] = jq_deparam_fragment = curry( jq_deparam_sub, 1 );
-  
-  // Section: Element manipulation
-  // 
-  // Method: jQuery.elemUrlAttr
-  // 
-  // Get the internal "Default URL attribute per tag" list, or augment the list
-  // with additional tag-attribute pairs, in case the defaults are insufficient.
-  // 
-  // In the <jQuery.fn.querystring> and <jQuery.fn.fragment> methods, this list
-  // is used to determine which attribute contains the URL to be modified, if
-  // an "attr" param is not specified.
-  // 
-  // Default Tag-Attribute List:
-  // 
-  //  a      - href
-  //  base   - href
-  //  iframe - src
-  //  img    - src
-  //  input  - src
-  //  form   - action
-  //  link   - href
-  //  script - src
-  // 
-  // Usage:
-  // 
-  // > jQuery.elemUrlAttr( [ tag_attr ] );
-  // 
-  // Arguments:
-  // 
-  //  tag_attr - (Object) An object containing a list of tag names and their
-  //    associated default attribute names in the format { tag: 'attr', ... } to
-  //    be merged into the internal tag-attribute list.
-  // 
-  // Returns:
-  // 
-  //  (Object) An object containing all stored tag-attribute values.
-  
-  // Only define function and set defaults if function doesn't already exist, as
-  // the urlInternal plugin will provide this method as well.
-  $[ str_elemUrlAttr ] || ($[ str_elemUrlAttr ] = function( obj ) {
-    return $.extend( elemUrlAttr_cache, obj );
-  })({
-    a: str_href,
-    base: str_href,
-    iframe: str_src,
-    img: str_src,
-    input: str_src,
-    form: 'action',
-    link: str_href,
-    script: str_src
-  });
-  
-  jq_elemUrlAttr = $[ str_elemUrlAttr ];
-  
-  // Method: jQuery.fn.querystring
-  // 
-  // Update URL attribute in one or more elements, merging the current URL (with
-  // or without pre-existing query string params) plus any params object or
-  // string into a new URL, which is then set into that attribute. Like
-  // <jQuery.param.querystring (build url)>, but for all elements in a jQuery
-  // collection.
-  // 
-  // Usage:
-  // 
-  // > jQuery('selector').querystring( [ attr, ] params [, merge_mode ] );
-  // 
-  // Arguments:
-  // 
-  //  attr - (String) Optional name of an attribute that will contain a URL to
-  //    merge params or url into. See <jQuery.elemUrlAttr> for a list of default
-  //    attributes.
-  //  params - (Object) A params object to be merged into the URL attribute.
-  //  params - (String) A URL containing query string params, or params string
-  //    to be merged into the URL attribute.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified, and is as-follows:
-  //    
-  //    * 0: params in the params argument will override any params in attr URL.
-  //    * 1: any params in attr URL will override params in the params argument.
-  //    * 2: params argument will completely replace any query string in attr
-  //         URL.
-  // 
-  // Returns:
-  // 
-  //  (jQuery) The initial jQuery collection of elements, but with modified URL
-  //  attribute values.
-  
-  // Method: jQuery.fn.fragment
-  // 
-  // Update URL attribute in one or more elements, merging the current URL (with
-  // or without pre-existing fragment/hash params) plus any params object or
-  // string into a new URL, which is then set into that attribute. Like
-  // <jQuery.param.fragment (build url)>, but for all elements in a jQuery
-  // collection.
-  // 
-  // Usage:
-  // 
-  // > jQuery('selector').fragment( [ attr, ] params [, merge_mode ] );
-  // 
-  // Arguments:
-  // 
-  //  attr - (String) Optional name of an attribute that will contain a URL to
-  //    merge params into. See <jQuery.elemUrlAttr> for a list of default
-  //    attributes.
-  //  params - (Object) A params object to be merged into the URL attribute.
-  //  params - (String) A URL containing fragment (hash) params, or params
-  //    string to be merged into the URL attribute.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified, and is as-follows:
-  //    
-  //    * 0: params in the params argument will override any params in attr URL.
-  //    * 1: any params in attr URL will override params in the params argument.
-  //    * 2: params argument will completely replace any fragment (hash) in attr
-  //         URL.
-  // 
-  // Returns:
-  // 
-  //  (jQuery) The initial jQuery collection of elements, but with modified URL
-  //  attribute values.
-  
-  function jq_fn_sub( mode, force_attr, params, merge_mode ) {
-    if ( !is_string( params ) && typeof params !== 'object' ) {
-      // force_attr not specified.
-      merge_mode = params;
-      params = force_attr;
-      force_attr = undefined;
-    }
-    
-    return this.each(function(){
-      var that = $(this),
-        
-        // Get attribute specified, or default specified via $.elemUrlAttr.
-        attr = force_attr || jq_elemUrlAttr()[ ( this.nodeName || '' ).toLowerCase() ] || '',
-        
-        // Get URL value.
-        url = attr && that.attr( attr ) || '';
-      
-      // Update attribute with new URL.
-      that.attr( attr, jq_param[ mode ]( url, params, merge_mode ) );
-    });
-    
-  };
-  
-  $.fn[ str_querystring ] = curry( jq_fn_sub, str_querystring );
-  $.fn[ str_fragment ]    = curry( jq_fn_sub, str_fragment );
-  
-  // Section: History, hashchange event
-  // 
-  // Method: jQuery.bbq.pushState
-  // 
-  // Adds a 'state' into the browser history at the current position, setting
-  // location.hash and triggering any bound <hashchange event> callbacks
-  // (provided the new state is different than the previous state).
-  // 
-  // If no arguments are passed, an empty state is created, which is just a
-  // shortcut for jQuery.bbq.pushState( {}, 2 ).
-  // 
-  // Usage:
-  // 
-  // > jQuery.bbq.pushState( [ params [, merge_mode ] ] );
-  // 
-  // Arguments:
-  // 
-  //  params - (String) A serialized params string or a hash string beginning
-  //    with # to merge into location.hash.
-  //  params - (Object) A params object to merge into location.hash.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified (unless a hash string beginning with # is specified, in which
-  //    case merge behavior defaults to 2), and is as-follows:
-  // 
-  //    * 0: params in the params argument will override any params in the
-  //         current state.
-  //    * 1: any params in the current state will override params in the params
-  //         argument.
-  //    * 2: params argument will completely replace current state.
-  // 
-  // Returns:
-  // 
-  //  Nothing.
-  // 
-  // Additional Notes:
-  // 
-  //  * Setting an empty state may cause the browser to scroll.
-  //  * Unlike the fragment and querystring methods, if a hash string beginning
-  //    with # is specified as the params agrument, merge_mode defaults to 2.
-  
-  jq_bbq.pushState = jq_bbq_pushState = function( params, merge_mode ) {
-    if ( is_string( params ) && /^#/.test( params ) && merge_mode === undefined ) {
-      // Params string begins with # and merge_mode not specified, so completely
-      // overwrite window.location.hash.
-      merge_mode = 2;
-    }
-    
-    var has_args = params !== undefined,
-      // Merge params into window.location using $.param.fragment.
-      url = jq_param_fragment( location.href,
-        has_args ? params : {}, has_args ? merge_mode : 2 );
-    
-    // Set new window.location.href. Note that Safari 3 & Chrome barf on
-    // location.hash = '#' so the entire URL is set.
-    location.href = url;
-  };
-  
-  // Method: jQuery.bbq.getState
-  // 
-  // Retrieves the current 'state' from the browser history, parsing
-  // location.hash for a specific key or returning an object containing the
-  // entire state, optionally coercing numbers, booleans, null and undefined
-  // values.
-  // 
-  // Usage:
-  // 
-  // > jQuery.bbq.getState( [ key ] [, coerce ] );
-  // 
-  // Arguments:
-  // 
-  //  key - (String) An optional state key for which to return a value.
-  //  coerce - (Boolean) If true, coerces any numbers or true, false, null, and
-  //    undefined to their actual value. Defaults to false.
-  // 
-  // Returns:
-  // 
-  //  (Anything) If key is passed, returns the value corresponding with that key
-  //    in the location.hash 'state', or undefined. If not, an object
-  //    representing the entire 'state' is returned.
-  
-  jq_bbq.getState = jq_bbq_getState = function( key, coerce ) {
-    return key === undefined || typeof key === 'boolean'
-      ? jq_deparam_fragment( key ) // 'key' really means 'coerce' here
-      : jq_deparam_fragment( coerce )[ key ];
-  };
-  
-  // Method: jQuery.bbq.removeState
-  // 
-  // Remove one or more keys from the current browser history 'state', creating
-  // a new state, setting location.hash and triggering any bound
-  // <hashchange event> callbacks (provided the new state is different than
-  // the previous state).
-  // 
-  // If no arguments are passed, an empty state is created, which is just a
-  // shortcut for jQuery.bbq.pushState( {}, 2 ).
-  // 
-  // Usage:
-  // 
-  // > jQuery.bbq.removeState( [ key [, key ... ] ] );
-  // 
-  // Arguments:
-  // 
-  //  key - (String) One or more key values to remove from the current state,
-  //    passed as individual arguments.
-  //  key - (Array) A single array argument that contains a list of key values
-  //    to remove from the current state.
-  // 
-  // Returns:
-  // 
-  //  Nothing.
-  // 
-  // Additional Notes:
-  // 
-  //  * Setting an empty state may cause the browser to scroll.
-  
-  jq_bbq.removeState = function( arr ) {
-    var state = {};
-    
-    // If one or more arguments is passed..
-    if ( arr !== undefined ) {
-      
-      // Get the current state.
-      state = jq_bbq_getState();
-      
-      // For each passed key, delete the corresponding property from the current
-      // state.
-      $.each( $.isArray( arr ) ? arr : arguments, function(i,v){
-        delete state[ v ];
-      });
-    }
-    
-    // Set the state, completely overriding any existing state.
-    jq_bbq_pushState( state, 2 );
-  };
-  
-  // Event: hashchange event (BBQ)
-  // 
-  // Usage in jQuery 1.4 and newer:
-  // 
-  // In jQuery 1.4 and newer, the event object passed into any hashchange event
-  // callback is augmented with a copy of the location.hash fragment at the time
-  // the event was triggered as its event.fragment property. In addition, the
-  // event.getState method operates on this property (instead of location.hash)
-  // which allows this fragment-as-a-state to be referenced later, even after
-  // window.location may have changed.
-  // 
-  // Note that event.fragment and event.getState are not defined according to
-  // W3C (or any other) specification, but will still be available whether or
-  // not the hashchange event exists natively in the browser, because of the
-  // utility they provide.
-  // 
-  // The event.fragment property contains the output of <jQuery.param.fragment>
-  // and the event.getState method is equivalent to the <jQuery.bbq.getState>
-  // method.
-  // 
-  // > $(window).bind( 'hashchange', function( event ) {
-  // >   var hash_str = event.fragment,
-  // >     param_obj = event.getState(),
-  // >     param_val = event.getState( 'param_name' ),
-  // >     param_val_coerced = event.getState( 'param_name', true );
-  // >   ...
-  // > });
-  // 
-  // Usage in jQuery 1.3.2:
-  // 
-  // In jQuery 1.3.2, the event object cannot to be augmented as in jQuery 1.4+,
-  // so the fragment state isn't bound to the event object and must instead be
-  // parsed using the <jQuery.param.fragment> and <jQuery.bbq.getState> methods.
-  // 
-  // > $(window).bind( 'hashchange', function( event ) {
-  // >   var hash_str = $.param.fragment(),
-  // >     param_obj = $.bbq.getState(),
-  // >     param_val = $.bbq.getState( 'param_name' ),
-  // >     param_val_coerced = $.bbq.getState( 'param_name', true );
-  // >   ...
-  // > });
-  // 
-  // Additional Notes:
-  // 
-  // * Due to changes in the special events API, jQuery BBQ v1.2 or newer is
-  //   required to enable the augmented event object in jQuery 1.4.2 and newer.
-  // * See <jQuery hashchange event> for more detailed information.
-  
-  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
-    
-    // Augmenting the event object with the .fragment property and .getState
-    // method requires jQuery 1.4 or newer. Note: with 1.3.2, everything will
-    // work, but the event won't be augmented)
-    add: function( handleObj ) {
-      var old_handler;
-      
-      function new_handler(e) {
-        // e.fragment is set to the value of location.hash (with any leading #
-        // removed) at the time the event is triggered.
-        var hash = e[ str_fragment ] = jq_param_fragment();
-        
-        // e.getState() works just like $.bbq.getState(), but uses the
-        // e.fragment property stored on the event object.
-        e.getState = function( key, coerce ) {
-          return key === undefined || typeof key === 'boolean'
-            ? jq_deparam( hash, key ) // 'key' really means 'coerce' here
-            : jq_deparam( hash, coerce )[ key ];
-        };
-        
-        old_handler.apply( this, arguments );
-      };
-      
-      // This may seem a little complicated, but it normalizes the special event
-      // .add method between jQuery 1.4/1.4.1 and 1.4.2+
-      if ( $.isFunction( handleObj ) ) {
-        // 1.4, 1.4.1
-        old_handler = handleObj;
-        return new_handler;
-      } else {
-        // 1.4.2+
-        old_handler = handleObj.handler;
-        handleObj.handler = new_handler;
-      }
-    }
-    
-  });
-  
-})(jQuery,this);
-
-/*!
- * jQuery hashchange event - v1.3 - 7/21/2010
- * http://benalman.com/projects/jquery-hashchange-plugin/
- * 
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-
-// Script: jQuery hashchange event
-//
-// *Version: 1.3, Last updated: 7/21/2010*
-// 
-// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
-// GitHub       - http://github.com/cowboy/jquery-hashchange/
-// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
-// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
-// 
-// About: License
-// 
-// Copyright (c) 2010 "Cowboy" Ben Alman,
-// Dual licensed under the MIT and GPL licenses.
-// http://benalman.com/about/license/
-// 
-// About: Examples
-// 
-// These working examples, complete with fully commented code, illustrate a few
-// ways in which this plugin can be used.
-// 
-// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
-// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
-// 
-// About: Support and Testing
-// 
-// Information about what version or versions of jQuery this plugin has been
-// tested with, what browsers it has been tested in, and where the unit tests
-// reside (so you can test it yourself).
-// 
-// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
-// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
-//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
-// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
-// 
-// About: Known issues
-// 
-// While this jQuery hashchange event implementation is quite stable and
-// robust, there are a few unfortunate browser bugs surrounding expected
-// hashchange event-based behaviors, independent of any JavaScript
-// window.onhashchange abstraction. See the following examples for more
-// information:
-// 
-// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
-// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
-// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
-// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
-// 
-// Also note that should a browser natively support the window.onhashchange 
-// event, but not report that it does, the fallback polling loop will be used.
-// 
-// About: Release History
-// 
-// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
-//         "removable" for mobile-only development. Added IE6/7 document.title
-//         support. Attempted to make Iframe as hidden as possible by using
-//         techniques from http://www.paciellogroup.com/blog/?p=604. Added 
-//         support for the "shortcut" format $(window).hashchange( fn ) and
-//         $(window).hashchange() like jQuery provides for built-in events.
-//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
-//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
-//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
-//         file to address access denied issues when setting document.domain in
-//         IE6/7.
-// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
-//         from a page on another domain would cause an error in Safari 4. Also,
-//         IE6/7 Iframe is now inserted after the body (this actually works),
-//         which prevents the page from scrolling when the event is first bound.
-//         Event can also now be bound before DOM ready, but it won't be usable
-//         before then in IE6/7.
-// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
-//         where browser version is incorrectly reported as 8.0, despite
-//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
-// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
-//         window.onhashchange functionality into a separate plugin for users
-//         who want just the basic event & back button support, without all the
-//         extra awesomeness that BBQ provides. This plugin will be included as
-//         part of jQuery BBQ, but also be available separately.
-
-(function($,window,undefined){
-  '$:nomunge'; // Used by YUI compressor.
-  
-  // Reused string.
-  var str_hashchange = 'hashchange',
-    
-    // Method / object references.
-    doc = document,
-    fake_onhashchange,
-    special = $.event.special,
-    
-    // Does the browser support window.onhashchange? Note that IE8 running in
-    // IE7 compatibility mode reports true for 'onhashchange' in window, even
-    // though the event isn't supported, so also test document.documentMode.
-    doc_mode = doc.documentMode,
-    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
-  
-  // Get location.hash (or what you'd expect location.hash to be) sans any
-  // leading #. Thanks for making this necessary, Firefox!
-  function get_fragment( url ) {
-    url = url || location.href;
-    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
-  };
-  
-  // Method: jQuery.fn.hashchange
-  // 
-  // Bind a handler to the window.onhashchange event or trigger all bound
-  // window.onhashchange event handlers. This behavior is consistent with
-  // jQuery's built-in event handlers.
-  // 
-  // Usage:
-  // 
-  // > jQuery(window).hashchange( [ handler ] );
-  // 
-  // Arguments:
-  // 
-  //  handler - (Function) Optional handler to be bound to the hashchange
-  //    event. This is a "shortcut" for the more verbose form:
-  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
-  //    all bound window.onhashchange event handlers will be triggered. This
-  //    is a shortcut for the more verbose
-  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
-  //    the <hashchange event> section.
-  // 
-  // Returns:
-  // 
-  //  (jQuery) The initial jQuery collection of elements.
-  
-  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
-  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
-  $.fn[ str_hashchange ] = function( fn ) {
-    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
-  };
-  
-  // Property: jQuery.fn.hashchange.delay
-  // 
-  // The numeric interval (in milliseconds) at which the <hashchange event>
-  // polling loop executes. Defaults to 50.
-  
-  // Property: jQuery.fn.hashchange.domain
-  // 
-  // If you're setting document.domain in your JavaScript, and you want hash
-  // history to work in IE6/7, not only must this property be set, but you must
-  // also set document.domain BEFORE jQuery is loaded into the page. This
-  // property is only applicable if you are supporting IE6/7 (or IE8 operating
-  // in "IE7 compatibility" mode).
-  // 
-  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
-  // path of the included "document-domain.html" file, which can be renamed or
-  // modified if necessary (note that the document.domain specified must be the
-  // same in both your main JavaScript as well as in this file).
-  // 
-  // Usage:
-  // 
-  // jQuery.fn.hashchange.domain = document.domain;
-  
-  // Property: jQuery.fn.hashchange.src
-  // 
-  // If, for some reason, you need to specify an Iframe src file (for example,
-  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
-  // do so using this property. Note that when using this property, history
-  // won't be recorded in IE6/7 until the Iframe src file loads. This property
-  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
-  // compatibility" mode).
-  // 
-  // Usage:
-  // 
-  // jQuery.fn.hashchange.src = 'path/to/file.html';
-  
-  $.fn[ str_hashchange ].delay = 50;
-  /*
-  $.fn[ str_hashchange ].domain = null;
-  $.fn[ str_hashchange ].src = null;
-  */
-  
-  // Event: hashchange event
-  // 
-  // Fired when location.hash changes. In browsers that support it, the native
-  // HTML5 window.onhashchange event is used, otherwise a polling loop is
-  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
-  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
-  // compatibility" mode), a hidden Iframe is created to allow the back button
-  // and hash-based history to work.
-  // 
-  // Usage as described in <jQuery.fn.hashchange>:
-  // 
-  // > // Bind an event handler.
-  // > jQuery(window).hashchange( function(e) {
-  // >   var hash = location.hash;
-  // >   ...
-  // > });
-  // > 
-  // > // Manually trigger the event handler.
-  // > jQuery(window).hashchange();
-  // 
-  // A more verbose usage that allows for event namespacing:
-  // 
-  // > // Bind an event handler.
-  // > jQuery(window).bind( 'hashchange', function(e) {
-  // >   var hash = location.hash;
-  // >   ...
-  // > });
-  // > 
-  // > // Manually trigger the event handler.
-  // > jQuery(window).trigger( 'hashchange' );
-  // 
-  // Additional Notes:
-  // 
-  // * The polling loop and Iframe are not created until at least one handler
-  //   is actually bound to the 'hashchange' event.
-  // * If you need the bound handler(s) to execute immediately, in cases where
-  //   a location.hash exists on page load, via bookmark or page refresh for
-  //   example, use jQuery(window).hashchange() or the more verbose 
-  //   jQuery(window).trigger( 'hashchange' ).
-  // * The event can be bound before DOM ready, but since it won't be usable
-  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
-  //   to bind it inside a DOM ready handler.
-  
-  // Override existing $.event.special.hashchange methods (allowing this plugin
-  // to be defined after jQuery BBQ in BBQ's source code).
-  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
-    
-    // Called only when the first 'hashchange' event is bound to window.
-    setup: function() {
-      // If window.onhashchange is supported natively, there's nothing to do..
-      if ( supports_onhashchange ) { return false; }
-      
-      // Otherwise, we need to create our own. And we don't want to call this
-      // until the user binds to the event, just in case they never do, since it
-      // will create a polling loop and possibly even a hidden Iframe.
-      $( fake_onhashchange.start );
-    },
-    
-    // Called only when the last 'hashchange' event is unbound from window.
-    teardown: function() {
-      // If window.onhashchange is supported natively, there's nothing to do..
-      if ( supports_onhashchange ) { return false; }
-      
-      // Otherwise, we need to stop ours (if possible).
-      $( fake_onhashchange.stop );
-    }
-    
-  });
-  
-  // fake_onhashchange does all the work of triggering the window.onhashchange
-  // event for browsers that don't natively support it, including creating a
-  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
-  // Iframe to enable back and forward.
-  fake_onhashchange = (function(){
-    var self = {},
-      timeout_id,
-      
-      // Remember the initial hash so it doesn't get triggered immediately.
-      last_hash = get_fragment(),
-      
-      fn_retval = function(val){ return val; },
-      history_set = fn_retval,
-      history_get = fn_retval;
-    
-    // Start the polling loop.
-    self.start = function() {
-      timeout_id || poll();
-    };
-    
-    // Stop the polling loop.
-    self.stop = function() {
-      timeout_id && clearTimeout( timeout_id );
-      timeout_id = undefined;
-    };
-    
-    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
-    // if location.hash has changed, and triggers the 'hashchange' event on
-    // window when necessary.
-    function poll() {
-      var hash = get_fragment(),
-        history_hash = history_get( last_hash );
-      
-      if ( hash !== last_hash ) {
-        history_set( last_hash = hash, history_hash );
-        
-        $(window).trigger( str_hashchange );
-        
-      } else if ( history_hash !== last_hash ) {
-        location.href = location.href.replace( /#.*/, '' ) + history_hash;
-      }
-      
-      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
-    };
-    
-    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
-    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
-    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
-    $.browser.msie && !supports_onhashchange && (function(){
-      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
-      // when running in "IE7 compatibility" mode.
-      
-      var iframe,
-        iframe_src;
-      
-      // When the event is bound and polling starts in IE 6/7, create a hidden
-      // Iframe for history handling.
-      self.start = function(){
-        if ( !iframe ) {
-          iframe_src = $.fn[ str_hashchange ].src;
-          iframe_src = iframe_src && iframe_src + get_fragment();
-          
-          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
-          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
-          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
-            
-            // When Iframe has completely loaded, initialize the history and
-            // start polling.
-            .one( 'load', function(){
-              iframe_src || history_set( get_fragment() );
-              poll();
-            })
-            
-            // Load Iframe src if specified, otherwise nothing.
-            .attr( 'src', iframe_src || 'javascript:0' )
-            
-            // Append Iframe after the end of the body to prevent unnecessary
-            // initial page scrolling (yes, this works).
-            .insertAfter( 'body' )[0].contentWindow;
-          
-          // Whenever `document.title` changes, update the Iframe's title to
-          // prettify the back/next history menu entries. Since IE sometimes
-          // errors with "Unspecified error" the very first time this is set
-          // (yes, very useful) wrap this with a try/catch block.
-          doc.onpropertychange = function(){
-            try {
-              if ( event.propertyName === 'title' ) {
-                iframe.document.title = doc.title;
-              }
-            } catch(e) {}
-          };
-          
-        }
-      };
-      
-      // Override the "stop" method since an IE6/7 Iframe was created. Even
-      // if there are no longer any bound event handlers, the polling loop
-      // is still necessary for back/next to work at all!
-      self.stop = fn_retval;
-      
-      // Get history by looking at the hidden Iframe's location.hash.
-      history_get = function() {
-        return get_fragment( iframe.location.href );
-      };
-      
-      // Set a new history item by opening and then closing the Iframe
-      // document, *then* setting its location.hash. If document.domain has
-      // been set, update that as well.
-      history_set = function( hash, history_hash ) {
-        var iframe_doc = iframe.document,
-          domain = $.fn[ str_hashchange ].domain;
-        
-        if ( hash !== history_hash ) {
-          // Update Iframe with any initial `document.title` that might be set.
-          iframe_doc.title = doc.title;
-          
-          // Opening the Iframe's document after it has been closed is what
-          // actually adds a history entry.
-          iframe_doc.open();
-          
-          // Set document.domain for the Iframe document as well, if necessary.
-          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
-          
-          iframe_doc.close();
-          
-          // Update the Iframe's hash, for great justice.
-          iframe.location.hash = hash;
-        }
-      };
-      
-    })();
-    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
-    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-    
-    return self;
-  })();
-  
-})(jQuery,this);
index 8502d14..6725d4b 100644 (file)
@@ -1,4 +1,4 @@
 name = Pazpar2 metasearch integration
 description = Metasearching of Z39.50, SRU and SOLR targets via Index Data's Pazpar2 and associated tool stack.
-core = 6.x
-version = 6.x-1.0
+core = 7.x
+dependencies[] = block
index e136c59..23d4de3 100644 (file)
@@ -6,21 +6,21 @@
  */
 
 /**
-* Implementation of hook_schema().
+* Implements hook_schema().
 */
 function mkdru_schema() {
   $schema['mkdru'] = array(
-    'description' => t('Stores settings for mkdru nodes.'),
+    'description' => 'Stores settings for mkdru nodes.',
     'fields' => array(
       'nid' => array(
-        'description' => t('The primary identifier for a node.'),
+        'description' => 'The primary identifier for a node.',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
         'default' => 0
        ),
       'vid' => array(
-        'description' => t('The current {node_revisions}.vid version identifier.'),
+        'description' => 'The current {node_revisions}.vid version identifier.',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
@@ -29,28 +29,28 @@ function mkdru_schema() {
       'pz2_path' => array(
         'type' => 'text',
         'not null' => TRUE,
-        'description' => t('Path to Pazpar2 or Service Proxy.')
+        'description' => 'Path to Pazpar2 or Service Proxy.',
       ),
       'use_sessions' => array(
-        'description' => t('Session handling toggle.'),
+        'description' => 'Session handling toggle.',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
       ),
       'source_max' => array(
-        'description' => t('Number of sources to display'),
+        'description' => 'Number of sources to display',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
       ),
       'author_max' => array(
-        'description' => t('Number of authors to display'),
+        'description' => 'Number of authors to display',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
       ),
       'subject_max' => array(
-        'description' => t('Number of subjects to display'),
+        'description' => 'Number of subjects to display',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
@@ -58,12 +58,12 @@ function mkdru_schema() {
       'sp_user' => array(
         'type' => 'text',
         'not null' => FALSE,
-        'description' => t('Service Proxy username')
+        'description' => 'Service Proxy username'
       ),
       'sp_pass' => array(
         'type' => 'text',
         'not null' => FALSE,
-        'description' => t('Service Proxy password')
+        'description' => 'Service Proxy password'
       ),
     ),
     'primary key' => array('nid', 'vid'),
@@ -74,28 +74,17 @@ function mkdru_schema() {
 }
 
 /**
-* Implementation of hook_install().
+* Implements hook_install().
 */
 function mkdru_install() {
   // Disable comments by default
   variable_set('comment_mkdru', COMMENT_NODE_DISABLED);
-  // Create table.
-  drupal_install_schema('mkdru');
 }
 
 /**
-* Implementation of hook_uninstall().
+* Implements hook_uninstall().
 */
 function mkdru_uninstall() {
-  // Drop table.
-  drupal_uninstall_schema('mkdru');
   // Delete variables
   variable_del('pz2_js_path');
-}
-
-function mkdru_update_6100() {
-  $ret = array();
-  db_add_field($ret, 'mkdru', 'sp_user', array('type' => 'varchar', 'length' => 32, 'not null' => FALSE, 'default' => '') );
-  db_add_field($ret, 'mkdru', 'sp_pass', array('type' => 'varchar', 'length' => 32, 'not null' => FALSE, 'default' => '') );
-  return $ret;
-}
+}
\ No newline at end of file
index a68fc93..6acbcd9 100644 (file)
@@ -5,13 +5,13 @@
 
 // Module metainfo
 /**
-* Implementation of hook_node_info()
+* Implements hook_node_info()
 */
 function mkdru_node_info() {
   return array(
     'mkdru' => array(
       'name' => t("Pazpar2 metasearch interface"),
-      'module' => 'mkdru',
+      'base' => 'mkdru',
       'description' => t("Metasearch interface for Z39.50/SRU and other targets via a Pazpar2/Service Proxy backend"),
     )
   );
@@ -20,12 +20,14 @@ function mkdru_node_info() {
 function mkdru_ting_search_show($params) {
    $path = drupal_get_path('module', 'mkdru');
   // Include client library.
-  drupal_add_js(variable_get('pz2_js_path', 'pazpar2/js') 
-    . '/pz2.js', 'module', 'footer');
-  drupal_add_js($path . '/jquery.ba-bbq.js', 'module', 'footer');
-  drupal_add_js($path . '/mkdru.theme.js', 'module', 'footer');
-  drupal_add_js($path . '/mkdru.client.js', 'module', 'footer');
-  $html = theme('mkdru_results'); 
+  drupal_add_js(variable_get('pz2_js_path', 'pazpar2/js') . '/pz2.js',
+    array('type' => 'file', 'scope' => 'footer'));
+  drupal_add_library('overlay', 'jquery-bbq');
+  drupal_add_js($path . '/mkdru.theme.js',
+    array('type' => 'file', 'scope' => 'footer'));
+  drupal_add_js($path . '/mkdru.client.js',
+    array('type' => 'file', 'scope' => 'footer'));
+  $html = theme('mkdru_results');
   drupal_add_js(array('mkdru' => 
     array('use_sessions' => '1', 'query' => $params['keys']
     )), 'setting');
@@ -33,17 +35,29 @@ function mkdru_ting_search_show($params) {
 }
 
 /**
-* Implementation of hook_perm()
+* Implements hook_permission()
 */
-function mkdru_perm() {
-  return array('create metasearch interface', 'edit any metasearch interface', 'edit own metasearch interface');
+function mkdru_permission() {
+  return array(
+    'administer metasearch interfaces' => array(
+      'title' => t('Administer Pazpar2 metasearch integration'),
+    ),
+    'create metasearch interface' => array(
+      'title' => t('Create metasearch interface'),
+    ),
+    'edit any metasearch interface' => array(
+      'title' => t('Edit any metasearch interface'),
+    ),
+    'edit own metasearch interface' => array(
+      'title' => t('Edit own metasearch interface'),
+    ),
+  );
 }
 
 /**
-* Implementation of hook_access()
+* Implements hook_node_access()
 */
-function mkdru_access($op, $node, $account) {
-
+function mkdru_node_access($node, $op, $account) {
   if ($op == 'create') {
     // Only users with permission to do so may create this node type.
     return user_access('create metasearch interface', $account);
@@ -62,7 +76,7 @@ function mkdru_access($op, $node, $account) {
 }
 
 /**
-* Implementation of hook_menu()
+* Implements hook_menu()
 */
 function mkdru_menu() {
   $items['admin/settings/mkdru'] = array(
@@ -91,10 +105,10 @@ function mkdru_init() {
 
 // Node config
 /**
-* Implementation of hook_form()
+* Implements hook_form()
 */
 function mkdru_form(&$node, $form_state) {
-  $type = node_get_types('type', $node);
+  $type = node_type_get_type($node);
 
   $form['title'] = array(
     '#type' => 'textfield',
@@ -182,7 +196,7 @@ function mkdru_form(&$node, $form_state) {
 
 
 /**
-* Implementation of hook_validate()
+* Implements hook_validate()
 */
 function mkdru_validate($node) {
   if (!is_numeric($node->source_max)) {
@@ -197,14 +211,14 @@ function mkdru_validate($node) {
 }
 
 /**
-* Implementation of hook_insert().
+* Implements hook_insert().
 */
 function mkdru_insert($node) {
   drupal_write_record('mkdru', $node);
 }
 
 /**
-* Implementation of hook_update().
+* Implements hook_update().
 */
 function mkdru_update($node) {
   if ($node->revision) {
@@ -217,62 +231,60 @@ function mkdru_update($node) {
 }
 
 /**
- * Implementation of hook_nodeapi().
- *
- * When a node revision is deleted, we need to remove the corresponding record
- * from our table. The only way to handle revision deletion is by implementing
- * hook_nodeapi().
+ * Implements hook_node_revision_delete()
  */
-function mkdru_nodeapi(&$node, $op, $teaser, $page) {
-  switch ($op) {
-    case 'delete revision':
-      db_query('DELETE FROM {mkdru} WHERE vid = %d', $node->vid);
-      break;
-  }
+function mkdru_node_revision_delete($node) {
+  db_delete('mkdru')
+    ->condition('vid', $node->vid)
+    ->execute();
 }
 
 /**
- * Implementation of hook_delete().
+ * Implements hook_delete()
  */
 function mkdru_delete($node) {
   // Deleting by nid covers all revisions.
-  db_query('DELETE FROM {mkdru} WHERE nid = %d', $node->nid);
+  db_delete('mkdru')
+    ->condition('nid', $nid->nid)
+    ->execute();
 }
 
 
 
 // Node rendering
 /**
-* Implementation of hook_load()
+* Implements hook_load()
 */
-function mkdru_load($node) {
-  return array('mkdru' => db_fetch_object(db_query(
-    'SELECT * FROM {mkdru} WHERE vid = %d', $node->vid)));
+function mkdru_load($nodes) {
+  $result = db_query('SELECT * FROM {mkdru} WHERE nid IN (:nids)', array(':nids' => array_keys($nodes)));
+  foreach ($result as $record) {
+    $nodes[$record->nid]->mkdru = $record;
+  }
 }
 
 /**
-* Implementation of hook_theme().
+* Implements hook_theme().
 */
 function mkdru_theme() {
   return array(
     'mkdru_form' => array(
       'template' => 'mkdru-form',
-      'arguments' => array(),
+      'variables' => array(),
     ),
     'mkdru_results' => array(
       'template' => 'mkdru-results',
-      'arguments' => array(),
+      'variables' => array(),
     ),
     'mkdru_js' => array(
-      'arguments' => array('node' => NULL),
+      'variables' => array('node' => NULL),
     ),
     'mkdru_block_search' => array(
       'template' => 'mkdru-block-search',
-      'arguments' => array('nid' => NULL, 'path' => NULL),
+      'variables' => array('nid' => NULL, 'path' => NULL),
     ),
     'mkdru_block_facet' => array(
       'template' => 'mkdru-block-facet',
-      'arguments' => array('class' => NULL)
+      'variables' => array('class' => NULL)
     )
   );
 }
@@ -280,93 +292,88 @@ function mkdru_theme() {
 /**
 * Theme function to include Javascript search client and deps
 */
-function theme_mkdru_js($node) {
+function theme_mkdru_js(&$variables) {
   $path = drupal_get_path('module', 'mkdru');
-  // Pazpar2 client library.
-  drupal_add_js(variable_get('pz2_js_path', 'pazpar2/js') . '/pz2.js', 'module', 'footer', TRUE, TRUE, FALSE);
+  // Pazpar2 client library
+  drupal_add_js(variable_get('pz2_js_path', 'pazpar2/js') . '/pz2.js', array(
+    'type' => 'file', 'scope' => 'footer', 'defer' => TRUE, 'preprocess' => FALSE));
   // jQuery plugin for query string/history manipulation.
-  drupal_add_js($path . '/jquery.ba-bbq.js', 'module', 'footer', TRUE, TRUE, FALSE);
-  drupal_add_js($path . '/mkdru.theme.js', 'module', 'footer', TRUE, TRUE, FALSE);
-  drupal_add_js($path . '/mkdru.client.js', 'module', 'footer', TRUE, TRUE, FALSE);
-  drupal_add_js(array('mkdru' => $node->mkdru), 'setting');
+  drupal_add_library('overlay', 'jquery-bbq');
+  drupal_add_js($path . '/mkdru.theme.js', array(
+    'type' => 'file', 'scope' => 'footer', 'defer' => TRUE, 'preprocess' => FALSE));
+  drupal_add_js($path . '/mkdru.client.js', array(
+    'type' => 'file', 'scope' => 'footer', 'defer' => TRUE, 'preprocess' => FALSE));
+  drupal_add_js(array('mkdru' => $variables['node']->mkdru), 'setting');
 }
 
 /** 
-* Implementation of hook_view()
+* Implements hook_view()
 */
-function mkdru_view($node, $teaser = FALSE, $page = FALSE) {
-  $node->content['mkdru_js'] = array(
-    '#value' => theme('mkdru_js', $node), 
-    '#weight' => 0,
-  );
-  $node->content['mkdru_form'] = array(
-    '#value' => theme('mkdru_form'), 
-    '#weight' => 1,
-  );
-  $node->content['mkdru_results'] = array(
-    '#value' => theme('mkdru_results'), 
-    '#weight' => 2,
-  );
+function mkdru_view($node, $view_mode) {
+  if ($view_mode == 'full') {
+    $node->content['mkdru_js'] = array(
+      '#markup' => theme('mkdru_js', array('node' => $node)), 
+      '#weight' => 0,
+    );
+    $node->content['mkdru_form'] = array(
+      '#markup' => theme('mkdru_form'), 
+      '#weight' => 1,
+    );
+    $node->content['mkdru_results'] = array(
+      '#markup' => theme('mkdru_results'), 
+      '#weight' => 2,
+    );
+  }
   return $node;
 }
 
+
+
+// Blocks
 /** 
-* Implementation of hook_block()
+* Implements hook_block_info()
 */
-function mkdru_block($op='list', $delta='sources', $edit=array()) {
-  switch ($op) {
-    case 'list':
-      // facet blocks
-      // D6 has no setting for note type visibility, set
-      // the default to limit facet display to this type
-      $visPHP = '<?php
-  if (arg(0) == "node" && is_numeric(arg(1))) {
-    $node = node_load(array("nid" => arg(1)));
-    return $node->type == "mkdru";
-  }
-?>';
-
-      // NB: block caching is redundant for static content
-      $blocks['mkdru_sources']['info'] = t('mkdru - source facets');
-      $blocks['mkdru_sources']['cache'] = BLOCK_NO_CACHE;
-      $blocks['mkdru_sources']['visibility'] = 2;
-      $blocks['mkdru_sources']['pages'] = $visPHP;
-      $blocks['mkdru_subjects']['info'] = t('mkdru - subject facets');
-      $blocks['mkdru_subjects']['cache'] = BLOCK_NO_CACHE;
-      $blocks['mkdru_subjects']['visibility'] = 2;
-      $blocks['mkdru_subjects']['pages'] = $visPHP;
-      $blocks['mkdru_authors']['info'] = t('mkdru - author facets');
-      $blocks['mkdru_authors']['cache'] = BLOCK_NO_CACHE;
-      $blocks['mkdru_authors']['visibility'] = 2;
-      $blocks['mkdru_authors']['pages'] = $visPHP;
-      // search blocks
-      $result = db_query("SELECT title, nid FROM {node} WHERE type = 'mkdru';");
-      while ($node = db_fetch_object($result)) {
-        $blocks['mkdru_search_' . $node->nid]['info'] = 
-           t('mkdru - search box for "' . $node->title . '"');
-        $blocks['mkdru_sources']['cache'] = BLOCK_NO_CACHE;
-      };
-      return $blocks;
-
-    case 'view':
-      switch ($delta) {
-        case 'mkdru_sources':
-          $block['subject'] = t('Source');
-          $block['content'] = theme('mkdru_block_facet', 'mkdru-facet-source');
-          return $block;
-        case 'mkdru_subjects':
-          $block['subject'] = t('Subject');
-          $block['content'] = theme('mkdru_block_facet', 'mkdru-facet-subject');
-          return $block;
-        case 'mkdru_authors':
-          $block['subject'] = t('Author');
-          $block['content'] = theme('mkdru_block_facet', 'mkdru-facet-author');
-          return $block;
-    }
-    if (substr($delta, 0, 13) == 'mkdru_search_') {
-      $nid = substr($delta, 13);
-      $block['content'] = theme('mkdru_block_search', $nid, '/node/' . $nid);
+function mkdru_block_info() {
+  // NB: block caching is redundant for static content
+  $blocks['mkdru_sources']['info'] = t('mkdru - source facets');
+  $blocks['mkdru_sources']['cache'] = DRUPAL_NO_CACHE;
+  $blocks['mkdru_subjects']['info'] = t('mkdru - subject facets');
+  $blocks['mkdru_subjects']['cache'] = DRUPAL_NO_CACHE;
+  $blocks['mkdru_authors']['info'] = t('mkdru - author facets');
+  $blocks['mkdru_authors']['cache'] = DRUPAL_NO_CACHE;
+
+  // search blocks
+  $result = db_query("SELECT title, nid FROM {node} WHERE type = 'mkdru';");
+  foreach($result as $node) {
+    $blocks['mkdru_search_' . $node->nid]['info'] = 
+        t('mkdru - search box for "' . $node->title . '"');
+    $blocks['mkdru_sources']['cache'] = DRUPAL_NO_CACHE;
+  };
+  return $blocks;
+}
+
+/** 
+* Implements hook_block_view()
+*/
+function mkdru_block_view($delta) {
+  switch ($delta) {
+    case 'mkdru_sources':
+      $block['subject'] = t('Source');
+      $block['content'] = theme('mkdru_block_facet', 'mkdru-facet-source');
+      return $block;
+    case 'mkdru_subjects':
+      $block['subject'] = t('Subject');
+      $block['content'] = theme('mkdru_block_facet', 'mkdru-facet-subject');
+      return $block;
+    case 'mkdru_authors':
+      $block['subject'] = t('Author');
+      $block['content'] = theme('mkdru_block_facet', 'mkdru-facet-author');
       return $block;
     }
+  if (substr($delta, 0, 13) == 'mkdru_search_') {
+    $nid = substr($delta, 13);
+    $block['content'] = theme('mkdru_block_search',
+        array('nid' => $nid, 'path' => '/node/' . $nid));
+    return $block;
   }
 }