From: Jason Skomorowski Date: Wed, 16 Feb 2011 05:12:01 +0000 (+0100) Subject: Running in Drupal 7. X-Git-Url: http://git.indexdata.com/?p=mkdru-moved-to-drupal.org.git;a=commitdiff_plain;h=71f905d869983f2162082de22d8849732e5d3efa Running in Drupal 7. --- diff --git a/LICENSE b/LICENSE deleted file mode 100644 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. - - 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.) - -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. - - 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. - - 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 - - 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. - - - Copyright (C) - - 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. - - , 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 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 index 3a5995d..0000000 --- a/jquery.ba-bbq.js +++ /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 v1.3, which adds -// document.title and document.domain support in IE6/7, BlackBerry -// support, better Iframe hiding for accessibility reasons, and the new -// "shortcut" method. Added the -// method which reduces the possibility of -// extraneous hashchange event triggering. Added the -// 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 -// in BBQ, which was the main reason for the -// previous release! -// 1.2 - (2/16/2010) Integrated 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 method, and reworked the -// 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 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 -// 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 -// plugin for more information. Also added the -// method and added additional 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 and -// 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 , or when the fragment is modified - // using . 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 and 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 - // , 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 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 - // , 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 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 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 - // 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 - // and the event.getState method is equivalent to the - // 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 and 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 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 and -// lowered its default value to 50. Added -// and 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 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 - // 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 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 ), 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 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 : - // - // > // 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 = $('