diff --git a/.gitignore b/.gitignore index 1fb826b..0c7c60c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ db_old_files db_rss_timestamp rss.locker new_files_list +.idea/ \ No newline at end of file diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..b0085f3 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,17 @@ +MinigalNano is licensed under the AGPL v3 (https://gnu.org/licenses/agpl-3.0.txt) +You can check github's contributors list : https://github.com/sebsauvage/MinigalNano/graphs/contributors + +Copyright (c) Thomas Rybak (2014) +Copyright (c) Sébastien Sauvage (2014) +Copyright (c) Aldarone (2014) +Copyright (c) Sylvhem (2014) +Copyright (c) Tom Canac (2014, 2015, 2016) +Copyright (c) Alda Marteau-Hardi (2014) +Copyright (c) bitbybit (2014) +Copyright (c) cyberic99 (2014) +Copyright (c) iGormilhit (2014) +Copyright (c) Jan Niggemann (2014, 2015) +Copyright (c) Lucas Cimon (2014) +Copyright (c) nodiscc (2014, 2015) +Copyright (c) Orangina Rouge (2014) +Copyright (c) Nitrux Project (2014) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a871fcf --- /dev/null +++ b/LICENSE @@ -0,0 +1,662 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + 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 +them 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state 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 Affero General Public License as published by + the Free Software Foundation, either version 3 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. + diff --git a/README.md b/README.md index 40f420d..ead1a5e 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,14 @@ If some thumbnails are wrong, you can purge this directory: Thumbnails will be a ------------------------------------------------------------ -MinigalNano is licensed under the Creative Commons Attribution-Share Alike license (http://creativecommons.org/licenses/by-sa/3.0/) +License +======= - * [Project contributors](humans.txt) +MinigalNano is licensed under the GNU AFFERO GENERAL PUBLIC LICENSE v3 (https://gnu.org/licenses/agpl-3.0.txt). + +Icons used are from the Nitrux project and licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives International +4.0 License (https://creativecommons.org/licenses/by-nc-nd/4.0/). + + * [Project contributors](AUTHORS) * [Original discussion page (english)](http://sebsauvage.net/wiki/doku.php?id=minigal_nano_en) * [Original discussion page (french)](http://sebsauvage.net/wiki/doku.php?id=minigal_nano) diff --git a/config-default.php b/config-default.php index 324edc5..787f8d1 100755 --- a/config-default.php +++ b/config-default.php @@ -1,51 +1,46 @@ "; // Breadcrumb parts separator +$label_home = "Home"; // Name of home link in breadcrumb navigation +$label_new = "New"; // Text to display for new images. Use with $display_new variable +$label_page = "Page"; // Text used for page navigation +$label_all = "All"; // Text used for link to display all images in one page +$label_noimages = "No images... yet !"; // Empty folder text +$label_noimages_advice = "Use your FTP to upload some picture !"; +$label_loading = "Loading..."; // Thumbnail loading text +$breadcrumb_separator = ">"; // Breadcrumb parts separator //RSS SETTINGS -$description = "MiniGal Nano"; -$nb_items_rss = 25; // Number of elements to display in the feed. If you add a lot of pictures at the time, consider increasing this number -$rss_refresh_interval = 60;// Time, in seconds, between two RSS refresh. for example, 3600 = 1update max per hour, 86400 = 1/day. -$SkipExts = array('html', 'txt', 'php', "gitignore"); //Files with one of this extension will not be displayed on the RSS feed +$description = "MiniGal Nano"; +$nb_items_rss = 25; // Number of elements to display in the feed. If you add a lot of pictures at the time, consider increasing this number +$rss_refresh_interval = 60; // Time, in seconds, between two RSS refresh. for example, 3600 = 1update max per hour, 86400 = 1/day. +$keep_extensions = array('jpg', 'jpeg', 'png', 'gif'); //Files with one of this extension will not be displayed on the RSS feed //ADVANCED SETTINGS -$thumb_size = 320; //Thumbnail height/width (square thumbs). Changing this will most likely require manual altering of the template file to make it look properly! -$label_max_length = 40; //Maximum chars of a folder name that will be displayed on the folder thumbnail -$display_exif = 0; //Take care, even if not diplayed EXIF are still readable for visitors. May be a good idea to erase EXIF data... -$display_filename = 0; //Show file names below the pictures +$thumb_size = 320; // Thumbnail height/width (square thumbs). Changing this will most likely require manual altering of the template file to make it look properly! +$label_max_length = 40; // Maximum chars of a folder name that will be displayed on the folder thumbnail +$display_exif = 0; // Take care, even if not diplayed EXIF are still readable for visitors. May be a good idea to erase EXIF data... +$display_filename = 0; // Show file names below the pictures ?> diff --git a/config.php b/config.php index 532fcbb..1d68062 100755 --- a/config.php +++ b/config.php @@ -1,24 +1,17 @@ diff --git a/createthumb.php b/createthumb.php index 28b40f8..402e03f 100644 --- a/createthumb.php +++ b/createthumb.php @@ -1,79 +1,83 @@ -*/ + * This file is part of MinigalNano: https://github.com/sebsauvage/MinigalNano + * + * MiniGal Nano is based on an original work by Thomas Rybak (© 2010) + * + * MinigalNano is licensed under the AGPL v3 (https://gnu.org/licenses/agpl-3.0.txt). + */ error_reporting(0); $get_filename = $_GET['filename']; $get_size = @$_GET['size']; -if (empty($get_size)) $get_size = 120; +if (empty($get_size)) { + $get_size = 120; +} -if (preg_match("/.jpe?g$/i", $get_filename)) $get_filename_type = "JPG"; -if (preg_match("/.gif$/i", $get_filename)) $get_filename_type = "GIF"; -if (preg_match("/.png$/i", $get_filename)) $get_filename_type = "PNG"; +if (preg_match("/^\/.*/i", $get_filename)) { + die("Unauthorized access !"); +} -// flip functions from http://stackoverflow.com/questions/8232722/how-to-flip-part-of-an-image-horizontal-with-php-gd +if (preg_match("/.jpe?g$/i", $get_filename)) { + $get_filename_type = "JPG"; +} + +if (preg_match("/.gif$/i", $get_filename)) { + $get_filename_type = "GIF"; +} + +if (preg_match("/.png$/i", $get_filename)) { + $get_filename_type = "PNG"; +} + +/** + * Vertical flip + * @author http://stackoverflow.com/questions/8232722/how-to-flip-part-of-an-image-horizontal-with-php-gd + */ function flipVertical(&$img) { $size_x = imagesx($img); $size_y = imagesy($img); $temp = imagecreatetruecolor($size_x, $size_y); - $x = imagecopyresampled($temp, $img, 0, 0, 0, ($size_y-1), $size_x, $size_y, $size_x, 0-$size_y); - if ($x) - { + $x = imagecopyresampled($temp, $img, 0, 0, 0, ($size_y - 1), $size_x, $size_y, $size_x, 0 - $size_y); + if ($x) { $img = $temp; } else { die("Unable to flip image"); } } +/** + * Horizontal flip + * @author http://stackoverflow.com/questions/8232722/how-to-flip-part-of-an-image-horizontal-with-php-gd + */ function flipHorizontal(&$img) { $size_x = imagesx($img); $size_y = imagesy($img); $temp = imagecreatetruecolor($size_x, $size_y); - $x = imagecopyresampled($temp, $img, 0, 0, ($size_x-1), 0, $size_x, $size_y, 0-$size_x, $size_y); - if ($x) - { + $x = imagecopyresampled($temp, $img, 0, 0, ($size_x - 1), 0, $size_x, $size_y, 0 - $size_x, $size_y); + if ($x) { $img = $temp; } else { die("Unable to flip image"); } } +/** + * Sanitizing (this allows for collisions) + */ function sanitize($name) { -// note: this allows for collisions return preg_replace("/[^[:alnum:]_.-]/", "_", $name); } // Make sure the "thumbs" directory exists. -if (!is_dir('thumbs') && is_writable('.')) -{ - mkdir('thumbs',0700); +if (!is_dir('thumbs') && is_writable('.')) { + mkdir('thumbs', 0700); } // Thumbnail file name and path. // (We always put thumbnails in jpg for simplification) -$thumbname = 'thumbs/'.sanitize($get_filename).'.jpg'; +$thumbname = 'thumbs/' . sanitize($get_filename) . '.jpg'; if (file_exists($thumbname)) // If thumbnail exists, serve it. { @@ -81,7 +85,7 @@ if (file_exists($thumbname)) // If thumbnail exists, serve it. $cacheContent = fread($fd, filesize($thumbname)); fclose($fd); header('Content-type: image/jpeg'); - echo($cacheContent); + echo ($cacheContent); exit; } @@ -112,63 +116,85 @@ $yoord = 0; $imgsize = getimagesize($get_filename); $width = $imgsize[0]; $height = $imgsize[1]; -if ($width > $height) // If the width is greater than the height it’s a horizontal picture -{ - $xoord = ceil(($width-$height)/2); - $width = $height; // Then we read a square frame that equals the width -} -else -{ - $yoord = ceil(($height-$width)/2); +// If the width is greater than the height it’s a horizontal picture +if ($width > $height) { + $xoord = ceil(($width - $height) / 2); + // Then we read a square frame that equals the width + $width = $height; +} else { + $yoord = ceil(($height - $width) / 2); $height = $width; } // Rotate JPG pictures +// for more info on orientation see +// http://www.daveperrett.com/articles/2012/07/28/exif-orientation-handling-is-a-ghetto/ + $degrees = 0; $flip = ''; -if ($get_filename_type == "JPG") -{ - if (function_exists('exif_read_data') && function_exists('imagerotate')) - { - $exif = exif_read_data($get_filename, 0, true); - if (isset($exif['IFD0']) && isset($exif['IFD0']['Orientation'])) - $ort = $exif['IFD0']['Orientation']; - else - $ort = 0; - // for more info on orientation see - // http://www.daveperrett.com/articles/2012/07/28/exif-orientation-handling-is-a-ghetto/ - $ort2deg = array(3=>180, 4=>180, 5=>270, 6=>270, 7=>90, 8=>90); - $degrees = in_array($ort, $ort2deg) ? $ort2deg[$ort] : 0; - $ort2flip = array(2, 4, 5, 7); - $flip = in_array($ort, $flip2deg) ? 'vertical' : ''; +if (preg_match("/.jpg$|.jpeg$/i", $_GET['filename'])) { + if (function_exists('exif_read_data') && function_exists('imagerotate')) { + $exif = exif_read_data($_GET['filename'], 0, true); + $ort = $exif['IFD0']['Orientation']; + switch ($ort) { + case 3: // 180 rotate right + $degrees = 180; + break; + case 6: // 90 rotate right + $degrees = 270; + break; + case 8: // 90 rotate left + $degrees = 90; + break; + case 2: // flip vertical + $flip = 'vertical'; + break; + case 7: // flipped + $degrees = 90; + $flip = 'vertical'; + break; + case 5: // flipped + $degrees = 270; + $flip = 'vertical'; + break; + case 4: // flipped + $degrees = 180; + $flip = 'vertical'; + break; + } } } $target = imagecreatetruecolor($get_size, $get_size); -// if the picture can be transparent, add a white background instead a black -if (in_array($get_filename_type, array("GIF", "PNG"))) -{ +// if the picture can be transparent, add a white background +if (in_array($get_filename_type, array("GIF", "PNG"))) { $backgroundColor = imagecolorallocate($target, 255, 255, 255); imagefill($target, 0, 0, $backgroundColor); } +if ($get_filename_type == "JPG") { + $source = imagecreatefromjpeg($get_filename); +} + +if ($get_filename_type == "GIF") { + $source = imagecreatefromgif($get_filename); +} + +if ($get_filename_type == "PNG") { + $source = imagecreatefrompng($get_filename); +} -if ($get_filename_type == "JPG") $source = imagecreatefromjpeg($get_filename); -if ($get_filename_type == "GIF") $source = imagecreatefromgif($get_filename); -if ($get_filename_type == "PNG") $source = imagecreatefrompng($get_filename); imagecopyresampled($target, $source, 0, 0, $xoord, $yoord, $get_size, $get_size, $width, $height); imagedestroy($source); //proper rotation by jan niggemann -if ($degrees != 0) -{ +if ($degrees != 0) { $target = imagerotate($target, $degrees, 0); } //proper mirror (aka flip) by jan niggemann -if ($flip == 'vertical') -{ +if ($flip == 'vertical') { //only in php >= 5.5.0 ImageJPEG(imageflip($target, IMG_FLIP_VERTICAL),null,80); flipVertical($target); flipHorizontal($target); @@ -182,15 +208,10 @@ imagedestroy($target); $cachedImage = ob_get_contents(); // Get the buffer content. ob_end_flush(); // End buffering -if (is_writable(dirname($thumbname))) -{ +if (is_writable(dirname($thumbname))) { $fd = fopen($thumbname, "w"); // Save buffer to disk - if ($fd) - { - fwrite($fd,$cachedImage); + if ($fd) { + fwrite($fd, $cachedImage); fclose($fd); } } - - -?> diff --git a/humans.txt b/humans.txt deleted file mode 100644 index 9d25ab7..0000000 --- a/humans.txt +++ /dev/null @@ -1,16 +0,0 @@ -MinigalNano is licensed under the Creative Commons Attribution-Share Alike license (http://creativecommons.org/licenses/by-sa/3.0/) - -Copyright (c) 2014 Thomas Rybak -Copyright (c) 2014 Sébastien Sauvage -Copyright (c) 2014 Aldarone -Copyright (c) 2014 Sylvhem -Copyright (c) 2014 Tom Canac -Copyright (c) 2014 Alda Marteau-Hardi -Copyright (c) 2014 bitbybit -Copyright (c) 2014 cyberic99 -Copyright (c) 2014 iGormilhit -Copyright (c) 2014 Jan -Copyright (c) 2014 Lucas Cimon -Copyright (c) 2014 nodiscc -Copyright (c) 2014 Orangina Rouge -Copyright (c) 2014 Nitrux Project \ No newline at end of file diff --git a/index.php b/index.php index 94cf65b..9af1dea 100755 --- a/index.php +++ b/index.php @@ -1,36 +1,23 @@ $length) { - return substr($name, 0, $length) . "..."; - } - return $name; +function padstring($name, $length) { + global $label_max_length; + if (!isset($length)) { + $length = $label_max_length; + } + if (strlen($name) > $length) { + return substr($name, 0, $length) . "..."; + } + return $name; } -function getfirstImage($dirname) -{ - $imageName = false; - $extensions = array("jpg", "png", "jpeg", "gif"); - if ($handle = opendir($dirname)) { - while(false !== ($file = readdir($handle))) { - if ($file[0] == '.') { - continue; - } - $pathinfo = pathinfo($file); - if (empty($pathinfo['extension'])) { - continue; - } - $ext = strtolower($pathinfo['extension']); - if (in_array($ext, $extensions)) { - $imageName = $file; - break; - } - } - closedir($handle); - } - return $imageName; +function getfirstImage($dirname) { + $imageName = false; + $extensions = array("jpg", "png", "jpeg", "gif"); + if ($handle = opendir($dirname)) { + while (false !== ($file = readdir($handle))) { + if ($file[0] == '.') { + continue; + } + $pathinfo = pathinfo($file); + if (empty($pathinfo['extension'])) { + continue; + } + $ext = strtolower($pathinfo['extension']); + if (in_array($ext, $extensions)) { + $imageName = $file; + break; + } + } + closedir($handle); + } + return $imageName; } -function parse_fraction($v, $round=0) -{ - list($x, $y) = array_map('intval', explode('/', $v)); - if (empty($x) || empty($y)) { - return $v; - } - if ($x % $y == 0) { - return $x/$y; - } - if ($y % $x == 0) { - return "1/" . $y/$x; - } - return round($x/$y, $round); +function parse_fraction($v, $round = 0) { + list($x, $y) = array_map('intval', explode('/', $v)); + if (empty($x) || empty($y)) { + return $v; + } + if ($x % $y == 0) { + return $x / $y; + } + if ($y % $x == 0) { + return "1/" . $y / $x; + } + return round($x / $y, $round); } -function readEXIF($file) -{ - $exif_arr = array(); - $exif_data = exif_read_data($file); +function readEXIF($file) { + $exif_arr = array(); + $exif_data = exif_read_data($file); - $exif_val = @$exif_data['Model']; - if (!empty($exif_val)) { - $exif_arr[] = $exif_val; - } + $exif_val = @$exif_data['Model']; + if (!empty($exif_val)) { + $exif_arr[] = $exif_val; + } - $exif_val = @$exif_data['FocalLength']; - if (!empty($exif_val)) { - $exif_arr[] = parse_fraction($exif_val) . "mm"; - } + $exif_val = @$exif_data['FocalLength']; + if (!empty($exif_val)) { + $exif_arr[] = parse_fraction($exif_val) . "mm"; + } - $exif_val = @$exif_data['ExposureTime']; - if (!empty($exif_val)) { - $exif_arr[] = parse_fraction($exif_val, 2) . "s"; - } + $exif_val = @$exif_data['ExposureTime']; + if (!empty($exif_val)) { + $exif_arr[] = parse_fraction($exif_val, 2) . "s"; + } - $exif_val = @$exif_data['FNumber']; - if (!empty($exif_val)) { - $exif_arr[] = "f" . parse_fraction($exif_val); - } + $exif_val = @$exif_data['FNumber']; + if (!empty($exif_val)) { + $exif_arr[] = "f" . parse_fraction($exif_val); + } - $exif_val = @$exif_data['ISOSpeedRatings']; - if (!empty($exif_val)) { - $exif_arr[] = "ISO " . $exif_val; - } + $exif_val = @$exif_data['ISOSpeedRatings']; + if (!empty($exif_val)) { + $exif_arr[] = "ISO " . $exif_val; + } - if (count($exif_arr) > 0) { - return "::" . implode(" | ", $exif_arr); + if (count($exif_arr) > 0) { + return "::" . implode(" | ", $exif_arr); + } + + return $exif_arr; +} + +function checkpermissions($file) { + global $messages; + + if (!is_readable($file)) { + $messages = "At least one file or folder has wrong permissions. " + . "Learn how to " + . "set file permissions"; + } +} + +function guardAgainstDirectoryTraversal($path) { + $pattern = "/^(.*\/)?(\.\.)(\/.*)?$/"; + $directory_traversal = preg_match($pattern, $path); + + if ($directory_traversal === 1) { + die("ERROR: Could not open " . htmlspecialchars(stripslashes($current_dir)) . " for reading!"); } } -function checkpermissions($file) -{ - global $messages; - - if (!is_readable($file)) { - $messages = "At least one file or folder has wrong permissions. " - . "Learn how to " - . "set file permissions"; - } +if (!defined("GALLERY_ROOT")) { + define("GALLERY_ROOT", ""); } -if (!defined("GALLERY_ROOT")) - define("GALLERY_ROOT", ""); $requestedDir = ''; -if (!empty($_GET['dir'])) - $requestedDir = $_GET['dir']; -$thumbdir = rtrim('photos/' . $requestedDir, '/'); - -//$thumbdir = str_replace('/..', '', $thumbdir); // Prevent directory traversal attacks. -if (strstr($thumbdir, '..') !== false) { - $requestedDir = ''; - $thumbdir = rtrim('photos/', '/'); +if (!empty($_GET['dir'])) { + $requestedDir = $_GET['dir']; } -$currentdir = GALLERY_ROOT . $thumbdir; +$photo_root = GALLERY_ROOT . 'photos/'; +$thumbdir = rtrim('photos/' . $requestedDir, '/'); +$current_dir = GALLERY_ROOT . $thumbdir; + +guardAgainstDirectoryTraversal($current_dir); //----------------------- // READ FILES AND FOLDERS @@ -174,330 +167,384 @@ $currentdir = GALLERY_ROOT . $thumbdir; $files = array(); $dirs = array(); $img_captions = array(); -if (is_dir($currentdir) && $handle = opendir($currentdir)) { - // 1. LOAD CAPTIONS - $caption_filename = "$currentdir/captions.txt"; - if (is_readable($caption_filename)) { - $caption_handle = fopen($caption_filename, "rb"); - while (!feof($caption_handle)) { - $caption_line = fgetss($caption_handle); - if (empty($caption_line)) { - continue; - } - list($img_file, $img_text) = explode('|', $caption_line); - $img_captions[$img_file] = trim($img_text); - } - fclose($caption_handle); - } +if (is_dir($current_dir) && $handle = opendir($current_dir)) { + // 1. LOAD CAPTIONS + $caption_filename = "$current_dir/captions.txt"; + if (is_readable($caption_filename)) { + $caption_handle = fopen($caption_filename, "rb"); + while (!feof($caption_handle)) { + $caption_line = fgetss($caption_handle); + if (empty($caption_line)) { + continue; + } + list($img_file, $img_text) = explode('|', $caption_line); + $img_captions[$img_file] = trim($img_text); + } + fclose($caption_handle); + } - while (false !== ($file = readdir($handle)) && !in_array($file, $SkipObjects)) { - // 2. LOAD FOLDERS - if (is_dir($currentdir . "/" . $file)) { - if ($file != "." && $file != "..") { - checkpermissions($currentdir . "/" . $file); // Check for correct file permission - // Set thumbnail to folder.jpg if found: - if (file_exists($currentdir. '/' . $file . '/folder.jpg')) { - $linkParams = http_build_query( - array('dir' => ltrim("$requestedDir/$file", '/')), - '', - '&' - ); - $linkUrl = "?$linkParams"; + while (false !== ($file = readdir($handle)) && !in_array($file, $skip_objects)) { + // 2. LOAD FOLDERS + if (is_dir($current_dir . "/" . $file)) { + if ($file != "." && $file != "..") { + checkpermissions($current_dir . "/" . $file); // Check for correct file permission + // Set thumbnail to folder.jpg if found: + if (file_exists($current_dir . '/' . $file . '/folder.jpg')) { + $linkParams = http_build_query( + array('dir' => ltrim("$requestedDir/$file", '/')), + '', + '&' + ); + $linkUrl = "?$linkParams"; - $imgParams = http_build_query( - array( - 'filename' => "$currentdir/$file/folder.jpg", - 'size' => $thumb_size - ), - '', - '&' - ); - $imgUrl = GALLERY_ROOT . "createthumb.php?$imgParams"; + $imgParams = http_build_query( + array( + 'filename' => "$current_dir/$file/folder.jpg", + 'size' => $thumb_size, + ), + '', + '&' + ); + $imgUrl = GALLERY_ROOT . "createthumb.php?$imgParams"; - $dirs[] = array( - "name" => $file, - "date" => filemtime($currentdir . "/" . $file . "/folder.jpg"), - "html" => "
  • " . padstring($file, $label_max_length) . "\"$label_loading\"
  • " - ); - } else { - // Set thumbnail to first image found (if any): - unset($firstimage); - $firstimage = getfirstImage("$currentdir/" . $file); + $dirs[] = array( + "name" => $file, + "date" => filemtime($current_dir . "/" . $file . "/folder.jpg"), + "html" => "
  • " . padstring($file, $label_max_length) . "\"$label_loading\"
  • ", + ); + } else { + // Set thumbnail to first image found (if any): + unset($firstimage); + $firstimage = getfirstImage("$current_dir/" . $file); - if ($firstimage != "") { - $linkParams = http_build_query( - array('dir' => ltrim("$requestedDir/$file", '/')), - '', - '&' - ); - $linkUrl = "?$linkParams"; + if ($firstimage != "") { + $linkParams = http_build_query( + array('dir' => ltrim("$requestedDir/$file", '/')), + '', + '&' + ); + $linkUrl = "?$linkParams"; - $imgParams = http_build_query( - array( - 'filename' => "$thumbdir/$file/$firstimage", - 'size' => $thumb_size - ), - '', - '&' - ); - $imgUrl = GALLERY_ROOT . "createthumb.php?$imgParams"; + $imgParams = http_build_query( + array( + 'filename' => "$thumbdir/$file/$firstimage", + 'size' => $thumb_size, + ), + '', + '&' + ); + $imgUrl = GALLERY_ROOT . "createthumb.php?$imgParams"; - $dirs[] = array( - "name" => $file, - "date" => filemtime($currentdir . "/" . $file), - "html" => "
  • " . padstring($file, $label_max_length) . "$label_loading
  • " - ); - } else { - // If no folder.jpg or image is found, then display default icon: - $linkParams = http_build_query( - array('dir' => ltrim("$requestedDir/$file", '/')), - '', - '&' - ); - $linkUrl = "?$linkParams"; - $imgUrl = GALLERY_ROOT . 'images/folder_' . strtolower($folder_color) . '.png'; + $dirs[] = array( + "name" => $file, + "date" => filemtime($current_dir . "/" . $file), + "html" => "
  • " . padstring($file, $label_max_length) . "$label_loading
  • ", + ); + } else { + // If no folder.jpg or image is found, then display default icon: + $linkParams = http_build_query( + array('dir' => ltrim("$requestedDir/$file", '/')), + '', + '&' + ); + $linkUrl = "?$linkParams"; + $imgUrl = GALLERY_ROOT . 'images/folder_' . strtolower($folder_color) . '.png'; - $dirs[] = array( - "name" => $file, - "date" => filemtime($currentdir . "/" . $file), - "html" => "
  • " . padstring($file, $label_max_length) . "$label_loading
  • " - ); - } - } - } - } + $dirs[] = array( + "name" => $file, + "date" => filemtime($current_dir . "/" . $file), + "html" => "
  • " . padstring($file, $label_max_length) . "$label_loading
  • ", + ); + } + } + } + } - // 3. LOAD FILES - if ($file != "." && $file != ".." && $file != "folder.jpg") { - if ($display_filename) - $filename_caption = "" . padstring($file, $label_max_length) . ""; - else - $filename_caption = ""; - // JPG, GIF and PNG - if (preg_match("/.jpg$|.gif$|.png$/i", $file)) { - //Read EXIF - if (!array_key_exists($file, $img_captions)) { - if ($display_exif == 1) { - $exifReaden = readEXIF($currentdir . "/" . $file); - //Add to the caption all the EXIF information - $img_captions[$file] = $file.$exifReaden; - } else { - //If no EXIF, just use the filename as caption - $img_captions[$file] = $file; - } - } - // Read the optionnal image title and caption in html file (image.jpg --> image.jpg.html) - // Format: title::caption - // Example: My cat::My cat like to roll on the floor. - // If file is not provided, image filename will be used instead. - checkpermissions($currentdir . "/" . $file); + // 3. LOAD FILES + if ($file != "." && $file != ".." && $file != "folder.jpg") { + if ($display_filename) { + $filename_caption = "" . padstring($file, $label_max_length) . ""; + } else { + $filename_caption = ""; + } - if (is_file($currentdir.'/'.$file.'.html')) - $img_captions[$file] = $file.'::'.htmlspecialchars(file_get_contents($currentdir.'/'.$file.'.html'), ENT_QUOTES); - $linkUrl = str_replace('%2F', '/', rawurlencode("$currentdir/$file")); - $imgParams = http_build_query( - array('filename' => "$thumbdir/$file", 'size' => $thumb_size), - '', - '&'); - $imgUrl = GALLERY_ROOT . "createthumb.php?$imgParams"; - if ($lazyload) - $imgopts = "class=\"b-lazy\" src=data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== data-src=\"$imgUrl\""; - else - $imgopts = "src=\"{$imgUrl}\""; - $files[] = array( - "name" => $file, - "date" => filemtime($currentdir . "/" . $file), - "size" => filesize($currentdir . "/" . $file), - "html" => "
  • $label_loading" . $filename_caption . "
  • "); - } - // Other filetypes - $extension = ""; - if (preg_match("/.pdf$/i", $file)) $extension = "PDF"; // PDF - if (preg_match("/.zip$/i", $file)) $extension = "ZIP"; // ZIP archive - if (preg_match("/.rar$|.r[0-9]{2,}/i", $file)) $extension = "RAR"; // RAR Archive - if (preg_match("/.tar$/i", $file)) $extension = "TAR"; // TARball archive - if (preg_match("/.gz$/i", $file)) $extension = "GZ"; // GZip archive - if (preg_match("/.doc$|.docx$/i", $file)) $extension = "DOCX"; // Word - if (preg_match("/.ppt$|.pptx$/i", $file)) $extension = "PPTX"; //Powerpoint - if (preg_match("/.xls$|.xlsx$/i", $file)) $extension = "XLXS"; // Excel - if (preg_match("/.ogv$|.mp4$|.mpg$|.mpeg$|.mov$|.avi$|.wmv$|.flv$|.webm$/i", $file)) $extension = "VIDEO"; // video files - if (preg_match("/.aiff$|.aif$|.wma$|.aac$|.flac$|.mp3$|.ogg$|.m4a$/i", $file)) $extension = "AUDIO"; // audio files + // JPG, GIF and PNG + if (preg_match("/.jpg$|.gif$|.png$/i", $file)) { + //Read EXIF + if (!array_key_exists($file, $img_captions)) { + if ($display_exif == 1) { + $exifReaden = readEXIF($current_dir . "/" . $file); + //Add to the caption all the EXIF information + $img_captions[$file] = $file . $exifReaden; + } else { + //If no EXIF, just use the filename as caption + $img_captions[$file] = $file; + } + } + // Read the optionnal image title and caption in html file (image.jpg --> image.jpg.html) + // Format: title::caption + // Example: My cat::My cat like to roll on the floor. + // If file is not provided, image filename will be used instead. + checkpermissions($current_dir . "/" . $file); - if ($extension != "") { - $files[] = array( - "name" => $file, - "date" => filemtime($currentdir . "/" . $file), - "size" => filesize($currentdir . "/" . $file), - "html" => "
  • " . padstring($file, 20) . "$file$filename_caption
  • "); - } - } - } - closedir($handle); + if (is_file($current_dir . '/' . $file . '.html')) { + $img_captions[$file] = $file . '::' . htmlspecialchars(file_get_contents($current_dir . '/' . $file . '.html'), ENT_QUOTES); + } + + $linkUrl = str_replace('%2F', '/', rawurlencode("$current_dir/$file")); + $imgParams = http_build_query( + array('filename' => "$thumbdir/$file", 'size' => $thumb_size), + '', + '&'); + $imgUrl = GALLERY_ROOT . "createthumb.php?$imgParams"; + if ($lazyload) { + $imgopts = "class=\"b-lazy\" src=data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== data-src=\"$imgUrl\""; + } else { + $imgopts = "src=\"{$imgUrl}\""; + } + + $files[] = array( + "name" => $file, + "date" => filemtime($current_dir . "/" . $file), + "size" => filesize($current_dir . "/" . $file), + "html" => "
  • $label_loading" . $filename_caption . "
  • "); + } + // Other filetypes + $extension = ""; + if (preg_match("/\.pdf$/i", $file)) { + $extension = "PDF"; + } + // PDF + if (preg_match("/\.zip$/i", $file)) { + $extension = "ZIP"; + } + // ZIP archive + if (preg_match("/\.rar$|\.r[0-9]{2,}/i", $file)) { + $extension = "RAR"; + } + // RAR Archive + if (preg_match("/\.tar$/i", $file)) { + $extension = "TAR"; + } + // TARball archive + if (preg_match("/\.gz$/i", $file)) { + $extension = "GZ"; + } + // GZip archive + if (preg_match("/\.doc$|\.docx$/i", $file)) { + $extension = "DOCX"; + } + // Word + if (preg_match("/\.ppt$|\.pptx$/i", $file)) { + $extension = "PPTX"; + } + //Powerpoint + if (preg_match("/\.xls$|\.xlsx$/i", $file)) { + $extension = "XLXS"; + } + // Excel + if (preg_match("/\.ogv$|\.mp4$|\.mpg$|\.mpeg$|\.mov$|\.avi$|\.wmv$|\.flv$|\.webm$/i", $file)) { + $extension = "VIDEO"; + } + // video files + if (preg_match("/\.aiff$|\.aif$|\.wma$|\.aac$|\.flac$|\.mp3$|\.ogg$|\.m4a$/i", $file)) { + $extension = "AUDIO"; + } + // audio files + + if ($extension != "") { + $files[] = array( + "name" => $file, + "date" => filemtime($current_dir . "/" . $file), + "size" => filesize($current_dir . "/" . $file), + "html" => "
  • " . padstring($file, 20) . "$file$filename_caption
  • "); + } + } + } + closedir($handle); } else { - die("ERROR: Could not open ".htmlspecialchars(stripslashes($currentdir))." for reading!"); + die("ERROR: Could not open " . htmlspecialchars(stripslashes($current_dir)) . " for reading!"); } //----------------------- // SORT FILES AND FOLDERS //----------------------- if (sizeof($dirs) > 0) { - foreach ($dirs as $key => $row) { - if ($row["name"] == "") { - unset($dirs[$key]); //Delete empty array entries - continue; - } - $name[$key] = strtolower($row['name']); - $date[$key] = strtolower($row['date']); - } - @array_multisort($$sorting_folders, $sortdir_folders, $name, $sortdir_folders, $dirs); + foreach ($dirs as $key => $row) { + if ($row["name"] == "") { + unset($dirs[$key]); //Delete empty array entries + continue; + } + $name[$key] = strtolower($row['name']); + $date[$key] = strtolower($row['date']); + } + @array_multisort($$sorting_folders, $sortdir_folders, $name, $sortdir_folders, $dirs); } if (sizeof($files) > 0) { - foreach ($files as $key => $row) { - if ($row["name"] == "") { - unset($files[$key]); //Delete empty array entries - continue; - } - $name[$key] = strtolower($row['name']); - $date[$key] = strtolower($row['date']); - $size[$key] = strtolower($row['size']); - } - @array_multisort($$sorting_files, $sortdir_files, $name, SORT_ASC, $files); + foreach ($files as $key => $row) { + if ($row["name"] == "") { + unset($files[$key]); //Delete empty array entries + continue; + } + $name[$key] = strtolower($row['name']); + $date[$key] = strtolower($row['date']); + $size[$key] = strtolower($row['size']); + } + @array_multisort($$sorting_files, $sortdir_files, $name, SORT_ASC, $files); } //----------------------- // OFFSET DETERMINATION //----------------------- -if (!isset($_GET["page"])) - $_GET["page"] = 1; +if (!isset($_GET["page"])) { + $_GET["page"] = 1; +} + $offset_start = ($_GET["page"] * $thumbs_pr_page) - $thumbs_pr_page; $offset_end = $offset_start + $thumbs_pr_page; -if ($offset_end > sizeof($dirs) + sizeof($files)) - $offset_end = sizeof($dirs) + sizeof($files); +if ($offset_end > sizeof($dirs) + sizeof($files)) { + $offset_end = sizeof($dirs) + sizeof($files); +} if ($_GET["page"] == "all" || $lazyload) { - $offset_start = 0; - $offset_end = sizeof($dirs) + sizeof($files); + $offset_start = 0; + $offset_end = sizeof($dirs) + sizeof($files); } //----------------------- // PAGE NAVIGATION //----------------------- if (!$lazyload && sizeof($dirs) + sizeof($files) > $thumbs_pr_page) { - $page_navigation .= "$label_page "; - for ($i = 1; $i <= ceil((sizeof($files) + sizeof($dirs)) / $thumbs_pr_page); $i++) { - if ($_GET["page"] == $i) - $page_navigation .= "$i"; - else - $page_navigation .= "" . $i . ""; - if ($i != ceil((sizeof($files) + sizeof($dirs)) / $thumbs_pr_page)) - $page_navigation .= " | "; - } - //Insert link to view all images - if ($_GET["page"] == "all") - $page_navigation .= " | $label_all"; - else - $page_navigation .= " | $label_all"; + $page_navigation .= "$label_page "; + for ($i = 1; $i <= ceil((sizeof($files) + sizeof($dirs)) / $thumbs_pr_page); $i++) { + if ($_GET["page"] == $i) { + $page_navigation .= "$i"; + } else { + $page_navigation .= "" . $i . ""; + } + + if ($i != ceil((sizeof($files) + sizeof($dirs)) / $thumbs_pr_page)) { + $page_navigation .= " | "; + } + + } + //Insert link to view all images + if ($_GET["page"] == "all") { + $page_navigation .= " | $label_all"; + } else { + $page_navigation .= " | $label_all"; + } + } //----------------------- // BREADCRUMB NAVIGATION //----------------------- -if ($requestedDir != "") { - $breadcrumb_navigation .= "" . $label_home . " $breadcrumb_separator "; - $navitems = explode("/", $_REQUEST['dir']); - for ($i = 0; $i < sizeof($navitems); $i++) { - if ($i == sizeof($navitems)-1) { - $breadcrumb_navigation .= $navitems[$i]; - } else { - $breadcrumb_navigation .= "" . $navitems[$i] . " $breadcrumb_separator "; - } - } -} else { - $breadcrumb_navigation .= $label_home; +if ($requestedDir != "" && $requestedDir != "photos") { + $breadcrumb_navigation = "
    "; + $breadcrumb_navigation .= "" . $label_home . " $breadcrumb_separator "; + $navitems = explode("/", htmlspecialchars($_REQUEST['dir'])); + for ($i = 0; $i < sizeof($navitems); $i++) { + if ($i == sizeof($navitems) - 1) { + $breadcrumb_navigation .= $navitems[$i]; + } else { + $breadcrumb_navigation .= "" . $navitems[$i] . " $breadcrumb_separator "; + } + } + $breadcrumb_navigation .= "
    "; } //Include hidden links for all images BEFORE current page so lightbox is able to browse images on different pages for ($y = 0; $y < $offset_start - sizeof($dirs); $y++) { - $breadcrumb_navigation .= ""; + $breadcrumb_navigation .= ""; } //----------------------- // DISPLAY FOLDERS //----------------------- if (count($dirs) + count($files) == 0) { - $thumbnails .= "
  • $label_noimages
  • "; //Display 'no images' text - if ($currentdir == "photos") - $messages = "It looks like you have just installed MiniGal Nano. Please run the system check tool"; + $thumbnails .= "
    $label_noimages
    $label_noimages_advice
    "; //Display 'no images' text + if ($current_dir == "photos") { + $messages = + "It looks like you have just installed MiniGal Nano. + Please run the system check tool.
    + And why not have a look to config.php and customize some values ?"; + } } $offset_current = $offset_start; for ($x = $offset_start; $x < sizeof($dirs) && $x < $offset_end; $x++) { - $offset_current++; - $thumbnails .= $dirs[$x]["html"]; + $offset_current++; + $thumbnails .= $dirs[$x]["html"]; } //----------------------- // DISPLAY FILES //----------------------- for ($i = $offset_start - sizeof($dirs); $i < $offset_end && $offset_current < $offset_end; $i++) { - if ($i >= 0) { - $offset_current++; - $thumbnails .= $files[$i]["html"]; - } + if ($i >= 0) { + $offset_current++; + $thumbnails .= $files[$i]["html"]; + } } //Include hidden links for all images AFTER current page so lightbox is able to browse images on different pages -if ($i < 0) - $i = 1; +if ($i < 0) { + $i = 1; +} + for ($y = $i; $y < sizeof($files); $y++) { - $page_navigation .= ""; + $page_navigation .= ""; } //----------------------- // OUTPUT MESSAGES //----------------------- if ($messages != "") { - $messages = "
    " . $messages . "
    "; + $messages = $messages . "
    "; } // Read folder comment. -$comment_filepath = $currentdir . $file . "/comment.html"; +$comment_filepath = $current_dir . $file . "/comment.html"; if (file_exists($comment_filepath)) { - $fd = fopen($comment_filepath, "r"); - $comment = fread($fd, filesize($comment_filepath)); - fclose($fd); + $fd = fopen($comment_filepath, "r"); + $comment = "
    " . fread($fd, filesize($comment_filepath)) . "
    "; + fclose($fd); } //PROCESS TEMPLATE FILE -if (GALLERY_ROOT != "") - $templatefile = GALLERY_ROOT . "templates/integrate.html"; -else - $templatefile = "templates/" . $templatefile . ".html"; +if (GALLERY_ROOT != "") { + $templatefile = GALLERY_ROOT . "templates/integrate.html"; +} else { + $templatefile = "templates/" . $templatefile . ".html"; +} if (!$fd = fopen($templatefile, "r")) { - echo "Template ".htmlspecialchars(stripslashes($templatefile))." not found!"; - exit(); + echo "Template " . htmlspecialchars(stripslashes($templatefile)) . " not found!"; + exit(); } else { - $template = fread($fd, filesize ($templatefile)); - fclose($fd); - $template = stripslashes($template); - $template = preg_replace("/<% title %>/", $title, $template); - $template = preg_replace("/<% messages %>/", $messages, $template); - $template = preg_replace("/<% author %>/", $author, $template); - $template = preg_replace("/<% gallery_root %>/", GALLERY_ROOT, $template); - $template = preg_replace("/<% images %>/", "$images", $template); - $template = preg_replace("/<% thumbnails %>/", "$thumbnails", $template); - $template = preg_replace("/<% breadcrumb_navigation %>/", "$breadcrumb_navigation", $template); - $template = preg_replace("/<% page_navigation %>/", "$page_navigation", $template); - $template = preg_replace("/<% folder_comment %>/", "$comment", $template); - $template = preg_replace("/<% bgcolor %>/", "$backgroundcolor", $template); - $template = preg_replace("/<% gallery_width %>/", "$gallery_width", $template); - $template = preg_replace("/<% version %>/", "$version", $template); - echo "$template"; + $template = fread($fd, filesize($templatefile)); + fclose($fd); + $template = stripslashes($template); + $template = preg_replace("/<% title %>/", $title, $template); + $template = preg_replace("/<% messages %>/", $messages, $template); + $template = preg_replace("/<% author %>/", $author, $template); + $template = preg_replace("/<% gallery_root %>/", GALLERY_ROOT, $template); + $template = preg_replace("/<% images %>/", "$images", $template); + $template = preg_replace("/<% thumbnails %>/", "$thumbnails", $template); + $template = preg_replace("/<% breadcrumb_navigation %>/", "$breadcrumb_navigation", $template); + $template = preg_replace("/<% page_navigation %>/", "$page_navigation", $template); + $template = preg_replace("/<% folder_comment %>/", "$comment", $template); + $template = preg_replace("/<% bgcolor %>/", "$backgroundcolor", $template); + $template = preg_replace("/<% gallery_width %>/", "$gallery_width", $template); + $template = preg_replace("/<% version %>/", "$version", $template); + echo "$template"; } diff --git a/integrate.php b/integrate.php index df24c25..459dcab 100644 --- a/integrate.php +++ b/integrate.php @@ -1,7 +1,15 @@ \ No newline at end of file +require GALLERY_ROOT . "index.php"; +?> diff --git a/js/mediabox1.3.4.js b/js/mediabox1.5.4.js similarity index 58% rename from js/mediabox1.3.4.js rename to js/mediabox1.5.4.js index 8f753ed..91e66dd 100644 --- a/js/mediabox1.3.4.js +++ b/js/mediabox1.5.4.js @@ -1,24 +1,35 @@ /* - mediaboxAdvanced v1.3.4b - The ultimate extension of Slimbox and Mediabox; an all-media script - updated 2010.09.21 - (c) 2007-2010 John Einselen - based on Slimbox v1.64 - The ultimate lightweight Lightbox clone - (c) 2007-2008 Christophe Beyls - MIT-style license. +mediaboxAdvanced v1.5.4 - The ultimate extension of Slimbox and Mediabox; an all-media script +updated 2011.2.19 + (c) 2007-2011 John Einselen - http://iaian7.com +based on Slimbox v1.64 - The ultimate lightweight Lightbox clone + (c) 2007-2008 Christophe Beyls - http://www.digitalia.be - MiniBoardNano modifications : - Tom Canac - Uncomment lines 208 and 866 to desactivate the rigth click (take care... it's a pain in the ass for the end-usernd don't protect you at all ! (maj+rigth click make it useless)) +description: The ultimate extension of Slimbox and Mediabox; an all-media script + +license: MIT-style + +authors: +- John Einselen +- Christophe Beyls +- Contributions from many others + +requires: +- core/1.3.2: [Core, Array, String, Number, Function, Object, Event, Browser, Class, Class.Extras, Slick.*, Element.*, FX.*, DOMReady, Swiff] +- Quickie/2.1: '*' + +provides: [Mediabox.open, Mediabox.close, Mediabox.recenter, Mediabox.scanPage] */ + var Mediabox; (function() { // Global variables, accessible to Mediabox only - var options, images, activeImage, prevImage, nextImage, top, mTop, left, mLeft, winWidth, winHeight, fx, preload, preloadPrev = new Image(), preloadNext = new Image(), foxfix = false, iefix = false, + var options, mediaArray, activeMedia, prevMedia, nextMedia, top, mTop, left, mLeft, winWidth, winHeight, fx, preload, preloadPrev = new Image(), preloadNext = new Image(), // DOM elements - overlay, center, image, bottom, captionSplit, title, caption, prevLink, number, nextLink, + overlay, center, media, bottom, captionSplit, title, caption, number, prevLink, nextLink, // Mediabox specific vars - URL, WH, WHL, elrel, mediaWidth, mediaHeight, mediaType = "none", mediaSplit, mediaId = "mediaBox", mediaFmt, margin; + URL, WH, WHL, elrel, mediaWidth, mediaHeight, mediaType = "none", mediaSplit, mediaId = "mediaBox", margin, marginBottom; /* Initialization */ @@ -31,19 +42,20 @@ var Mediabox; ]).setStyle("display", "none") ); - image = new Element("div", {id: "mbImage"}).injectInside(center); - bottom = new Element("div", {id: "mbBottom"}).injectInside(center).adopt( + container = new Element("div", {id: "mbContainer"}).inject(center, "inside"); + media = new Element("div", {id: "mbMedia"}).inject(container, "inside"); + bottom = new Element("div", {id: "mbBottom"}).inject(center, "inside").adopt( closeLink = new Element("a", {id: "mbCloseLink", href: "#"}).addEvent("click", close), nextLink = new Element("a", {id: "mbNextLink", href: "#"}).addEvent("click", next), prevLink = new Element("a", {id: "mbPrevLink", href: "#"}).addEvent("click", previous), title = new Element("div", {id: "mbTitle"}), number = new Element("div", {id: "mbNumber"}), caption = new Element("div", {id: "mbCaption"}) - ); + ); fx = { overlay: new Fx.Tween(overlay, {property: "opacity", duration: 360}).set(0), - image: new Fx.Tween(image, {property: "opacity", duration: 360, onComplete: captionAnimate}), + media: new Fx.Tween(media, {property: "opacity", duration: 360, onComplete: captionAnimate}), bottom: new Fx.Tween(bottom, {property: "opacity", duration: 240}).set(0) }; }); @@ -55,27 +67,49 @@ var Mediabox; close(); // Thanks to Yosha on the google group for fixing the close function API! }, - open: function(_images, startImage, _options) { - options = $extend({ - text: ['«','»','×'], // Set "previous", "next", and "close" button content (HTML code should be written as entity codes or properly escaped) -// text: ['«','»','×'], // Set "previous", "next", and "close" button content (HTML code should be written as entity codes or properly escaped) -// example text: ['Prev','Next','Close'], - loop: true, // Allows to navigate between first and last images + recenter: function(){ // Thanks to Garo Hussenjian (Xapnet Productions http://www.xapnet.com) for suggesting this addition + if (center && !Browser.Platform.ios) { + left = window.getScrollLeft() + (window.getWidth()/2); + center.setStyles({left: left, marginLeft: -(mediaWidth/2)-margin}); +// top = window.getScrollTop() + (window.getHeight()/2); +// margin = center.getStyle('padding-left').toInt()+media.getStyle('margin-left').toInt()+media.getStyle('padding-left').toInt(); +// center.setStyles({top: top, left: left, marginTop: -(mediaHeight/2)-margin, marginLeft: -(mediaWidth/2)-margin}); + } + }, + + open: function(_mediaArray, startMedia, _options) { + options = { +// Text options (translate as needed) + buttonText: ['«','»','×'], // Array defines "previous", "next", and "close" button content (HTML code should be written as entity codes or properly escaped) +// buttonText: ['«','»','×'], +// buttonText: ['Prev','Next','Close'], + counterText: '({x} of {y})', // Counter text, {x} = current item number, {y} = total gallery length + linkText: '{x}
    open in a new tab
    ', // Text shown on iOS devices for non-image links + flashText: 'Error
    Adobe Flash is either not installed or not up to date, please visit Adobe.com to download the free player.', // Text shown if Flash is not installed. +// General overlay options + center: true, // Set to false for use with custom CSS layouts + loop: false, // Navigate from last to first elements in a gallery keyboard: true, // Enables keyboard control; escape key, left arrow, and right arrow - alpha: true, // Adds 'x', 'c', 'p', and 'n' when keyboard control is also set to true - stopKey: false, // Stops all default keyboard actions while overlay is open (such as up/down arrows) - // Does not apply to iFrame content, does not affect mouse scrolling - overlayOpacity: 0.7, // 1 is opaque, 0 is completely transparent (change the color in the CSS file) + keyboardAlpha: false, // Adds 'x', 'c', 'p', and 'n' when keyboard control is also set to true + keyboardStop: false, // Stops all default keyboard actions while overlay is open (such as up/down arrows) + // Does not apply to iFrame content, does not affect mouse scrolling + overlayOpacity: 0.8, // 1 is opaque, 0 is completely transparent (change the color in the CSS file) resizeOpening: true, // Determines if box opens small and grows (true) or starts at larger size (false) resizeDuration: 240, // Duration of each of the box resize animations (in milliseconds) - resizeTransition: false, // Mootools transition effect (false leaves it at the default) initialWidth: 320, // Initial width of the box (in pixels) initialHeight: 180, // Initial height of the box (in pixels) defaultWidth: 640, // Default width of the box (in pixels) for undefined media (MP4, FLV, etc.) defaultHeight: 360, // Default height of the box (in pixels) for undefined media (MP4, FLV, etc.) showCaption: true, // Display the title and caption, true / false showCounter: true, // If true, a counter will only be shown if there is more than 1 image to display - counterText: '({x} / {y})', // Translate or change as you wish + countBack: false, // Inverts the displayed number (so instead of the first element being labeled 1/10, it's 10/10) + clickBlock: false, // Adds an event on right-click to block saving of images from the context menu in most browsers (this can't prevent other ways of downloading, but works as a casual deterent) + // due to less than ideal code ordering, clickBlock on links must be removed manually around line 250 +// iOS device options +// iOSenable: false, // When set to false, disables overlay entirely (links open in new tab) + // IMAGES and INLINE content will display normally, + // while ALL OTHER content will display a direct link (this is required so as to not break mixed-media galleries) + iOShtml: true, // If set to true, HTML content is displayed normally as well (useful if your HTML content is minimal and UI oriented instead of external sites) // Image options imgBackground: false, // Embed images as CSS background (true) or tag (false) // CSS background is naturally non-clickable, preventing downloads @@ -84,7 +118,8 @@ var Mediabox; imgPadding: 100, // Clearance necessary for images larger than the window size (only used when imgBackground is false) // Change this number only if the CSS style is significantly divergent from the original, and requires different sizes // Inline options -// overflow: 'auto', // If set, overides CSS settings for inline content only + overflow: 'auto', // If set, overides CSS settings for inline content only, set to "false" to leave CSS settings intact. + inlineClone: false, // Clones the inline element instead of moving it from the page to the overlay // Global media options html5: 'true', // HTML5 settings for YouTube and Vimeo, false = off, true = on scriptaccess: 'true', // Allow script access to flash files @@ -96,20 +131,16 @@ var Mediabox; volume: '100', // 0-100, used for NonverBlaster and Quicktime players medialoop: 'true', // Loop video playback, true / false, used for NonverBlaster and Quicktime players bgcolor: '#000000', // Background color, used for flash and QT media - wmode: 'opaque', // Background setting for Adobe Flash ('opaque' and 'transparent' are most common) + wmode: 'transparent', // Background setting for Adobe Flash ('opaque' and 'transparent' are most common) // NonverBlaster - useNB: true, // use NonverBlaster (true) or JW Media Player (false) for .flv and .mp4 files - playerpath: '/js/NonverBlaster.swf', // Path to NonverBlaster.swf - controlColor: '0xFFFFFF', // set the controlbar color - controlBackColor: '0x000000', // set the controlbar color - showTimecode: 'false', // turn timecode display off or on -// JW Media Player settings and options - JWplayerpath: '/js/player.swf', // Path to the mediaplayer.swf or flvplayer.swf file - backcolor: '000000', // Base color for the controller, color name / hex value (0x000000) - frontcolor: '999999', // Text and button color for the controller, color name / hex value (0x000000) - lightcolor: '000000', // Rollover color for the controller, color name / hex value (0x000000) - screencolor: '000000', // Rollover color for the controller, color name / hex value (0x000000) - controlbar: 'over', // bottom, over, none (this setting is ignored when playing audio files) + playerpath: 'files/NonverBlaster.swf', // Path to NonverBlaster.swf + showTimecode: 'false', // turn timecode display off or on (true, false) + controlColor: '0xFFFFFF', // set the control color + controlBackColor: '0x0000000', // set the bakcground color (video only) +// playerBackColor: '0x0000FF', // set the player background color (leave blank to allow CSS styles to show through for audio) + playerBackColor: '', // set the player background color (leave blank to allow CSS styles to show through) + wmodeNB: 'transparent', // Background setting for Adobe Flash (set to 'transparent' for a blank background, 'opaque' in other situations) +// autoAdvance: 'false', // placeholder setting only - not currently implemented (intending to add auto gallery list navigation on play-end) // Quicktime options controller: 'true', // Show controller, true / false // Flickr options @@ -121,12 +152,11 @@ var Mediabox; revverFront: 'ffffff', // Foreground color revverGrad: '000000', // Gradation color // Ustream options - usViewers: 'true', // Show online viewer count (true/false) + usViewers: 'true', // Show online viewer count (true, false) // Youtube options ytBorder: '0', // Outline (1=true, 0=false) ytColor1: '000000', // Outline color ytColor2: '333333', // Base interface color (highlight colors stay consistent) - ytQuality: '&ap=%2526fmt%3D18', // Leave empty for standard quality, use '&ap=%2526fmt%3D18' for high quality, and '&ap=%2526fmt%3D22' for HD (note that not all videos are availible in high quality, and very few in HD) ytRel: '0', // Show related videos (1=true, 0=false) ytInfo: '1', // Show video info (1=true, 0=false) ytSearch: '0', // Show search field (1=true, 0=false) @@ -137,43 +167,51 @@ var Mediabox; vmByline: '1', // Show byline vmPortrait: '1', // Show author portrait vmColor: 'ffffff' // Custom controller colors, hex value minus the # sign, defult is 5ca0b5 - }, _options || {}); + }; - prevLink.set('html', options.text[0]); - nextLink.set('html', options.text[1]); - closeLink.set('html', options.text[2]); + prevLink.set('html', options.buttonText[0]); + nextLink.set('html', options.buttonText[1]); + closeLink.set('html', options.buttonText[2]); - margin = center.getStyle('padding-left').toInt()+image.getStyle('margin-left').toInt()+image.getStyle('padding-left').toInt(); - - if ((Browser.Engine.gecko) && (Browser.Engine.version<19)) { // Fixes Firefox 2 and Camino 1.6 incompatibility with opacity + flash - foxfix = true; + if (Browser.firefox2) { // Fixes Firefox 2 and Camino 1.6 incompatibility with opacity + flash options.overlayOpacity = 1; - overlay.className = 'mbOverlayFF'; + overlay.className = 'mbOverlayOpaque'; } - if ((Browser.Engine.trident) && (Browser.Engine.version<5)) { // Fixes IE 6 and earlier incompatibilities with CSS position: fixed; - iefix = true; - overlay.className = 'mbOverlayIE'; - overlay.setStyle("position", "absolute"); + if (Browser.Platform.ios) { + options.keyboard = false; + options.resizeOpening = false; // Speeds up interaction on small devices (mobile) or older computers (IE6) + overlay.className = 'mbMobile'; + bottom.className = 'mbMobile'; +// options.overlayOpacity = 0.001; // Helps ameliorate the issues with CSS overlays in iOS, leaving a clickable background, but avoiding the visible issues position(); } - if (typeof _images == "string") { // Used for single images only, with URL and Title as first two arguments - _images = [[_images,startImage,_options]]; - startImage = 0; + if (Browser.ie6) { + options.resizeOpening = false; // Speeds up interaction on small devices (mobile) or older computers (IE6) + overlay.className = 'mbOverlayAbsolute'; + position(); } - images = _images; - options.loop = options.loop && (images.length > 1); + if (typeof _mediaArray == "string") { // Used for single mediaArray only, with URL and Title as first two arguments + _mediaArray = [[_mediaArray,startMedia,_options]]; + startMedia = 0; + } + + mediaArray = _mediaArray; + options.loop = options.loop && (mediaArray.length > 1); size(); setup(true); top = window.getScrollTop() + (window.getHeight()/2); left = window.getScrollLeft() + (window.getWidth()/2); - fx.resize = new Fx.Morph(center, $extend({duration: options.resizeDuration, onComplete: imageAnimate}, options.resizeTransition ? {transition: options.resizeTransition} : {})); - center.setStyles({top: top, left: left, width: options.initialWidth, height: options.initialHeight, marginTop: -(options.initialHeight/2)-margin, marginLeft: -(options.initialWidth/2)-margin, display: ""}); + margin = center.getStyle('padding-left').toInt()+media.getStyle('margin-left').toInt()+media.getStyle('padding-left').toInt(); + marginBottom = bottom.getStyle('margin-left').toInt()+bottom.getStyle('padding-left').toInt()+bottom.getStyle('margin-right').toInt()+bottom.getStyle('padding-right').toInt(); + +/****/ center.setStyles({top: top, left: left, width: options.initialWidth, height: options.initialHeight, marginTop: -(options.initialHeight/2)-margin, marginLeft: -(options.initialWidth/2)-margin, display: ""}); + fx.resize = new Fx.Morph(center, {duration: options.resizeDuration, onComplete: mediaAnimate}); fx.overlay.start(options.overlayOpacity); - return changeImage(startImage); + return changeMedia(startMedia); } }; @@ -198,7 +236,7 @@ var Mediabox; linkMapper = linkMapper || function(el) { elrel = el.rel.split(/[\[\]]/); elrel = elrel[1]; - return [el.href, el.title, elrel]; + return [el.get('href'), el.title, elrel]; // thanks to Dušan Medlín for figuring out the URL bug! }; linksFilter = linksFilter || function() { @@ -207,12 +245,13 @@ var Mediabox; var links = this; +/* clickBlock code - remove the following three lines to enable right-clicking on links to images */ links.addEvent('contextmenu', function(e){ - /*if (this.toString().match(/\.gif|\.jpg|\.jpeg|\.png/i)) e.stop();*/ + if (this.toString().match(/\.gif|\.jpg|\.jpeg|\.png/i)) e.stop(); }); links.removeEvents("click").addEvent("click", function() { - // Build the list of images that will be displayed + // Build the list of media that will be displayed var filteredArray = links.filter(linksFilter, this); var filteredLinks = []; var filteredHrefs = []; @@ -221,7 +260,7 @@ var Mediabox; if(filteredHrefs.indexOf(item.toString()) < 0) { filteredLinks.include(filteredArray[index]); filteredHrefs.include(filteredArray[index].toString()); - }; + } }); return Mediabox.open(filteredLinks.map(linkMapper), filteredHrefs.indexOf(this.toString()), _options); @@ -245,9 +284,9 @@ var Mediabox; function setup(open) { // Hides on-page objects and embeds while the overlay is open, nessesary to counteract Firefox stupidity - if (Browser.Engine.gecko) { + if (Browser.firefox) { ["object", window.ie ? "select" : "embed"].forEach(function(tag) { - Array.forEach(document.getElementsByTagName(tag), function(el) { + Array.forEach($$(tag), function(el) { if (open) el._mediabox = el.style.visibility; el.style.visibility = open ? "hidden" : el._mediabox; }); @@ -257,13 +296,13 @@ var Mediabox; overlay.style.display = open ? "" : "none"; var fn = open ? "addEvent" : "removeEvent"; - if (iefix) window[fn]("scroll", position); + if (Browser.Platform.ios || Browser.ie6) window[fn]("scroll", position); // scroll position is updated only after movement has stopped window[fn]("resize", size); if (options.keyboard) document[fn]("keydown", keyDown); } function keyDown(event) { - if (options.alpha) { + if (options.keyboardAlpha) { switch(event.code) { case 27: // Esc case 88: // 'x' @@ -290,42 +329,51 @@ var Mediabox; next(); } } - if (options.stopKey) { return false; }; + if (options.keyboardStop) { return false; } } function previous() { - return changeImage(prevImage); + return changeMedia(prevMedia); } function next() { - return changeImage(nextImage); + return changeMedia(nextMedia); } - function changeImage(imageIndex) { - if (imageIndex >= 0) { - image.set('html', ''); - activeImage = imageIndex; - prevImage = ((activeImage || !options.loop) ? activeImage : images.length) - 1; - nextImage = activeImage + 1; - if (nextImage == images.length) nextImage = options.loop ? 0 : -1; + function changeMedia(mediaIndex) { + if (mediaIndex >= 0) { +// if (Browser.Platform.ios && !options.iOSenable) { +// window.open(mediaArray[mediaIndex][0], "_blank"); +// close(); +// return false; +// } + media.set('html', ''); + activeMedia = mediaIndex; + prevMedia = ((activeMedia || !options.loop) ? activeMedia : mediaArray.length) - 1; + nextMedia = activeMedia + 1; + if (nextMedia == mediaArray.length) nextMedia = options.loop ? 0 : -1; stop(); center.className = "mbLoading"; + if (preload && mediaType == "inline" && !options.inlineClone) preload.adopt(media.getChildren()); // prevents loss of adopted data /* mediaboxAdvanced link formatting and media support */ - if (!images[imageIndex][2]) images[imageIndex][2] = ''; // Thanks to Leo Feyer for offering this fix - WH = images[imageIndex][2].split(' '); + if (!mediaArray[mediaIndex][2]) mediaArray[mediaIndex][2] = ''; // Thanks to Leo Feyer for offering this fix + WH = mediaArray[mediaIndex][2].split(' '); WHL = WH.length; if (WHL>1) { - mediaWidth = (WH[WHL-2].match("%")) ? (window.getWidth()*((WH[WHL-2].replace("%", ""))*0.01))+"px" : WH[WHL-2]+"px"; - mediaHeight = (WH[WHL-1].match("%")) ? (window.getHeight()*((WH[WHL-1].replace("%", ""))*0.01))+"px" : WH[WHL-1]+"px"; +// mediaWidth = (WH[WHL-2].match("%")) ? (window.getWidth()*((WH[WHL-2].replace("%", ""))*0.01))+"px" : WH[WHL-2]+"px"; + mediaWidth = (WH[WHL-2].match("%")) ? (window.getWidth()*((WH[WHL-2].replace("%", ""))*0.01)) : WH[WHL-2]; +// mediaHeight = (WH[WHL-1].match("%")) ? (window.getHeight()*((WH[WHL-1].replace("%", ""))*0.01))+"px" : WH[WHL-1]+"px"; + mediaHeight = (WH[WHL-1].match("%")) ? (window.getHeight()*((WH[WHL-1].replace("%", ""))*0.01)) : WH[WHL-1]; } else { mediaWidth = ""; mediaHeight = ""; } - URL = images[imageIndex][0]; + URL = mediaArray[mediaIndex][0]; // URL = encodeURI(URL).replace("(","%28").replace(")","%29"); - captionSplit = images[activeImage][1].split('::'); +// URL = encodeURI(URL).replace("(","%28").replace(")","%29").replace("%20"," "); + captionSplit = mediaArray[activeMedia][1].split('::'); // Quietube and yFrog support if (URL.match(/quietube\.com/i)) { @@ -353,47 +401,29 @@ var Mediabox; mediaType = 'obj'; mediaWidth = mediaWidth || options.defaultWidth; mediaHeight = mediaHeight || options.defaultHeight; - if (options.useNB) { - preload = new Swiff(''+options.playerpath+'?mediaURL='+URL+'&allowSmoothing=true&autoPlay='+options.autoplay+'&buffer=6&showTimecode='+options.showTimecode+'&loop='+options.medialoop+'&controlColor='+options.controlColor+'&controlBackColor='+options.controlBackColor+'&defaultVolume='+options.volume+'&scaleIfFullScreen=true&showScalingButton=true&crop=false', { - id: 'MediaboxSWF', + preload = new Swiff(''+options.playerpath+'?mediaURL='+URL+'&allowSmoothing=true&autoPlay='+options.autoplay+'&buffer=6&showTimecode='+options.showTimecode+'&loop='+options.medialoop+'&controlColor='+options.controlColor+'&controlBackColor='+options.controlBackColor+'&playerBackColor='+options.playerBackColor+'&defaultVolume='+options.volume+'&scaleIfFullScreen=true&showScalingButton=true&crop=false', { + id: 'mbVideo', width: mediaWidth, height: mediaHeight, - params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} + params: {wmode: options.wmodeNB, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} }); - } else { - preload = new Swiff(''+options.JWplayerpath+'?file='+URL+'&backcolor='+options.backcolor+'&frontcolor='+options.frontcolor+'&lightcolor='+options.lightcolor+'&screencolor='+options.screencolor+'&autostart='+options.autoplay+'&controlbar='+options.controlbar, { - id: 'MediaboxSWF', - width: mediaWidth, - height: mediaHeight, - params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} - }); - } startEffect(); // MP3, AAC } else if (URL.match(/\.mp3|\.aac|tweetmic\.com|tmic\.fm/i) || mediaType == 'audio') { mediaType = 'obj'; mediaWidth = mediaWidth || options.defaultWidth; - mediaHeight = mediaHeight || "20px"; + mediaHeight = mediaHeight || "17"; if (URL.match(/tweetmic\.com|tmic\.fm/i)) { URL = URL.split('/'); URL[4] = URL[4] || URL[3]; URL = "http://media4.fjarnet.net/tweet/tweetmicapp-"+URL[4]+'.mp3'; } - if (options.useNB) { preload = new Swiff(''+options.playerpath+'?mediaURL='+URL+'&allowSmoothing=true&autoPlay='+options.autoplay+'&buffer=6&showTimecode='+options.showTimecode+'&loop='+options.medialoop+'&controlColor='+options.controlColor+'&controlBackColor='+options.controlBackColor+'&defaultVolume='+options.volume+'&scaleIfFullScreen=true&showScalingButton=true&crop=false', { - id: 'MediaboxSWF', + id: 'mbAudio', width: mediaWidth, height: mediaHeight, params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} }); - } else { - preload = new Swiff(''+options.JWplayerpath+'?file='+URL+'&backcolor='+options.backcolor+'&frontcolor='+options.frontcolor+'&lightcolor='+options.lightcolor+'&screencolor='+options.screencolor+'&autostart='+options.autoplay, { - id: 'MediaboxSWF', - width: mediaWidth, - height: mediaHeight, - params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} - }); - } startEffect(); // SWF } else if (URL.match(/\.swf/i) || mediaType == 'flash') { @@ -401,7 +431,7 @@ var Mediabox; mediaWidth = mediaWidth || options.defaultWidth; mediaHeight = mediaHeight || options.defaultHeight; preload = new Swiff(URL, { - id: 'MediaboxSWF', + id: 'mbFlash', width: mediaWidth, height: mediaHeight, params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} @@ -411,12 +441,12 @@ var Mediabox; } else if (URL.match(/\.mov|\.m4v|\.m4a|\.aiff|\.avi|\.caf|\.dv|\.mid|\.m3u|\.mp3|\.mp2|\.mp4|\.qtz/i) || mediaType == 'qt') { mediaType = 'qt'; mediaWidth = mediaWidth || options.defaultWidth; - mediaHeight = (parseInt(mediaHeight)+16)+"px" || options.defaultHeight; +// mediaHeight = (parseInt(mediaHeight, 10)+16)+"px" || options.defaultHeight; + mediaHeight = (parseInt(mediaHeight, 10)+16) || options.defaultHeight; preload = new Quickie(URL, { id: 'MediaboxQT', width: mediaWidth, height: mediaHeight, - container: 'mbImage', attributes: {controller: options.controller, autoplay: options.autoplay, volume: options.volume, loop: options.medialoop, bgcolor: options.bgcolor} }); startEffect(); @@ -426,8 +456,8 @@ var Mediabox; // Blip.tv } else if (URL.match(/blip\.tv/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "640px"; - mediaHeight = mediaHeight || "390px"; + mediaWidth = mediaWidth || "640"; + mediaHeight = mediaHeight || "390"; preload = new Swiff(URL, { src: URL, width: mediaWidth, @@ -438,8 +468,8 @@ var Mediabox; // Break.com } else if (URL.match(/break\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "464px"; - mediaHeight = mediaHeight || "376px"; + mediaWidth = mediaWidth || "464"; + mediaHeight = mediaHeight || "376"; mediaId = URL.match(/\d{6}/g); preload = new Swiff('http://embed.break.com/'+mediaId, { width: mediaWidth, @@ -450,8 +480,8 @@ var Mediabox; // DailyMotion } else if (URL.match(/dailymotion\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "480px"; - mediaHeight = mediaHeight || "381px"; + mediaWidth = mediaWidth || "480"; + mediaHeight = mediaHeight || "381"; preload = new Swiff(URL, { id: mediaId, width: mediaWidth, @@ -462,8 +492,8 @@ var Mediabox; // Facebook } else if (URL.match(/facebook\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "320px"; - mediaHeight = mediaHeight || "240px"; + mediaWidth = mediaWidth || "320"; + mediaHeight = mediaHeight || "240"; mediaSplit = URL.split('v='); mediaSplit = mediaSplit[1].split('&'); mediaId = mediaSplit[0]; @@ -476,10 +506,10 @@ var Mediabox; }); startEffect(); // Flickr - } else if (URL.match(/flickr\.com/i)) { + } else if (URL.match(/flickr\.com(?!.+\/show\/)/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "500px"; - mediaHeight = mediaHeight || "375px"; + mediaWidth = mediaWidth || "500"; + mediaHeight = mediaHeight || "375"; mediaSplit = URL.split('/'); mediaId = mediaSplit[5]; preload = new Swiff('http://www.flickr.com/apps/video/stewart.swf', { @@ -493,8 +523,8 @@ var Mediabox; // GameTrailers Video } else if (URL.match(/gametrailers\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "480px"; - mediaHeight = mediaHeight || "392px"; + mediaWidth = mediaWidth || "480"; + mediaHeight = mediaHeight || "392"; mediaId = URL.match(/\d{5}/g); preload = new Swiff('http://www.gametrailers.com/remote_wrap.php?mid='+mediaId, { id: mediaId, @@ -506,8 +536,8 @@ var Mediabox; // Google Video } else if (URL.match(/google\.com\/videoplay/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "400px"; - mediaHeight = mediaHeight || "326px"; + mediaWidth = mediaWidth || "400"; + mediaHeight = mediaHeight || "326"; mediaSplit = URL.split('='); mediaId = mediaSplit[1]; preload = new Swiff('http://video.google.com/googleplayer.swf?docId='+mediaId+'&autoplay='+options.autoplayNum, { @@ -520,8 +550,8 @@ var Mediabox; // Megavideo - Thanks to Robert Jandreu for suggesting this code! } else if (URL.match(/megavideo\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "640px"; - mediaHeight = mediaHeight || "360px"; + mediaWidth = mediaWidth || "640"; + mediaHeight = mediaHeight || "360"; mediaSplit = URL.split('='); mediaId = mediaSplit[1]; preload = new Swiff('http://wwwstatic.megavideo.com/mv_player.swf?v='+mediaId, { @@ -534,8 +564,8 @@ var Mediabox; // Metacafe } else if (URL.match(/metacafe\.com\/watch/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "400px"; - mediaHeight = mediaHeight || "345px"; + mediaWidth = mediaWidth || "400"; + mediaHeight = mediaHeight || "345"; mediaSplit = URL.split('/'); mediaId = mediaSplit[4]; preload = new Swiff('http://www.metacafe.com/fplayer/'+mediaId+'/.swf?playerVars=autoPlay='+options.autoplayYes, { @@ -548,8 +578,8 @@ var Mediabox; // Myspace } else if (URL.match(/vids\.myspace\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "425px"; - mediaHeight = mediaHeight || "360px"; + mediaWidth = mediaWidth || "425"; + mediaHeight = mediaHeight || "360"; preload = new Swiff(URL, { id: mediaId, width: mediaWidth, @@ -560,8 +590,8 @@ var Mediabox; // Revver } else if (URL.match(/revver\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "480px"; - mediaHeight = mediaHeight || "392px"; + mediaWidth = mediaWidth || "480"; + mediaHeight = mediaHeight || "392"; mediaSplit = URL.split('/'); mediaId = mediaSplit[4]; preload = new Swiff('http://flash.revver.com/player/1.0/player.swf?mediaId='+mediaId+'&affiliateId='+options.revverID+'&allowFullScreen='+options.revverFullscreen+'&autoStart='+options.autoplay+'&backColor=#'+options.revverBack+'&frontColor=#'+options.revverFront+'&gradColor=#'+options.revverGrad+'&shareUrl=revver', { @@ -574,8 +604,8 @@ var Mediabox; // Rutube } else if (URL.match(/rutube\.ru/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "470px"; - mediaHeight = mediaHeight || "353px"; + mediaWidth = mediaWidth || "470"; + mediaHeight = mediaHeight || "353"; mediaSplit = URL.split('='); mediaId = mediaSplit[1]; preload = new Swiff('http://video.rutube.ru/'+mediaId, { @@ -585,25 +615,11 @@ var Mediabox; params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} }); startEffect(); -// Seesmic - } else if (URL.match(/seesmic\.com/i)) { - mediaType = 'obj'; - mediaWidth = mediaWidth || "435px"; - mediaHeight = mediaHeight || "355px"; - mediaSplit = URL.split('/'); - mediaId = mediaSplit[5]; - preload = new Swiff('http://seesmic.com/Standalone.swf?video='+mediaId, { - id: mediaId, - width: mediaWidth, - height: mediaHeight, - params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} - }); - startEffect(); // Tudou } else if (URL.match(/tudou\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "400px"; - mediaHeight = mediaHeight || "340px"; + mediaWidth = mediaWidth || "400"; + mediaHeight = mediaHeight || "340"; mediaSplit = URL.split('/'); mediaId = mediaSplit[5]; preload = new Swiff('http://www.tudou.com/v/'+mediaId, { @@ -612,11 +628,11 @@ var Mediabox; params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} }); startEffect(); -// Twitvcam +// Twitcam } else if (URL.match(/twitcam\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "320px"; - mediaHeight = mediaHeight || "265px"; + mediaWidth = mediaWidth || "320"; + mediaHeight = mediaHeight || "265"; mediaSplit = URL.split('/'); mediaId = mediaSplit[3]; preload = new Swiff('http://static.livestream.com/chromelessPlayer/wrappers/TwitcamPlayer.swf?hash='+mediaId, { @@ -625,24 +641,11 @@ var Mediabox; params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} }); startEffect(); -// Twiturm - } else if (URL.match(/twiturm\.com/i)) { - mediaType = 'obj'; - mediaWidth = mediaWidth || "402px"; - mediaHeight = mediaHeight || "48px"; - mediaSplit = URL.split('/'); - mediaId = mediaSplit[3]; - preload = new Swiff('http://twiturm.com/flash/twiturm_mp3.swf?playerID=0&sf='+mediaId, { - width: mediaWidth, - height: mediaHeight, - params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} - }); - startEffect(); // Twitvid } else if (URL.match(/twitvid\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "600px"; - mediaHeight = mediaHeight || "338px"; + mediaWidth = mediaWidth || "600"; + mediaHeight = mediaHeight || "338"; mediaSplit = URL.split('/'); mediaId = mediaSplit[3]; preload = new Swiff('http://www.twitvid.com/player/'+mediaId, { @@ -654,8 +657,8 @@ var Mediabox; // Ustream.tv } else if (URL.match(/ustream\.tv/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "400px"; - mediaHeight = mediaHeight || "326px"; + mediaWidth = mediaWidth || "400"; + mediaHeight = mediaHeight || "326"; preload = new Swiff(URL+'&viewcount='+options.usViewers+'&autoplay='+options.autoplay, { width: mediaWidth, height: mediaHeight, @@ -665,8 +668,8 @@ var Mediabox; // YouKu } else if (URL.match(/youku\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "480px"; - mediaHeight = mediaHeight || "400px"; + mediaWidth = mediaWidth || "480"; + mediaHeight = mediaHeight || "400"; mediaSplit = URL.split('id_'); mediaId = mediaSplit[1]; preload = new Swiff('http://player.youku.com/player.php/sid/'+mediaId+'=/v.swf', { @@ -680,8 +683,8 @@ var Mediabox; mediaSplit = URL.split('v='); if (options.html5) { mediaType = 'url'; - mediaWidth = mediaWidth || "640px"; - mediaHeight = mediaHeight || "385px"; + mediaWidth = mediaWidth || "640"; + mediaHeight = mediaHeight || "385"; mediaId = "mediaId_"+new Date().getTime(); // Safari may not update iframe content with a static id. preload = new Element('iframe', { 'src': 'http://www.youtube.com/embed/'+mediaSplit[1], @@ -694,20 +697,9 @@ var Mediabox; } else { mediaType = 'obj'; mediaId = mediaSplit[1]; - if (mediaId.match(/fmt=22/i)) { - mediaFmt = '&ap=%2526fmt%3D22'; - mediaWidth = mediaWidth || "640px"; - mediaHeight = mediaHeight || "385px"; - } else if (mediaId.match(/fmt=18/i)) { - mediaFmt = '&ap=%2526fmt%3D18'; - mediaWidth = mediaWidth || "560px"; - mediaHeight = mediaHeight || "345px"; - } else { - mediaFmt = options.ytQuality; - mediaWidth = mediaWidth || "480px"; - mediaHeight = mediaHeight || "295px"; - } - preload = new Swiff('http://www.youtube.com/v/'+mediaId+'&autoplay='+options.autoplayNum+'&fs='+options.fullscreenNum+mediaFmt+'&border='+options.ytBorder+'&color1=0x'+options.ytColor1+'&color2=0x'+options.ytColor2+'&rel='+options.ytRel+'&showinfo='+options.ytInfo+'&showsearch='+options.ytSearch, { + mediaWidth = mediaWidth || "480"; + mediaHeight = mediaHeight || "385"; + preload = new Swiff('http://www.youtube.com/v/'+mediaId+'&autoplay='+options.autoplayNum+'&fs='+options.fullscreenNum+'&border='+options.ytBorder+'&color1=0x'+options.ytColor1+'&color2=0x'+options.ytColor2+'&rel='+options.ytRel+'&showinfo='+options.ytInfo+'&showsearch='+options.ytSearch, { id: mediaId, width: mediaWidth, height: mediaHeight, @@ -720,9 +712,9 @@ var Mediabox; mediaType = 'obj'; mediaSplit = URL.split('p='); mediaId = mediaSplit[1]; - mediaWidth = mediaWidth || "480px"; - mediaHeight = mediaHeight || "385px"; - preload = new Swiff('http://www.youtube.com/p/'+mediaId+'&autoplay='+options.autoplayNum+'&fs='+options.fullscreenNum+mediaFmt+'&border='+options.ytBorder+'&color1=0x'+options.ytColor1+'&color2=0x'+options.ytColor2+'&rel='+options.ytRel+'&showinfo='+options.ytInfo+'&showsearch='+options.ytSearch, { + mediaWidth = mediaWidth || "480"; + mediaHeight = mediaHeight || "385"; + preload = new Swiff('http://www.youtube.com/p/'+mediaId+'&autoplay='+options.autoplayNum+'&fs='+options.fullscreenNum+'&border='+options.ytBorder+'&color1=0x'+options.ytColor1+'&color2=0x'+options.ytColor2+'&rel='+options.ytRel+'&showinfo='+options.ytInfo+'&showsearch='+options.ytSearch, { id: mediaId, width: mediaWidth, height: mediaHeight, @@ -732,8 +724,8 @@ var Mediabox; // Veoh } else if (URL.match(/veoh\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "410px"; - mediaHeight = mediaHeight || "341px"; + mediaWidth = mediaWidth || "410"; + mediaHeight = mediaHeight || "341"; URL = URL.replace('%3D','/'); mediaSplit = URL.split('watch/'); mediaId = mediaSplit[1]; @@ -747,8 +739,8 @@ var Mediabox; // Viddler } else if (URL.match(/viddler\.com/i)) { mediaType = 'obj'; - mediaWidth = mediaWidth || "437px"; - mediaHeight = mediaHeight || "370px"; + mediaWidth = mediaWidth || "437"; + mediaHeight = mediaHeight || "370"; mediaSplit = URL.split('/'); mediaId = mediaSplit[4]; preload = new Swiff(URL, { @@ -760,25 +752,10 @@ var Mediabox; params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen, id: 'viddler_'+mediaId, movie: URL} }); startEffect(); -// Viddyou - } else if (URL.match(/viddyou\.com/i)) { - mediaType = 'obj'; - mediaWidth = mediaWidth || "416px"; - mediaHeight = mediaHeight || "312px"; - mediaSplit = URL.split('='); - mediaId = mediaSplit[1]; - preload = new Swiff('http://www.viddyou.com/get/v2_'+options.vuPlayer+'/'+mediaId+'.swf', { - id: mediaId, - movie: 'http://www.viddyou.com/get/v2_'+options.vuPlayer+'/'+mediaId+'.swf', - width: mediaWidth, - height: mediaHeight, - params: {wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} - }); - startEffect(); // Vimeo (now includes HTML5 option) } else if (URL.match(/vimeo\.com/i)) { - mediaWidth = mediaWidth || "640px"; // site defualt: 400px - mediaHeight = mediaHeight || "360px"; // site defualt: 225px + mediaWidth = mediaWidth || "640"; // site defualt: 400px + mediaHeight = mediaHeight || "360"; // site defualt: 225px mediaSplit = URL.split('/'); mediaId = mediaSplit[3]; @@ -803,32 +780,16 @@ var Mediabox; }); startEffect(); } -// 12seconds - } else if (URL.match(/12seconds\.tv/i)) { - mediaType = 'obj'; - mediaWidth = mediaWidth || "430px"; - mediaHeight = mediaHeight || "360px"; - mediaSplit = URL.split('/'); - mediaId = mediaSplit[5]; - preload = new Swiff('http://embed.12seconds.tv/players/remotePlayer.swf', { - id: mediaId, - width: mediaWidth, - height: mediaHeight, - params: {flashvars: 'vid='+mediaId+'', wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess: options.scriptaccess, allowfullscreen: options.fullscreen} - }); - startEffect(); - - /* Specific Content Types */ - // INLINE } else if (URL.match(/\#mb_/i)) { mediaType = 'inline'; mediaWidth = mediaWidth || options.defaultWidth; mediaHeight = mediaHeight || options.defaultHeight; URLsplit = URL.split('#'); - preload = document.id(URLsplit[1]).get('html'); +// preload = new Element("div", {id: "mbMediaInline"}).adopt(document.id(URLsplit[1]).getChildren().clone([true,true])); + preload = document.id(URLsplit[1]); startEffect(); -// HTML +// HTML (applies to ALL links not recognised as a specific media type) } else { mediaType = 'url'; mediaWidth = mediaWidth || options.defaultWidth; @@ -848,93 +809,123 @@ var Mediabox; } function startEffect() { +// if (Browser.Platform.ios && (mediaType == "obj" || mediaType == "qt" || mediaType == "html")) alert("this isn't gonna work"); +// if (Browser.Platform.ios && (mediaType == "obj" || mediaType == "qt" || mediaType == "html")) mediaType = "ios"; + (mediaType == "img")?media.addEvent("click", next):media.removeEvent("click", next); if (mediaType == "img"){ mediaWidth = preload.width; mediaHeight = preload.height; if (options.imgBackground) { - image.setStyles({backgroundImage: "url("+URL+")", display: ""}); + media.setStyles({backgroundImage: "url("+URL+")", display: ""}); } else { // Thanks to Dusan Medlin for fixing large 16x9 image errors in a 4x3 browser if (mediaHeight >= winHeight-options.imgPadding && (mediaHeight / winHeight) >= (mediaWidth / winWidth)) { mediaHeight = winHeight-options.imgPadding; - mediaWidth = preload.width = parseInt((mediaHeight/preload.height)*mediaWidth); + mediaWidth = preload.width = parseInt((mediaHeight/preload.height)*mediaWidth, 10); preload.height = mediaHeight; } else if (mediaWidth >= winWidth-options.imgPadding && (mediaHeight / winHeight) < (mediaWidth / winWidth)) { mediaWidth = winWidth-options.imgPadding; - mediaHeight = preload.height = parseInt((mediaWidth/preload.width)*mediaHeight); + mediaHeight = preload.height = parseInt((mediaWidth/preload.width)*mediaHeight, 10); preload.width = mediaWidth; } - if (Browser.Engine.trident) preload = document.id(preload); - /*preload.addEvent('mousedown', function(e){ e.stop(); }).addEvent('contextmenu', function(e){ e.stop(); });*/ - image.setStyles({backgroundImage: "none", display: ""}); - preload.inject(image); + if (Browser.ie) preload = document.id(preload); + if (options.clickBlock) preload.addEvent('mousedown', function(e){ e.stop(); }).addEvent('contextmenu', function(e){ e.stop(); }); + media.setStyles({backgroundImage: "none", display: ""}); + preload.inject(media); } +// mediaWidth += "px"; +// mediaHeight += "px"; + } else if (mediaType == "inline") { +// if (options.overflow) media.setStyles({overflow: options.overflow}); + media.setStyles({backgroundImage: "none", display: ""}); +// preload.inject(media); +// media.grab(preload.get('html')); + (options.inlineClone)?media.grab(preload.get('html')):media.adopt(preload.getChildren()); + } else if (mediaType == "qt") { + media.setStyles({backgroundImage: "none", display: ""}); + preload.inject(media); +// preload; + } else if (mediaType == "ios" || Browser.Platform.ios) { + media.setStyles({backgroundImage: "none", display: ""}); + media.set('html', options.linkText.replace(/\{x\}/gi, URL)); + mediaWidth = options.DefaultWidth; + mediaHeight = options.DefaultHeight; + } else if (mediaType == "url") { + media.setStyles({backgroundImage: "none", display: ""}); + preload.inject(media); +// if (Browser.safari) options.resizeOpening = false; // Prevents occasional blank video display errors in Safari, thanks to Kris Gale for the solution } else if (mediaType == "obj") { - if (Browser.Plugins.Flash.version<8) { - image.setStyles({backgroundImage: "none", display: ""}); - image.set('html', '
    Error
    Adobe Flash is either not installed or not up to date, please visit Adobe.com to download the free player.
    '); + if (Browser.Plugins.Flash.version < "8") { + media.setStyles({backgroundImage: "none", display: ""}); + media.set('html', '
    Error
    Adobe Flash is either not installed or not up to date, please visit Adobe.com to download the free player.
    '); mediaWidth = options.DefaultWidth; mediaHeight = options.DefaultHeight; } else { - image.setStyles({backgroundImage: "none", display: ""}); - preload.inject(image); + media.setStyles({backgroundImage: "none", display: ""}); + preload.inject(media); +// if (Browser.safari) options.resizeOpening = false; // Prevents occasional blank video display errors in Safari, thanks to Kris Gale for the solution } - } else if (mediaType == "qt") { - image.setStyles({backgroundImage: "none", display: ""}); - preload; - } else if (mediaType == "inline") { -// if (options.overflow) image.setStyles({overflow: options.overflow}); - image.setStyles({backgroundImage: "none", display: ""}); - image.set('html', preload); - } else if (mediaType == "url") { - image.setStyles({backgroundImage: "none", display: ""}); - preload.inject(image); } else { - image.setStyles({backgroundImage: "none", display: ""}); - image.set('html', '
    Error
    A file type error has occoured, please visit iaian7.com or contact the website author for more information.
    '); + media.setStyles({backgroundImage: "none", display: ""}); + media.set('html', options.flashText); mediaWidth = options.defaultWidth; mediaHeight = options.defaultHeight; } - image.setStyles({width: mediaWidth, height: mediaHeight}); - caption.setStyles({width: mediaWidth}); title.set('html', (options.showCaption) ? captionSplit[0] : ""); caption.set('html', (options.showCaption && (captionSplit.length > 1)) ? captionSplit[1] : ""); - number.set('html', (options.showCounter && (images.length > 1)) ? options.counterText.replace(/{x}/, activeImage + 1).replace(/{y}/, images.length) : ""); + number.set('html', (options.showCounter && (mediaArray.length > 1)) ? options.counterText.replace(/\{x\}/, (options.countBack)?mediaArray.length-activeMedia:activeMedia+1).replace(/\{y\}/, mediaArray.length) : ""); - if ((prevImage >= 0) && (images[prevImage][0].match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i))) preloadPrev.src = images[prevImage][0].replace(/twitpic\.com/i, "twitpic.com/show/full"); - if ((nextImage >= 0) && (images[nextImage][0].match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i))) preloadNext.src = images[nextImage][0].replace(/twitpic\.com/i, "twitpic.com/show/full"); +// if (options.countBack) { +// number.set('html', (options.showCounter && (mediaArray.length > 1)) ? options.counterText.replace(/{x}/, activeMedia + 1).replace(/{y}/, mediaArray.length) : ""); +// } else { +// number.set('html', (options.showCounter && (mediaArray.length > 1)) ? options.counterText.replace(/{x}/, mediaArray.length - activeMedia).replace(/{y}/, mediaArray.length) : ""); +// } - mediaWidth = image.offsetWidth; - mediaHeight = image.offsetHeight+bottom.offsetHeight; - if (mediaHeight >= top+top) { mTop = -top } else { mTop = -(mediaHeight/2) }; - if (mediaWidth >= left+left) { mLeft = -left } else { mLeft = -(mediaWidth/2) }; - if (options.resizeOpening) { fx.resize.start({width: mediaWidth, height: mediaHeight, marginTop: mTop-margin, marginLeft: mLeft-margin}); - } else { center.setStyles({width: mediaWidth, height: mediaHeight, marginTop: mTop-margin, marginLeft: mLeft-margin}); imageAnimate(); } + if ((prevMedia >= 0) && (mediaArray[prevMedia][0].match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i))) preloadPrev.src = mediaArray[prevMedia][0].replace(/twitpic\.com/i, "twitpic.com/show/full"); + if ((nextMedia >= 0) && (mediaArray[nextMedia][0].match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i))) preloadNext.src = mediaArray[nextMedia][0].replace(/twitpic\.com/i, "twitpic.com/show/full"); + if (prevMedia >= 0) prevLink.style.display = ""; + if (nextMedia >= 0) nextLink.style.display = ""; + media.setStyles({width: mediaWidth+"px", height: mediaHeight+"px"}); + bottom.setStyles({width: mediaWidth-marginBottom+"px"}); + caption.setStyles({width: mediaWidth-marginBottom+"px"}); + + mediaWidth = media.offsetWidth; + mediaHeight = media.offsetHeight+bottom.offsetHeight; + if (mediaHeight >= top+top) { mTop = -top; } else { mTop = -(mediaHeight/2); } + if (mediaWidth >= left+left) { mLeft = -left; } else { mLeft = -(mediaWidth/2); } +/****/ if (options.resizeOpening) { fx.resize.start({width: mediaWidth, height: mediaHeight, marginTop: mTop-margin, marginLeft: mLeft-margin}); +/****/ } else { center.setStyles({width: mediaWidth, height: mediaHeight, marginTop: mTop-margin, marginLeft: mLeft-margin}); mediaAnimate(); } +// center.setStyles({width: mediaWidth, height: mediaHeight, marginTop: mTop-margin, marginLeft: mLeft-margin}); +// mediaAnimate(); } - function imageAnimate() { - fx.image.start(1); + function mediaAnimate() { + fx.media.start(1); } function captionAnimate() { center.className = ""; - if (prevImage >= 0) prevLink.style.display = ""; - if (nextImage >= 0) nextLink.style.display = ""; +// if (prevMedia >= 0) prevLink.style.display = ""; +// if (nextMedia >= 0) nextLink.style.display = ""; fx.bottom.start(1); } function stop() { - if (preload) preload.onload = $empty; + if (preload) { + if (mediaType == "inline" && !options.inlineClone) preload.adopt(media.getChildren()); // prevents loss of adopted data + preload.onload = function(){}; // $empty replacement + } fx.resize.cancel(); - fx.image.cancel().set(0); + fx.media.cancel().set(0); fx.bottom.cancel().set(0); $$(prevLink, nextLink).setStyle("display", "none"); } function close() { - if (activeImage >= 0) { - preload.onload = $empty; - image.set('html', ''); + if (activeMedia >= 0) { + if (mediaType == "inline" && !options.inlineClone) preload.adopt(media.getChildren()); // prevents loss of adopted data + preload.onload = function(){}; // $empty replacement + media.empty(); for (var f in fx) fx[f].cancel(); center.setStyle("display", "none"); fx.overlay.chain(setup).start(0); @@ -943,17 +934,43 @@ var Mediabox; } })(); + /* Quicktime detection from Quickie.js */ + +Browser.Plugins.QuickTime = (function(){ + if (navigator.plugins) { + for (var i = 0, l = navigator.plugins.length; i < l; i++) { + if (navigator.plugins[i].name.indexOf('QuickTime') >= 0) { + return true; + } + } + } else { + var test; + try { test = new ActiveXObject('QuickTime.QuickTime'); } + catch(e) {} + + if (test) { return true; } + } + return false; +})(); + /* Autoload code block */ Mediabox.scanPage = function() { +// if (Browser.Platform.ios && !(navigator.userAgent.match(/iPad/i))) return; // this quits the process if the visitor is using a non-iPad iOS device (iPhone or iPod Touch) // $$('#mb_').each(function(hide) { hide.set('display', 'none'); }); var links = $$("a").filter(function(el) { return el.rel && el.rel.test(/^lightbox/i); }); - $$(links).mediabox({/* Put custom options here */}, null, function(el) { - var rel0 = this.rel.replace(/[[]|]/gi," "); +// $$(links).mediabox({/* Put custom options here */}, null, function(el) { + links.mediabox({/* Put custom options here */}, null, function(el) { + var rel0 = this.rel.replace(/[\[\]|]/gi," "); var relsize = rel0.split(" "); - return (this == el) || ((this.rel.length > 8) && el.rel.match(relsize[1])); +// return (this == el) || ((this.rel.length > 8) && el.rel.match(relsize[1])); + + var relsearch = "\\["+relsize[1]+"[ \\]]"; + var relregexp = new RegExp(relsearch); + return (this == el) || ((this.rel.length > 8) && el.rel.match(relregexp)); }); }; -window.addEvent("domready", Mediabox.scanPage); \ No newline at end of file + +window.addEvents({domready: Mediabox.scanPage, resize: Mediabox.recenter}); // to recenter the overlay while scrolling, add "scroll: Mediabox.recenter" to the object diff --git a/js/mootools.js b/js/mootools.js deleted file mode 100644 index 7724933..0000000 --- a/js/mootools.js +++ /dev/null @@ -1,360 +0,0 @@ -//MooTools, , My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, , MIT Style License. - -var MooTools={version:"1.2.6",build:"a3be7a0ef5205eb655c4ee11e8cbedcb3f2ffa95"};var Native=function(l){l=l||{};var a=l.name;var j=l.legacy;var b=l.protect; -var c=l.implement;var i=l.generics;var g=l.initialize;var h=l.afterImplement||function(){};var d=g||j;i=i!==false;d.constructor=Native;d.$family={name:"native"}; -if(j&&g){d.prototype=j.prototype;}d.prototype.constructor=d;if(a){var f=a.toLowerCase();d.prototype.$family={name:f};Native.typize(d,f);}var k=function(o,m,p,n){if(!b||n||!o.prototype[m]){o.prototype[m]=p; -}if(i){Native.genericize(o,m,b);}h.call(o,m,p);return o;};d.alias=function(o,m,q){if(typeof o=="string"){var p=this.prototype[o];if((o=p)){return k(this,m,o,q); -}}for(var n in o){this.alias(n,o[n],m);}return this;};d.implement=function(n,m,q){if(typeof n=="string"){return k(this,n,m,q);}for(var o in n){k(this,o,n[o],m); -}return this;};if(c){d.implement(c);}return d;};Native.genericize=function(b,c,a){if((!a||!b[c])&&typeof b.prototype[c]=="function"){b[c]=function(){var d=Array.prototype.slice.call(arguments); -return b.prototype[c].apply(d.shift(),d);};}};Native.implement=function(d,c){for(var b=0,a=d.length;b-1:this.indexOf(a)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim(); -},camelCase:function(){return this.replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase()); -});},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1"); -},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(b){var a=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); -return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null;},stripScripts:function(b){var a=""; -var c=this.replace(/]*>([\s\S]*?)<\/script>/gi,function(){a+=arguments[1]+"\n";return"";});if(b===true){$exec(a);}else{if($type(b)=="function"){b(a,c); -}}return c;},substitute:function(a,b){return this.replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1);}return(a[c]!=undefined)?a[c]:""; -});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){for(var a in this){if(this.hasOwnProperty(a)&&this[a]===b){return a;}}return null; -},hasValue:function(a){return(Hash.keyOf(this,a)!==null);},extend:function(a){Hash.each(a||{},function(c,b){Hash.set(this,b,c);},this);return this;},combine:function(a){Hash.each(a||{},function(c,b){Hash.include(this,b,c); -},this);return this;},erase:function(a){if(this.hasOwnProperty(a)){delete this[a];}return this;},get:function(a){return(this.hasOwnProperty(a))?this[a]:null; -},set:function(a,b){if(!this[a]||this.hasOwnProperty(a)){this[a]=b;}return this;},empty:function(){Hash.each(this,function(b,a){delete this[a];},this); -return this;},include:function(a,b){if(this[a]==undefined){this[a]=b;}return this;},map:function(b,c){var a=new Hash;Hash.each(this,function(f,d){a.set(d,b.call(c,f,d,this)); -},this);return a;},filter:function(b,c){var a=new Hash;Hash.each(this,function(f,d){if(b.call(c,f,d,this)){a.set(d,f);}},this);return a;},every:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&!b.call(c,this[a],a)){return false; -}}return true;},some:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&b.call(c,this[a],a)){return true;}}return false;},getKeys:function(){var a=[]; -Hash.each(this,function(c,b){a.push(b);});return a;},getValues:function(){var a=[];Hash.each(this,function(b){a.push(b);});return a;},toQueryString:function(a){var b=[]; -Hash.each(this,function(g,f){if(a){f=a+"["+f+"]";}var d;switch($type(g)){case"object":d=Hash.toQueryString(g,f);break;case"array":var c={};g.each(function(j,h){c[h]=j; -});d=Hash.toQueryString(c,f);break;default:d=f+"="+encodeURIComponent(g);}if(g!=undefined){b.push(d);}});return b.join("&");}});Hash.alias({keyOf:"indexOf",hasValue:"contains"}); -var Event=new Native({name:"Event",initialize:function(a,g){g=g||window;var l=g.document;a=a||g.event;if(a.$extended){return a;}this.$extended=true;var k=a.type; -var h=a.target||a.srcElement;while(h&&h.nodeType==3){h=h.parentNode;}if(k.test(/key/)){var b=a.which||a.keyCode;var n=Event.Keys.keyOf(b);if(k=="keydown"){var d=b-111; -if(d>0&&d<13){n="f"+d;}}n=n||String.fromCharCode(b).toLowerCase();}else{if(k.match(/(click|mouse|menu)/i)){l=(!l.compatMode||l.compatMode=="CSS1Compat")?l.html:l.body; -var j={x:a.pageX||a.clientX+l.scrollLeft,y:a.pageY||a.clientY+l.scrollTop};var c={x:(a.pageX)?a.pageX-g.pageXOffset:a.clientX,y:(a.pageY)?a.pageY-g.pageYOffset:a.clientY}; -if(k.match(/DOMMouseScroll|mousewheel/)){var i=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3;}var f=(a.which==3)||(a.button==2);var m=null;if(k.match(/over|out/)){switch(k){case"mouseover":m=a.relatedTarget||a.fromElement; -break;case"mouseout":m=a.relatedTarget||a.toElement;}if(!(function(){while(m&&m.nodeType==3){m=m.parentNode;}return true;}).create({attempt:Browser.Engine.gecko})()){m=false; -}}}}return $extend(this,{event:a,type:k,page:j,client:c,rightClick:f,wheel:i,relatedTarget:m,target:h,code:b,key:n,shift:a.shiftKey,control:a.ctrlKey,alt:a.altKey,meta:a.metaKey}); -}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault(); -},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); -}else{this.event.returnValue=false;}return this;}});function Class(b){if(b instanceof Function){b={initialize:b};}var a=function(){Object.reset(this);if(a._prototyping){return this; -}this._current=$empty;var c=(this.initialize)?this.initialize.apply(this,arguments):this;delete this._current;delete this.caller;return c;}.extend(this); -a.implement(b);a.constructor=Class;a.prototype.constructor=a;return a;}Function.prototype.protect=function(){this._protected=true;return this;};Object.reset=function(a,c){if(c==null){for(var f in a){Object.reset(a,f); -}return a;}delete a[c];switch($type(a[c])){case"object":var d=function(){};d.prototype=a[c];var b=new d;a[c]=Object.reset(b);break;case"array":a[c]=$unlink(a[c]); -break;}return a;};new Native({name:"Class",initialize:Class}).extend({instantiate:function(b){b._prototyping=true;var a=new b;delete b._prototyping;return a; -},wrap:function(a,b,c){if(c._origin){c=c._origin;}return function(){if(c._protected&&this._current==null){throw new Error('The method "'+b+'" cannot be called.'); -}var f=this.caller,g=this._current;this.caller=g;this._current=arguments.callee;var d=c.apply(this,arguments);this._current=g;this.caller=f;return d;}.extend({_owner:a,_origin:c,_name:b}); -}});Class.implement({implement:function(a,d){if($type(a)=="object"){for(var f in a){this.implement(f,a[f]);}return this;}var g=Class.Mutators[a];if(g){d=g.call(this,d); -if(d==null){return this;}}var c=this.prototype;switch($type(d)){case"function":if(d._hidden){return this;}c[a]=Class.wrap(this,a,d);break;case"object":var b=c[a]; -if($type(b)=="object"){$mixin(b,d);}else{c[a]=$unlink(d);}break;case"array":c[a]=$unlink(d);break;default:c[a]=d;}return this;}});Class.Mutators={Extends:function(a){this.parent=a; -this.prototype=Class.instantiate(a);this.implement("parent",function(){var b=this.caller._name,c=this.caller._owner.parent.prototype[b];if(!c){throw new Error('The method "'+b+'" has no parent.'); -}return c.apply(this,arguments);}.protect());},Implements:function(a){$splat(a).each(function(b){if(b instanceof Function){b=Class.instantiate(b);}this.implement(b); -},this);}};var Chain=new Class({$chain:[],chain:function(){this.$chain.extend(Array.flatten(arguments));return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false; -},clearChain:function(){this.$chain.empty();return this;}});var Events=new Class({$events:{},addEvent:function(c,b,a){c=Events.removeOn(c);if(b!=$empty){this.$events[c]=this.$events[c]||[]; -this.$events[c].include(b);if(a){b.internal=true;}}return this;},addEvents:function(a){for(var b in a){this.addEvent(b,a[b]);}return this;},fireEvent:function(c,b,a){c=Events.removeOn(c); -if(!this.$events||!this.$events[c]){return this;}this.$events[c].each(function(d){d.create({bind:this,delay:a,"arguments":b})();},this);return this;},removeEvent:function(b,a){b=Events.removeOn(b); -if(!this.$events[b]){return this;}if(!a.internal){this.$events[b].erase(a);}return this;},removeEvents:function(c){var d;if($type(c)=="object"){for(d in c){this.removeEvent(d,c[d]); -}return this;}if(c){c=Events.removeOn(c);}for(d in this.$events){if(c&&c!=d){continue;}var b=this.$events[d];for(var a=b.length;a--;a){this.removeEvent(d,b[a]); -}}return this;}});Events.removeOn=function(a){return a.replace(/^on([A-Z])/,function(b,c){return c.toLowerCase();});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments)); -if(!this.addEvent){return this;}for(var a in this.options){if($type(this.options[a])!="function"||!(/^on[A-Z]/).test(a)){continue;}this.addEvent(a,this.options[a]); -delete this.options[a];}return this;}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(a,b){var c=Element.Constructors.get(a); -if(c){return c(b);}if(typeof a=="string"){return document.newElement(a,b);}return document.id(a).set(b);},afterImplement:function(a,b){Element.Prototype[a]=b; -if(Array[a]){return;}Elements.implement(a,function(){var c=[],h=true;for(var f=0,d=this.length;f");d=(a.name=="x");}catch(b){}var c=function(f){return(""+f).replace(/&/g,"&").replace(/"/g,"""); -};Document.implement({newElement:function(f,g){if(g&&g.checked!=null){g.defaultChecked=g.checked;}if(d&&g){f="<"+f;if(g.name){f+=' name="'+c(g.name)+'"'; -}if(g.type){f+=' type="'+c(g.type)+'"';}f+=">";delete g.name;delete g.type;}return this.id(this.createElement(f)).set(g);},newTextNode:function(f){return this.createTextNode(f); -},getDocument:function(){return this;},getWindow:function(){return this.window;},id:(function(){var f={string:function(i,h,g){i=g.getElementById(i);return(i)?f.element(i,h):null; -},element:function(g,j){$uid(g);if(!j&&!g.$family&&!(/^object|embed$/i).test(g.tagName)){var h=Element.Prototype;for(var i in h){g[i]=h[i];}}return g;},object:function(h,i,g){if(h.toElement){return f.element(h.toElement(g),i); -}return null;}};f.textnode=f.whitespace=f.window=f.document=$arguments(0);return function(h,j,i){if(h&&h.$family&&h.uid){return h;}var g=$type(h);return(f[g])?f[g](h,j,i||document):null; -};})()});})();if(window.$==null){Window.implement({$:function(a,b){return document.id(a,b,this.document);}});}Window.implement({$$:function(a){if(arguments.length==1&&typeof a=="string"){return this.document.getElements(a); -}var g=[];var c=Array.flatten(arguments);for(var d=0,b=c.length;d1);a.each(function(f){var g=this.getElementsByTagName(f.trim());(b)?c.extend(g):c=g; -},this);return new Elements(c,{ddup:b,cash:!d});}});(function(){var i={},g={};var j={input:"checked",option:"selected",textarea:(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerHTML":"value"}; -var c=function(m){return(g[m]||(g[m]={}));};var h=function(o,m){if(!o){return;}var n=o.uid;if(m!==true){m=false;}if(Browser.Engine.trident){if(o.clearAttributes){var r=m&&o.cloneNode(false); -o.clearAttributes();if(r){o.mergeAttributes(r);}}else{if(o.removeEvents){o.removeEvents();}}if((/object/i).test(o.tagName)){for(var q in o){if(typeof o[q]=="function"){o[q]=$empty; -}}Element.dispose(o);}}if(!n){return;}i[n]=g[n]=null;};var d=function(){Hash.each(i,h);if(Browser.Engine.trident){$A(document.getElementsByTagName("object")).each(h); -}if(window.CollectGarbage){CollectGarbage();}i=g=null;};var k=function(o,m,t,n,q,s){var p=o[t||m];var r=[];while(p){if(p.nodeType==1&&(!n||Element.match(p,n))){if(!q){return document.id(p,s); -}r.push(p);}p=p[m];}return(q)?new Elements(r,{ddup:false,cash:!s}):null;};var f={html:"innerHTML","class":"className","for":"htmlFor",defaultValue:"defaultValue",text:(Browser.Engine.trident||(Browser.Engine.webkit&&Browser.Engine.version<420))?"innerText":"textContent"}; -var b=["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"];var l=["value","type","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"]; -b=b.associate(b);Hash.extend(f,b);Hash.extend(f,l.associate(l.map(String.toLowerCase)));var a={before:function(n,m){if(m.parentNode){m.parentNode.insertBefore(n,m); -}},after:function(n,m){if(!m.parentNode){return;}var o=m.nextSibling;(o)?m.parentNode.insertBefore(n,o):m.parentNode.appendChild(n);},bottom:function(n,m){m.appendChild(n); -},top:function(n,m){var o=m.firstChild;(o)?m.insertBefore(n,o):m.appendChild(n);}};a.inside=a.bottom;Hash.each(a,function(m,n){n=n.capitalize();Element.implement("inject"+n,function(o){m(this,document.id(o,true)); -return this;});Element.implement("grab"+n,function(o){m(document.id(o,true),this);return this;});});Element.implement({set:function(q,n){switch($type(q)){case"object":for(var o in q){this.set(o,q[o]); -}break;case"string":var m=Element.Properties.get(q);(m&&m.set)?m.set.apply(this,Array.slice(arguments,1)):this.setProperty(q,n);}return this;},get:function(n){var m=Element.Properties.get(n); -return(m&&m.get)?m.get.apply(this,Array.slice(arguments,1)):this.getProperty(n);},erase:function(n){var m=Element.Properties.get(n);(m&&m.erase)?m.erase.apply(this):this.removeProperty(n); -return this;},setProperty:function(n,o){var m=f[n];if(o==undefined){return this.removeProperty(n);}if(m&&b[n]){o=!!o;}(m)?this[m]=o:this.setAttribute(n,""+o); -return this;},setProperties:function(m){for(var n in m){this.setProperty(n,m[n]);}return this;},getProperty:function(n){var m=f[n];var o=(m)?this[m]:this.getAttribute(n,2); -return(b[n])?!!o:(m)?o:o||null;},getProperties:function(){var m=$A(arguments);return m.map(this.getProperty,this).associate(m);},removeProperty:function(n){var m=f[n]; -(m)?this[m]=(m&&b[n])?false:"":this.removeAttribute(n);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this; -},hasClass:function(m){return this.className.contains(m," ");},addClass:function(m){if(!this.hasClass(m)){this.className=(this.className+" "+m).clean(); -}return this;},removeClass:function(m){this.className=this.className.replace(new RegExp("(^|\\s)"+m+"(?:\\s|$)"),"$1");return this;},toggleClass:function(m){return this.hasClass(m)?this.removeClass(m):this.addClass(m); -},adopt:function(){Array.flatten(arguments).each(function(m){m=document.id(m,true);if(m){this.appendChild(m);}},this);return this;},appendText:function(n,m){return this.grab(this.getDocument().newTextNode(n),m); -},grab:function(n,m){a[m||"bottom"](document.id(n,true),this);return this;},inject:function(n,m){a[m||"bottom"](this,document.id(n,true));return this;},replaces:function(m){m=document.id(m,true); -m.parentNode.replaceChild(this,m);return this;},wraps:function(n,m){n=document.id(n,true);return this.replaces(n).grab(n,m);},getPrevious:function(m,n){return k(this,"previousSibling",null,m,false,n); -},getAllPrevious:function(m,n){return k(this,"previousSibling",null,m,true,n);},getNext:function(m,n){return k(this,"nextSibling",null,m,false,n);},getAllNext:function(m,n){return k(this,"nextSibling",null,m,true,n); -},getFirst:function(m,n){return k(this,"nextSibling","firstChild",m,false,n);},getLast:function(m,n){return k(this,"previousSibling","lastChild",m,false,n); -},getParent:function(m,n){return k(this,"parentNode",null,m,false,n);},getParents:function(m,n){return k(this,"parentNode",null,m,true,n);},getSiblings:function(m,n){return this.getParent().getChildren(m,n).erase(this); -},getChildren:function(m,n){return k(this,"nextSibling","firstChild",m,true,n);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument; -},getElementById:function(p,o){var n=this.ownerDocument.getElementById(p);if(!n){return null;}for(var m=n.parentNode;m!=this;m=m.parentNode){if(!m){return null; -}}return document.id(n,o);},getSelected:function(){return new Elements($A(this.options).filter(function(m){return m.selected;}));},getComputedStyle:function(n){if(this.currentStyle){return this.currentStyle[n.camelCase()]; -}var m=this.getDocument().defaultView.getComputedStyle(this,null);return(m)?m.getPropertyValue([n.hyphenate()]):null;},toQueryString:function(){var m=[]; -this.getElements("input, select, textarea",true).each(function(n){if(!n.name||n.disabled||n.type=="submit"||n.type=="reset"||n.type=="file"){return;}var o=(n.tagName.toLowerCase()=="select")?Element.getSelected(n).map(function(p){return p.value; -}):((n.type=="radio"||n.type=="checkbox")&&!n.checked)?null:n.value;$splat(o).each(function(p){if(typeof p!="undefined"){m.push(n.name+"="+encodeURIComponent(p)); -}});});return m.join("&");},clone:function(p,m){p=p!==false;var s=this.cloneNode(p);var o=function(w,v){if(!m){w.removeAttribute("id");}if(Browser.Engine.trident){w.clearAttributes(); -w.mergeAttributes(v);w.removeAttribute("uid");if(w.options){var x=w.options,t=v.options;for(var u=x.length;u--;){x[u].selected=t[u].selected;}}}var y=j[v.tagName.toLowerCase()]; -if(y&&v[y]){w[y]=v[y];}};if(p){var q=s.getElementsByTagName("*"),r=this.getElementsByTagName("*");for(var n=q.length;n--;){o(q[n],r[n]);}}o(s,this);return document.id(s); -},destroy:function(){Element.empty(this);Element.dispose(this);h(this,true);return null;},empty:function(){$A(this.childNodes).each(function(m){Element.destroy(m); -});return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},hasChild:function(m){m=document.id(m,true);if(!m){return false; -}if(Browser.Engine.webkit&&Browser.Engine.version<420){return $A(this.getElementsByTagName(m.tagName)).contains(m);}return(this.contains)?(this!=m&&this.contains(m)):!!(this.compareDocumentPosition(m)&16); -},match:function(m){return(!m||(m==this)||(Element.get(this,"tag")==m));}});Native.implement([Element,Window,Document],{addListener:function(p,o){if(p=="unload"){var m=o,n=this; -o=function(){n.removeListener("unload",o);m();};}else{i[this.uid]=this;}if(this.addEventListener){this.addEventListener(p,o,false);}else{this.attachEvent("on"+p,o); -}return this;},removeListener:function(n,m){if(this.removeEventListener){this.removeEventListener(n,m,false);}else{this.detachEvent("on"+n,m);}return this; -},retrieve:function(n,m){var p=c(this.uid),o=p[n];if(m!=undefined&&o==undefined){o=p[n]=m;}return $pick(o);},store:function(n,m){var o=c(this.uid);o[n]=m; -return this;},eliminate:function(m){var n=c(this.uid);delete n[m];return this;}});window.addListener("unload",d);})();Element.Properties=new Hash;Element.Properties.style={set:function(a){this.style.cssText=a; -},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase(); -}};Element.Properties.html=(function(){var g=true;try{var a=document.createElement("tr");a.innerHTML="x";a=a.firstChild;g=!(a.nodeName=="TD"&&a.innerHTML=="x"); -}catch(d){}if(!g){return{set:function(){this.innerHTML=Array.flatten(arguments).join("");}};}var f=document.createElement("div");var b={table:[1,"","
    "],select:[1,""],tbody:[2,"","
    "],tr:[3,"","
    "]}; -b.thead=b.tfoot=b.tbody;var c={set:function(){var j=Array.flatten(arguments).join("");var k=b[this.get("tag")];if(k){var l=f;l.innerHTML=k[1]+j+k[2];for(var h=k[0]; -h--;){l=l.firstChild;}this.empty().adopt(l.childNodes);}else{this.innerHTML=j;}}};c.erase=c.set;return c;})();if(Browser.Engine.webkit&&Browser.Engine.version<420){Element.Properties.text={get:function(){if(this.innerText){return this.innerText; -}var a=this.ownerDocument.newElement("div",{html:this.innerHTML}).inject(this.ownerDocument.body);var b=a.innerText;a.destroy();return b;}};}Element.Properties.events={set:function(a){this.addEvents(a); -}};Native.implement([Element,Window,Document],{addEvent:function(f,h){var i=this.retrieve("events",{});i[f]=i[f]||{keys:[],values:[]};if(i[f].keys.contains(h)){return this; -}i[f].keys.push(h);var g=f,a=Element.Events.get(f),c=h,j=this;if(a){if(a.onAdd){a.onAdd.call(this,h);}if(a.condition){c=function(k){if(a.condition.call(this,k)){return h.call(this,k); -}return true;};}g=a.base||g;}var d=function(){return h.call(j);};var b=Element.NativeEvents[g];if(b){if(b==2){d=function(k){k=new Event(k,j.getWindow()); -if(c.call(j,k)===false){k.stop();}};}this.addListener(g,d);}i[f].values.push(d);return this;},removeEvent:function(c,b){var a=this.retrieve("events");if(!a||!a[c]){return this; -}var g=a[c].keys.indexOf(b);if(g==-1){return this;}a[c].keys.splice(g,1);var f=a[c].values.splice(g,1)[0];var d=Element.Events.get(c);if(d){if(d.onRemove){d.onRemove.call(this,b); -}c=d.base||c;}return(Element.NativeEvents[c])?this.removeListener(c,f):this;},addEvents:function(a){for(var b in a){this.addEvent(b,a[b]);}return this; -},removeEvents:function(a){var c;if($type(a)=="object"){for(c in a){this.removeEvent(c,a[c]);}return this;}var b=this.retrieve("events");if(!b){return this; -}if(!a){for(c in b){this.removeEvents(c);}this.eliminate("events");}else{if(b[a]){while(b[a].keys[0]){this.removeEvent(a,b[a].keys[0]);}b[a]=null;}}return this; -},fireEvent:function(d,b,a){var c=this.retrieve("events");if(!c||!c[d]){return this;}c[d].keys.each(function(f){f.create({bind:this,delay:a,"arguments":b})(); -},this);return this;},cloneEvents:function(d,a){d=document.id(d);var c=d.retrieve("events");if(!c){return this;}if(!a){for(var b in c){this.cloneEvents(d,b); -}}else{if(c[a]){c[a].keys.each(function(f){this.addEvent(a,f);},this);}}return this;}});try{if(typeof HTMLElement!="undefined"){HTMLElement.prototype.fireEvent=Element.prototype.fireEvent; -}}catch(e){}Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1}; -(function(){var a=function(b){var c=b.relatedTarget;if(c==undefined){return true;}if(c===false){return false;}return($type(this)!="document"&&c!=this&&c.prefix!="xul"&&!this.hasChild(c)); -};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}}); -})();Element.Properties.styles={set:function(a){this.setStyles(a);}};Element.Properties.opacity={set:function(a,b){if(!b){if(a==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden"; -}}else{if(this.style.visibility!="visible"){this.style.visibility="visible";}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1;}if(Browser.Engine.trident){this.style.filter=(a==1)?"":"alpha(opacity="+a*100+")"; -}this.style.opacity=a;this.store("opacity",a);},get:function(){return this.retrieve("opacity",1);}};Element.implement({setOpacity:function(a){return this.set("opacity",a,true); -},getOpacity:function(){return this.get("opacity");},setStyle:function(b,a){switch(b){case"opacity":return this.set("opacity",parseFloat(a));case"float":b=(Browser.Engine.trident)?"styleFloat":"cssFloat"; -}b=b.camelCase();if($type(a)!="string"){var c=(Element.Styles.get(b)||"@").split(" ");a=$splat(a).map(function(f,d){if(!c[d]){return"";}return($type(f)=="number")?c[d].replace("@",Math.round(f)):f; -}).join(" ");}else{if(a==String(Number(a))){a=Math.round(a);}}this.style[b]=a;return this;},getStyle:function(h){switch(h){case"opacity":return this.get("opacity"); -case"float":h=(Browser.Engine.trident)?"styleFloat":"cssFloat";}h=h.camelCase();var a=this.style[h];if(!$chk(a)){a=[];for(var g in Element.ShortStyles){if(h!=g){continue; -}for(var f in Element.ShortStyles[g]){a.push(this.getStyle(f));}return a.join(" ");}a=this.getComputedStyle(h);}if(a){a=String(a);var c=a.match(/rgba?\([\d\s,]+\)/); -if(c){a=a.replace(c[0],c[0].rgbToHex());}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(a,10)))){if(h.test(/^(height|width)$/)){var b=(h=="width")?["left","right"]:["top","bottom"],d=0; -b.each(function(i){d+=this.getStyle("border-"+i+"-width").toInt()+this.getStyle("padding-"+i).toInt();},this);return this["offset"+h.capitalize()]-d+"px"; -}if((Browser.Engine.presto)&&String(a).test("px")){return a;}if(h.test(/(border(.+)Width|margin|padding)/)){return"0px";}}return a;},setStyles:function(b){for(var a in b){this.setStyle(a,b[a]); -}return this;},getStyles:function(){var a={};Array.flatten(arguments).each(function(b){a[b]=this.getStyle(b);},this);return a;}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}); -Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(h){var g=Element.ShortStyles; -var b=Element.Styles;["margin","padding"].each(function(i){var j=i+h;g[i][j]=b[j]="@px";});var f="border"+h;g.border[f]=b[f]="@px @ rgb(@, @, @)";var d=f+"Width",a=f+"Style",c=f+"Color"; -g[f]={};g.borderWidth[d]=g[f][d]=b[d]="@px";g.borderStyle[a]=g[f][a]=b[a]="@";g.borderColor[c]=g[f][c]=b[c]="rgb(@, @, @)";});(function(){Element.implement({scrollTo:function(i,j){if(b(this)){this.getWindow().scrollTo(i,j); -}else{this.scrollLeft=i;this.scrollTop=j;}return this;},getSize:function(){if(b(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight}; -},getScrollSize:function(){if(b(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(b(this)){return this.getWindow().getScroll(); -}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var j=this,i={x:0,y:0};while(j&&!b(j)){i.x+=j.scrollLeft;i.y+=j.scrollTop;j=j.parentNode; -}return i;},getOffsetParent:function(){var i=this;if(b(i)){return null;}if(!Browser.Engine.trident){return i.offsetParent;}while((i=i.parentNode)&&!b(i)){if(d(i,"position")!="static"){return i; -}}return null;},getOffsets:function(){if(this.getBoundingClientRect){var k=this.getBoundingClientRect(),n=document.id(this.getDocument().documentElement),q=n.getScroll(),l=this.getScrolls(),j=this.getScroll(),i=(d(this,"position")=="fixed"); -return{x:k.left.toInt()+l.x-j.x+((i)?0:q.x)-n.clientLeft,y:k.top.toInt()+l.y-j.y+((i)?0:q.y)-n.clientTop};}var m=this,o={x:0,y:0};if(b(this)){return o; -}while(m&&!b(m)){o.x+=m.offsetLeft;o.y+=m.offsetTop;if(Browser.Engine.gecko){if(!g(m)){o.x+=c(m);o.y+=h(m);}var p=m.parentNode;if(p&&d(p,"overflow")!="visible"){o.x+=c(p); -o.y+=h(p);}}else{if(m!=this&&Browser.Engine.webkit){o.x+=c(m);o.y+=h(m);}}m=m.offsetParent;}if(Browser.Engine.gecko&&!g(this)){o.x-=c(this);o.y-=h(this); -}return o;},getPosition:function(l){if(b(this)){return{x:0,y:0};}var m=this.getOffsets(),j=this.getScrolls();var i={x:m.x-j.x,y:m.y-j.y};var k=(l&&(l=document.id(l)))?l.getPosition():{x:0,y:0}; -return{x:i.x-k.x,y:i.y-k.y};},getCoordinates:function(k){if(b(this)){return this.getWindow().getCoordinates();}var i=this.getPosition(k),j=this.getSize(); -var l={left:i.x,top:i.y,width:j.x,height:j.y};l.right=l.left+l.width;l.bottom=l.top+l.height;return l;},computePosition:function(i){return{left:i.x-f(this,"margin-left"),top:i.y-f(this,"margin-top")}; -},setPosition:function(i){return this.setStyles(this.computePosition(i));}});Native.implement([Document,Window],{getSize:function(){if(Browser.Engine.presto||Browser.Engine.webkit){var j=this.getWindow(); -return{x:j.innerWidth,y:j.innerHeight};}var i=a(this);return{x:i.clientWidth,y:i.clientHeight};},getScroll:function(){var j=this.getWindow(),i=a(this); -return{x:j.pageXOffset||i.scrollLeft,y:j.pageYOffset||i.scrollTop};},getScrollSize:function(){var j=a(this),i=this.getSize();return{x:Math.max(j.scrollWidth,i.x),y:Math.max(j.scrollHeight,i.y)}; -},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var i=this.getSize();return{top:0,left:0,bottom:i.y,right:i.x,height:i.y,width:i.x}; -}});var d=Element.getComputedStyle;function f(i,j){return d(i,j).toInt()||0;}function g(i){return d(i,"-moz-box-sizing")=="border-box";}function h(i){return f(i,"border-top-width"); -}function c(i){return f(i,"border-left-width");}function b(i){return(/^(?:body|html)$/i).test(i.tagName);}function a(i){var j=i.getDocument();return(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; -}})();Element.alias("setPosition","position");Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x; -},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y; -},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x; -}});Native.implement([Document,Element],{getElements:function(j,h){j=j.split(",");var c,f={};for(var d=0,b=j.length;d1),cash:!h});}});Element.implement({match:function(b){if(!b||(b==this)){return true; -}var d=Selectors.Utils.parseTagAndID(b);var a=d[0],f=d[1];if(!Selectors.Filters.byID(this,f)||!Selectors.Filters.byTag(this,a)){return false;}var c=Selectors.Utils.parseSelector(b); -return(c)?Selectors.Utils.filter(this,c,{}):true;}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)}; -Selectors.Utils={chk:function(b,c){if(!c){return true;}var a=$uid(b);if(!c[a]){return c[a]=true;}return false;},parseNthArgument:function(i){if(Selectors.Cache.nth[i]){return Selectors.Cache.nth[i]; -}var f=i.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!f){return false;}var h=parseInt(f[1],10);var d=(h||h===0)?h:1;var g=f[2]||false;var c=parseInt(f[3],10)||0; -if(d!=0){c--;while(c<1){c+=d;}while(c>=d){c-=d;}}else{d=c;g="index";}switch(g){case"n":f={a:d,b:c,special:"n"};break;case"odd":f={a:2,b:0,special:"n"}; -break;case"even":f={a:2,b:1,special:"n"};break;case"first":f={a:0,special:"index"};break;case"last":f={special:"last-child"};break;case"only":f={special:"only-child"}; -break;default:f={a:(d-1),special:"index"};}return Selectors.Cache.nth[i]=f;},parseSelector:function(f){if(Selectors.Cache.parsed[f]){return Selectors.Cache.parsed[f]; -}var d,i={classes:[],pseudos:[],attributes:[]};while((d=Selectors.RegExps.combined.exec(f))){var j=d[1],h=d[2],g=d[3],b=d[5],c=d[6],k=d[7];if(j){i.classes.push(j); -}else{if(c){var a=Selectors.Pseudo.get(c);if(a){i.pseudos.push({parser:a,argument:k});}else{i.attributes.push({name:c,operator:"=",value:k});}}else{if(h){i.attributes.push({name:h,operator:g,value:b}); -}}}}if(!i.classes.length){delete i.classes;}if(!i.attributes.length){delete i.attributes;}if(!i.pseudos.length){delete i.pseudos;}if(!i.classes&&!i.attributes&&!i.pseudos){i=null; -}return Selectors.Cache.parsed[f]=i;},parseTagAndID:function(b){var a=b.match(Selectors.RegExps.tag);var c=b.match(Selectors.RegExps.id);return[(a)?a[1]:"*",(c)?c[1]:false]; -},filter:function(g,c,f){var d;if(c.classes){for(d=c.classes.length;d--;d){var h=c.classes[d];if(!Selectors.Filters.byClass(g,h)){return false;}}}if(c.attributes){for(d=c.attributes.length; -d--;d){var b=c.attributes[d];if(!Selectors.Filters.byAttribute(g,b.name,b.operator,b.value)){return false;}}}if(c.pseudos){for(d=c.pseudos.length;d--;d){var a=c.pseudos[d]; -if(!Selectors.Filters.byPseudo(g,a.parser,a.argument,f)){return false;}}}return true;},getByTagAndID:function(b,a,d){if(d){var c=(b.getElementById)?b.getElementById(d,true):Element.getElementById(b,d,true); -return(c&&Selectors.Filters.byTag(c,a))?[c]:[];}else{return b.getElementsByTagName(a);}},search:function(p,o,u){var b=[];var c=o.trim().replace(Selectors.RegExps.splitter,function(k,j,i){b.push(j); -return":)"+i;}).split(":)");var q,f,B;for(var A=0,w=c.length;A":function(j,h,k,a,g){var c=Selectors.Utils.getByTagAndID(h,k,a);for(var f=0,d=c.length;fa){return false;}}return(c==a);},even:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n+1",a); -},odd:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n",a);},selected:function(){return this.selected;},enabled:function(){return(this.disabled===false); -}});Element.Events.domready={onAdd:function(a){if(Browser.loaded){a.call(this);}}};(function(){var b=function(){if(Browser.loaded){return;}Browser.loaded=true; -window.fireEvent("domready");document.fireEvent("domready");};window.addEvent("load",b);if(Browser.Engine.trident){var a=document.createElement("div"); -(function(){($try(function(){a.doScroll();return document.id(a).inject(document.body).set("html","temp").dispose();}))?b():arguments.callee.delay(50);})(); -}else{if(Browser.Engine.webkit&&Browser.Engine.version<525){(function(){(["loaded","complete"].contains(document.readyState))?b():arguments.callee.delay(50); -})();}else{document.addEvent("DOMContentLoaded",b);}}})();var JSON=new Hash(this.JSON&&{stringify:JSON.stringify,parse:JSON.parse}).extend({$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(a){return JSON.$specialChars[a]||"\\u00"+Math.floor(a.charCodeAt()/16).toString(16)+(a.charCodeAt()%16).toString(16); -},encode:function(b){switch($type(b)){case"string":return'"'+b.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case"array":return"["+String(b.map(JSON.encode).clean())+"]"; -case"object":case"hash":var a=[];Hash.each(b,function(f,d){var c=JSON.encode(f);if(c){a.push(JSON.encode(d)+":"+c);}});return"{"+a+"}";case"number":case"boolean":return String(b); -case false:return"null";}return null;},decode:function(string,secure){if($type(string)!="string"||!string.length){return null;}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null; -}return eval("("+string+")");}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(b,a){this.key=b; -this.setOptions(a);},write:function(b){b=encodeURIComponent(b);if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; -}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; -}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); -return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this;}});Cookie.write=function(b,c,a){return new Cookie(b,a).write(c); -};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose();};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"transparent",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object; -},initialize:function(m,n){this.instance="Swiff_"+$time();this.setOptions(n);n=this.options;var b=this.id=n.id||this.instance;var a=document.id(n.container); -Swiff.CallBacks[this.instance]={};var f=n.params,h=n.vars,g=n.callBacks;var i=$extend({height:n.height,width:n.width},n.properties);var l=this;for(var d in g){Swiff.CallBacks[this.instance][d]=(function(o){return function(){return o.apply(l.object,arguments); -};})(g[d]);h[d]="Swiff.CallBacks."+this.instance+"."+d;}f.flashVars=Hash.toQueryString(h);if(Browser.Engine.trident){i.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"; -f.movie=m;}else{i.type="application/x-shockwave-flash";i.data=m;}var k=''; -}}k+="";this.object=((a)?a.empty():new Element("div")).set("html",k).firstChild;},replaces:function(a){a=document.id(a,true);a.parentNode.replaceChild(this.toElement(),a); -return this;},inject:function(a){document.id(a,true).appendChild(this.toElement());return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments)); -}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+""); -return eval(rs);};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore"},initialize:function(a){this.subject=this.subject||this; -this.setOptions(a);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();var b=this.options.wait;if(b===false){this.options.link="cancel"; -}},getTransition:function(){return function(a){return -(Math.cos(Math.PI*a)-1)/2;};},step:function(){var a=$time();if(a=(7-4*d)/11){f=c*c-Math.pow((11-6*d-11*g)/4,2); -break;}}return f;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,[a+2]); -});});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,noCache:false},initialize:function(a){this.xhr=new Browser.Request(); -this.setOptions(a);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return; -}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));this.xhr.onreadystatechange=$empty;if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML}; -this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}},isSuccess:function(){return((this.status>=200)&&(this.status<300)); -},processScripts:function(a){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(a);}return a.stripScripts(this.options.evalScripts); -},success:function(b,a){this.onSuccess(this.processScripts(b),a);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); -},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(a,b){this.headers.set(a,b); -return this;},getHeader:function(a){return $try(function(){return this.xhr.getResponseHeader(a);}.bind(this));},check:function(){if(!this.running){return true; -}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));return false;}return false;},send:function(l){if(!this.check(l)){return this; -}this.running=true;var j=$type(l);if(j=="string"||j=="element"){l={data:l};}var d=this.options;l=$extend({data:d.data,url:d.url,method:d.method},l);var h=l.data,b=String(l.url),a=l.method.toLowerCase(); -switch($type(h)){case"element":h=document.id(h).toQueryString();break;case"object":case"hash":h=Hash.toQueryString(h);}if(this.options.format){var k="format="+this.options.format; -h=(h)?k+"&"+h:k;}if(this.options.emulation&&!["get","post"].contains(a)){var i="_method="+a;h=(h)?i+"&"+h:i;a="post";}if(this.options.urlEncoded&&a=="post"){var c=(this.options.encoding)?"; charset="+this.options.encoding:""; -this.headers.set("Content-type","application/x-www-form-urlencoded"+c);}if(this.options.noCache){var g="noCache="+new Date().getTime();h=(h)?g+"&"+h:g; -}var f=b.lastIndexOf("/");if(f>-1&&(f=b.indexOf("#"))>-1){b=b.substr(0,f);}if(h&&a=="get"){b=b+(b.contains("?")?"&":"?")+h;h=null;}this.xhr.open(a.toUpperCase(),b,this.options.async); -this.xhr.onreadystatechange=this.onStateChange.bind(this);this.headers.each(function(n,m){try{this.xhr.setRequestHeader(m,n);}catch(o){this.fireEvent("exception",[m,n]); -}},this);this.fireEvent("request");this.xhr.send(h);if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this; -}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var a={}; -["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(b){a[b]=function(){var c=Array.link(arguments,{url:String.type,data:$defined}); -return this.send($extend(c,{method:b}));};});Request.implement(a);})();Element.Properties.send={set:function(a){var b=this.retrieve("send");if(b){b.cancel(); -}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},a));},get:function(a){if(a||!this.retrieve("send")){if(a||!this.retrieve("send:options")){this.set("send",a); -}this.store("send",new Request(this.retrieve("send:options")));}return this.retrieve("send");}};Element.implement({send:function(a){var b=this.get("send"); -b.send({data:this,url:a||b.options.url});return this;}});Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false},processHTML:function(c){var b=c.match(/]*>([\s\S]*?)<\/body>/i); -c=(b)?b[1]:c;var a=new Element("div");return $try(function(){var d=""+c+"",h;if(Browser.Engine.trident){h=new ActiveXObject("Microsoft.XMLDOM"); -h.async=false;h.loadXML(d);}else{h=new DOMParser().parseFromString(d,"text/xml");}d=h.getElementsByTagName("root")[0];if(!d){return null;}for(var g=0,f=d.childNodes.length; -g1){y=arguments; +}else{if(v){y=[x];}}}if(y){w={};for(var z=0;z>>0; +b>>0;b>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0; +b-1; +},test:function(a,b){return((typeOf(a)=="regexp")?a:new RegExp(""+a,b)).test(this);},trim:function(){return String(this).replace(/^\s+|\s+$/g,"");},clean:function(){return String(this).replace(/\s+/g," ").trim(); +},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase()); +});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1"); +},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); +return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1); +}return(a[c]!=null)?a[c]:"";});}});String.prototype.contains=function(a,b){return(b)?(b+this+b).indexOf(b+a+b)>-1:String(this).indexOf(a)>-1;};Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this)); +},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0);return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype; +g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this; +if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b); +},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});delete Function.prototype.bind;Function.implement({create:function(b){var a=this; +b=b||{};return function(d){var c=b.arguments;c=(c!=null)?Array.from(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c);}var e=function(){return a.apply(b.bind||null,c); +};if(b.delay){return setTimeout(e,b.delay);}if(b.periodical){return setInterval(e,b.periodical);}if(b.attempt){return Function.attempt(e);}return e();}; +},bind:function(c,b){var a=this;if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},bindWithEvent:function(c,b){var a=this; +if(b!=null){b=Array.from(b);}return function(d){return a.apply(c,(b==null)?arguments:[d].concat(b));};},run:function(a,b){return this.apply(b,Array.from(a)); +}});if(Object.create==Function.prototype.create){Object.create=null;}var $try=Function.attempt;(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={}; +for(var e=0,b=g.length;e="11"){delete m.ie;}var a=m.platform;if(a=="windows"){a="win";}m.Platform={name:a}; +m.Platform[a]=true;m.Request=(function(){var o=function(){return new XMLHttpRequest();};var n=function(){return new ActiveXObject("MSXML2.XMLHTTP");};var e=function(){return new ActiveXObject("Microsoft.XMLHTTP"); +};return Function.attempt(function(){o();return o;},function(){n();return n;},function(){e();return e;});})();m.Features.xhr=!!(m.Request);var h=(Function.attempt(function(){return navigator.plugins["Shockwave Flash"].description; +},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);m.Plugins={Flash:{version:Number(h[0]||"0."+h[1])||0,build:Number(h[2])||0}}; +m.exec=function(n){if(!n){return n;}if(g.execScript){g.execScript(n);}else{var e=i.createElement("script");e.setAttribute("type","text/javascript");e.text=n; +i.head.appendChild(e);i.head.removeChild(e);}return n;};String.implement("stripScripts",function(n){var e="";var o=this.replace(/]*>([\s\S]*?)<\/script>/gi,function(p,q){e+=q+"\n"; +return"";});if(n===true){m.exec(e);}else{if(typeOf(n)=="function"){n(e,o);}}return o;});m.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event}); +this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,n){g[e]=n;});this.Document=i.$constructor=new Type("Document",function(){}); +i.$family=Function.from("document").hide();Document.mirror(function(e,n){i[e]=n;});i.html=i.documentElement;if(!i.head){i.head=i.getElementsByTagName("head")[0]; +}if(i.execCommand){try{i.execCommand("BackgroundImageCache",false,true);}catch(f){}}if(this.attachEvent&&!this.addEventListener){var c=function(){this.detachEvent("onunload",c); +i.head=i.html=i.window=null;};this.attachEvent("onunload",c);}var k=Array.from;try{k(i.html.childNodes);}catch(f){Array.from=function(n){if(typeof n!="string"&&Type.isEnumerable(n)&&typeOf(n)!="array"){var e=n.length,o=new Array(e); +while(e--){o[e]=n[e];}return o;}return k(n);};var j=Array.prototype,l=j.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var n=j[e]; +Array[e]=function(o){return n.apply(Array.from(o),l.call(arguments,1));};});}if(m.Platform.ios){m.Platform.ipod=true;}m.Engine={};var d=function(n,e){m.Engine.name=n; +m.Engine[n+e]=true;m.Engine.version=e;};if(m.ie){m.Engine.trident=true;switch(m.version){case 6:d("trident",4);break;case 7:d("trident",5);break;case 8:d("trident",6); +}}if(m.firefox){m.Engine.gecko=true;if(m.version>=3){d("gecko",19);}else{d("gecko",18);}}if(m.safari||m.chrome){m.Engine.webkit=true;switch(m.version){case 2:d("webkit",419); +break;case 3:d("webkit",420);break;case 4:d("webkit",525);}}if(m.opera){m.Engine.presto=true;if(m.version>=9.6){d("presto",960);}else{if(m.version>=9.5){d("presto",950); +}else{d("presto",925);}}}if(m.name=="unknown"){switch((navigator.userAgent.toLowerCase().match(/(?:webkit|khtml|gecko)/)||[])[0]){case"webkit":case"khtml":m.Engine.webkit=true; +break;case"gecko":m.Engine.gecko=true;}}this.$exec=m.exec;})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window; +}c=c||g.event;if(c.$extended){return c;}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey; +var i=this.type=c.type;var h=c.target||c.srcElement;while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode); +this.key=b[d]||Object.keyOf(Event.Keys,d);if(i=="keydown"||i=="keyup"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase(); +}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; +this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY}; +if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"]; +while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation; +this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY}; +this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation(); +},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); +}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"}); +})();var Event=DOMEvent;Event.Keys={};Event.Keys=new Hash(Event.Keys);(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h}; +}var g=function(){e(this);if(g.$prototyping){return this;}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null; +return i;}.extend(this).implement(h);g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.'); +}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments); +};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone(); +break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.'); +}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h}); +return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this; +}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping; +return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j; +for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments)); +return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty(); +return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d); +if(c==$empty){return this;}this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]); +}return this;},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c); +}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this; +},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue; +}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments)); +if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})(); +(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p; +var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length; +return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o; +}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")); +function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n]; +if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,""); +}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")}); +}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"}); +}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)"); +break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break; +case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I); +};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o); +};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString; +k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML"); +};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return; +}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w); +s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false; +var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=''; +s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1); +try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=''; +s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML='';c.getElementsByClassName("b").length; +c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML='';y=(c.getElementsByClassName("a").length!=2); +}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/"); +}catch(C){}try{c.innerHTML='';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML=''; +s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML='';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0); +}catch(C){}}try{c.innerHTML='
    ';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matches||A.mozMatchesSelector||A.webkitMatchesSelector; +if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando; +s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E]; +if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E); +};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue)); +};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F); +}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode)); +}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1; +}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0; +}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E); +}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]); +if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U); +}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors; +}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors; +}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A); +}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v); +if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*"); +for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p); +}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector; +}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null; +}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0; +A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p); +}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z; +return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID; +if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator; +if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1)); +this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search; +}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk); +if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c; +}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH); +if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n}; +return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false; +}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue; +}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u]; +if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q); +}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild; +if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue; +}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q); +this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q); +}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q); +break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue; +}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild; +return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1; +},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false; +}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false; +}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1)); +},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName; +while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false; +}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false; +}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex")); +},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for"); +},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style"); +},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type"); +},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{}); +e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c); +return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c); +};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n; +return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o); +};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c); +return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this); +var Element=this.Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={}; +}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0];b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length; +f=this.length){delete this[g--];}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d; +try{d=(document.createElement("").name=="x");}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked; +}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g); +}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this; +},getWindow:function(){return this.window;},id:(function(){var e={string:function(L,K,l){L=Slick.find(l,"#"+L.replace(/(\W)/g,"\\$1"));return(L)?e.element(L,K):null; +},element:function(K,L){Slick.uidOf(K);if(!L&&!K.$family&&!(/^(?:object|embed)$/i).test(K.tagName)){var l=K.fireEvent;K._fireEvent=function(M,N){return l(M,N); +};Object.append(K,Element.Prototype);}return K;},object:function(K,L,l){if(K.toElement){return e.element(K.toElement(l),L);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l; +};return function(K,M,L){if(K&&K.$family&&K.uniqueNumber){return K;}var l=typeOf(K);return(e[l])?e[l](K,M,L||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document); +});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements); +},getElement:function(e){return document.id(Slick.find(this,e));}});var p={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(p); +}if(!document.createElement("div").contains){Element.implement(p);}Element.implement("hasChild",function(e){return this!==e&&this.contains(e);});(function(l,L,e){this.Selectors={}; +var M=this.Selectors.Pseudo=new Hash();var K=function(){for(var N in M){if(M.hasOwnProperty(N)){Slick.definePseudo(N,M[N]);delete M[N];}}};Slick.search=function(O,P,N){K(); +return l.call(this,O,P,N);};Slick.find=function(N,O){K();return L.call(this,N,O);};Slick.match=function(O,N){K();return e.call(this,O,N);};})(Slick.search,Slick.find,Slick.match); +var v=function(L,K){if(!L){return K;}L=Object.clone(Slick.parse(L));var l=L.expressions;for(var e=l.length;e--;){l[e][0].combinator=K;}return L;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(K){return this.getElement(v(K,e)); +});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(K){return this.getElements(v(K,e)); +});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,v(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,v(e,">")).getLast()); +},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1"))); +},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){var O=new Elements;if(arguments.length==1&&typeof e=="string"){return Slick.search(this.document,e,O); +}var L=Array.flatten(arguments);for(var M=0,K=L.length;M';return e.cloneNode(true).firstChild.childNodes.length!=1; +})(document.createElement("div"));var j=!!document.createElement("div").classList;var F=function(e){var l=(e||"").clean().split(" "),K={};return l.filter(function(L){if(L!==""&&!K[L]){return K[L]=L; +}});};var t=function(e){this.classList.add(e);};var g=function(e){this.classList.remove(e);};Element.implement({setProperty:function(l,K){var L=d[l.toLowerCase()]; +if(L){L(this,K);}else{var e;if(u){e=this.retrieve("$attributeWhiteList",{});}if(K==null){this.removeAttribute(l);if(u){delete e[l];}}else{this.setAttribute(l,""+K); +if(u){e[l]=true;}}}return this;},setProperties:function(e){for(var l in e){this.setProperty(l,e[l]);}return this;},getProperty:function(M){var K=n[M.toLowerCase()]; +if(K){return K(this);}if(u){var l=this.getAttributeNode(M),L=this.retrieve("$attributeWhiteList",{});if(!l){return null;}if(l.expando&&!L[M]){var N=this.outerHTML; +if(N.substr(0,N.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(M)<0){return null;}L[M]=true;}}var e=Slick.getAttribute(this,M);return(!e&&!Slick.hasAttribute(this,M))?null:e; +},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e);},removeProperty:function(e){return this.setProperty(e,null); +},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(K,l){var e=Element.Properties[K];(e&&e.set)?e.set.call(this,l):this.setProperty(K,l); +}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l);}.overloadGetter(),erase:function(l){var e=Element.Properties[l]; +(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:j?function(e){return this.classList.contains(e);}:function(e){return this.className.clean().contains(e," "); +},addClass:j?function(e){F(e).forEach(t,this);return this;}:function(e){this.className=F(e+" "+this.className).join(" ");return this;},removeClass:j?function(e){F(e).forEach(g,this); +return this;}:function(e){var l=F(this.className);F(e).forEach(l.erase,l);this.className=l.join(" ");return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e); +}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var L=this,e,N=Array.flatten(arguments),M=N.length;if(M>1){L=e=document.createDocumentFragment(); +}for(var K=0;K1){L=document.createDocumentFragment(); +for(var N=0,e=O.length;N";a=(x.childNodes.length==1);if(!a){var w="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),y=w.length; +while(y--){b.createElement(w[y]);}}x=null;h=Function.attempt(function(){var e=document.createElement("table");e.innerHTML="";return true; +});var c=document.createElement("tr"),r="";c.innerHTML=r;C=(c.innerHTML==r);c=null;if(!h||!C||!a){Element.Properties.html.set=(function(l){var e={table:[1,"","
    "],select:[1,""],tbody:[2,"","
    "],tr:[3,"","
    "]}; +e.thead=e.tfoot=e.tbody;return function(K){var L=e[this.get("tag")];if(!L&&!a){L=[0,"",""];}if(!L){return l.call(this,K);}var O=L[0],N=document.createElement("div"),M=N; +if(!a){b.appendChild(N);}N.innerHTML=[L[1],K,L[2]].flatten().join("");while(O--){M=M.firstChild;}this.empty().adopt(M.childNodes);if(!a){b.removeChild(N); +}N=null;};})(Element.Properties.html.set);}var q=document.createElement("form");q.innerHTML="";if(q.firstChild.value!="s"){Element.Properties.value={set:function(N){var l=this.get("tag"); +if(l!="select"){return this.setProperty("value",N);}var K=this.getElements("option");N=String(N);for(var L=0;L0||r==null?"visible":"hidden";};var p=function(r,v,u){var t=r.style,s=t.filter||r.getComputedStyle("filter")||"";t.filter=(v.test(s)?s.replace(v,u):s+" "+u).trim(); +if(!t.filter){t.removeAttribute("filter");}};var h=(j?function(s,r){s.style.opacity=r;}:(g?function(s,r){if(!s.currentStyle||!s.currentStyle.hasLayout){s.style.zoom=1; +}if(r==null||r==1){p(s,q,"");if(r==1&&i(s)!=1){p(s,q,"alpha(opacity=100)");}}else{p(s,q,"alpha(opacity="+(r*100).limit(0,100).round()+")");}}:b));var i=(j?function(s){var r=s.style.opacity||s.getComputedStyle("opacity"); +return(r=="")?1:r.toFloat();}:(g?function(s){var t=(s.style.filter||s.getComputedStyle("filter")),r;if(t){r=t.match(q);}return(r==null||t==null)?1:(r[1]/100); +}:function(s){var r=s.retrieve("$opacity");if(r==null){r=(s.style.visibility=="hidden"?0:1);}return r;}));var d=(l.style.cssFloat==null)?"styleFloat":"cssFloat",a={left:"0%",top:"0%",center:"50%",right:"100%",bottom:"100%"},c=(l.style.backgroundPositionX!=null); +var m=function(r,s){if(s=="backgroundPosition"){r.removeAttribute(s+"X");s+="Y";}r.removeAttribute(s);};Element.implement({getComputedStyle:function(t){if(!n&&this.currentStyle){return this.currentStyle[t.camelCase()]; +}var s=Element.getDocument(this).defaultView,r=s?s.getComputedStyle(this,null):null;return(r)?r.getPropertyValue((t==d)?"float":t.hyphenate()):"";},setStyle:function(s,r){if(s=="opacity"){if(r!=null){r=parseFloat(r); +}h(this,r);return this;}s=(s=="float"?d:s).camelCase();if(typeOf(r)!="string"){var t=(Element.Styles[s]||"@").split(" ");r=Array.from(r).map(function(v,u){if(!t[u]){return""; +}return(typeOf(v)=="number")?t[u].replace("@",Math.round(v)):v;}).join(" ");}else{if(r==String(Number(r))){r=Math.round(r);}}this.style[s]=r;if((r==""||r==null)&&e&&this.style.removeAttribute){m(this.style,s); +}return this;},getStyle:function(x){if(x=="opacity"){return i(this);}x=(x=="float"?d:x).camelCase();var r=this.style[x];if(!r||x=="zIndex"){if(Element.ShortStyles.hasOwnProperty(x)){r=[]; +for(var w in Element.ShortStyles[x]){r.push(this.getStyle(w));}return r.join(" ");}r=this.getComputedStyle(x);}if(c&&/^backgroundPosition[XY]?$/.test(x)){return r.replace(/(top|right|bottom|left)/g,function(s){return a[s]; +})||"0px";}if(!r&&x=="backgroundPosition"){return"0px 0px";}if(r){r=String(r);var u=r.match(/rgba?\([\d\s,]+\)/);if(u){r=r.replace(u[0],u[0].rgbToHex()); +}}if(!n&&!this.style[x]){if((/^(height|width)$/).test(x)&&!(/px$/.test(r))){var t=(x=="width")?["left","right"]:["top","bottom"],v=0;t.each(function(s){v+=this.getStyle("border-"+s+"-width").toInt()+this.getStyle("padding-"+s).toInt(); +},this);return this["offset"+x.capitalize()]-v+"px";}if((/^border(.+)Width|margin|padding/).test(x)&&isNaN(parseFloat(r))){return"0px";}}if(o&&/^border(Top|Right|Bottom|Left)?$/.test(x)&&/^#/.test(r)){return r.replace(/^(.+)\s(.+)\s(.+)$/,"$2 $3 $1"); +}return r;},setStyles:function(s){for(var r in s){this.setStyle(r,s[r]);}return this;},getStyles:function(){var r={};Array.flatten(arguments).each(function(s){r[s]=this.getStyle(s); +},this);return r;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundSize:"@px",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}; +Element.implement({setOpacity:function(r){h(this,r);return this;},getOpacity:function(){return i(this);}});Element.Properties.opacity={set:function(r){h(this,r); +b(this,r);},get:function(){return i(this);}};Element.Styles=new Hash(Element.Styles);Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}}; +["Top","Right","Bottom","Left"].each(function(x){var w=Element.ShortStyles;var s=Element.Styles;["margin","padding"].each(function(y){var z=y+x;w[y][z]=s[z]="@px"; +});var v="border"+x;w.border[v]=s[v]="@px @ rgb(@, @, @)";var u=v+"Width",r=v+"Style",t=v+"Color";w[v]={};w.borderWidth[u]=w[v][u]=s[u]="@px";w.borderStyle[r]=w[v][r]=s[r]="@"; +w.borderColor[t]=w[v][t]=s[t]="rgb(@, @, @)";});if(c){Element.ShortStyles.backgroundPosition={backgroundPositionX:"@",backgroundPositionY:"@"};}})();(function(){Element.Properties.events={set:function(b){this.addEvents(b); +}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{});if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this; +}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f);}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k); +}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j);};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow()); +if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]);}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events"); +if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d);if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e]; +if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e);}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this; +},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this;},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]); +}return this;}var c=this.retrieve("events");if(!c){return this;}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e); +},this);delete c[b];}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c); +}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b); +}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,hashchange:1,popstate:2,error:1,abort:1,scroll:1}; +Element.Events={mousewheel:{base:"onwheel" in document?"wheel":"onmousewheel" in document?"mousewheel":"DOMMouseScroll"}};var a=function(b){var c=b.relatedTarget; +if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c));};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2; +Element.MouseenterCheck=a;}else{Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2; +Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return b.type!="propertychange"||b.event.propertyName=="checked"; +}};}Element.Events=new Hash(Element.Events);})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2; +var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p);}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover",condition:Element.MouseenterCheck},mouseleave:{base:"mouseout",condition:Element.MouseenterCheck},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}}; +var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length; +n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns; +if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o); +}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")}); +}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n); +}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":""); +});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this; +}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(n.condition||w&&w.condition){var l=q,m=n.condition||w.condition; +q=function(C,B){return l(C,B)&&m.call(C,B,v);};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s); +}}:function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture); +},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r];if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u); +}delete p[u];q[m]=p;return j.call(this,r,w,l.capture);}var o,v;if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o); +}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o);}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)}); +})();(function(){var h=document.createElement("div"),e=document.createElement("div");h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null; +var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName);};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n); +}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight}; +},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(a(this)){return this.getWindow().getScroll(); +}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0};while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop; +n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}var n=(k(m,"position")=="static")?i:l; +while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}try{return m.offsetParent; +}catch(n){}return null;},getOffsets:function(){var t=this.getBoundingClientRect;t=t&&!Browser.Platform.ios;if(t){var n=this.getBoundingClientRect(),q=document.id(this.getDocument().documentElement),u=q.getScroll(),o=this.getScrolls(),m=(k(this,"position")=="fixed"); +return{x:n.left.toInt()+o.x+((m)?0:u.x)-q.clientLeft,y:n.top.toInt()+o.y+((m)?0:u.y)-q.clientTop};}var p=this,r={x:0,y:0};if(a(this)){return r;}while(p&&!a(p)){r.x+=p.offsetLeft; +r.y+=p.offsetTop;if(Browser.firefox){if(!c(p)){r.x+=b(p);r.y+=g(p);}var s=p.parentNode;if(s&&k(s,"overflow")!="visible"){r.x+=b(s);r.y+=g(s);}}else{if(p!=this&&Browser.safari){r.x+=b(p); +r.y+=g(p);}}p=p.offsetParent;}if(Browser.firefox&&!c(this)){r.x-=b(this);r.y-=g(this);}return r;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls(); +var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition();return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates(); +}var m=this.getPosition(o),n=this.getSize();var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")}; +},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight}; +},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body; +return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize(); +return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box"; +}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName); +}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y; +},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x; +},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y; +},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this; +this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval; +this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame-1&&e.indexOf(document.domain)==-1){return;}var h=g.rules||g.cssRules; +b(h);});return Fx.CSS.Cache[a]=d;}});Fx.CSS.Cache={};Fx.CSS.Parsers={Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true); +}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a)); +});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:Function.from(false),compute:function(b,a){return a; +},serve:function(a){return a;}}};Fx.CSS.Parsers=new Hash(Fx.CSS.Parsers);Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b); +this.parent(a);},set:function(b,a){if(arguments.length==1){a=b;b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit); +return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this;}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b); +return this.parent(a.from,a.to);}});Element.Properties.tween={set:function(a){this.get("tween").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("tween"); +if(!a){a=new Fx.Tween(this,{link:"cancel"});this.store("tween",a);}return a;}};Element.implement({tween:function(a,c,b){this.get("tween").start(a,c,b); +return this;},fade:function(d){var e=this.get("tween"),g,c=["opacity"].append(arguments),a;if(c[1]==null){c[1]="toggle";}switch(c[1]){case"in":g="start"; +c[1]=1;break;case"out":g="start";c[1]=0;break;case"show":g="set";c[1]=1;break;case"hide":g="set";c[1]=0;break;case"toggle":var b=this.retrieve("fade:flag",this.getStyle("opacity")==1); +g="start";c[1]=b?0:1;this.store("fade:flag",!b);a=true;break;default:g="start";}if(!a){this.eliminate("fade:flag");}e[g].apply(e,c);var f=c[c.length-1]; +if(g=="set"||f!=0){this.setStyle("visibility",f==0?"hidden":"visible");}else{e.chain(function(){this.element.setStyle("visibility","hidden");this.callChain(); +});}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));a=(a=="transparent")?"#fff":a; +}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original")); +b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a); +},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={}; +for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={}; +for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){this.get("morph").cancel().setOptions(a); +return this;},get:function(){var a=this.retrieve("morph");if(!a){a=new Fx.Morph(this,{link:"cancel"});this.store("morph",a);}return a;}};Element.implement({morph:function(a){this.get("morph").start(a); +return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":"); +a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];}}return a;}});Fx.Transition=function(c,b){b=Array.from(b); +var a=function(d){return c(d,b);};return Object.append(a,{easeIn:a,easeOut:function(d){return 1-c(1-d,b);},easeInOut:function(d){return(d<=0.5?c(2*d,b):(2-c(2*(1-d),b)))/2; +}});};Fx.Transitions={linear:function(a){return a;}};Fx.Transitions=new Hash(Fx.Transitions);Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]); +}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a&&a[0]||6);},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a)); +},Sine:function(a){return 1-Math.cos(a*Math.PI/2);},Back:function(b,a){a=a&&a[0]||1.618;return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;for(var d=0,c=1; +1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3); +}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2);});});(function(){var d=function(){},a=("onprogress" in new Browser.Request); +var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request(); +this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false; +this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d; +}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml); +}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e); +}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); +},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]); +},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f; +return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true; +}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this; +}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options; +o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString(); +break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e; +j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g; +}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.indexOf("?")>-1?"&":"?")+String.uniqueID(); +}if(j&&(e=="get"||e=="delete")){f+=(f.indexOf("?")>-1?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this); +}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true; +}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]); +}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this); +}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d; +if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e}; +if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e); +return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")}); +this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})(); +Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response; +c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html); +c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements); +}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript); +}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this; +},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a; +}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={}; +}JSON=new Hash({stringify:JSON.stringify,parse:JSON.parse});(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"}; +var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4);};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""); +return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON(); +}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[]; +Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj; +case"null":return"null";}return null;};JSON.secure=true;JSON.secure=false;JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null; +}if(secure==null){secure=JSON.secure;}if(secure){if(JSON.parse){return JSON.parse(string);}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure."); +}}return eval("("+string+")");};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"}); +},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure(); +}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b; +this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; +}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; +}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); +return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}}); +Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose(); +};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a); +k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b); +if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h); +c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a); +}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this); +}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document); \ No newline at end of file diff --git a/js/script.js b/js/script.js index a14f130..6d0f295 100644 --- a/js/script.js +++ b/js/script.js @@ -1,4 +1,9 @@ /*=== lazyLoading ===*/ window.addEventListener('load', function(){ var bLazy = new Blazy; -}, false); \ No newline at end of file +}, false); + +/*=== Message close ===*/ +document.getElementById('closeMessage').addEventListener('click', function(){ + document.getElementById('Message').style.display = 'none'; +}); \ No newline at end of file diff --git a/patches/firefox-lightbox-image-autorotation.patch b/patches/firefox-lightbox-image-autorotation.patch new file mode 100644 index 0000000..fd4ad0b --- /dev/null +++ b/patches/firefox-lightbox-image-autorotation.patch @@ -0,0 +1,96 @@ +diff --git a/css/mediaboxBlack.css b/css/mediaboxBlack.css +index 9213688..752c704 100644 +--- a/css/mediaboxBlack.css ++++ b/css/mediaboxBlack.css +@@ -38,9 +38,21 @@ + -khtml-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + -moz-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + box-shadow: 0px 5px 20px rgba(0,0,0,0.50); ++ width: 100%; ++ height: 100%; + } + #mbCenter img{ ++ width:auto; ++ height:auto; ++ max-width:100%; ++ max-height:95%; + border-radius: 4px; ++ image-orientation: from-image; ++ position: absolute; ++ margin: auto; ++ top: 0; ++ left: 0; ++ right: 0; + } + + #mbCenter.mbLoading { +diff --git a/css/mediaboxWhite.css b/css/mediaboxWhite.css +index de9d439..832911e 100644 +--- a/css/mediaboxWhite.css ++++ b/css/mediaboxWhite.css +@@ -38,10 +38,22 @@ + -khtml-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + -moz-box-shadow: 0px 5px 20px rgba(0,0,0,0.50); + box-shadow: 0px 5px 20px rgba(0,0,0,0.50); ++ width: 100%; ++ height: 100%; + } + + #mbCenter img{ ++ width:auto; ++ height:auto; ++ max-width:100%; ++ max-height:95%; + border-radius: 4px; ++ image-orientation: from-image; ++ position: absolute; ++ margin: auto; ++ top: 0; ++ left: 0; ++ right: 0; + } + + #mbCenter.mbLoading { +diff --git a/js/mediabox1.5.4.js b/js/mediabox1.5.4.js +index 821e599..e47a138 100644 +--- a/js/mediabox1.5.4.js ++++ b/js/mediabox1.5.4.js +@@ -815,6 +815,16 @@ var Mediabox; + if (mediaType == "img"){ + mediaWidth = preload.width; + mediaHeight = preload.height; ++ ++ // Hack jn@hz6.de: make lightbox squared to make room for the image (that will be properly rotated by the browser [at least FF since v26]) ++ if (mediaWidth > mediaHeight) { ++ mediaHeight = mediaWidth ++ } ++ ++ if (mediaWidth < mediaHeight) { ++ mediaWidth = mediaHeight ++ } ++ + if (options.imgBackground) { + media.setStyles({backgroundImage: "url("+URL+")", display: ""}); + } else { // Thanks to Dusan Medlin for fixing large 16x9 image errors in a 4x3 browser +@@ -827,11 +837,14 @@ var Mediabox; + mediaHeight = preload.height = parseInt((mediaWidth/preload.width)*mediaHeight, 10); + preload.width = mediaWidth; + } ++ + if (Browser.ie) preload = document.id(preload); + if (options.clickBlock) preload.addEvent('mousedown', function(e){ e.stop(); }).addEvent('contextmenu', function(e){ e.stop(); }); ++ + media.setStyles({backgroundImage: "none", display: ""}); + preload.inject(media); + } ++ + // mediaWidth += "px"; + // mediaHeight += "px"; + } else if (mediaType == "inline") { +@@ -973,4 +986,4 @@ Mediabox.scanPage = function() { + }); + }; + +-window.addEvents({domready: Mediabox.scanPage, resize: Mediabox.recenter}); // to recenter the overlay while scrolling, add "scroll: Mediabox.recenter" to the object +\ No newline at end of file ++window.addEvents({domready: Mediabox.scanPage, resize: Mediabox.recenter}); // to recenter the overlay while scrolling, add "scroll: Mediabox.recenter" to the object diff --git a/patches/firefox-lightbox-image-autorotation.readme b/patches/firefox-lightbox-image-autorotation.readme new file mode 100644 index 0000000..861d5f4 --- /dev/null +++ b/patches/firefox-lightbox-image-autorotation.readme @@ -0,0 +1,11 @@ +You access your MinigalNano exclusively with firefox >v26 (for example +on your home server)? + +If you apply this patch, the images in the lightbox are properly rotated +by the browser itself using the information from the EXIF data. + +To fit the images, I made the lightbox squared so there are white +stripes either on the sides or the top and the bottom. + +Jan +(jn@hz6.de) diff --git a/rss.php b/rss.php index a3083cc..545b895 100644 --- a/rss.php +++ b/rss.php @@ -1,14 +1,22 @@ $ovalue) { - $nkeys = array_keys($new, $ovalue); - foreach ($nkeys as $nindex) { - $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ? - $matrix[$oindex - 1][$nindex - 1] + 1 : 1; - if ($matrix[$oindex][$nindex] > $maxlen) { - $maxlen = $matrix[$oindex][$nindex]; - $omax = $oindex + 1 - $maxlen; - $nmax = $nindex + 1 - $maxlen; - } - } - } - if ($maxlen == 0) - return array(array('d'=>$old, 'i'=>$new)); - return array_merge( - diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), - array_slice($new, $nmax, $maxlen), - diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); -} +function diff($old, $new) { + $matrix = array(); + $maxlen = 0; + foreach ($old as $oindex => $ovalue) { + $nkeys = array_keys($new, $ovalue); + foreach ($nkeys as $nindex) { + $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ? + $matrix[$oindex - 1][$nindex - 1] + 1 : 1; + if ($matrix[$oindex][$nindex] > $maxlen) { + $maxlen = $matrix[$oindex][$nindex]; + $omax = $oindex + 1 - $maxlen; + $nmax = $nindex + 1 - $maxlen; + } + } + } + if ($maxlen == 0) { + return array(array('d' => $old, 'i' => $new)); + } -function print_array($array_to_display) -{ - echo '
    ';
    -    print_r($array_to_display);
    -    echo '
    '; + return array_merge( + diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), + array_slice($new, $nmax, $maxlen), + diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); } /*===================*/ /* Variables */ /*===================*/ -require("config-default.php"); -include("config.php"); - -$content = ""; +require "config-default.php"; +include "config.php"; $folder = "photos"; -$content = listFiles($gallery_link, $content, $folder, $SkipExts, $SkipObjects); + +$content = array(); +$content = listFiles($content, $folder, $keep_extensions, $skip_objects); +usort($content, function ($a, $b) {return filemtime($a) < filemtime($b);}); if (is_writeable(".")) { - $to_store = ""; - $old_files_list = "db_old_files"; //list of files in ./photos - $db_feed_source = "db_feed_source"; - $db_rss_timestamp = "db_rss_timestamp"; + $to_store = ""; + $old_files_list = "db_old_files"; //list of files in ./photos + $db_feed_source = "db_feed_source"; + $db_rss_timestamp = "db_rss_timestamp"; - // Init files - if (!file_exists($old_files_list)) { - file_put_contents($old_files_list, ""); - } - if (!file_exists($db_feed_source)) { - file_put_contents($db_feed_source, ""); - } - if (!file_exists($db_rss_timestamp)) { - file_put_contents($db_rss_timestamp, ""); - } + // Init files + if (!file_exists($old_files_list)) { + file_put_contents($old_files_list, ""); + } + if (!file_exists($db_feed_source)) { + file_put_contents($db_feed_source, ""); + } + if (!file_exists($db_rss_timestamp)) { + file_put_contents($db_rss_timestamp, ""); + } - /*===================*/ - /* Computing */ - /*===================*/ - #Todo : ajouter une condition : dois-je regénérer le flux ou utiliser les anciens fichiers ? - $temp = file_get_contents($db_feed_source); - $last_rss_gen = file_get_contents($db_rss_timestamp); - $current_time = time(); - // If the RSS generation is already launched, don't do a second generation at the same time - if (($current_time - $last_rss_gen) > $rss_refresh_interval && file_exists("rss.locker") == false) { - file_put_contents("rss.locker", ""); - file_put_contents($db_rss_timestamp, time()); - // Load the list from files. - $old_files_list_content = explode("\n", file_get_contents($old_files_list)); - $new_files_list_content = explode("\n", $content); #debug - // Generate and stock new elements - $differences = diff($old_files_list_content, $new_files_list_content); - for ($i=0; $i < count($differences); $i++) { - if (is_array($differences[$i])) { - for ($j=0; $j < count($differences[$i]["i"]); $j++) { - if (strlen($differences[$i]["i"][$j]) > 2) { - $to_store .= $differences[$i]["i"][$j] . "\n"; - } - } - } - } - // Add new elements at the top of the feed's source - $temp = $to_store . $temp; - file_put_contents($db_feed_source, $temp); - // Store the current file list for the next generation - file_put_contents($old_files_list, $content); - unlink("rss.locker"); - } - $content = $temp; + /*===================*/ + /* Computing */ + /*===================*/ + #Todo : ajouter une condition : dois-je regénérer le flux ou utiliser les anciens fichiers ? + $temp = file_get_contents($db_feed_source); + $last_rss_gen = file_get_contents($db_rss_timestamp); + $current_time = time(); + // If the RSS generation is already launched, don't do a second generation at the same time + if (($current_time - $last_rss_gen) > $rss_refresh_interval && file_exists("rss.locker") == false) { + file_put_contents("rss.locker", ""); + file_put_contents($db_rss_timestamp, time()); + // Load the list from files. + $old_files_list_content = explode("\n", file_get_contents($old_files_list)); + $new_files_list_content = $content; #debug + // Generate and stock new elements + $differences = diff($old_files_list_content, $new_files_list_content); + for ($i = 0; $i < count($differences); $i++) { + if (is_array($differences[$i])) { + for ($j = 0; $j < count($differences[$i]["i"]); $j++) { + if (strlen($differences[$i]["i"][$j]) > 2) { + $to_store .= $differences[$i]["i"][$j] . "\n"; + } + } + } + } + // Add new elements at the top of the feed's source + $temp = $to_store . $temp; + file_put_contents($db_feed_source, $temp); + // Store the current file list for the next generation + file_put_contents($old_files_list, join("/n", $content)); + unlink("rss.locker"); + } + $content = explode("\n", $temp); } /*===================*/ /* XML Gen */ /*===================*/ -$temp = explode("\n", $content); +header('Content-Type: text/xml'); +echo "\n"; echo "\n"; echo "$title"; echo "$gallery_link"; echo "$description\n"; -for ($i=0; $i < $nb_items_rss && $i < count($temp); $i++) { - if (empty($temp[$i])) - continue; - echo "\n"; - echo " " . basename($temp[$i]) . "\n"; - echo " ". $temp[$i] . "\n"; - echo " ]]>\n"; - echo "\n"; +for ($i = 0; $i < $nb_items_rss && $i < count($content); $i++) { + if (empty($content[$i])) { + continue; + } + + $link = $gallery_link . '/' . str_replace(' ', '%20', $content[$i]); + echo "\n"; + echo " " . basename($link) . "\n"; + echo " " . $link . "\n"; + echo " " . $link . "\n"; + echo " ]]>\n"; + echo " " . date("D, j M Y H:i:s O", filemtime($content[$i])) . ""; + echo "\n"; } echo "\n"; diff --git a/system_check.php b/system_check.php index 640ae28..796ff99 100644 --- a/system_check.php +++ b/system_check.php @@ -1,9 +1,28 @@ @@ -59,41 +78,72 @@ display: inline-table; background-color: #eaf1ea; padding: 2px; - } + } -

    MiniBoardNano system check

    +

    MiniGal Nano system check

    PHP Version
    -
    ')) echo 'middle-yes'; else echo 'middle-no' ?>"> - +
    ')) { + echo 'middle-yes'; +} else { + echo 'middle-no'; +} +?>"> +
    - PHP scripting language version 4.0 or greater is needed + PHP scripting language version 4.0 or greater is needed.

    GD library support
    -
    "> - +
    "> +
    - GD image manipulation library is used to create thumbnails. Bundled since PHP 4.3 + GD image manipulation library is used to create thumbnails. Bundled since PHP 4.3.

    EXIF support
    -
    "> - +
    "> +
    - Ability to extract and display EXIF information. The script will work without it, but not display image information + Ability to extract and display EXIF information. The script will work without it, but not display image information. +
    +
    + +
    + Thumbnails caching +
    +
    "> + +
    +
    + You should let php create and use the 'thumbs" directory. MiniGal will be much faster.

    @@ -101,15 +151,15 @@ PHP memory limit
    - +
    - Memory is needed to create thumbnails. Bigger images uses more memory + Memory is needed to create thumbnails. Bigger images uses more memory.
    diff --git a/templates/board.html b/templates/board.html index a9de4ac..d6ad430 100644 --- a/templates/board.html +++ b/templates/board.html @@ -14,6 +14,7 @@ font-size: 62.5%; } body { + position: relative; margin: 0; padding: 0; width: 100%; @@ -28,23 +29,38 @@ text-decoration: none; } h1 { - margin: 20px 0 0 0; + margin: 0; + padding: 1.5rem 0; font-family: Georgia, Lucida, serif; font-style: italic; } h1 a{ - color: #CC2027; + color: #CC2027; } body > header{ background-color:#FFF; padding: 1px 0 0 0; margin-bottom: 1rem; } - #container, #innerheader{ + #container, + #innerheader, + .Message { max-width: <% gallery_width %>; margin: 0px auto; } - header aside{ + + .Message { + background-color: #2ecc71; + border-radius: 2px; + } + .Message > div { + padding: 1rem; + } + .closeMessage { + float: right; + } + + .Comment { padding: 2rem 0; } img { @@ -52,11 +68,27 @@ } nav { font-size: 1.3em; - padding-top: 2rem; + } + .NavWrapper { + padding: 1rem 0; } body > nav { text-align: center; } + + .Empty, + .EmptyAdvice { + text-align: center; + text-shadow:0 1px 0 #FFF + } + .Empty { + font-size: 10rem; + } + .EmptyAdvice { + font-size: 2rem; + font-style: italic; + } + #folder_comment { margin-bottom:10px; @@ -91,7 +123,7 @@ } #gallery li img{ width: 100%; - } + } #gallery em { background: #FFF; text-align: center; @@ -107,7 +139,7 @@ } footer { padding-top: 2rem; - margin: 25px 0px; + margin-bottom: 25px; text-align: center; } footer a { @@ -163,21 +195,19 @@ } } - - - - - +
    + <% messages %> +
    + +