diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100755 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 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 General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is 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. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +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. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + 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 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. Use with the GNU Affero General Public License. + + 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 Affero 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 special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 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 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 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 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + 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 GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/admin/admin-init.php b/admin/admin-init.php new file mode 100755 index 0000000..e91ba99 --- /dev/null +++ b/admin/admin-init.php @@ -0,0 +1,322 @@ + +plugin_name . '_admin_pages', array( $this, 'add_admin_pages' ) ); + + $menu_hook = 'admin_menu'; + add_action( $menu_hook, array( $this, 'register_admin_menu' ) ); + + add_action( 'plugins_loaded', array( $this, 'get_all_settings' ), 8 ); + } + + /*-----------------------------------------------------------------------------------*/ + /* set_default_settings() */ + /* Called when plugin just installed */ + /*-----------------------------------------------------------------------------------*/ + public function set_default_settings() { + + do_action( $this->plugin_name . '_set_default_settings' ); + } + + /*-----------------------------------------------------------------------------------*/ + /* get_all_settings() */ + /* Get all settings when plugin is loaded */ + /*-----------------------------------------------------------------------------------*/ + public function get_all_settings() { + + do_action( $this->plugin_name . '_get_all_settings' ); + } + + /** + * add_admin_menu() + * Add the Admin menu + * ============================================= + * check add_menu_page() function at http://codex.wordpress.org/Function_Reference/add_menu_page to know the parameters need to parse for type is menu + * check add_submenu_page() function at http://codex.wordpress.org/Function_Reference/add_submenu_page to know the parameters need to parse for type is submenu + * array ( + * array ( + * 'type' => 'menu' : (required) add it as main menu on left sidebar of Dashboard + * 'page_title' => 'Quotes & Orders Mode' : (required) The text to be displayed in the title tags of the page when the menu is selected + * 'menu_title' => 'Quotes & Orders Mode' : (required) The text to be displayed in the title tags of the page when the menu is selected + * 'capability' => 'manage_options' : (required) The capability required for this menu to be displayed to the user. + * View instruction at http://codex.wordpress.org/Roles_and_Capabilities + * 'menu_slug' => 'quotes-orders-mode' : (required) The slug name to refer to this menu by. + * 'function' => 'my_function_name' : (required) The function that displays the page content for the menu page. + * 'icon_url' => 'http://my_icon.png' : (optional) The url to the icon to be used for this menu. + * 'position' => 50 : (optional) The position in the menu order this menu should appear. + * By default, if this parameter is omitted, the menu will appear at the bottom of the menu structure. + * 'admin_url' => 'admin.php' : (required) The admin url : admin.php , options-general.php + * 'callback_function'=> 'my_callback_function': (optional) The callback function is called when this page does not have tab + * 'script_function' => 'my_script_function' : (optional) The script function that only include for this page. + * 'view_doc' => '' : (optional) Support html. The text show on the heading + * ), + * array ( + * 'type' => 'submenu' : (required) add it as sub menu on left sidebar of Dashboard + * 'parent_slug' => 'quotes-orders-mode' : (required) The slug name for the parent menu. + * 'page_title' => 'Quotes & Orders Mode' : (required) The text to be displayed in the title tags of the page when the menu is selected + * 'menu_title' => 'Quotes & Orders Mode' : (required) The text to be displayed in the title tags of the page when the menu is selected + * 'capability' => 'manage_options' : (required) The capability required for this menu to be displayed to the user. + * View instruction at http://codex.wordpress.org/Roles_and_Capabilities + * 'menu_slug' => 'quotes-orders-mode' : (required) The slug name to refer to this menu by. + * 'function' => 'my_function_name' : (required) The function that displays the page content for the menu page. + * 'admin_url' => 'admin.php' : (required) The admin url : admin.php , options-general.php + * 'callback_function'=> 'my_callback_function': (optional) The callback function is called when this page does not have tab + * 'script_function' => 'my_script_function' : (optional) The script function that only include for this page. + * 'view_doc' => '' : (optional) Support html. The text show on the heading + * ) + * ) + * + */ + public function add_admin_menu() { + + $this->admin_menu = apply_filters( $this->plugin_name . '_add_admin_menu', $this->admin_menu ); + } + + /*-----------------------------------------------------------------------------------*/ + /* register_admin_menu() */ + /* Setup the Admin menu in WordPress + /*-----------------------------------------------------------------------------------*/ + public function register_admin_menu() { + + if ( is_array( $this->admin_menu ) && count( $this->admin_menu ) > 0 ) { + foreach ( $this->admin_menu as $menu_item ) { + if ( ! isset( $menu_item['type'] ) || trim( $menu_item['type'] ) == '' ) continue; + + switch( $menu_item['type'] ) { + + case 'menu': + + $menu_page = add_menu_page( esc_html( $menu_item['page_title'] ), $menu_item['menu_title'], $menu_item['capability'], $menu_item['menu_slug'] , $menu_item['function'], $menu_item['icon_url'], $menu_item['position'] ); + + if ( isset( $menu_item['script_function'] ) && trim( $menu_item['script_function'] ) != '' ) + add_action( "admin_print_scripts-" . $menu_page, $menu_item['script_function'] ); + + break; + + case 'submenu': + + $submenu_page = add_submenu_page( $menu_item['parent_slug'] , esc_html( $menu_item['page_title'] ), $menu_item['menu_title'], $menu_item['capability'], $menu_item['menu_slug'] , $menu_item['function'] ); + + if ( isset( $menu_item['script_function'] ) && trim( $menu_item['script_function'] ) != '' ) + add_action( "admin_print_scripts-" . $submenu_page, $menu_item['script_function'] ); + + break; + } + } + + } + + } + + /*-----------------------------------------------------------------------------------*/ + /* add_admin_pages() */ + /* Get list page for Admin UI can include scripts and styles at header and footer + /*-----------------------------------------------------------------------------------*/ + public function add_admin_pages( $admin_pages ) { + + if ( ! is_array( $admin_pages ) ) $admin_pages = array(); + + if ( is_array( $this->admin_menu ) && count( $this->admin_menu ) > 0 ) { + foreach ( $this->admin_menu as $menu_item ) { + if ( ! isset( $menu_item['type'] ) || trim( $menu_item['type'] ) == '' ) continue; + + switch( $menu_item['type'] ) { + + case 'menu': + case 'submenu': + if ( ! in_array( $menu_item['menu_slug'], $admin_pages ) ) + $admin_pages[] = $menu_item['menu_slug']; + break; + } + } + + } + + return $admin_pages; + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_settings_page() */ + /* Show Settings Page Layout + /*-----------------------------------------------------------------------------------*/ + public function admin_settings_page( $page_data = array() ) { + global $current_tab; + + if ( ! is_array( $page_data ) || count( $page_data ) < 1 ) return; + + $current_page = $page_data['menu_slug']; + + do_action( $this->plugin_name . '_page_start' ); + do_action( $this->plugin_name . '-' . $current_page . '_page_start' ); + + ?> +
+

+ plugin_name . '-' . $current_page . '_settings_tabs_array', array() ); + + if ( ! is_array( $tabs ) || count( $tabs ) < 1 ) { + ?> +

+ +

+
+ +
+ + +
+ plugin_name . '-' . $current_page . '_settings_tabs_' . $current_tab ); + } + ?> +
+ +
+
+ plugin_name . '_page_end' ); + do_action( $this->plugin_name . '-' . $current_page . '_page_end' ); + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_settings_tab() */ + /* Show Settings Tab Layout + /*-----------------------------------------------------------------------------------*/ + public function admin_settings_tab( $current_page = '', $tab_data = array() ) { + global $current_subtab; + + if ( ! is_array( $tab_data ) || count( $tab_data ) < 1 ) return; + + $current_tab = $tab_data['name']; + + do_action( $this->plugin_name . '-' . $current_page . '_tab_start' ); + do_action( $this->plugin_name . '-' . $current_tab . '_tab_start' ); + + $subtabs = apply_filters( $this->plugin_name . '-' . $current_tab . '_settings_subtabs_array', array() ); + + if ( is_array( $subtabs ) && count( $subtabs ) > 0 ) { + + ?> +
+
    + ' . $separate_text . '' . $subtab['label'] . '' . "\n"; + + $separate_text = ' | '; + } + + do_action( $this->plugin_name . '-' . $current_tab . '_settings_subtabs' ); + ?> +
+
+ +
+ +
+ plugin_name . '-' . $current_tab . '_settings_subtabs_content' ); + ?> + +
+ plugin_name . '-' . $current_page . '_tab_end' ); + do_action( $this->plugin_name . '-' . $current_tab . '_tab_end' ); + } +} + +global $wp_pvc_admin_init; +$wp_pvc_admin_init = new WP_PVC_Admin_Init(); + +?> diff --git a/admin/admin-interface.php b/admin/admin-interface.php new file mode 100755 index 0000000..494e79d --- /dev/null +++ b/admin/admin-interface.php @@ -0,0 +1,3704 @@ + +admin_includes(); + + add_action( 'init', array( $this, 'init_scripts' ) ); + add_action( 'init', array( $this, 'init_styles' ) ); + + // AJAX hide yellow message dontshow + add_action( 'wp_ajax_'.$this->plugin_name.'_a3_admin_ui_event', array( $this, 'a3_admin_ui_event' ) ); + add_action( 'wp_ajax_nopriv_'.$this->plugin_name.'_a3_admin_ui_event', array( $this, 'a3_admin_ui_event' ) ); + + } + + /*-----------------------------------------------------------------------------------*/ + /* Init scripts */ + /*-----------------------------------------------------------------------------------*/ + public function init_scripts() { + $admin_pages = $this->admin_pages(); + + if ( is_admin() && isset( $_REQUEST['page'] ) && in_array( $_REQUEST['page'], $admin_pages ) ) { + add_action( 'admin_enqueue_scripts', array( $this, 'admin_script_load' ) ); + add_action( 'admin_enqueue_scripts', array( $this, 'register_modal_scripts' ), 0 ); + do_action( $this->plugin_name . '_init_scripts' ); + + add_action( 'admin_print_scripts', array( $this, 'admin_localize_printed_scripts' ), 5 ); + add_action( 'admin_print_footer_scripts', array( $this, 'admin_localize_printed_scripts' ), 5 ); + } + } + + /*-----------------------------------------------------------------------------------*/ + /* Init styles */ + /*-----------------------------------------------------------------------------------*/ + public function init_styles() { + $admin_pages = $this->admin_pages(); + + if ( is_admin() && isset( $_REQUEST['page'] ) && in_array( $_REQUEST['page'], $admin_pages ) ) { + add_action( 'admin_enqueue_scripts', array( $this, 'register_fontawesome_style' ), 0 ); + add_action( 'admin_enqueue_scripts', array( $this, 'admin_css_load' ) ); + do_action( $this->plugin_name . '_init_styles' ); + } + } + + public function register_fontawesome_style() { + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; + wp_register_style( 'font-awesome-styles', $this->admin_plugin_url() . '/assets/css/font-awesome' . $suffix . '.css', array(), '4.5.0', 'all' ); + } + + public function register_modal_scripts() { + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; + wp_register_style( 'bootstrap-modal', $this->admin_plugin_url() . '/assets/css/modal' . $suffix . '.css', array(), '4.0.0', 'all' ); + wp_register_script( 'bootstrap-util', $this->admin_plugin_url() . '/assets/js/bootstrap/util' . $suffix . '.js', array( 'jquery' ), '4.0.0', false ); + wp_register_script( 'bootstrap-modal', $this->admin_plugin_url() . '/assets/js/bootstrap/modal' . $suffix . '.js', array( 'jquery', 'bootstrap-util' ), '4.0.0', false ); + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_script_load */ + /*-----------------------------------------------------------------------------------*/ + + public function admin_script_load() { + + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; + $rtl = is_rtl() ? '.rtl' : ''; + + wp_register_script( 'chosen', $this->admin_plugin_url() . '/assets/js/chosen/chosen.jquery' . $suffix . '.js', array( 'jquery' ), true, false ); + wp_register_script( 'a3rev-chosen-new', $this->admin_plugin_url() . '/assets/js/chosen/chosen.jquery' . $suffix . '.js', array( 'jquery' ), true, false ); + wp_register_script( 'a3rev-style-checkboxes', $this->admin_plugin_url() . '/assets/js/iphone-style-checkboxes' . $rtl . '.js', array('jquery'), true, false ); + wp_register_script( 'jquery-ui-slider-rtl', $this->admin_plugin_url() . '/assets/js/ui-slider/jquery.ui.slider.rtl' . $suffix . '.js', array('jquery'), true, true ); + + wp_register_script( 'a3rev-admin-ui-script', $this->admin_plugin_url() . '/assets/js/admin-ui-script.js', array('jquery'), true, true ); + wp_register_script( 'a3rev-typography-preview', $this->admin_plugin_url() . '/assets/js/a3rev-typography-preview.js', array('jquery'), false, true ); + wp_register_script( 'a3rev-settings-preview', $this->admin_plugin_url() . '/assets/js/a3rev-settings-preview.js', array('jquery'), false, true ); + wp_register_script( 'jquery-tiptip', $this->admin_plugin_url() . '/assets/js/tipTip/jquery.tipTip' . $suffix . '.js', array( 'jquery' ), true, true ); + wp_register_script( 'a3rev-metabox-ui', $this->admin_plugin_url() . '/assets/js/data-meta-boxes.js', array( 'jquery' ), true, true ); + wp_register_script( 'jquery-rwd-image-maps', $this->admin_plugin_url() . '/assets/js/rwdImageMaps/jquery.rwdImageMaps.min.js', array( 'jquery' ), true, true ); + + wp_enqueue_script( 'jquery' ); + wp_enqueue_script( 'wp-color-picker' ); + if ( is_rtl() ) { + wp_enqueue_script( 'jquery-ui-slider-rtl' ); + } else { + wp_enqueue_script( 'jquery-ui-slider' ); + } + wp_enqueue_script( 'chosen' ); + wp_enqueue_script( 'a3rev-chosen-new' ); + wp_enqueue_script( 'a3rev-style-checkboxes' ); + wp_enqueue_script( 'a3rev-admin-ui-script' ); + wp_enqueue_script( 'a3rev-typography-preview' ); + wp_enqueue_script( 'a3rev-settings-preview' ); + wp_enqueue_script( 'jquery-tiptip' ); + wp_enqueue_script( 'a3rev-metabox-ui' ); + + } // End admin_script_load() + + /*-----------------------------------------------------------------------------------*/ + /* admin_localize_printed_scripts: Localize scripts only when enqueued */ + /*-----------------------------------------------------------------------------------*/ + + public function admin_localize_printed_scripts() { + $rtl = is_rtl() ? 1 : 0; + + if ( wp_script_is( 'a3rev-admin-ui-script' ) ) { + wp_localize_script( 'a3rev-admin-ui-script', 'a3_admin_ui_script_params', apply_filters( 'a3_admin_ui_script_params', array( + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'plugin' => $this->plugin_name, + 'security' => wp_create_nonce( $this->plugin_name . '_a3_admin_ui_event' ), + 'rtl' => $rtl, + ) ) ); + } + + } // End admin_localize_printed_scripts() + + public function a3_admin_ui_event() { + check_ajax_referer( $this->plugin_name. '_a3_admin_ui_event', 'security' ); + if ( isset( $_REQUEST['type'] ) ) { + switch ( trim( $_REQUEST['type'] ) ) { + case 'open_close_panel_box': + $form_key = $_REQUEST['form_key']; + $box_id = $_REQUEST['box_id']; + $is_open = $_REQUEST['is_open']; + + $user_id = get_current_user_id(); + $opened_box = get_user_meta( $user_id, $this->plugin_name . '-' . trim( $form_key ), true ); + if ( empty( $opened_box ) || ! is_array( $opened_box ) ) { + $opened_box = array(); + } + if ( 1 == $is_open && ! in_array( $box_id, $opened_box ) ) { + $opened_box[] = $box_id; + } elseif ( 0 == $is_open && in_array( $box_id, $opened_box ) ) { + $opened_box = array_diff( $opened_box, array( $box_id ) ); + } + update_user_meta( $user_id, $this->plugin_name . '-' . trim( $form_key ), $opened_box ); + break; + + case 'check_new_version': + $transient_name = $_REQUEST['transient_name']; + delete_transient( $transient_name ); + + $new_version = ''; + if ( class_exists( 'WP_PVC_Upgrade' ) ) { + $new_version = WP_PVC_Upgrade::get_version_info(); + } + + $version_message = $this->get_version_message(); + $has_new_version = 1; + if ( '' == trim( $version_message ) ) { + $version_message = __( 'Great! You have the latest version installed.', 'page-views-count' ); + $has_new_version = 0; + } else { + delete_option('pvc_clean_on_deletion'); + if ( is_array( $new_version ) && 'valid' == $new_version['is_valid_key'] ) { + $current_update_plugins = get_site_transient( 'update_plugins' ); + if ( isset( $current_update_plugins->response ) ) { + $plugin_name = A3_PVC_PLUGIN_NAME; + if ( empty( $current_update_plugins->response[$plugin_name] ) ) { + $current_update_plugins->response[$plugin_name] = new stdClass(); + } + $current_update_plugins->response[$plugin_name]->url = "http://www.a3rev.com"; + $current_update_plugins->response[$plugin_name]->slug = get_option( $this->plugin_option_key ); + $current_update_plugins->response[$plugin_name]->package = $new_version["url"]; + $current_update_plugins->response[$plugin_name]->new_version = $new_version['version']; + $current_update_plugins->response[$plugin_name]->upgrade_notice = $new_version['upgrade_notice']; + $current_update_plugins->response[$plugin_name]->id = "0"; + set_site_transient( 'update_plugins', $current_update_plugins ); + } + } + } + + $response_data = array( + 'has_new_version' => $has_new_version, + 'version_message' => $version_message, + ); + echo json_encode( $response_data ); + break; + } + + } + die(); + } + + + /*-----------------------------------------------------------------------------------*/ + /* admin_css_load */ + /*-----------------------------------------------------------------------------------*/ + + public function admin_css_load () { + global $wp_version; + + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; + + wp_enqueue_style( 'a3rev-admin-ui-style', $this->admin_plugin_url() . '/assets/css/admin-ui-style' . $suffix . '.css' ); + + if ( version_compare( $wp_version, '3.8', '>=' ) ) { + wp_enqueue_style( 'a3rev-admin-flat-ui-style', $this->admin_plugin_url() . '/assets/css/admin-flat-ui-style' . $suffix . '.css' ); + } + wp_enqueue_style( 'wp-color-picker' ); + wp_enqueue_style( 'a3rev-chosen-new-style', $this->admin_plugin_url() . '/assets/js/chosen/chosen' . $suffix . '.css' ); + wp_enqueue_style( 'a3rev-tiptip-style', $this->admin_plugin_url() . '/assets/js/tipTip/tipTip.css' ); + wp_enqueue_style( 'a3rev-metabox-ui-style', $this->admin_plugin_url() . '/assets/css/a3_admin_metabox.css' ); + + if ( is_rtl() ) { + wp_enqueue_style( 'a3rev-admin-ui-style-rtl', $this->admin_plugin_url() . '/assets/css/admin-ui-style.rtl' . $suffix . '.css' ); + wp_enqueue_style( 'a3rev-metabox-ui-style-rtl', $this->admin_plugin_url() . '/assets/css/a3_admin_metabox.rtl' . $suffix . '.css' ); + } + + } // End admin_css_load() + + /*-----------------------------------------------------------------------------------*/ + /* get_success_message */ + /*-----------------------------------------------------------------------------------*/ + public function get_success_message( $message = '' ) { + if ( trim( $message ) == '' ) $message = __( 'Settings successfully saved.' , 'page-views-count' ); + return '

' . $message . '

'; + } + + /*-----------------------------------------------------------------------------------*/ + /* get_error_message */ + /*-----------------------------------------------------------------------------------*/ + public function get_error_message( $message = '' ) { + if ( trim( $message ) == '' ) $message = __( 'Error: Settings can not save.' , 'page-views-count' ); + return '

' . $message . '

'; + } + + /*-----------------------------------------------------------------------------------*/ + /* get_reset_message */ + /*-----------------------------------------------------------------------------------*/ + public function get_reset_message( $message = '' ) { + if ( trim( $message ) == '' ) $message = __( 'Settings successfully reseted.' , 'page-views-count' ); + return '

' . $message . '

'; + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_includes */ + /* Include required core files used in admin UI. + /*-----------------------------------------------------------------------------------*/ + public function admin_includes() { + // Includes Font Face Lib + include_once( 'includes/fonts_face.php' ); + + // Includes Uploader Lib + include_once( 'includes/uploader/class-uploader.php' ); + } + + /*-----------------------------------------------------------------------------------*/ + /* Get Font Weights */ + /*-----------------------------------------------------------------------------------*/ + public function get_font_weights() { + $font_weights = array ( + '300' => __( 'Thin', 'page-views-count' ), + '300 italic' => __( 'Thin/Italic', 'page-views-count' ), + 'normal' => __( 'Normal', 'page-views-count' ), + 'italic' => __( 'Italic', 'page-views-count' ), + 'bold' => __( 'Bold', 'page-views-count' ), + 'bold italic' => __( 'Bold/Italic', 'page-views-count' ), + ); + return apply_filters( $this->plugin_name . '_font_weights', $font_weights ); + } + + /*-----------------------------------------------------------------------------------*/ + /* Get Border Styles */ + /*-----------------------------------------------------------------------------------*/ + public function get_border_styles() { + $border_styles = array ( + 'solid' => __( 'Solid', 'page-views-count' ), + 'double' => __( 'Double', 'page-views-count' ), + 'dashed' => __( 'Dashed', 'page-views-count' ), + 'dotted' => __( 'Dotted', 'page-views-count' ), + 'groove' => __( 'Groove', 'page-views-count' ), + 'ridge' => __( 'Ridge', 'page-views-count' ), + 'inset' => __( 'Inset', 'page-views-count' ), + 'outset' => __( 'Outset', 'page-views-count' ), + ); + return apply_filters( $this->plugin_name . '_border_styles', $border_styles ); + } + + /*-----------------------------------------------------------------------------------*/ + /* Get Settings Default Function - get_settings_default */ + /* Just called for when option values is an array and it's in single option name for all settings + /*-----------------------------------------------------------------------------------*/ + + public function get_settings_default( $options, $option_name = '' ) { + + $default_settings = array(); + + if ( !is_array( $options ) || count( $options ) < 1 ) return $default_settings; + + foreach ( $options as $value ) { + if ( ! isset( $value['type'] ) ) continue; + if ( in_array( $value['type'], array( 'row', 'column', 'heading', 'ajax_submit', 'ajax_multi_submit' ) ) ) continue; + if ( ! isset( $value['id'] ) || trim( $value['id'] ) == '' ) continue; + if ( ! isset( $value['default'] ) ) $value['default'] = ''; + + switch ( $value['type'] ) { + + // Array textfields + case 'array_textfields' : + if ( !isset( $value['ids'] ) || !is_array( $value['ids'] ) || count( $value['ids'] ) < 1 ) break; + + foreach ( $value['ids'] as $text_field ) { + if ( ! isset( $text_field['id'] ) || trim( $text_field['id'] ) == '' ) continue; + if ( ! isset( $text_field['default'] ) ) $text_field['default'] = ''; + + // Do not include when it's separate option + if ( isset( $text_field['separate_option'] ) && $text_field['separate_option'] != false ) continue; + + // Remove [, ] characters from id argument + if ( strstr( $text_field['id'], '[' ) ) { + parse_str( esc_attr( $text_field['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + } else { + $id_attribute = esc_attr( $text_field['id'] ); + } + + $default_settings[$id_attribute] = $text_field['default']; + } + + break; + + default : + // Do not include when it's separate option + if ( isset( $value['separate_option'] ) && $value['separate_option'] != false ) continue; + + // Remove [, ] characters from id argument + if ( strstr( $value['id'], '[' ) ) { + parse_str( esc_attr( $value['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + } else { + $id_attribute = esc_attr( $value['id'] ); + } + + // Backward compatibility to old settings don't have line_height option for typography + if ( 'typography' == $value['type'] && ! isset( $value['default']['line_height'] ) ) { + $value['default']['line_height'] = '1.4em'; + } + + $default_settings[$id_attribute] = $value['default']; + + break; + } + } + + if ( trim( $option_name ) != '' ) $default_settings = apply_filters( $this->plugin_name . '_' . $option_name . '_default_settings' , $default_settings ); + if ( ! is_array( $default_settings ) ) $default_settings = array(); + + return $default_settings; + + } + + /*-----------------------------------------------------------------------------------*/ + /* Get Settings Function - get_settings */ + /*-----------------------------------------------------------------------------------*/ + + public function get_settings( $options, $option_name = '' ) { + + if ( !is_array( $options ) || count( $options ) < 1 ) return; + + $new_settings = array(); $new_single_setting = ''; // :) + + // Get settings for option values is an array and it's in single option name for all settings + if ( trim( $option_name ) != '' ) { + global ${$option_name}; + + $default_settings = $this->get_settings_default( $options, $option_name ); + + $current_settings = get_option( $option_name ); + if ( ! is_array( $current_settings ) ) $current_settings = array(); + $current_settings = array_merge( $default_settings, $current_settings ); + + $current_settings = array_map( array( $this, 'admin_stripslashes' ), $current_settings ); + $current_settings = apply_filters( $this->plugin_name . '_' . $option_name . '_get_settings' , $current_settings ); + + $$option_name = $current_settings; + + } + + // Get settings for option value is stored as a record or it's spearate option + foreach ( $options as $value ) { + if ( ! isset( $value['type'] ) ) continue; + if ( in_array( $value['type'], array( 'row', 'column', 'heading', 'ajax_submit', 'ajax_multi_submit' ) ) ) continue; + if ( ! isset( $value['id'] ) || trim( $value['id'] ) == '' ) continue; + if ( ! isset( $value['default'] ) ) $value['default'] = ''; + + // For way it has an option name + if ( ! isset( $value['separate_option'] ) ) $value['separate_option'] = false; + + // Remove [, ] characters from id argument + if ( strstr( $value['id'], '[' ) ) { + parse_str( esc_attr( $value['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + } else { + $id_attribute = esc_attr( $value['id'] ); + } + + if ( trim( $option_name ) == '' || $value['separate_option'] != false ) { + global ${$id_attribute}; + + $current_setting = get_option( $id_attribute, $value['default'] ); + + switch ( $value['type'] ) { + + // Array textfields + case 'wp_editor' : + if ( is_array( $current_setting ) ) + $current_setting = array_map( array( $this, 'stripslashes' ), $current_setting ); + elseif ( ! is_null( $current_setting ) ) + $current_setting = stripslashes( $current_setting ); + break; + + default: + + if ( is_array( $current_setting ) ) + $current_setting = array_map( array( $this, 'admin_stripslashes' ), $current_setting ); + elseif ( ! is_null( $current_setting ) ) + $current_setting = esc_attr( stripslashes( $current_setting ) ); + + // Backward compatibility to old settings don't have line_height option for typography + if ( 'typography' == $value['type'] && ! isset( $current_setting['line_height'] ) ) { + $current_setting['line_height'] = '1.4em'; + } + + break; + } + + $current_setting = apply_filters( $this->plugin_name . '_' . $id_attribute . '_get_setting' , $current_setting ); + + $$id_attribute = $current_setting; + } + } + + // :) + if ( ! isset( $this->is_free_plugin ) || ! $this->is_free_plugin ) { + $fs = array( 0 => 'c', 1 => 'p', 2 => 'h', 3 => 'i', 4 => 'e', 5 => 'n', 6 => 'k', 7 => '_' ); + $cs = array( 0 => 'U', 1 => 'g', 2 => 'p', 3 => 'r', 4 => 'd', 5 => 'a', 6 => 'e', 7 => '_' ); + $check_settings_save = true; + if ( isset( $this->class_name ) && ! class_exists( $this->class_name . $cs[7] . $cs[0] . $cs[2] . $cs[1] . $cs[3] . $cs[5] . $cs[4] . $cs[6] ) ) { + $check_settings_save = false; + } + if ( ! function_exists( $this->plugin_name . $fs[7] . $fs[0] . $fs[2] . $fs[4] . $fs[0] . $fs[6] . $fs[7] . $fs[1] . $fs[3] . $fs[5] ) ) { + $check_settings_save = false; + } + if ( ! $check_settings_save ) { + + if ( trim( $option_name ) != '' ) { + update_option( $option_name, $new_settings ); + $$option_name = $new_settings; + } + + foreach ( $options as $value ) { + if ( ! isset( $value['type'] ) ) continue; + if ( in_array( $value['type'], array( 'row', 'column', 'heading', 'ajax_submit', 'ajax_multi_submit' ) ) ) continue; + if ( ! isset( $value['id'] ) || trim( $value['id'] ) == '' ) continue; + if ( ! isset( $value['default'] ) ) $value['default'] = ''; + if ( ! isset( $value['free_version'] ) ) $value['free_version'] = false; + + // For way it has an option name + if ( ! isset( $value['separate_option'] ) ) $value['separate_option'] = false; + + // Remove [, ] characters from id argument + if ( strstr( $value['id'], '[' ) ) { + parse_str( esc_attr( $value['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + } else { + $id_attribute = esc_attr( $value['id'] ); + } + + if ( trim( $option_name ) == '' || $value['separate_option'] != false ) { + update_option( $id_attribute, $new_single_setting ); + $$id_attribute = $new_single_setting; + } + } + } + } + + return true; + + } + + /*-----------------------------------------------------------------------------------*/ + /* Save Settings Function - save_settings */ + /*-----------------------------------------------------------------------------------*/ + + public function save_settings( $options, $option_name = '' ) { + + if ( !is_array( $options ) || count( $options ) < 1 ) return; + + if ( empty( $_POST ) ) return false; + + $update_options = array(); + $update_separate_options = array(); + //var_dump($_POST); + + // Get settings for option value is stored as a record or it's spearate option + foreach ( $options as $value ) { + if ( ! isset( $value['type'] ) ) continue; + if ( in_array( $value['type'], array( 'row', 'column', 'heading', 'ajax_submit', 'ajax_multi_submit' ) ) ) continue; + + // Save for global settings of plugin framework + switch ( $value['type'] ) { + + // Toggle Box Open + case 'onoff_toggle_box' : + + if ( isset( $_POST[ $this->toggle_box_open_option ] ) ) { + $option_value = 1; + } else { + $option_value = 0; + } + + update_option( $this->toggle_box_open_option, $option_value ); + + break; + + } + + if ( ! isset( $value['id'] ) || trim( $value['id'] ) == '' ) continue; + if ( ! isset( $value['default'] ) ) $value['default'] = ''; + + // For way it has an option name + if ( ! isset( $value['separate_option'] ) ) $value['separate_option'] = false; + + // Remove [, ] characters from id argument + $key = false; + if ( strstr( $value['id'], '[' ) ) { + parse_str( esc_attr( $value['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + + $key = key( $option_array[ $id_attribute ] ); + } else { + $id_attribute = esc_attr( $value['id'] ); + } + + // Get the option name + $option_value = null; + + switch ( $value['type'] ) { + + // Checkbox type + case 'checkbox' : + case 'onoff_checkbox' : + case 'switcher_checkbox' : + + if ( ! isset( $value['checked_value'] ) ) $value['checked_value'] = 1; + if ( ! isset( $value['unchecked_value'] ) ) $value['unchecked_value'] = 0; + + if ( trim( $option_name ) == '' || $value['separate_option'] != false ) { + if ( $key != false ) { + if ( isset( $_POST[ $id_attribute ][ $key ] ) ) { + $option_value = $value['checked_value']; + } else { + $option_value = $value['unchecked_value']; + } + } else { + if ( isset( $_POST[ $id_attribute ] ) ) { + $option_value = $value['checked_value']; + } else { + $option_value = $value['unchecked_value']; + } + } + + } else { + if ( $key != false ) { + if ( isset( $_POST[ $option_name ][ $id_attribute ][ $key ] ) ) { + $option_value = $value['checked_value']; + } else { + $option_value = $value['unchecked_value']; + } + } else { + if ( isset( $_POST[ $option_name ][ $id_attribute ] ) ) { + $option_value = $value['checked_value']; + } else { + $option_value = $value['unchecked_value']; + } + } + } + + break; + + // Array textfields + case 'array_textfields' : + if ( !isset( $value['ids'] ) || !is_array( $value['ids'] ) || count( $value['ids'] ) < 1 ) break; + + foreach ( $value['ids'] as $text_field ) { + if ( ! isset( $text_field['id'] ) || trim( $text_field['id'] ) == '' ) continue; + if ( ! isset( $text_field['default'] ) ) $text_field['default'] = ''; + + // Remove [, ] characters from id argument + $key = false; + if ( strstr( $text_field['id'], '[' ) ) { + parse_str( esc_attr( $text_field['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + + $key = key( $option_array[ $id_attribute ] ); + } else { + $id_attribute = esc_attr( $text_field['id'] ); + } + + // Get the option name + $option_value = null; + + if ( trim( $option_name ) == '' || $value['separate_option'] != false ) { + if ( $key != false ) { + if ( isset( $_POST[ $id_attribute ][ $key ] ) ) { + $option_value = $_POST[ $id_attribute ][ $key ]; + } else { + $option_value = ''; + } + } else { + if ( isset( $_POST[ $id_attribute ] ) ) { + $option_value = $_POST[ $id_attribute ]; + } else { + $option_value = ''; + } + } + + } else { + if ( $key != false ) { + if ( isset( $_POST[ $option_name ][ $id_attribute ][ $key ] ) ) { + $option_value = $_POST[ $option_name ][ $id_attribute ][ $key ]; + } else { + $option_value = ''; + } + } else { + if ( isset( $_POST[ $option_name ][ $id_attribute ] ) ) { + $option_value = $_POST[ $option_name ][ $id_attribute ]; + } else { + $option_value = ''; + } + } + } + + if ( strstr( $text_field['id'], '[' ) ) { + // Set keys and value + $key = key( $option_array[ $id_attribute ] ); + + $update_options[ $id_attribute ][ $key ] = $option_value; + + if ( trim( $option_name ) != '' && $value['separate_option'] != false ) { + $update_separate_options[ $id_attribute ][ $key ] = $option_value; + } + + } else { + $update_options[ $id_attribute ] = $option_value; + + if ( trim( $option_name ) != '' && $value['separate_option'] != false ) { + $update_separate_options[ $id_attribute ] = $option_value; + } + } + } + + break; + + // Other types + default : + if ( trim( $option_name ) == '' || $value['separate_option'] != false ) { + if ( $key != false ) { + if ( isset( $_POST[ $id_attribute ][ $key ] ) ) { + $option_value = $_POST[ $id_attribute ][ $key ]; + } else { + $option_value = ''; + } + } else { + if ( isset( $_POST[ $id_attribute ] ) ) { + $option_value = $_POST[ $id_attribute ]; + } else { + $option_value = ''; + } + } + + } else { + if ( $key != false ) { + if ( isset( $_POST[ $option_name ][ $id_attribute ][ $key ] ) ) { + $option_value = $_POST[ $option_name ][ $id_attribute ][ $key ]; + } else { + $option_value = ''; + } + } else { + if ( isset( $_POST[ $option_name ][ $id_attribute ] ) ) { + $option_value = $_POST[ $option_name ][ $id_attribute ]; + } else { + $option_value = ''; + } + } + } + + // Just for Color type + if ( 'color' == $value['type'] && '' == trim( $option_value ) ) { + $option_value = 'transparent'; + } + // Just for Background Color type + elseif ( 'bg_color' == $value['type'] && '' == trim( $option_value['color'] ) ) { + $option_value['color'] = 'transparent'; + } elseif ( 'upload' == $value['type'] ) { + // Uploader: Set key and value for attachment id of upload type + if ( strstr( $value['id'], '[' ) ) { + $key = key( $option_array[ $id_attribute ] ); + + if ( trim( $option_name ) != '' && $value['separate_option'] != false ) { + if ( isset( $_POST[ $id_attribute ][ $key . '_attachment_id' ] ) ) { + $attachment_id = $_POST[ $id_attribute ][ $key . '_attachment_id' ]; + } else { + $attachment_id = 0; + } + + $update_separate_options[ $id_attribute ][ $key . '_attachment_id' ] = $attachment_id; + } else { + if ( isset( $_POST[ $option_name ][ $id_attribute ][ $key . '_attachment_id' ] ) ) { + $attachment_id = $_POST[ $option_name ][ $id_attribute ][ $key . '_attachment_id' ]; + } else { + $attachment_id = 0; + } + + $update_options[ $id_attribute ][ $key . '_attachment_id' ] = $attachment_id; + } + } else { + if ( trim( $option_name ) != '' && $value['separate_option'] != false ) { + if ( isset( $_POST[ $id_attribute . '_attachment_id' ] ) ) { + $attachment_id = $_POST[ $id_attribute . '_attachment_id' ]; + } else { + $attachment_id = 0; + } + $update_separate_options[ $id_attribute . '_attachment_id' ] = $attachment_id; + } else { + if ( isset( $_POST[ $option_name ][ $id_attribute . '_attachment_id' ] ) ) { + $attachment_id = $_POST[ $option_name ][ $id_attribute . '_attachment_id' ]; + } else { + $attachment_id = 0; + } + $update_options[ $id_attribute . '_attachment_id' ] = $attachment_id; + } + } + } + + break; + + } + + if ( !in_array( $value['type'], array( 'array_textfields' ) ) ) { + if ( strstr( $value['id'], '[' ) ) { + // Set keys and value + $key = key( $option_array[ $id_attribute ] ); + + if ( trim( $option_name ) != '' && $value['separate_option'] != false ) { + $update_separate_options[ $id_attribute ][ $key ] = $option_value; + } else { + $update_options[ $id_attribute ][ $key ] = $option_value; + } + + } else { + + if ( trim( $option_name ) != '' && $value['separate_option'] != false ) { + $update_separate_options[ $id_attribute ] = $option_value; + } else { + $update_options[ $id_attribute ] = $option_value; + } + } + } + + } + + // Save settings for option values is an array and it's in single option name for all settings + if ( trim( $option_name ) != '' ) { + update_option( $option_name, $update_options ); + } + + // Save options if each option save in a row + if ( count( $update_options ) > 0 && trim( $option_name ) == '' ) { + foreach ( $update_options as $name => $value ) { + update_option( $name, $value ); + } + } + + // Save separate options + if ( count( $update_separate_options ) > 0 ) { + foreach ( $update_separate_options as $name => $value ) { + update_option( $name, $value ); + } + } + + return true; + + } + + /*-----------------------------------------------------------------------------------*/ + /* Reset Function - reset_settings */ + /*-----------------------------------------------------------------------------------*/ + + public function reset_settings( $options, $option_name = '', $reset = false, $free_version = false ) { + + if ( !is_array( $options ) || count( $options ) < 1 ) return; + + // Update settings default for option values is an array and it's in single option name for all settings + if ( trim( $option_name ) != '' ) { + + $default_settings = $this->get_settings_default( $options, $option_name ); + + $current_settings = get_option( $option_name ); + if ( ! is_array( $current_settings ) ) $current_settings = array(); + $current_settings = array_merge( $default_settings, $current_settings ); + + if ( $reset && !$free_version ) { + update_option( $option_name, $default_settings ); + } else { + if ( $free_version ) { + foreach ( $options as $value ) { + if ( ! isset( $value['type'] ) ) continue; + if ( in_array( $value['type'], array( 'row', 'column', 'heading', 'ajax_submit', 'ajax_multi_submit' ) ) ) continue; + if ( ! isset( $value['id'] ) || trim( $value['id'] ) == '' ) continue; + + switch ( $value['type'] ) { + + // Array textfields + case 'array_textfields' : + if ( !isset( $value['ids'] ) || !is_array( $value['ids'] ) || count( $value['ids'] ) < 1 ) break; + + foreach ( $value['ids'] as $text_field ) { + if ( ! isset( $text_field['id'] ) || trim( $text_field['id'] ) == '' ) continue; + if ( ! isset( $text_field['default'] ) ) $text_field['default'] = ''; + if ( ! isset( $text_field['free_version'] ) ) { + if ( ! isset( $value['free_version'] ) ) + $text_field['free_version'] = false; + else + $text_field['free_version'] = $value['free_version']; + } + if ( $text_field['free_version'] ) unset( $default_settings[ $text_field['id']] ); + } + + break; + + default : + if ( ! isset( $value['default'] ) ) $value['default'] = ''; + if ( ! isset( $value['free_version'] ) ) $value['free_version'] = false; + if ( $value['free_version'] ) unset( $default_settings[ $value['id']] ); + + break; + } + } + + $current_settings = array_merge( $current_settings, $default_settings ); + update_option( $option_name, $current_settings ); + } else { + update_option( $option_name, $current_settings ); + } + } + + } + + // Update settings default for option value is stored as a record or it's spearate option + foreach ( $options as $value ) { + if ( ! isset( $value['type'] ) ) continue; + if ( in_array( $value['type'], array( 'row', 'column', 'heading', 'ajax_submit', 'ajax_multi_submit' ) ) ) continue; + if ( ! isset( $value['id'] ) || trim( $value['id'] ) == '' ) continue; + if ( ! isset( $value['default'] ) ) $value['default'] = ''; + if ( ! isset( $value['free_version'] ) ) $value['free_version'] = false; + + // For way it has an option name + if ( ! isset( $value['separate_option'] ) ) $value['separate_option'] = false; + + switch ( $value['type'] ) { + + // Array textfields + case 'array_textfields' : + if ( !isset( $value['ids'] ) || !is_array( $value['ids'] ) || count( $value['ids'] ) < 1 ) break; + + foreach ( $value['ids'] as $text_field ) { + if ( ! isset( $text_field['id'] ) || trim( $text_field['id'] ) == '' ) continue; + if ( ! isset( $text_field['default'] ) ) $text_field['default'] = ''; + if ( ! isset( $text_field['free_version'] ) ) { + if ( ! isset( $value['free_version'] ) ) + $text_field['free_version'] = false; + else + $text_field['free_version'] = $value['free_version']; + } + + // Remove [, ] characters from id argument + $key = false; + if ( strstr( $text_field['id'], '[' ) ) { + parse_str( esc_attr( $text_field['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + + $key = key( $option_array[ $id_attribute ] ); + } else { + $id_attribute = esc_attr( $text_field['id'] ); + } + + if ( trim( $option_name ) == '' || $value['separate_option'] != false ) { + if ( $reset && $text_field['free_version'] && !$free_version ) { + if ( $key != false ) { + $current_settings = get_option( $id_attribute, array() ); + if ( ! is_array( $current_settings) ) { + $current_settings = array(); + } + $current_settings[$key] = $text_field['default']; + update_option( $id_attribute, $current_settings ); + } else { + update_option( $id_attribute, $text_field['default'] ); + } + } elseif ( $reset && !$text_field['free_version'] ) { + if ( $key != false ) { + $current_settings = get_option( $id_attribute, array() ); + if ( ! is_array( $current_settings) ) { + $current_settings = array(); + } + $current_settings[$key] = $text_field['default']; + update_option( $id_attribute, $current_settings ); + } else { + update_option( $id_attribute, $text_field['default'] ); + } + } else { + if ( $key != false ) { + $current_settings = get_option( $id_attribute, array() ); + if ( ! is_array( $current_settings) ) { + $current_settings = array(); + } + if ( ! isset( $current_settings[$key] ) ) { + $current_settings[$key] = $text_field['default']; + update_option( $id_attribute, $current_settings ); + } + } else { + add_option( $id_attribute, $text_field['default'] ); + } + } + } + } + + break; + + default : + // Remove [, ] characters from id argument + $key = false; + if ( strstr( $value['id'], '[' ) ) { + parse_str( esc_attr( $value['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + + $key = key( $option_array[ $id_attribute ] ); + } else { + $id_attribute = esc_attr( $value['id'] ); + } + + if ( trim( $option_name ) == '' || $value['separate_option'] != false ) { + if ( $reset && $value['free_version'] && !$free_version ) { + if ( $key != false ) { + $current_settings = get_option( $id_attribute, array() ); + if ( ! is_array( $current_settings) ) { + $current_settings = array(); + } + $current_settings[$key] = $value['default']; + update_option( $id_attribute, $current_settings ); + } else { + update_option( $id_attribute, $value['default'] ); + } + } elseif ( $reset && !$value['free_version'] ) { + if ( $key != false ) { + $current_settings = get_option( $id_attribute, array() ); + if ( ! is_array( $current_settings) ) { + $current_settings = array(); + } + $current_settings[$key] = $value['default']; + update_option( $id_attribute, $current_settings ); + } else { + update_option( $id_attribute, $value['default'] ); + } + } else { + if ( $key != false ) { + $current_settings = get_option( $id_attribute, array() ); + if ( ! is_array( $current_settings) ) { + $current_settings = array(); + } + if ( ! isset( $current_settings[$key] ) ) { + $current_settings[$key] = $value['default']; + update_option( $id_attribute, $current_settings ); + } + } else { + add_option( $id_attribute, $value['default'] ); + } + } + } + + break; + } + + } + + } + + /*-----------------------------------------------------------------------------------*/ + /* Get Option Value Function - settings_get_option */ + /* Just called for when each option has an option value for settings + /*-----------------------------------------------------------------------------------*/ + + public function settings_get_option( $option_name, $default = '' ) { + // Array value + if ( strstr( $option_name, '[' ) ) { + + parse_str( $option_name, $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $option_name = current( $option_keys ); + + // Get value + $option_values = get_option( $option_name, '' ); + + $key = key( $option_array[ $option_name ] ); + + if ( isset( $option_values[ $key ] ) ) + $option_value = $option_values[ $key ]; + else + $option_value = null; + + // Single value + } else { + $option_value = get_option( $option_name, null ); + } + + if ( is_array( $option_value ) ) + $option_value = array_map( 'stripslashes', $option_value ); + elseif ( ! is_null( $option_value ) ) + $option_value = stripslashes( $option_value ); + + return $option_value === null ? $default : $option_value; + } + + /** + * Output admin fields. + * + * + * @access public + * @param array $options : Opens array to output + * @param text $form_key : It's unique key for form to get correct save and reset action for this form + * @param text $option_name : Save all settings as array into database for a single option name + * @param array $form_messages : { 'success_message' => '', 'error_message' => '', 'reset_message' => '' } + * @return void + * ======================================================================== + * Option Array Structure : + * type => row | column | heading | ajax_submit | ajax_multi_submit | google_api_key | onoff_toggle_box | text | email | number | password | color | bg_color | textarea | select | multiselect | radio | onoff_radio | checkbox | onoff_checkbox + * | switcher_checkbox | image_size | single_select_page | typography | border | border_styles | border_corner | box_shadow + * | slider | upload | wp_editor | array_textfields | + * + * id => text + * name => text + * free_version => true | false : if Yes then when save settings with $free_version = true, it does reset this option + * class => text + * css => text + * default => text : apply for other types + * array( 'enable' => 1, 'color' => '#515151' ) : apply bg_color only + * array( 'width' => '125', 'height' => '125', 'crop' => 1 ) : apply image_size only + * array( 'size' => '9px', line_height => '1.4em', 'face' => 'Arial', 'style' => 'normal', 'color' => '#515151' ) : apply for typography only + * array( 'width' => '1px', 'style' => 'normal', 'color' => '#515151', 'corner' => 'rounded' | 'square' , 'top_left_corner' => 3, + * 'top_right_corner' => 3, 'bottom_left_corner' => 3, 'bottom_right_corner' => 3 ) : apply for border only + * array( 'width' => '1px', 'style' => 'normal', 'color' => '#515151' ) : apply for border_styles only + * array( 'corner' => 'rounded' | 'square' , 'top_left_corner' => 3, 'top_right_corner' => 3, 'bottom_left_corner' => 3, + * 'bottom_right_corner' => 3 ) : apply for border_corner only + * array( 'enable' => 1|0, 'h_shadow' => '5px' , 'v_shadow' => '5px', 'blur' => '2px' , 'spread' => '2px', 'color' => '#515151', + * 'inset' => '' | 'insert' ) : apply for box_shadow only + * + * desc => text + * desc_tip => text + * separate_option => true | false + * custom_attributes => array + * view_doc => allowed html code : apply for heading only + * placeholder => text : apply for input, email, number, password, textarea, select, multiselect and single_select_page + * hide_if_checked => true | false : apply for checkbox only + * show_if_checked => true | false : apply for checkbox only + * checkboxgroup => start | end : apply for checkbox only + * checked_value => text : apply for checkbox, onoff_checkbox, switcher_checkbox only ( it's value set to database when checkbox is checked ) + * unchecked_value => text : apply for checkbox, onoff_checkbox, switcher_checkbox only ( it's value set to database when checkbox is unchecked ) + * checked_label => text : apply for onoff_checkbox, switcher_checkbox only ( set it to show the text instead ON word default ) + * unchecked_label => text : apply for onoff_checkbox, switcher_checkbox only ( set it to show the text instead OFF word default ) + * options => array : apply for select, multiselect, radio types + * + * onoff_options => array : apply for onoff_radio only + * ---------------- example --------------------- + * array( + * array( 'val' => 1, + * 'text' => 'Top', + * 'checked_label' => 'ON', + * 'unchecked_value' => 'OFF' ), + * + * array( 'val' => 2, + * 'text' => 'Bottom', + * 'checked_label' => 'ON', + * 'unchecked_value' => 'OFF' ), + * ) + * --------------------------------------------- + * + * args => array : apply for single_select_page only + * min => number : apply for slider, border, border_corner types only + * max => number : apply for slider, border, border_corner types only + * increment => number : apply for slider, border, border_corner types only + * textarea_rows => number : apply for wp_editor type only + * + * ids => array : apply for array_textfields only + * ---------------- example --------------------- + * array( + * array( 'id' => 'box_margin_top', + * 'name' => 'Top', + * 'class' => '', + * 'css' => 'width:40px;', + * 'default' => '10px' ), + * + * array( 'id' => 'box_margin_top', + * 'name' => 'Top', + * 'class' => '', + * 'css' => 'width:40px;', + * 'default' => '10px' ), + * ) + * --------------------------------------------- + * + * strip_methods => true | false : apply for upload type only + * + * submit_data => array : apply for ajax_submit only + * ---------------- example --------------------- + * array( + * 'ajax_url' => admin_url( 'admin-ajax.php', 'relative' ), + * 'ajax_type' => 'POST', + * 'data' => array( + * 'action' => 'action_name', + * ), + * ), + * button_name => text : apply for ajax_submit, ajax_multi_submit only + * progressing_text => text : apply for ajax_submit, ajax_multi_submit only + * completed_text => text : apply for ajax_submit, ajax_multi_submit only + * successed_text => text : apply for ajax_submit, ajax_multi_submit only + * + * statistic_column => number : apply for ajax_multi_submit only + * resubmit => true | false : apply for ajax_multi_submit only + * + * multi_submit => array : apply for ajax_multi_submit only + * ---------------- example --------------------- + * array( + * array( + * 'item_id' => 'item_ajax_id', + * 'item_name' => 'Item Ajax Name', + * 'current_items' => 20, + * 'total_items' => 20, + * 'progressing_text' => 'Processing, + * 'completed_text' => 'Completed', + * 'submit_data' => array( + * 'ajax_url' => admin_url( 'admin-ajax.php', 'relative' ), + * 'ajax_type' => 'POST', + * 'data' => array( + * 'action' => 'action_name', + * ) + * ), + * 'show_statistic' => true, + * 'statistic_customizer' => array( + * 'current_color' => '#96587d', + * ), + * ), + * array( + * ... + * ), + * ... + * ) + * + */ + + public function admin_forms( $options, $form_key, $option_name = '', $form_messages = array() ) { + global $wp_pvc_fonts_face, $wp_pvc_uploader, $current_subtab; + + $new_settings = array(); $new_single_setting = ''; // :) + $admin_message = ''; + + if ( isset( $_POST['form_name_action'] ) && $_POST['form_name_action'] == $form_key ) { + + do_action( $this->plugin_name . '_before_settings_save_reset' ); + do_action( $this->plugin_name . '-' . trim( $form_key ) . '_before_settings_save' ); + + // Save settings action + if ( isset( $_POST['bt_save_settings'] ) ) { + $this->save_settings( $options, $option_name ); + $admin_message = $this->get_success_message( ( isset( $form_messages['success_message'] ) ) ? $form_messages['success_message'] : '' ); + } + // Reset settings action + elseif ( isset( $_POST['bt_reset_settings'] ) ) { + $this->reset_settings( $options, $option_name, true ); + $admin_message = $this->get_success_message( ( isset( $form_messages['reset_message'] ) ) ? $form_messages['reset_message'] : '' ); + } + + do_action( $this->plugin_name . '-' . trim( $form_key ) . '_after_settings_save' ); + do_action( $this->plugin_name . '_after_settings_save_reset' ); + } + do_action( $this->plugin_name . '-' . trim( $form_key ) . '_settings_init' ); + do_action( $this->plugin_name . '_settings_init' ); + + $option_values = array(); + if ( trim( $option_name ) != '' ) { + $option_values = get_option( $option_name, array() ); + if ( is_array( $option_values ) ) + $option_values = array_map( array( $this, 'admin_stripslashes' ), $option_values ); + else + $option_values = array(); + + $default_settings = $this->get_settings_default( $options, $option_name ); + + $option_values = array_merge($default_settings, $option_values); + } + + if ( !is_array( $options ) || count( $options ) < 1 ) return ''; + ?> + + + ' . "\n\n"; + + // close panel box + echo '' . "\n\n"; + } + + if ( $header_box_opening ) { + $header_box_opening = false; + + // close box inside + echo '' . "\n\n"; + + // close panel box + echo '' . "\n\n"; + } + + if ( $had_first_column ) { + // close panel column + echo '' . "\n\n"; + } + + if ( $had_first_row ) { + // close panel row + echo '' . "\n\n"; + + // open panel column + echo '
' . "\n\n"; + } + + $had_first_column = false; + $had_first_row = true; + + break; + + // Column + case 'column': + + if ( $end_heading_id !== false && ! $closed_panel_inner ) { + if ( trim( $end_heading_id ) != '' ) do_action( $this->plugin_name . '_settings_' . sanitize_title( $end_heading_id ) . '_end' ); + echo '' . "\n\n"; + echo '
' . "\n\n"; + if ( trim( $end_heading_id ) != '' ) do_action( $this->plugin_name . '_settings_' . sanitize_title( $end_heading_id ) . '_after' ); + + $closed_panel_inner = true; + } + + if ( $header_sub_box_opening ) { + $header_sub_box_opening = false; + + // close box inside + echo '' . "\n\n"; + + // close panel box + echo '' . "\n\n"; + } + + if ( $header_box_opening ) { + $header_box_opening = false; + + // close box inside + echo '' . "\n\n"; + + // close panel box + echo '' . "\n\n"; + } + + if ( $had_first_column ) { + // close panel column + echo '' . "\n\n"; + + // open panel column + echo '
' . "\n\n"; + } else { + // open panel column + echo '
' . "\n\n"; + } + + $had_first_column = true; + $had_first_row = true; + + break; + + // Heading + case 'heading': + + $is_box = false; + if ( isset( $value['is_box'] ) && true == $value['is_box'] ) { + $is_box = true; + } + + $is_sub = false; + if ( isset( $value['is_sub'] ) && true == $value['is_sub'] ) { + $is_sub = true; + } + + $count_heading++; + if ( $count_heading > 1 && ! $closed_panel_inner ) { + if ( trim( $end_heading_id ) != '' ) do_action( $this->plugin_name . '_settings_' . sanitize_title( $end_heading_id ) . '_end' ); + echo '' . "\n\n"; + echo '
' . "\n\n"; + if ( trim( $end_heading_id ) != '' ) do_action( $this->plugin_name . '_settings_' . sanitize_title( $end_heading_id ) . '_after' ); + } + if ( ! empty( $value['id'] ) ) + $end_heading_id = $value['id']; + else + $end_heading_id = ''; + + if ( $header_sub_box_opening ) { + $header_sub_box_opening = false; + + // close box inside + echo '
' . "\n\n"; + + // close panel box + echo '' . "\n\n"; + } + + if ( $is_box && $header_box_opening && ! $is_sub ) { + $header_box_opening = false; + + // close box inside + echo '' . "\n\n"; + + // close panel box + echo '' . "\n\n"; + } + + $view_doc = ( isset( $value['view_doc'] ) ) ? $value['view_doc'] : ''; + + if ( ! empty( $value['id'] ) ) do_action( $this->plugin_name . '_settings_' . sanitize_title( $value['id'] ) . '_before' ); + + if ( $is_box ) { + $heading_box_id = $count_heading; + if ( ! empty( $value['id'] ) ) { + $heading_box_id = $value['id']; + } + + $toggle_box_class = 'enable_toggle_box_save'; + + $opened_class = ''; + if ( in_array( $heading_box_id, $opened_box ) && 1 == $toggle_box_open ) { + $opened_class = 'box_open'; + } + + if ( isset( $_POST['bt_save_settings']) && in_array( $heading_box_id, $opened_box ) ) { + $opened_class = 'box_open'; + } + + // Change to open box for the heading set alway_open = true + if ( isset( $value['alway_open'] ) && true == $value['alway_open'] ) { + $opened_class = 'box_open'; + } + + // Change to close box for the heading set alway_close = true + if ( isset( $value['alway_close'] ) && true == $value['alway_close'] ) { + $opened_class = ''; + } + + // Make the box open on first load with this argument first_open = true + if ( isset( $value['first_open'] ) && true == $value['first_open'] ) { + $this_box_is_opened = get_user_meta( $user_id, $this->plugin_name . '-' . trim( $heading_box_id ) . '-' . 'opened', true ); + if ( empty( $this_box_is_opened ) ) { + $opened_class = 'box_open'; + add_user_meta( $user_id, $this->plugin_name . '-' . trim( $heading_box_id ) . '-' . 'opened', 1 ); + } + } + + $box_handle_class = ''; + if ( isset( $value['is_active'] ) && true == $value['is_active'] ) { + $box_handle_class .= 'box_active'; + } + + if ( isset( $_GET['box_open'] ) && $_GET['box_open'] == $value['id'] ) { + $opened_class = 'box_open'; + } + + // open panel box + echo '
' . "\n\n"; + + // open box handle + echo '
' . "\n\n"; + + echo ( ! empty( $value['name'] ) ) ? '

'. esc_html( $value['name'] ) .' '. $view_doc .'

' : ''; + + if ( stristr( $value['class'], 'pro_feature_fields' ) !== false && ! empty( $value['id'] ) ) $this->upgrade_top_message( true, sanitize_title( $value['id'] ) ); + elseif ( stristr( $value['class'], 'pro_feature_fields' ) !== false ) $this->upgrade_top_message( true ); + + // close box handle + echo '
' . "\n\n"; + + // open box inside + echo '
' . "\n\n"; + + echo '
' . "\n\n"; + + if ( $is_sub ) { + // Mark this heading as a sub box is openning to check for close it on next header box + $header_sub_box_opening = true; + } else { + // Mark this heading as a box is openning to check for close it on next header box + $header_box_opening = true; + } + + } else { + echo '
' . "\n\n"; + if ( stristr( $value['class'], 'pro_feature_fields' ) !== false && ! empty( $value['id'] ) ) $this->upgrade_top_message( true, sanitize_title( $value['id'] ) ); + elseif ( stristr( $value['class'], 'pro_feature_fields' ) !== false ) $this->upgrade_top_message( true ); + + echo ( ! empty( $value['name'] ) ) ? '

'. esc_html( $value['name'] ) .' '. $view_doc .'

' : ''; + } + + if ( ! empty( $value['desc'] ) ) { + echo '
' . "\n\n"; + echo wpautop( wptexturize( $value['desc'] ) ); + echo '
' . "\n\n"; + } + + $closed_panel_inner = false; + + echo '' . "\n\n"; + + if ( ! empty( $value['id'] ) ) do_action( $this->plugin_name . '_settings_' . sanitize_title( $value['id'] ) . '_start' ); + break; + + // Google API Key input + case 'google_api_key': + + $google_api_key = $this->settings_get_option( $this->google_api_key_option ); + $google_api_key_enable = $this->settings_get_option( $this->google_api_key_option . '_enable', 0 ); + if ( ! isset( $value['checked_label'] ) ) $value['checked_label'] = __( 'ON', 'page-views-count' ); + if ( ! isset( $value['unchecked_label'] ) ) $value['unchecked_label'] = __( 'OFF', 'page-views-count' ); + + ?> + + + get_version_message(); + $new_version_class = ''; + if ( '' != trim( $version_message ) ) { + $new_version_class = 'a3rev-ui-new-version-message'; + } + + ?> + + + + + + 0 ) { + $number_ajax = 0; + $old_item_id = ''; + foreach ( $multi_submit as $single_submit ) { + $multi_current_items += (int) $single_submit['current_items']; + $multi_total_items += (int) $single_submit['total_items']; + + $single_submit['next_item_id'] = ''; + $multi_ajax[$single_submit['item_id']] = $single_submit; + + if ( $number_ajax > 0 ) { + $multi_ajax[$old_item_id]['next_item_id'] = $single_submit['item_id']; + } + $old_item_id = $single_submit['item_id']; + + $number_ajax++; + } + } + $multi_ajax = json_encode( $multi_ajax ); + + ?> + + + settings_get_option( $this->toggle_box_open_option, 0 ); + if ( ! isset( $value['checked_label'] ) ) $value['checked_label'] = __( 'ON', 'page-views-count' ); + if ( ! isset( $value['unchecked_label'] ) ) $value['unchecked_label'] = __( 'OFF', 'page-views-count' ); + + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $name_attribute, + 'id' => $id_attribute, + 'sort_column' => 'menu_order', + 'sort_order' => 'ASC', + 'show_option_none' => ' ', + 'class' => 'a3rev-ui-' . sanitize_title( $value['type'] ) . ' ' . $value['class'], + 'echo' => false, + 'selected' => absint( $option_value ) + ); + + if( isset( $value['args'] ) ) + $args = wp_parse_args( $value['args'], $args ); + + ?> + + + + + + + + + + + + + + + + + + + + + settings_get_option( $attachment_id_name_attribute, 0 ); + + ?> + + + + + + + + + plugin_name . '_admin_field_' . $value['type'], $value ); + break; + } + } + + // :) + if ( ! isset( $this->is_free_plugin ) || ! $this->is_free_plugin ) { + $fs = array( 0 => 'c', 1 => 'p', 2 => 'h', 3 => 'i', 4 => 'e', 5 => 'n', 6 => 'k', 7 => '_' ); + $cs = array( 0 => 'U', 1 => 'g', 2 => 'p', 3 => 'r', 4 => 'd', 5 => 'a', 6 => 'e', 7 => '_' ); + $check_settings_save = true; + if ( isset( $this->class_name ) && ! class_exists( $this->class_name . $cs[7] . $cs[0] . $cs[2] . $cs[1] . $cs[3] . $cs[5] . $cs[4] . $cs[6] ) ) { + $check_settings_save = false; + } + if ( ! function_exists( $this->plugin_name . $fs[7] . $fs[0] . $fs[2] . $fs[4] . $fs[0] . $fs[6] . $fs[7] . $fs[1] . $fs[3] . $fs[5] ) ) { + $check_settings_save = false; + } + if ( ! $check_settings_save ) { + + if ( trim( $option_name ) != '' ) { + update_option( $option_name, $new_settings ); + } + + foreach ( $options as $value ) { + if ( ! isset( $value['type'] ) ) continue; + if ( in_array( $value['type'], array( 'heading' ) ) ) continue; + if ( ! isset( $value['id'] ) || trim( $value['id'] ) == '' ) continue; + if ( ! isset( $value['default'] ) ) $value['default'] = ''; + if ( ! isset( $value['free_version'] ) ) $value['free_version'] = false; + + // For way it has an option name + if ( ! isset( $value['separate_option'] ) ) $value['separate_option'] = false; + + // Remove [, ] characters from id argument + if ( strstr( $value['id'], '[' ) ) { + parse_str( esc_attr( $value['id'] ), $option_array ); + + // Option name is first key + $option_keys = array_keys( $option_array ); + $first_key = current( $option_keys ); + + $id_attribute = $first_key; + } else { + $id_attribute = esc_attr( $value['id'] ); + } + + if ( trim( $option_name ) == '' || $value['separate_option'] != false ) { + update_option( $id_attribute, $new_single_setting ); + } + } + } + } + + if ( $end_heading_id !== false && ! $closed_panel_inner ) { + if ( trim( $end_heading_id ) != '' ) do_action( $this->plugin_name . '_settings_' . sanitize_title( $end_heading_id ) . '_end' ); + echo '
+ + + + + /> + +
 
+
+
Google Developer API to create a key", 'page-views-count' ), 'https://developers.google.com/fonts/docs/developer_api#APIKey' ); ?>
+
+ + /> +

+

+
+
+
+ + + + + + +

+ +
+ +
+ + + + + + +
+
+
+
+
+ +
+ +
+ +
+ + + + + + +
+
+
+
+
+
+ + +
+ 0 ) { + $column_width = round( (100 / $statistic_column ), 2, PHP_ROUND_HALF_DOWN ); + foreach ( $multi_submit as $single_submit ) { + + $current_items = (int) $single_submit['current_items']; + $total_items = (int) $single_submit['total_items']; + + // Calculate deg value for cirlce + $current_deg = 360; + $left_deg = 360; + $right_deg = 180; + $pie_class = 'pie-more-50'; + if ( $current_items < $total_items ) { + $current_deg = round( ( $current_items / $total_items ) * 360 ); + } + if ( $current_deg <= 180 ) { + $left_deg = $right_deg = $current_deg; + $pie_class = ''; + } else { + $right_deg = 180; + $left_deg = $current_deg; + } + + $statistic_customizer = isset ( $single_submit['statistic_customizer'] ) ? $single_submit['statistic_customizer'] : false; + if ( $statistic_customizer ) { + $current_color = isset( $statistic_customizer['current_color'] ) ? $statistic_customizer['current_color'] : ''; + } + ?> +
+
+
+
+
+
+
+
+
+ + / + +
+ +
+
+ +
+
+
+
+ + + + + + /> +
+ + + + + /> +
+ + + + + /> +
+ + + + + + /> +
+
+ + /> +
+
+ + + + + + +
+ + + + +
+ + + +
+ +
    + 0 ) { + foreach ( $value['options'] as $val => $text ) { + ?> +
  • + +
  • + +
+
+
+ + + +
+ +
    + 0 ) { + foreach ( $value['onoff_options'] as $i_option ) { + if ( ! isset( $i_option['checked_label'] ) ) $i_option['checked_label'] = __( 'ON', 'page-views-count' ); + if ( ! isset( $i_option['unchecked_label'] ) ) $i_option['unchecked_label'] = __( 'OFF', 'page-views-count' ); + if ( ! isset( $i_option['val'] ) ) $i_option['val'] = 1; + if ( ! isset( $i_option['text'] ) ) $i_option['text'] = ''; + ?> +
  • + + class="a3rev-ui-onoff_radio " + checked_label="" + unchecked_label="" + type="radio" + value="" + + + /> +
  • + +
+
+
+ + +
+ +
+ + + + + +
+
+ + + + + + /> +
+ + + + + + /> +
+ + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + /> + + + + +
+ +
+ +
+ + + + + + + + + /> + + + + +
+ + + + + /> + + +
+
+ +
+
+
+
+
+
+
+ px +
+
+
+
+ +
+
+
+
+
+
+
+ px +
+
+
+
+ +
+
+
+
+
+
+
+ px +
+
+
+
+ +
+
+
+
+
+
+
+ px +
+
+
+
+
+
+ +
+ +
+ + + + + + + + + /> + + + + +
+ +
+
+ + + + /> + + + + + +
+
+ +
+
+
+
+
+
+
+ px +
+
+
+
+ +
+
+
+
+
+
+
+ px +
+
+
+
+ +
+
+
+
+
+
+
+ px +
+
+
+
+ +
+
+
+
+
+
+
+ px +
+
+
+
+
+
+
+
+ + + /> + +
+
+
+ + + + + + + + + + + + + + + + /> + + + + /> + + + +
+
+
+
+ + + +
+
+
+
+
+ + /> +
+
+
+ + + + + upload_input( $name_attribute, $id_attribute, $option_value, $attachment_id, $value['default'], esc_html( $value['name'] ), $class, esc_attr( $value['css'] ) , '', $strip_methods );?> +
+ + + + + + $name_attribute, + 'wpautop' => true, + 'editor_class' => 'a3rev-ui-' . sanitize_title( $value['type'] ) . ' ' . esc_attr( $value['class'] ), + 'textarea_rows' => $value['textarea_rows'] ) ); ?> +
+ + + + +
+ settings_get_option( $text_field['id'], $text_field['default'] ); + } + // Get option value when it's an element from option array + else { + if ( $key != false ) { + $option_value = ( isset( $option_values[ $id_attribute ][ $key ] ) ) ? $option_values[ $id_attribute ][ $key ] : $text_field['default']; + } else { + $option_value = ( isset( $option_values[ $id_attribute ] ) ) ? $option_values[ $id_attribute ] : $text_field['default']; + } + } + + // Generate name and id attributes + if ( trim( $option_name ) == '' ) { + $name_attribute = esc_attr( $text_field['id'] ); + } elseif ( $value['separate_option'] != false ) { + $name_attribute = esc_attr( $text_field['id'] ); + $id_attribute = esc_attr( $option_name ) . '_' . $id_attribute; + } else { + // Array value + if ( strstr( $text_field['id'], '[' ) ) { + $name_attribute = esc_attr( $option_name ) . '[' . $id_attribute . ']' . str_replace( $id_attribute . '[', '[', esc_attr( $text_field['id'] ) ); + } else { + $name_attribute = esc_attr( $option_name ) . '[' . esc_attr( $text_field['id'] ) . ']'; + } + $id_attribute = esc_attr( $option_name ) . '_' . $id_attribute; + } + ?> + + +
+ +
' . "\n\n"; + echo '
' . "\n\n"; + if ( trim( $end_heading_id ) != '' ) do_action( $this->plugin_name . '_settings_' . sanitize_title( $end_heading_id ) . '_after' ); + } + + if ( $header_sub_box_opening ) { + $header_sub_box_opening = false; + + // close box inside + echo '
' . "\n\n"; + + // close panel box + echo '
' . "\n\n"; + } + + if ( $header_box_opening ) { + $header_box_opening = false; + + // close box inside + echo '
' . "\n\n"; + + // close panel box + echo '' . "\n\n"; + } + + if ( $had_first_column ) { + // close panel column + echo '' . "\n\n"; + } + + ?> + + plugin_name . '-' . trim( $form_key ) . '_settings_end' ); ?> +

+ + + + +

+ + + + + plugin_name . '-custom-boxes' , true ); + if ( empty( $opened_box ) || ! is_array( $opened_box ) ) { + $opened_box = array(); + } + + $toggle_box_open = $this->settings_get_option( $this->toggle_box_open_option, 0 ); + + $toggle_box_class = ''; + if ( 1 == $toggle_box_open ) { + $toggle_box_class = 'enable_toggle_box_save'; + } + + $opened_class = ''; + if ( in_array( $heading_box_id, $opened_box ) && 1 == $toggle_box_open ) { + $opened_class = 'box_open'; + } + + // Change to open box for the heading set alway_open = true + if ( isset( $options['alway_open'] ) && true == $options['alway_open'] ) { + $opened_class = 'box_open'; + } + + // Change to close box for the heading set alway_close = true + if ( isset( $options['alway_close'] ) && true == $options['alway_close'] ) { + $opened_class = ''; + } + + // Make the box open on first load with this argument first_open = true + if ( isset( $options['first_open'] ) && true == $options['first_open'] ) { + $this_box_is_opened = get_user_meta( $user_id, $this->plugin_name . '-' . trim( $heading_box_id ) . '-' . 'opened', true ); + if ( empty( $this_box_is_opened ) ) { + $opened_class = 'box_open'; + add_user_meta( $user_id, $this->plugin_name . '-' . trim( $heading_box_id ) . '-' . 'opened', 1 ); + } + } + + } else { + + $toggle_box_class = ''; + $opened_class = ''; + + } + + // open panel box + echo '
' . "\n\n"; + + // open box handle + echo '
' . "\n\n"; + + echo ( ! empty( $options['name'] ) ) ? '

'. esc_html( $options['name'] ) .' '. $view_doc .'

' : ''; + + if ( stristr( $options['class'], 'pro_feature_fields' ) !== false && ! empty( $options['id'] ) ) $this->upgrade_top_message( true, sanitize_title( $options['id'] ) ); + elseif ( stristr( $options['class'], 'pro_feature_fields' ) !== false ) $this->upgrade_top_message( true ); + + // close box handle + echo '
' . "\n\n"; + + // open box inside + echo '
' . "\n\n"; + + echo '
' . "\n\n"; + + } else { + echo '
' . "\n\n"; + if ( stristr( $options['class'], 'pro_feature_fields' ) !== false && ! empty( $options['id'] ) ) $this->upgrade_top_message( true, sanitize_title( $options['id'] ) ); + elseif ( stristr( $options['class'], 'pro_feature_fields' ) !== false ) $this->upgrade_top_message( true ); + + echo ( ! empty( $options['name'] ) ) ? '

'. esc_html( $options['name'] ) .' '. $view_doc .'

' : ''; + } + + if ( ! empty( $options['desc'] ) ) { + echo '
' . "\n\n"; + echo wpautop( wptexturize( $options['desc'] ) ); + echo '
' . "\n\n"; + } + + echo $settings_html; + + echo '
'; + + if ( $is_box ) { + // close box inside + echo '
' . "\n\n"; + + // close panel box + echo '
' . "\n\n"; + } + } + + /*-----------------------------------------------------------------------------------*/ + /* Custom Stripslashed for array in array - admin_stripslashes() */ + /*-----------------------------------------------------------------------------------*/ + public function admin_stripslashes( $values ) { + if ( is_array( $values ) ) { + $values = array_map( array( $this, 'admin_stripslashes' ), $values ); + } else { + $values = esc_attr( stripslashes( $values ) ); + } + + return $values; + } + + /*-----------------------------------------------------------------------------------*/ + /* hextorgb() */ + /* Convert Hex to RGB for color */ + /*-----------------------------------------------------------------------------------*/ + public function hextorgb( $color = '', $text = true ) { + $color = trim( $color ); + if ( '' == $color || 'transparent' == $color ) { + return false; + } + + if ( '#' == $color[0] ) { + $color = substr( $color, 1 ); + } + + if ( 6 == strlen( $color ) ) { + list( $r, $g, $b ) = array( $color[0].$color[1], $color[2].$color[3], $color[4].$color[5] ); + } elseif ( 3 == strlen( $color ) ) { + list( $r, $g, $b ) = array( $color[0].$color[0], $color[1].$color[1], $color[2].$color[2] ); + } else { + return false; + } + + $r = hexdec($r); + $g = hexdec($g); + $b = hexdec($b); + + if ( $text ) { + return $r.','.$g.','.$b; + } else { + return array( $r, $g, $b ); + } + } + + /*-----------------------------------------------------------------------------------*/ + /* generate_border_css() */ + /* Generate Border CSS on frontend */ + /*-----------------------------------------------------------------------------------*/ + public function generate_border_css( $option ) { + + $border_css = ''; + + $border_css .= 'border: ' . esc_attr( $option['width'] ) . ' ' . esc_attr( $option['style'] ) . ' ' . esc_attr( $option['color'] ) .' !important;'; + + if ( isset( $option['corner'] ) && esc_attr( $option['corner'] ) == 'rounded' ) { + if ( ! isset( $option['rounded_value'] ) ) $option['rounded_value'] = 0; + if ( ! isset( $option['top_left_corner'] ) ) $option['top_left_corner'] = $option['rounded_value']; + if ( ! isset( $option['top_right_corner'] ) ) $option['top_right_corner'] = $option['rounded_value']; + if ( ! isset( $option['bottom_left_corner'] ) ) $option['bottom_left_corner'] = $option['rounded_value']; + if ( ! isset( $option['bottom_right_corner'] ) ) $option['bottom_right_corner'] = $option['rounded_value']; + + $border_css .= 'border-radius: ' . $option['top_left_corner'] . 'px ' . $option['top_right_corner'] . 'px ' . $option['bottom_right_corner'] . 'px ' . $option['bottom_left_corner'] . 'px !important;'; + $border_css .= '-moz-border-radius: ' . $option['top_left_corner'] . 'px ' . $option['top_right_corner'] . 'px ' . $option['bottom_right_corner'] . 'px ' . $option['bottom_left_corner'] . 'px !important;'; + $border_css .= '-webkit-border-radius: ' . $option['top_left_corner'] . 'px ' . $option['top_right_corner'] . 'px ' . $option['bottom_right_corner'] . 'px ' . $option['bottom_left_corner'] . 'px !important;'; + } else { + $border_css .= 'border-radius: 0px !important;'; + $border_css .= '-moz-border-radius: 0px !important;'; + $border_css .= '-webkit-border-radius: 0px !important;'; + } + + return $border_css; + + } + + /*-----------------------------------------------------------------------------------*/ + /* generate_border_style_css() */ + /* Generate Border Style CSS on frontend */ + /*-----------------------------------------------------------------------------------*/ + public function generate_border_style_css( $option ) { + + $border_style_css = ''; + + $border_style_css .= 'border: ' . esc_attr( $option['width'] ) . ' ' . esc_attr( $option['style'] ) . ' ' . esc_attr( $option['color'] ) .' !important;'; + + return $border_style_css; + + } + + /*-----------------------------------------------------------------------------------*/ + /* generate_border_corner_css() */ + /* Generate Border Corner CSS on frontend */ + /*-----------------------------------------------------------------------------------*/ + public function generate_border_corner_css( $option ) { + + $border_corner_css = ''; + + if ( isset( $option['corner'] ) && esc_attr( $option['corner'] ) == 'rounded' ) { + if ( ! isset( $option['rounded_value'] ) ) $option['rounded_value'] = 0; + if ( ! isset( $option['top_left_corner'] ) ) $option['top_left_corner'] = $option['rounded_value']; + if ( ! isset( $option['top_right_corner'] ) ) $option['top_right_corner'] = $option['rounded_value']; + if ( ! isset( $option['bottom_left_corner'] ) ) $option['bottom_left_corner'] = $option['rounded_value']; + if ( ! isset( $option['bottom_right_corner'] ) ) $option['bottom_right_corner'] = $option['rounded_value']; + + $border_corner_css .= 'border-radius: ' . $option['top_left_corner'] . 'px ' . $option['top_right_corner'] . 'px ' . $option['bottom_right_corner'] . 'px ' . $option['bottom_left_corner'] . 'px !important;'; + $border_corner_css .= '-moz-border-radius: ' . $option['top_left_corner'] . 'px ' . $option['top_right_corner'] . 'px ' . $option['bottom_right_corner'] . 'px ' . $option['bottom_left_corner'] . 'px !important;'; + $border_corner_css .= '-webkit-border-radius: ' . $option['top_left_corner'] . 'px ' . $option['top_right_corner'] . 'px ' . $option['bottom_right_corner'] . 'px ' . $option['bottom_left_corner'] . 'px !important;'; + } else { + $border_corner_css .= 'border-radius: 0px !important;'; + $border_corner_css .= '-moz-border-radius: 0px !important;'; + $border_corner_css .= '-webkit-border-radius: 0px !important;'; + } + + return $border_corner_css; + + } + + /*-----------------------------------------------------------------------------------*/ + /* generate_shadow_css() */ + /* Generate Shadow CSS on frontend */ + /*-----------------------------------------------------------------------------------*/ + public function generate_shadow_css( $option ) { + + $shadow_css = ''; + if ( ! isset( $option['inset'] ) ) $option['inset'] = ''; + + if ( isset( $option['enable'] ) && $option['enable'] == 1 ) { + $shadow_css .= 'box-shadow: ' . $option['h_shadow'] . ' ' . $option['v_shadow'] . ' ' . $option['blur'] . ' ' . $option['spread'] . ' ' . $option['color'] . ' ' . $option['inset'] . ' !important;'; + $shadow_css .= '-moz-box-shadow: ' . $option['h_shadow'] . ' ' . $option['v_shadow'] . ' ' . $option['blur'] . ' ' . $option['spread'] . ' ' . $option['color'] . ' ' . $option['inset'] . ' !important;'; + $shadow_css .= '-webkit-box-shadow: ' . $option['h_shadow'] . ' ' . $option['v_shadow'] . ' ' . $option['blur'] . ' ' . $option['spread'] . ' ' . $option['color'] . ' ' . $option['inset'] . ' !important;'; + } else { + $shadow_css .= 'box-shadow: none !important ;'; + $shadow_css .= '-moz-box-shadow: none !important ;'; + $shadow_css .= '-webkit-box-shadow: none !important ;'; + } + + return $shadow_css; + + } + + /*-----------------------------------------------------------------------------------*/ + /* generate_background_css() */ + /* Generate Background Color CSS on frontend */ + /*-----------------------------------------------------------------------------------*/ + public function generate_background_color_css( $option, $transparency = 100 ) { + + $return_css = ''; + + if ( isset( $option['enable'] ) && $option['enable'] == 1 ) { + $color = $option['color']; + if ( 100 != $transparency ) { + $color = $this->hextorgb( $color ); + $transparency = (int) $transparency / 100; + + if ( $color !== false ) { + $return_css .= 'background-color: rgba( ' . $color . ', ' . $transparency . ' ) !important;'; + } else { + $return_css .= 'background-color: transparent !important ;'; + } + } else { + $return_css .= 'background-color: ' . $color . ' !important ;'; + } + } else { + $return_css .= 'background-color: transparent !important ;'; + } + + return $return_css; + + } + +} + +global $wp_pvc_admin_interface; +$wp_pvc_admin_interface = new WP_PVC_Admin_Interface(); + +?> diff --git a/admin/admin-pages/admin-pvc-page.php b/admin/admin-pages/admin-pvc-page.php new file mode 100755 index 0000000..0715da8 --- /dev/null +++ b/admin/admin-pages/admin-pvc-page.php @@ -0,0 +1,141 @@ + +page_init(); + $this->tabs_include(); + } + + /*-----------------------------------------------------------------------------------*/ + /* page_init() */ + /* Page Init */ + /*-----------------------------------------------------------------------------------*/ + public function page_init() { + + add_filter( $this->plugin_name . '_add_admin_menu', array( $this, 'add_admin_menu' ) ); + } + + /*-----------------------------------------------------------------------------------*/ + /* page_data() */ + /* Get Page Data */ + /*-----------------------------------------------------------------------------------*/ + public function page_data() { + + $page_data = array( + 'type' => 'submenu', + 'parent_slug' => 'options-general.php', + 'page_title' => __( 'Page Views Count', 'page-views-count' ), + 'menu_title' => __( 'Page Views Count', 'page-views-count' ), + 'capability' => 'manage_options', + 'menu_slug' => $this->menu_slug, + 'function' => 'wp_pvc_admin_page_show', + 'admin_url' => 'options-general.php', + 'callback_function' => 'wp_pvc_callback_settings_page_show', + 'script_function' => '', + 'view_doc' => '', + ); + + if ( $this->page_data ) return $this->page_data; + return $this->page_data = $page_data; + + } + + /*-----------------------------------------------------------------------------------*/ + /* add_admin_menu() */ + /* Add This page to menu on left sidebar */ + /*-----------------------------------------------------------------------------------*/ + public function add_admin_menu( $admin_menu ) { + + if ( ! is_array( $admin_menu ) ) $admin_menu = array(); + $admin_menu[] = $this->page_data(); + + return $admin_menu; + } + + /*-----------------------------------------------------------------------------------*/ + /* tabs_include() */ + /* Include all tabs into this page + /*-----------------------------------------------------------------------------------*/ + public function tabs_include() { + + include_once( $this->admin_plugin_dir() . '/tabs/admin-pvc-tab.php' ); + + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_settings_page() */ + /* Show Settings Page */ + /*-----------------------------------------------------------------------------------*/ + public function admin_settings_page() { + global $wp_pvc_admin_init; + + $wp_pvc_admin_init->admin_settings_page( $this->page_data() ); + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_settings_page() */ + /* Show Settings Page */ + /*-----------------------------------------------------------------------------------*/ + public function callback_admin_settings_page() { + global $wp_pvc_general_settings; + + $this->plugin_extension_start(); + $wp_pvc_general_settings->settings_form(); + $this->plugin_extension_end(); + } +} + +global $wp_pvc_admin_page; +$wp_pvc_admin_page = new WP_PVC_Admin_Page(); + +/** + * wp_pvc_admin_page_show() + * Define the callback function to show page content + */ +function wp_pvc_admin_page_show() { + global $wp_pvc_admin_page; + $wp_pvc_admin_page->admin_settings_page(); +} + +function wp_pvc_callback_settings_page_show() { + global $wp_pvc_admin_page; + $wp_pvc_admin_page->callback_admin_settings_page(); +} + +?> \ No newline at end of file diff --git a/admin/admin-ui.php b/admin/admin-ui.php new file mode 100755 index 0000000..b5a5713 --- /dev/null +++ b/admin/admin-ui.php @@ -0,0 +1,345 @@ + +admin_plugin_url ) return $this->admin_plugin_url; + return $this->admin_plugin_url = untrailingslashit( plugins_url( '/', __FILE__ ) ); + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_plugin_dir() */ + /*-----------------------------------------------------------------------------------*/ + public function admin_plugin_dir() { + if ( $this->admin_plugin_dir ) return $this->admin_plugin_dir; + return $this->admin_plugin_dir = untrailingslashit( plugin_dir_path( __FILE__ ) ); + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_pages() */ + /*-----------------------------------------------------------------------------------*/ + public function admin_pages() { + $admin_pages = apply_filters( $this->plugin_name . '_admin_pages', $this->admin_pages ); + + return (array)$admin_pages; + } + + /** + * get_premium_video_data() + * return array + * Data is used for Premium Video Box + */ + public function get_premium_video_data() { + $premium_video_data = array( + 'box_title' => __( 'Premium Version Enhanced Features', 'page-views-count' ), + 'image_url' => A3_PVC_IMAGES_URL. '/video.jpg', + 'video_url' => 'https://www.youtube.com/embed/9dGw-ORfMIk?version=3&autoplay=1', + 'left_title' => __( 'Premium Version Enhanced Features', 'page-views-count' ), + 'left_text' => __( 'Page View Count Premium', 'page-views-count' ) + . "\n\n" . __( 'Quick Video showing the main (not all) enhanced features that are built into the Page View Count Premium version', 'page-views-count' ), + 'right_title' => __( 'Developer Support and Premium Features', 'page-views-count' ), + 'right_text' => __( 'Limited Time Offer. Purchase the Premium Version Lifetime License. That is a Lifetime of maintenance updates, feature upgrades and developer support for a once only fee. Offer ending soon.', 'page-views-count' ) + . "\n\n" . '' . __( 'Get Premium Features and Support', '' ) . '', + ); + + return $premium_video_data; + } + + public function plugin_premium_video_box( $echo = true ) { + $premium_video_data = apply_filters( $this->plugin_name . '_plugin_premium_video_data', $this->get_premium_video_data() ); + + $output = '
'; + $output .= '
'; + $output .= '
'; + $output .= '
'; + $output .= '

'.$premium_video_data['box_title'].'

'; + $output .= '
'; + $output .= '
'; + $output .= $this->plugin_premium_video(); + $output .= $this->plugin_premium_video_text(); + $output .= '
'; + $output .= '
'; + $output .= '
'; + $output .= '
'; + + $output = apply_filters( $this->plugin_name . '_plugin_premium_video', $output ); + + if ( $echo ) + echo $output; + else + return $output; + } + + public function plugin_premium_video( $echo = false ) { + $premium_video_data = apply_filters( $this->plugin_name . '_plugin_premium_video_data', $this->get_premium_video_data() ); + + wp_enqueue_style('thickbox'); + wp_enqueue_script('thickbox'); + + $output = '
'; + $output .= '

' . $premium_video_data['left_title'] . '

'; + $output .= ''; + $output .= ''; + $output .= '
'; + $output .= '
'; + $output .= wpautop( $premium_video_data['left_text'] ); + $output .= '
'; + + if ( $echo ) + echo $output; + else + return $output; + } + + public function plugin_premium_video_text( $echo = false ) { + $premium_video_data = apply_filters( $this->plugin_name . '_plugin_premium_video_data', $this->get_premium_video_data() ); + + $output = ''; + if ( '' != trim( $premium_video_data['right_text'] ) ) { + $output .= '
'; + $output .= '
'; + $output .= '

' . $premium_video_data['right_title'] . '

'; + $output .= wpautop( $premium_video_data['right_text'] ); + $output .= '
'; + } + + if ( $echo ) + echo $output; + else + return $output; + } + + public function plugin_extension_boxes( $echo = false ) { + + /** + * extension_boxes + * ============================================= + * array ( + * 'id' => 'box_id' : Enter unique your box id + * 'content' => 'html_content' : (required) Enter the html content to show inside the box + * 'css' => 'custom style' : custom style for the box container + * ) + * + */ + $extension_boxes = apply_filters( $this->plugin_name . '_plugin_extension_boxes', array() ); + + $output = ''; + if ( is_array( $extension_boxes ) && count( $extension_boxes ) > 0 ) { + foreach ( $extension_boxes as $box ) { + if ( ! isset( $box['id'] ) ) $box['id'] = ''; + if ( ! isset( $box['class'] ) ) $box['class'] = ''; + if ( ! isset( $box['css'] ) ) $box['css'] = ''; + if ( ! isset( $box['content'] ) ) $box['content'] = ''; + + $output .= '
'; + $output .= $box['content']; + $output .= '
'; + } + } + + if ( $echo ) + echo $output; + else + return $output; + } + + /*-----------------------------------------------------------------------------------*/ + /* plugin_extension_start() */ + /* Start of yellow box on right for pro fields + /*-----------------------------------------------------------------------------------*/ + public function plugin_extension_start( $echo = true ) { + $output = '
'; + $output .= '
'; + $output .= '
'; + $output .= $this->plugin_extension_boxes( false ); + $output .= '
'; + $output .= '
'; + $output .= '
'; + + $output = apply_filters( $this->plugin_name . '_plugin_extension_start', $output ); + + if ( $echo ) + echo $output; + else + return $output; + } + + /*-----------------------------------------------------------------------------------*/ + /* plugin_extension_start() */ + /* End of yellow box on right for pro fields + /*-----------------------------------------------------------------------------------*/ + public function plugin_extension_end( $echo = true ) { + $output = '
'; + $output .= '
'; + + $output = apply_filters( $this->plugin_name . '_plugin_extension_end', $output ); + + if ( $echo ) + echo $output; + else + return $output; + + } + + /*-----------------------------------------------------------------------------------*/ + /* upgrade_top_message() */ + /* Show upgrade top message for pro fields + /*-----------------------------------------------------------------------------------*/ + public function upgrade_top_message( $echo = false, $setting_id = '' ) { + $upgrade_top_message = sprintf( '
' + . __( 'Advanced Settings - Upgrade to the %s License to activate these settings.', 'page-views-count' ) + . '
' + , apply_filters( $this->plugin_name . '_' . $setting_id . '_pro_plugin_page_url', apply_filters( $this->plugin_name . '_pro_plugin_page_url', $this->pro_plugin_page_url ) ) + , apply_filters( $this->plugin_name . '_' . $setting_id . '_pro_version_name', apply_filters( $this->plugin_name . '_pro_version_name', __( 'Pro Version', 'page-views-count' ) ) ) + ); + + $upgrade_top_message = apply_filters( $this->plugin_name . '_upgrade_top_message', $upgrade_top_message, $setting_id ); + + if ( $echo ) echo $upgrade_top_message; + else return $upgrade_top_message; + + } + + /*-----------------------------------------------------------------------------------*/ + /* pro_fields_before() */ + /* Start of yellow box on right for pro fields + /*-----------------------------------------------------------------------------------*/ + public function pro_fields_before( $echo = true ) { + echo apply_filters( $this->plugin_name . '_pro_fields_before', '
'. $this->upgrade_top_message() ); + } + + /*-----------------------------------------------------------------------------------*/ + /* pro_fields_after() */ + /* End of yellow border for pro fields + /*-----------------------------------------------------------------------------------*/ + public function pro_fields_after( $echo = true ) { + echo apply_filters( $this->plugin_name . '_pro_fields_after', '
' ); + } + + /*-----------------------------------------------------------------------------------*/ + /* blue_message_box() */ + /* Blue Message Box + /*-----------------------------------------------------------------------------------*/ + public function blue_message_box( $message = '', $width = '600px' ) { + $message = '
' . $message . '
'; + $message = apply_filters( $this->plugin_name . '_blue_message_box', $message ); + + return $message; + } + + /*-----------------------------------------------------------------------------------*/ + /* get_version_message() */ + /* Get new version message, also include error connect + /*-----------------------------------------------------------------------------------*/ + public function get_version_message() { + $version_message = ''; + + //Getting version number + $version_transient = get_transient( $this->version_transient ); + if ( false !== $version_transient ) { + $transient_timeout = '_transient_timeout_' . $this->version_transient; + $timeout = get_option( $transient_timeout, false ); + if ( false === $timeout ) { + $version_message = __( 'You should check now to see if have any new version is available', 'page-views-count' ); + } elseif ( 'cannot_connect_api' == $version_transient ) { + $version_message = sprintf( __( 'Connection Failure! Please try again. If this issue persists please create a support request on the plugin a3rev support forum.', 'page-views-count' ), $this->support_url ); + } else { + $version_info = explode( '||', $version_transient ); + if ( FALSE !== stristr( $version_transient, '||' ) + && is_array( $version_info ) + && isset( $version_info[1] ) && $version_info[1] == 'valid' + && version_compare( get_option('a3_pvc_version') , $version_info[0], '<' ) ) { + + $version_message = sprintf( __( 'There is a new version %s available, update now or download direct from My Account on a3rev.com', 'page-views-count' ), + $version_info[0], + wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . A3_PVC_PLUGIN_NAME ), 'upgrade-plugin_' . A3_PVC_PLUGIN_NAME ), + 'https://a3rev.com/my-account/downloads/' + ); + } + } + + } else { + $version_message = __( 'You should check now to see if have any new version is available', 'page-views-count' ); + } + + return $version_message; + } + +} + +?> diff --git a/admin/assets/css/a3_admin_metabox.css b/admin/assets/css/a3_admin_metabox.css new file mode 100644 index 0000000..4fbb725 --- /dev/null +++ b/admin/assets/css/a3_admin_metabox.css @@ -0,0 +1,278 @@ +@font-face { + font-family: "a3-metabox-plugin-framework"; + src:url("../fonts/a3-metabox-plugin-framework.eot"); + src:url("../fonts/a3-metabox-plugin-framework.eot?#iefix") format("embedded-opentype"), + url("../fonts/a3-metabox-plugin-framework.woff") format("woff"), + url("../fonts/a3-metabox-plugin-framework.ttf") format("truetype"), + url("../fonts/a3-metabox-plugin-framework.svg#a3-metabox-plugin-framework") format("svg"); + font-weight: normal; + font-style: normal; + +} + +.a3-metabox-panel-wrap .a3-metabox-icon:before { + font-family: "a3-metabox-plugin-framework" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.a3-metabox-wrapper .expand_all:before, .a3-metabox-wrapper .close_all:before { + font-size: 12px; + color: #aaa; + font-weight: bold !important; + margin-right: 5px; +} +.a3-metabox-wrapper .expand_all:before { + content: "\e000"; +} +.a3-metabox-wrapper .close_all:before { + content: "\e002"; +} +.a3-metabox-wrapper .a3-metabox-item .handlediv:before { + font-size: 16px !important; +} +.a3-metabox-wrapper .a3-metabox-item.closed .handlediv:before { + content: "\e005"!important; +} +.a3-metabox-wrapper .a3-metabox-item.open .handlediv:before { + content: "\e004"!important; +} + +.a3-metabox-panel-wrap { + background: #fff; + padding-left: 146px; + box-sizing: border-box; +} +.a3-metabox-wrapper, .a3-metabox-options-panel { + float: right; + width: 100%; +} +.a3-metabox-wrapper p.toolbar, +.a3-metabox-options-panel .a3-metabox-items, +.a3-metabox-options-panel p.toolbar { + padding-left: 15px!important; + padding-right: 15px!important; +} +.a3-metabox-tabs-back { + position: absolute; + top: 0; + left: 0; + bottom: 0; + background: #f5f5f5; + width: 145px; + border-right: 1px solid #DFDFDF; +} +ul.a3-metabox-data-tabs { + background: #f5f5f5; + line-height: 1em; + float: left; + width: 145px; + margin: 0 0 0 -146px; + position: relative; + padding: 0 0 10px; +} +ul.a3-metabox-data-tabs li { + display: block; + padding: 0; + margin: 0; +} +ul.a3-metabox-data-tabs li a { + padding: 10px; + line-height: 18px!important; + margin: 0; + display: block; + background: #f5f5f5; + text-decoration: none; + border-bottom: 1px solid #f5f5f5; + border-top: 1px solid #eaeaea; +} +ul.a3-metabox-data-tabs li:first-child a { + border-top: 0 !important; +} +ul.a3-metabox-data-tabs li.active a { + border-color: #DFDFDF; + position: relative; + background-color: #fff; + color: #555; + margin: 0 -1px 0 0; +} +.a3-metabox-panel, .a3-metabox-options-panel { + padding: 0; + color: #555 +} +.a3-metabox-panel table.form-table td label, +.a3-metabox-panel table.form-table td span, +.a3-metabox-panel table.form-table td a, +.a3-metabox-panel table.form-table td input, +.a3-metabox-panel table.form-table td select, +.a3-metabox-panel table.form-table td *, +.a3-metabox-panel table.form-table td, +.a3-metabox-panel * { + font-size: 13px; +} +.a3-metabox-panel table td { + padding: 10px 15px; +} + +.a3-metabox-wrapper .toolbar { + margin: 0!important; + border-top: 1px solid #fff; + border-bottom: 1px solid #DFDFDF; + padding: 9px 15px!important; +} +.a3-metabox-wrapper .toolbar:first-child { + border-top: 0 +} +.a3-metabox-wrapper .toolbar:last-child { + border-bottom: 0 +} +.a3-metabox-wrapper p.toolbar { + overflow: hidden; + zoom: 1; +} +.a3-metabox-wrapper .a3-metabox-items { + border-bottom: 1px solid #DFDFDF; +} +.a3-metabox-wrapper .a3-metabox-item-sortable-placeholder { + border-color: #bbb; + background-color: #f5f5f5; + margin-bottom: 9px; + border-width: 1px; + border-style: dashed; +} +.a3-metabox-wrapper .a3-metabox-item { + background: #fff; + border-bottom: 1px solid #DFDFDF; + margin: 0!important; +} +.a3-metabox-wrapper .a3-metabox-item:last-of-type { + border-bottom: 0 none; +} +.a3-metabox-wrapper .a3-metabox-item .handlediv:before { + line-height: 1!important; +} +.a3-metabox-wrapper .a3-metabox-item.closed h3 { + border: 0; +} +.a3-metabox-wrapper .a3-metabox-item h3 { + margin: 0!important; + padding: 10px 15px !important; + font-size: 1em!important; + overflow: hidden; + zoom: 1; + cursor: move; + position: relative; +} +.a3-metabox-wrapper .a3-metabox-item h3 span { + font-weight: 400; +} +.a3-metabox-wrapper .a3-metabox-item.open h3 { + cursor: ne-resize; +} +.a3-metabox-wrapper .a3-metabox-item.closed h3 { + cursor: sw-resize; +} +.a3-metabox-wrapper .a3-metabox-item h3 button { + float: right; +} +.a3-metabox-wrapper .a3-metabox-item h3 strong { + line-height: 1; +} +.a3-metabox-wrapper .a3-metabox-item h3 .handlediv { + background-position: 6px 5px!important; + height: 24px; + width: 24px; + position: absolute; + z-index: 1000; + right: 0; +} +.a3-metabox-wrapper .a3-metabox-item h3.fixed { + cursor: pointer!important; +} +.a3-metabox-wrapper .a3-metabox-item h3:hover .handlediv { + display: block; +} +.a3-metabox-wrapper .a3-metabox-item table { + width: 100%; + position: relative; + background: #fff; + padding: 0px; + margin: 0px; +} +.a3-metabox-wrapper .a3-metabox-item h3 table { + margin: 0; +} +.a3-metabox-wrapper .a3-metabox-item h3 table td:first-child { + width: 27%; +} +.a3-metabox-panel table tr td:first-child { + width: 27%; +} +.a3-metabox-wrapper .a3-metabox-item table td { + text-align: left; + vertical-align: top; + border: 0 +} +.a3-metabox-wrapper .a3-metabox-item h3 table td { + padding: 0; +} +.a3-metabox-wrapper .a3-metabox-item table td label { + text-align: left; + display: block; + line-height: 21px; +} +.a3-metabox-wrapper .close_all, .a3-metabox-wrapper .expand_all { + float: right; + margin-left: 14px; + line-height: 22px; + text-decoration: none +} +@media only screen and (max-width: 900px) { + .a3-metabox-panel-wrap { + padding-left: 35px; + } + .a3-metabox-tabs-back { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 28px; + border-right: 1px solid #DFDFDF; + } + ul.a3-metabox-data-tabs { + width: 28px; + margin-left: -35px; + } + ul.a3-metabox-data-tabs li a { + overflow: hidden; + white-space: nowrap; + } + .a3-metabox-tabs-back, ul.a3-metabox-data-tabs { + width: 40px; + } + ul.a3-metabox-data-tabs li a { + position: relative; + text-indent: -999px; + padding: 10px; + } + ul.a3-metabox-data-tabs li a:before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + text-indent: 0; + text-align: center; + line-height: 40px; + width: 40px; + height: 40px; + } + .a3-metabox-wrapper, .a3-metabox-options-panel { + width: 98%; + } +} diff --git a/admin/assets/css/a3_admin_metabox.rtl.css b/admin/assets/css/a3_admin_metabox.rtl.css new file mode 100644 index 0000000..4bf9ec8 --- /dev/null +++ b/admin/assets/css/a3_admin_metabox.rtl.css @@ -0,0 +1,78 @@ +.clear { + clear: both; +} +.nobr { + white-space: nowrap; +} +.a3-metabox-panel-wrap { + padding-left: 0px; + padding-right: 146px; +} +.a3-metabox-panel-wrap .a3-metabox-tabs-back { + left: auto; + right: 0; + border-left: 1px solid #DFDFDF; + border-right: none; +} +.a3-metabox-panel-wrap ul.a3-metabox-data-tabs { + float: right; + margin: 0 -146px 0 0; +} +.a3-metabox-panel-wrap ul.a3-metabox-data-tabs li.active a { + margin: 0 0 0 -1px; +} +.a3-metabox-wrapper, +.a3-metabox-options-panel { + float: left; +} +.a3-metabox-wrapper .a3-metabox-items, +.a3-metabox-wrapper p.toolbar, +.a3-metabox-options-panel .a3-metabox-items, +.a3-metabox-options-panel p.toolbar { + padding-left: 20px !important; + padding-right: 12px !important; +} +.a3-metabox-wrapper .close_all, +.a3-metabox-wrapper .expand_all { + float: left; + margin-left: 0px; + margin-right: 14px; +} +.a3-metabox-wrapper .a3-metabox-item table td { + text-align: right; +} +.a3-metabox-wrapper .a3-metabox-item table td label { + text-align: right; +} +.a3-metabox-wrapper .a3-metabox-item h3 .handlediv { + left: 0; + right: auto; +} +@media only screen and (max-width: 900px) { + .a3-metabox-panel-wrap { + padding-left: 0px; + padding-right: 35px; + } + .a3-metabox-panel-wrap .a3-metabox-tabs-back { + left: auto; + left: 0; + border-left: 1px solid #DFDFDF; + border-right: none; + } + .a3-metabox-panel-wrap ul.a3-metabox-data-tabs { + margin-left: 0px; + margin-right: -35px; + } + .a3-metabox-panel-wrap ul.a3-metabox-data-tabs li a:after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + text-indent: 0; + text-align: center; + line-height: 40px; + width: 40px; + height: 40px; + } +} diff --git a/admin/assets/css/a3_admin_metabox.rtl.less b/admin/assets/css/a3_admin_metabox.rtl.less new file mode 100644 index 0000000..f2ea995 --- /dev/null +++ b/admin/assets/css/a3_admin_metabox.rtl.less @@ -0,0 +1,106 @@ +@import "mixins.less"; + +/*-------------------------------------------------------------------------------------------*/ +/* A3rev Admin Metabox RTL UI */ +/*-------------------------------------------------------------------------------------------*/ + +.a3-metabox-panel-wrap { + padding-left: 0px; + padding-right: 146px; + + .a3-metabox-tabs-back { + left: auto; + right: 0; + border-left: 1px solid #DFDFDF; + border-right: none; + } + + ul { + &.a3-metabox-data-tabs { + float: right; + margin: 0 -146px 0 0; + + li { + &.active { + a { + margin: 0 0 0 -1px; + } + } + } + } + } +} + +.a3-metabox-wrapper, .a3-metabox-options-panel { + float: left; + + .a3-metabox-items, p.toolbar { + padding-left: 20px !important; + padding-right: 12px !important; + } +} + +.a3-metabox-wrapper { + .close_all, .expand_all { + float: left; + margin-left: 0px; + margin-right: 14px; + } + + .a3-metabox-item { + table { + td { + text-align: right; + + label { + text-align: right; + } + } + } + h3 { + .handlediv { + left: 0; + right: auto; + + } + } + } +} + +@media only screen and (max-width: 900px) { + .a3-metabox-panel-wrap { + padding-left: 0px; + padding-right: 35px; + + .a3-metabox-tabs-back { + left: auto; + left: 0; + border-left: 1px solid #DFDFDF; + border-right: none; + } + + ul { + &.a3-metabox-data-tabs { + margin-left: 0px; + margin-right: -35px; + + li { + a { + &:after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + text-indent: 0; + text-align: center; + line-height: 40px; + width: 40px; + height: 40px; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/admin/assets/css/a3_admin_metabox.rtl.min.css b/admin/assets/css/a3_admin_metabox.rtl.min.css new file mode 100644 index 0000000..af9ea94 --- /dev/null +++ b/admin/assets/css/a3_admin_metabox.rtl.min.css @@ -0,0 +1 @@ +.clear{clear:both}.nobr{white-space:nowrap}.a3-metabox-panel-wrap{padding-left:0px;padding-right:146px}.a3-metabox-panel-wrap .a3-metabox-tabs-back{left:auto;right:0;border-left:1px solid #DFDFDF;border-right:none}.a3-metabox-panel-wrap ul.a3-metabox-data-tabs{float:right;margin:0 -146px 0 0}.a3-metabox-panel-wrap ul.a3-metabox-data-tabs li.active a{margin:0 0 0 -1px}.a3-metabox-wrapper,.a3-metabox-options-panel{float:left}.a3-metabox-wrapper .a3-metabox-items,.a3-metabox-wrapper p.toolbar,.a3-metabox-options-panel .a3-metabox-items,.a3-metabox-options-panel p.toolbar{padding-left:20px !important;padding-right:12px !important}.a3-metabox-wrapper .close_all,.a3-metabox-wrapper .expand_all{float:left;margin-left:0px;margin-right:14px}.a3-metabox-wrapper .a3-metabox-item table td{text-align:right}.a3-metabox-wrapper .a3-metabox-item table td label{text-align:right}.a3-metabox-wrapper .a3-metabox-item h3 .handlediv{left:0;right:auto}@media only screen and (max-width: 900px){.a3-metabox-panel-wrap{padding-left:0px;padding-right:35px}.a3-metabox-panel-wrap .a3-metabox-tabs-back{left:auto;left:0;border-left:1px solid #DFDFDF;border-right:none}.a3-metabox-panel-wrap ul.a3-metabox-data-tabs{margin-left:0px;margin-right:-35px}.a3-metabox-panel-wrap ul.a3-metabox-data-tabs li a:after{position:absolute;top:0;right:0;bottom:0;left:0;text-indent:0;text-align:center;line-height:40px;width:40px;height:40px}} \ No newline at end of file diff --git a/admin/assets/css/admin-flat-ui-style.css b/admin/assets/css/admin-flat-ui-style.css new file mode 100644 index 0000000..a4527e6 --- /dev/null +++ b/admin/assets/css/admin-flat-ui-style.css @@ -0,0 +1,209 @@ +/*-------------------------------------------------------------------------------------------*/ +/* A3rev Panel UI FLAT */ +/*-------------------------------------------------------------------------------------------*/ +@charset "UTF-8"; + +.a3rev_panel_container input[type="text"], .a3rev_panel_container input[type="email"] , .a3rev_panel_container input[type="number"], .a3rev_panel_container input[type="password"] { height:auto !important; } + +/* Font Control */ +.a3rev_panel_container .a3rev-ui-typography-preview { height:24px; margin-top: 1px; vertical-align: top; } + +/* Color Control */ +.a3rev_panel_container .wp-picker-container, .a3rev_panel_container .wp-picker-container:active { vertical-align:bottom; } +.a3rev_panel_container .wp-color-result { top:1px !important; vertical-align: top !important; } +.a3rev_panel_container input.a3rev-color-picker { font-family: open sans !important; margin-top: 1px !important;} +.a3rev_panel_container input.wp-picker-default { margin-top: 1px !important; vertical-align:top; } + +/* Settings Preview */ +.a3rev_panel_container .a3rev-ui-settings-preview { height:24px; margin-top: 1px; vertical-align: top; } + +/* Border Rounded Corner Control */ +.a3rev_panel_container .a3rev-ui-border_corner-span { float:left; width:150px; } +.a3rev_panel_container .forminp-border_corner .iPhoneCheckContainer .iPhoneCheckLabelOff, .a3rev_panel_container .forminp-border_corner .iOSCheckContainer .iOSCheckLabelOff { + background: #569aef !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid #666666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + color: #FFFFFF !important; + text-shadow: none !important; +} + +/* Box Shadow Control */ +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iPhoneCheckContainer, .a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iOSCheckContainer { top:0px; vertical-align:top; } +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iPhoneCheckContainer .iPhoneCheckLabelOff, .a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iOSCheckContainer .iOSCheckLabelOff { + background: #569aef !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid #666666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + color: #FFFFFF !important; + text-shadow: none !important; +} + +/* SLIDER Control */ +.a3rev_panel_container .a3rev-ui-slide { + background: #ededed !important; + border: 1px solid #666 !important; + border-radius: 3px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + + height: 10px; + width: 220px; + position:relative; + float:left; + margin-top:4px; +} +.a3rev_panel_container .a3rev-ui-slide .ui-slider-handle { + background: #666 !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid #666 !important; + border-radius: 3px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + + position: absolute; + z-index: 2; + width: 22px; + height: 23px; + cursor: pointer; + font-weight: bold; + color: #1C94C4; + outline: none; + top: -8px; + margin-left: -11px; +} +.a3rev_panel_container .a3rev-ui-slide .ui-slider-range { + background: #569aef !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid #666 !important; + border-left:none !important; + border-radius: 3px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + + position: absolute; + top: -1px; + height: 100%; +} + +/* OnOff Radio Control */ +.a3rev_panel_container .forminp-onoff_radio li .iPhoneCheckContainer label { + margin:0 !important; +} + +/* OnOff Checkbox & Radio Control */ +.a3rev_panel_container .iPhoneCheckContainer label, .a3rev_panel_container .iOSCheckContainer label { + white-space: nowrap; + font-size: 14px; + line-height: 23px; + font-weight: bold; + font-family: inherit !important; + cursor: pointer; + display: block; + position: absolute; + width: auto; + top: 0; + overflow: hidden; + user-select: none; + -moz-user-select: none; + -khtml-user-select: none; +} +.a3rev_panel_container label.iPhoneCheckLabelOff, .a3rev_panel_container label.iOSCheckLabelOff { + background: #ededed !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid #666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + height: 23px; + color: #000 !important; + text-shadow: none !important; + text-align: right; + right: 0; +} +.a3rev_panel_container label.iPhoneCheckLabelOn, .a3rev_panel_container label.iOSCheckLabelOn { + background: #569aef !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid #666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + height: 23px; + text-align:left; + color: #FFFFFF; + text-shadow: none !important; + left: 0; +} +.a3rev_panel_container .iPhoneCheckHandle, .a3rev_panel_container .iOSCheckHandle { + background: #666 !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid #666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + display: block; + cursor: pointer; + position: absolute; + top: 0px; + left: -1px; + width: 35px; + height:23px; +} + +/* Switcher Checkbox Control */ +.a3rev_panel_container .forminp-switcher_checkbox .iPhoneCheckContainer .iPhoneCheckLabelOff, .a3rev_panel_container .forminp-switcher_checkbox .iOSCheckContainer .iOSCheckLabelOff { + background: #569aef !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid #666666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + color: #FFFFFF !important; + text-shadow: none !important; +} + +/* Style for Chosen lib */ +.chosen-container-single .chosen-single { + background: #FFF !important; +} +.chosen-container-active .chosen-single-with-drop { + background: #FFF !important; +} +.chosen-container-multi .chosen-choices .search-choice { + background: #e4e4e4 !important; + -webkit-box-shadow: none !important; + -moz-box-shadow : none !important; + box-shadow : none !important; +} + +/* Thickbox of Uploader */ +#media-upload .ui-sortable .media-item { + clear:both; +} + +@media screen and ( max-width: 782px ) { + #media-items { + width:100%; + } + .media-item .describe input[type="text"], .media-item .describe textarea { + width:100%; + } +} diff --git a/admin/assets/css/admin-flat-ui-style.min.css b/admin/assets/css/admin-flat-ui-style.min.css new file mode 100644 index 0000000..10a7e5b --- /dev/null +++ b/admin/assets/css/admin-flat-ui-style.min.css @@ -0,0 +1,27 @@ +.a3rev_panel_container input[type="text"],.a3rev_panel_container input[type="email"],.a3rev_panel_container input[type="number"],.a3rev_panel_container input[type="password"]{height:auto !important} +.a3rev_panel_container .a3rev-ui-typography-preview{height:24px;margin-top:1px;vertical-align:top} +.a3rev_panel_container .wp-picker-container,.a3rev_panel_container .wp-picker-container:active{vertical-align:bottom} +.a3rev_panel_container .wp-color-result{top:1px !important;vertical-align:top !important} +.a3rev_panel_container input.a3rev-color-picker{font-family:open sans !important;margin-top:1px !important} +.a3rev_panel_container input.wp-picker-default{margin-top:1px !important;vertical-align:top} +.a3rev_panel_container .a3rev-ui-settings-preview{height:24px;margin-top:1px;vertical-align:top} +.a3rev_panel_container .a3rev-ui-border_corner-span{float:left;width:150px} +.a3rev_panel_container .forminp-border_corner .iPhoneCheckContainer .iPhoneCheckLabelOff,.a3rev_panel_container .forminp-border_corner .iOSCheckContainer .iOSCheckLabelOff{background:#569aef !important;box-shadow:none !important;-webkit-box-shadow:none !important;border:1px solid #666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;color:#fff !important;text-shadow:none !important} +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iPhoneCheckContainer,.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iOSCheckContainer{top:0;vertical-align:top} +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iPhoneCheckContainer .iPhoneCheckLabelOff,.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iOSCheckContainer .iOSCheckLabelOff{background:#569aef !important;box-shadow:none !important;-webkit-box-shadow:none !important;border:1px solid #666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;color:#fff !important;text-shadow:none !important} +.a3rev_panel_container .a3rev-ui-slide{background:#ededed !important;border:1px solid #666 !important;border-radius:3px;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;height:10px;width:220px;position:relative;float:left;margin-top:4px} +.a3rev_panel_container .a3rev-ui-slide .ui-slider-handle{background:#666 !important;box-shadow:none !important;-webkit-box-shadow:none !important;border:1px solid #666 !important;border-radius:3px;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;position:absolute;z-index:2;width:22px;height:23px;cursor:pointer;font-weight:bold;color:#1c94c4;outline:0;top:-8px;margin-left:-11px} +.a3rev_panel_container .a3rev-ui-slide .ui-slider-range{background:#569aef !important;box-shadow:none !important;-webkit-box-shadow:none !important;border:1px solid #666 !important;border-left:none !important;border-radius:3px;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;position:absolute;top:-1px;height:100%} +.a3rev_panel_container .forminp-onoff_radio li .iPhoneCheckContainer label{margin:0 !important} +.a3rev_panel_container .iPhoneCheckContainer label,.a3rev_panel_container .iOSCheckContainer label{white-space:nowrap;font-size:14px;line-height:23px;font-weight:bold;font-family:inherit !important;cursor:pointer;display:block;position:absolute;width:auto;top:0;overflow:hidden;user-select:none;-moz-user-select:none;-khtml-user-select:none} +.a3rev_panel_container label.iPhoneCheckLabelOff,.a3rev_panel_container label.iOSCheckLabelOff{background:#ededed !important;box-shadow:none !important;-webkit-box-shadow:none !important;border:1px solid #666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;height:23px;color:#000 !important;text-shadow:none !important;text-align:right;right:0} +.a3rev_panel_container label.iPhoneCheckLabelOn,.a3rev_panel_container label.iOSCheckLabelOn{background:#569aef !important;box-shadow:none !important;-webkit-box-shadow:none !important;border:1px solid #666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;height:23px;text-align:left;color:#fff;text-shadow:none !important;left:0} +.a3rev_panel_container .iPhoneCheckHandle,.a3rev_panel_container .iOSCheckHandle{background:#666 !important;box-shadow:none !important;-webkit-box-shadow:none !important;border:1px solid #666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;display:block;cursor:pointer;position:absolute;top:0;left:-1px;width:35px;height:23px} +.a3rev_panel_container .forminp-switcher_checkbox .iPhoneCheckContainer .iPhoneCheckLabelOff,.a3rev_panel_container .forminp-switcher_checkbox .iOSCheckContainer .iOSCheckLabelOff{background:#569aef !important;box-shadow:none !important;-webkit-box-shadow:none !important;border:1px solid #666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;color:#fff !important;text-shadow:none !important} +.chosen-container-single .chosen-single{background:#FFF !important} +.chosen-container-active .chosen-single-with-drop{background:#FFF !important} +.chosen-container-multi .chosen-choices .search-choice{background:#e4e4e4 !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important;box-shadow:none !important} +#media-upload .ui-sortable .media-item{clear:both} +@media screen and (max-width:782px){#media-items{width:100%} +.media-item .describe input[type="text"],.media-item .describe textarea{width:100%} +} \ No newline at end of file diff --git a/admin/assets/css/admin-ui-style.css b/admin/assets/css/admin-ui-style.css new file mode 100644 index 0000000..8df288c --- /dev/null +++ b/admin/assets/css/admin-ui-style.css @@ -0,0 +1,1064 @@ +/*-------------------------------------------------------------------------------------------*/ +/* A3rev Panel UI */ +/*-------------------------------------------------------------------------------------------*/ +@charset "UTF-8"; + +/* A3 Plugin Framework Font Icons */ + +/* GENERATE by Fontastic http://fontastic.me */ +@font-face { + font-family: "a3-plugin-framework"; + src:url("../fonts/a3-plugin-framework.eot"); + src:url("../fonts/a3-plugin-framework.eot?#iefix") format("embedded-opentype"), + url("../fonts/a3-plugin-framework.woff") format("woff"), + url("../fonts/a3-plugin-framework.ttf") format("truetype"), + url("../fonts/a3-plugin-framework.svg#a3-plugin-framework") format("svg"); + font-weight: normal; + font-style: normal; + +} + +@-webkit-keyframes progress-bar { + from { background-position: 0 0;} + to { background-position: 24px 40px;} +} +@keyframes progress-bar { + from { background-position: 0 0;} + to { background-position: 24px 40px;} +} + +[class^="a3-plugin-ui-"]:before, +[class*=" a3-plugin-ui-"]:before { + font-family: "a3-plugin-framework" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.a3-plugin-ui-a3-plugins-icon:before { + content: "a"; +} +.a3-plugin-ui-a3-rev-logo:before { + content: "b"; +} +.a3-plugin-ui-a3-thumb-icon:before { + content: "c"; +} +.a3-plugin-ui-delete-icon:before { + content: "d"; +} +.a3-plugin-ui-help-icon:before { + content: "e"; +} +.a3-plugin-ui-key-icon:before { + content: "f"; +} +.a3-plugin-ui-preview-icon:before { + content: "g"; +} +.a3-plugin-ui-refresh-icon:before { + content: "h"; +} +.a3-plugin-ui-loading-icon:before { + content: "k"; +} +.a3-plugin-ui-a3-plugins-icon-1:before { + content: "i"; +} +.a3-plugin-ui-a3-rev-logo-1:before { + content: "j"; +} + +.a3rev_panel_container { + visibility:hidden; + height:0; + overflow:hidden; + margin-top:10px; + float: left; + width: 100%; +} +.a3rev_panel_container .a3rev_panel_row { + display: table; + width: 100%; + table-layout: fixed; + clear: both; + position: relative; +} +.a3rev_panel_container .a3rev_panel_row:after { + display: table; + clear: both; + content: ''; +} +.a3rev_panel_container .a3rev_panel_column { + display: table-cell; + width: 50%; + box-sizing: border-box; + padding: 0 10px; + position: relative; + vertical-align: top; +} +.a3rev_panel_container .a3rev_panel_column:last-child { + padding-right: 0; +} +.a3rev_panel_container .a3rev_panel_column:first-child { + padding-left: 0; + padding-right: 10px; +} +.a3rev_panel_container .a3rev_panel_box { + position: relative; + border: 1px solid #e5e5e5; + -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.06); + box-shadow: 0 1px 1px rgba(0,0,0,0.06); + background: #fff; + margin-bottom: 20px; + border-radius: 0px; +} +.a3rev_panel_container .a3rev_panel_box .a3rev_panel_box { + -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.1); + box-shadow: 0 1px 1px rgba(0,0,0,0.1); +} +.a3rev_panel_container .a3rev_panel_box_handle { + padding: 8px 12px 8px 38px; + position: relative; +} +.a3rev_panel_container .a3rev_panel_box_handle .pro_feature_top_message { + text-align: left; + margin: 5px 0 0; +} +.a3rev_panel_container .a3-plugin-ui-panel-box { + cursor: pointer; + margin: 0; +} +.a3rev_panel_container .a3-plugin-ui-panel-box:before { + content: "j"; + color: #aaa; + position: absolute; + top: 7px; + left: 10px; + font-size: 20px; +} +.a3rev_panel_container .box_active .a3-plugin-ui-panel-box:before { + color: #22ef00; +} +.a3rev_panel_container .a3-plugin-ui-panel-box.box_open:before { + content: "m"; + color: #000; +} +.a3rev_panel_container .a3-plugin-ui-panel-box:hover:before { + color: #000; +} +.a3rev_panel_container .a3rev_panel_box_handle h3 { + margin: 0; +} +.a3rev_panel_container .a3rev_panel_box_handle p { + font-size: 12px; + margin: 5px 0; +} +.a3rev_panel_container .a3rev_panel_box_handle p:last-child { + margin-bottom: 0; +} +.a3rev_panel_container .a3rev_panel_box_inside { + overflow: hidden; + height: 0; + visibility: hidden; + border-top: 1px solid #eee; + padding: 0 12px; +} +.a3rev_panel_container .a3rev_panel_box_inside.box_open { + overflow: inherit; + height: auto; + visibility: visible; +} +.a3rev_panel_container .a3rev_panel_box.pro_feature_fields .a3rev_panel_box_handle { + background-color: #edfed0; +} +.a3rev_panel_container .a3rev_panel_box.pro_feature_fields .a3rev_panel_box_inside { + border-color: #7ebd14; +} +.a3rev_panel_container .a3rev_panel_inner { + clear:both; + display:block; + padding-bottom:10px; +} +.a3rev_panel_container .a3rev_panel_inner h3 { + margin-bottom:0; +} +.a3rev_panel_container .a3rev_panel_inner .form-table { + margin-bottom:0; +} +.icon32-a3rev-ui-settings { + background:url("../images/a3-plugins.png") no-repeat left top; +} + +.a3_subsubsub_section { + float: left; + width: 100%; +} + +.a3rev_panel_container input[type="text"], .a3rev_panel_container input[type="email"] , .a3rev_panel_container input[type="number"], .a3rev_panel_container input[type="password"] { height:24px; } + +/* Font Control */ +.a3rev_panel_container .a3rev-ui-typography-size { width:80px; } +.a3rev_panel_container .a3rev-ui-typography-line_height { width:80px; } +.a3rev_panel_container .a3rev-ui-typography-face { width:160px; } +.a3rev_panel_container .a3rev-ui-typography-style { width:100px; } +.a3rev_panel_container .a3rev-ui-typography-preview { display:inline-block; } + +.a3rev_panel_container .typography-preview-container .preview_remove { + background:#EEEEEE; + border: 1px solid #DDDDDD; + border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + -moz-border-radius: 2px 2px 2px 2px; + cursor: pointer; + height: 10px; + padding: 2px; + position: absolute; + right: -10px; + top: -10px; + width: 10px; + z-index: 99; + text-decoration:none !important; +} +.a3rev_panel_container .a3rev-ui-typography-preview-button { float: left; margin: 0px; padding-top: 0px; height:24px; line-height:24px; } +.a3rev_panel_container .typography-preview-container { clear: both; position:relative; width:50%; margin-top:10px; } +.a3rev_panel_container .typography-preview { word-wrap: break-word; clear: both; padding: 20px; border: 1px solid #CCCCCC; background: #FDFDFD; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; } +/* Class is dynamically added to the "html" tag. */ + +/* Color Control */ +.a3rev_panel_container .wp-picker-holder { position:absolute; z-index: 10000; } +.a3rev_panel_container input.wp-picker-default { height:24px !important; } +.a3rev_panel_container .wp-color-result { top:0px; } + +/* Text Input Control */ +.a3rev_panel_container .a3rev-ui-text { width:300px; max-width:70%; } + +/* Email Input Control */ +.a3rev_panel_container .a3rev-ui-email { width:300px; max-width:70%; } + +/* Number Input Control */ +.a3rev_panel_container .a3rev-ui-number { width:40px; max-width:70%; } + +/* Password Input Control */ +.a3rev_panel_container .a3rev-ui-password { width:300px; max-width:70%; } + +/* Google API KEY Control */ +.a3rev_panel_container .a3rev-ui-google_api_key { width:350px; max-width: 100%; } +.a3rev_panel_container .a3rev-ui-google-api-key-inside { margin-top: 10px; } +.a3rev_panel_container .a3rev-ui-google-valid-key-message, +.a3rev_panel_container .a3rev-ui-google-unvalid-key-message { display: none; } +.a3rev_panel_container .a3rev-ui-google-valid-key, +.a3rev_panel_container .a3rev-ui-google-unvalid-key { padding: 10px; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } +.a3rev_panel_container .a3rev-ui-google-valid-key { background-color: #dff0d8; border: 1px solid #468847; color: #468847; } +.a3rev_panel_container .a3rev-ui-google-unvalid-key { background-color: #ffebe8; border: 1px solid #dd3d36; color: #dd3d36; } +.a3rev_panel_container .a3rev-ui-google-valid-key .a3rev-ui-google-valid-key-message, +.a3rev_panel_container .a3rev-ui-google-unvalid-key .a3rev-ui-google-unvalid-key-message { display: block; } + +/* Manual Check New Version Control */ +.a3rev_panel_container .a3rev-ui-version-checking { display: none; margin-top: 6px; background-image: url('../images/loading-bottom.gif'); background-repeat: no-repeat; background-size: 100% auto; width: 16px; height: 16px; } +.a3rev_panel_container .a3rev-ui-check-version-message { font-size: 13px; } +.a3rev_panel_container .a3rev-ui-new-version-message, +.a3rev_panel_container .a3rev-ui-latest-version-message { padding: 8px 10px; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); margin-top: 8px; } +.a3rev_panel_container .a3rev-ui-latest-version-message { background-color: #dff0d8; border: 1px solid #468847; color: #468847; } +.a3rev_panel_container .a3rev-ui-new-version-message { background-color: #ffebe8; border: 1px solid #dd3d36; color: #dd3d36; } + +/* Ajax Submit Control */ +.a3rev_panel_container .a3rev-ui-ajax_submit-control, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control { + margin-bottom: 6px; +} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-button, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-button { + border-radius: 5px; + border: none; + background: #2186fa; + color: #fff; + font-size: 16px; + padding: 8px 15px; + transition: all 0.5s ease 0.1s; + cursor: pointer; + height: 40px; + box-sizing: border-box; + margin-bottom: 5px; +} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-button:hover, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-button:hover { + background: #f4741b; +} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-button.disabled, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-button.disabled { + background: #999; + cursor: default; +} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-successed, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-successed { + display: none; + color: #46b450; + font-size: 14px; + transition: all 1.5s ease 0.1s; + height: 40px; + box-sizing: border-box; +} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-errors, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-errors { + display: none; + color: #dc3232; + font-size: 14px; + transition: all 1.5s ease 0.1s; +} +.a3rev_panel_container .a3rev-ui-progress-bar-wrap { + background: rgba(0, 0, 0, 0.6) none repeat scroll 0 0; + border-radius: 6px; + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.6) inset; + display: none; + padding: 3px; + width: 100%; + max-width: 600px; + position: relative; +} +.a3rev_panel_container .a3rev-ui-progress-inner { + animation: progress-bar 1s infinite linear; + -ms-animation: progress-bar 1s infinite linear; + -moz-animation: progress-bar 1s infinite linear; + -webkit-animation: progress-bar 1s infinite linear; + background: rgba(0, 0, 0, 0) repeating-linear-gradient(-45deg, #0077ff, #0077ff 10px, #c3defd 10px, #c3defd 24px) repeat scroll 0 0 / 68px 68px; + border-radius: 4px; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.75); + height: 34px; + overflow: hidden; + transition: width 2s ease 0.1s; + width: 0px; +} +.a3rev_panel_container .a3rev-ui-progressing-text, +.a3rev_panel_container .a3rev-ui-completed-text { + box-sizing: border-box; + color: #fff; + display: block; + font-size: 16px; + left: 0; + top: 0; + padding: 0px 10px; + position: absolute; + text-align: center; + text-shadow: 0px 0px 2px #000; + width: 100%; + height: 100%; + line-height: 40px; + z-index: 1; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.a3rev_panel_container .a3rev-ui-completed-text { + display: none; +} + +/* Ajax Multi Submit Control */ +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-button { + margin-bottom: 0px; +} +.a3rev_panel_container .a3rev-ui-statistics-wrap { + float: left; + width: 100%; + max-width: 600px; + margin-top: 20px; +} +.a3rev_panel_container .a3rev-ui-statistic-item { + float: left; + width: 100%; + box-sizing: border-box; + margin-bottom: 30px; +} +.a3rev_panel_container .a3rev-ui-pie-wrap { + height: 80px; + width: 80px; + margin: 0 auto 5px auto; + position: relative; +} +.a3rev_panel_container .a3rev-ui-pie-shadow { + border: 10px solid #ddd; + border-radius: 100%; + height: 100%; + width: 100%; + box-sizing: border-box; +} +.a3rev_panel_container .a3rev-ui-pie { + clip: rect(0px, 80px, 80px, 40px); + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; +} +.a3rev_panel_container .a3rev-ui-pie.pie-more-50 { + clip: rect(auto, auto, auto, auto); +} +.a3rev_panel_container .a3rev-ui-pie-half-circle { + clip: rect(0px, 40px, 80px, 0px); + border: 10px solid #3498db; + border-radius: 100%; + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + box-sizing: border-box; +} +.a3rev_panel_container .a3rev-ui-statistic-text { + text-align: center; + text-transform: uppercase; + color: #777; +} +.a3rev_panel_container .a3rev-ui-statistic-separate, +.a3rev_panel_container .a3rev-ui-statistic-current-item, +.a3rev_panel_container .a3rev-ui-statistic-total-item { + color: #000; + font-size: 25px; + margin: 0px; +} + +/* Textarea Control */ +.a3rev_panel_container .a3rev-ui-textarea { width:600px; max-width:70%; } + +/* Select Control */ +.a3rev_panel_container .a3rev-ui-select { width:160px; max-width:70%; } + +/* Multiselect Control */ +.a3rev_panel_container .a3rev-ui-multiselect { width:300px; max-width:70%; } + +/* Radio Control */ +.a3rev_panel_container .forminp-radio ul { margin:0; } + +/* Image Size Control */ +.a3rev_panel_container .a3rev-ui-image_size-width { width:40px; } +.a3rev_panel_container .a3rev-ui-image_size-height { width:40px; } +.a3rev_panel_container .a3rev-ui-image_size-crop { } + +/* Single Select Page Control */ +.a3rev_panel_container .a3rev-ui-single_select_page { width:300px; max-width:70%; } + +/* Settings Preview */ +.a3rev_panel_container .a3rev-ui-settings-preview { display:inline-block; } +.a3rev_panel_container .settings-apply-preview { padding:10px; background:#FF0; } +.a3rev_panel_container .settings-preview-container .preview_remove { + background:#EEEEEE; + border: 1px solid #DDDDDD; + border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + -moz-border-radius: 2px 2px 2px 2px; + cursor: pointer; + height: 10px; + padding: 2px; + position: absolute; + right: -10px; + top: -10px; + width: 10px; + z-index: 99; + text-decoration:none !important; +} +.a3rev_panel_container .a3rev-ui-settings-preview-button { float: left; margin: 0px; padding-top: 0px; height:24px; line-height:24px; } +.a3rev_panel_container .settings-preview-container { clear: both; position:relative; margin-top:12px; width:50%; } +.a3rev_panel_container .settings-preview { word-wrap: break-word; clear: both; padding: 30px; border: 1px solid #CCCCCC; background: #FDFDFD; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; } + +/* Border Styles Control */ +.a3rev_panel_container .a3rev-ui-border_styles-width { width:80px; } +.a3rev_panel_container .a3rev-ui-border_styles-style { width:80px; } + +/* Border Rounded Corner Control */ +.a3rev_panel_container .forminp-border_corner .desc { margin-bottom:10px !important; } +.a3rev_panel_container .forminp-border_corner .iPhoneCheckContainer { margin-right:30px; } +.a3rev_panel_container .a3rev-ui-border-corner-value-container { float:left; width:100%; } +.a3rev_panel_container .a3rev-ui-border_corner-top_left, .a3rev_panel_container .a3rev-ui-border_corner-top_right, .a3rev_panel_container .a3rev-ui-border_corner-bottom_left, .a3rev_panel_container .a3rev-ui-border_corner-bottom_right { float:left; width:100%; clear:both; padding-top:5px; } +.a3rev_panel_container .a3rev-ui-border_corner-span { float:left; width:140px; margin-bottom:8px; } +.a3rev_panel_container .a3rev-ui-border_corner-px { float:left; margin-right:10px; } +.a3rev_panel_container .forminp-border_corner .settings-apply-preview { border:1px solid #515151; } +.a3rev_panel_container .forminp-border_corner .iPhoneCheckContainer .iPhoneCheckLabelOff, .a3rev_panel_container .forminp-border_corner .iOSCheckContainer .iOSCheckLabelOff { + background: #569aef; + background: -moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5)); + background: -webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: linear-gradient(#468be0 20%, #569aef 50%, #6aa7f6 52%, #82b3f5 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + border: 1px solid #666666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + color: #FFFFFF; + text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.6); +} + +/* Background Color Control */ +.a3rev_panel_container .a3rev-ui-bg_color-enable-container { margin-top:10px; } + +/* Box Shadow Control */ +.a3rev_panel_container .a3rev-ui-box_shadow-h_shadow { width:80px; } +.a3rev_panel_container .a3rev-ui-box_shadow-v_shadow { width:80px; } +.a3rev_panel_container .a3rev-ui-box_shadow-blur { width:80px; } +.a3rev_panel_container .a3rev-ui-box_shadow-spread { width:80px; } +.a3rev_panel_container .a3rev-ui-box_shadow-enable-container { margin-top:10px; } +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iPhoneCheckContainer, .a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iOSCheckContainer { float:none; display:inline-block; margin-top:0; top:-12px; margin-right:0px; } +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iPhoneCheckContainer .iPhoneCheckLabelOff, .a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iOSCheckContainer .iOSCheckLabelOff { + background: #569aef; + background: -moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5)); + background: -webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: linear-gradient(#468be0 20%, #569aef 50%, #6aa7f6 52%, #82b3f5 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + border: 1px solid #666666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + color: #FFFFFF; + text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.6); +} + +/* Uploader Control */ +.a3rev_panel_container .a3rev-ui-upload { width:300px; height:24px; } + +/* SLIDER Control */ +.a3rev_panel_container .a3rev-ui-slide-container { + white-space:nowrap; + float:left; +} +.a3rev_panel_container .a3rev-ui-slide-container-start { + padding-left:12px; + margin-bottom:15px; + margin-right:20px; + float:left; +} +.a3rev_panel_container .a3rev-ui-slide-result-container { + float:left; + white-space:nowrap; +} +.a3rev_panel_container .a3rev-ui-slide { + background: #ededed; + background: -moz-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#ededed),color-stop(50%,#ededed),color-stop(52%,#f7f6f6),color-stop(100%,#ffffff)); + background: -webkit-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%); + background: -o-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%); + background: -ms-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%); + background: linear-gradient(#dcdcdc 20%, #ededed 50%, #f7f6f6 52%, #ffffff 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdcdc',endColorstr='#ffffff',GradientType=0); + border: 1px solid #d0d0d9; + border-radius: 3px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + + height: 10px; + width: 220px; + position:relative; + float:left; + margin-top:4px; +} +.a3rev_panel_container .a3rev-ui-slide .ui-slider-handle { + background: #569aef; + background: -moz-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#bcbcbc),color-stop(50%,#d5d5d5),color-stop(52%,#d8d8d8),color-stop(100%,#efefef)); + background: -webkit-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%); + background: -o-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%); + background: -ms-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%); + background: linear-gradient(#bcbcbc 20%, #d5d5d5 50%, #d8d8d8 52%, #efefef 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bcbcbc',endColorstr='#efefef',GradientType=0); + box-shadow: 0 1px 0px 0px #FFFFFF inset; + -webkit-box-shadow: 0 1px 0px 0px #FFFFFF inset; + border: 1px solid #999999; + border-radius: 3px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + + position: absolute; + z-index: 2; + width: 22px; + height: 23px; + cursor: pointer; + font-weight: bold; + color: #1C94C4; + outline: none; + top: -8px; + margin-left: -11px; +} +.a3rev_panel_container .a3rev-ui-slide .ui-slider-range { + background: #569aef; + background: -moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5)); + background: -webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: linear-gradient(#468be0 20%, #569aef 50%, #6aa7f6 52%, #82b3f5 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + border: 1px solid #255399; + border-radius: 3px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + + position: absolute; + top: -1px; + height: 100%; +} +.a3rev_panel_container .a3rev-ui-slider { float:left; width: 50px; padding:3px; margin-top:-1px;} + +/* Array TextFields Control */ +.a3rev_panel_container .a3rev-ui-array_textfields { width:40px; } + +/* OnOff Radio Control */ +.a3rev_panel_container .forminp-onoff_radio ul { + float:left; + width:100%; + margin:0; +} +.a3rev_panel_container .forminp-onoff_radio li { + float:left; + width:100%; + padding-top:10px; +} +.a3rev_panel_container .forminp-onoff_radio .iPhoneCheckDisabled , .a3rev_panel_container .forminp-onoff_radio .iOSCheckDisabled { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; +} + +/* OnOff Checkbox & Radio Control */ +.a3rev_panel_container .iPhoneCheckContainer, .a3rev_panel_container .iOSCheckContainer { + position: relative; + height: 25px; + cursor: pointer; + margin-right:10px; + float:left; + margin-top:-3px; +} +.a3rev_panel_container .iPhoneCheckContainer input, .a3rev_panel_container .iOSCheckContainer input { + display: none; +} +.a3rev_panel_container .iPhoneCheckContainer label, .a3rev_panel_container .iOSCheckContainer label { + white-space: nowrap; + font-size: 14px; + line-height: 24px; + font-weight: bold; + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + cursor: pointer; + display: block; + position: absolute; + width: auto; + top: 0; + overflow: hidden; + user-select: none; + -moz-user-select: none; + -khtml-user-select: none; +} +.a3rev_panel_container label.iPhoneCheckLabelOff, .a3rev_panel_container label.iOSCheckLabelOff { + background: #ededed; + background: -moz-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#ededed),color-stop(50%,#ededed),color-stop(52%,#f7f6f6),color-stop(100%,#ffffff)); + background: -webkit-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%); + background: -o-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%); + background: -ms-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%); + background: linear-gradient(#dcdcdc 20%, #ededed 50%, #f7f6f6 52%, #ffffff 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdcdc',endColorstr='#ffffff',GradientType=0); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + border: 1px solid #999999; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + height: 23px; + color: #8b8b8b; + text-shadow: 0px 0px 2px rgba(255, 255, 255, 0.6); + text-align: right; + right: 0; +} +.a3rev_panel_container label.iPhoneCheckLabelOff span, .a3rev_panel_container label.iOSCheckLabelOff span { + padding-right: 10px; + padding-left: 0px; + display: inline-block; + text-transform:uppercase; +} +.a3rev_panel_container label.iPhoneCheckLabelOn, .a3rev_panel_container label.iOSCheckLabelOn { + background: #569aef; + background: -moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5)); + background: -webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: linear-gradient(#468be0 20%, #569aef 50%, #6aa7f6 52%, #82b3f5 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + border: 1px solid #999999; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + height: 23px; + text-align:left; + color: #FFFFFF; + text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.6); + left: 0; +} +.a3rev_panel_container label.iPhoneCheckLabelOn span, .a3rev_panel_container label.iOSCheckLabelOn span { + padding-left:10px; + display: inline-block; + text-transform:uppercase; +} +.a3rev_panel_container .iPhoneCheckHandle, .a3rev_panel_container .iOSCheckHandle { + background: #569aef; + background: -moz-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#bcbcbc),color-stop(50%,#d5d5d5),color-stop(52%,#d8d8d8),color-stop(100%,#efefef)); + background: -webkit-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%); + background: -o-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%); + background: -ms-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%); + background: linear-gradient(#bcbcbc 20%, #d5d5d5 50%, #d8d8d8 52%, #efefef 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bcbcbc',endColorstr='#efefef',GradientType=0); + box-shadow: 0 1px 0px 0px #FFFFFF inset; + -webkit-box-shadow: 0 1px 0px 0px #FFFFFF inset; + border: 1px solid #999999; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + display: block; + cursor: pointer; + position: absolute; + top: 0px; + left: -1px; + width: 35px; + height:23px; +} + +.a3rev_panel_container .iPhoneCheckDisabled , .a3rev_panel_container .iOSCheckDisabled { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50); + opacity: 0.5; +} +/* Switcher Checkbox Control */ +.a3rev_panel_container .forminp-switcher_checkbox .iPhoneCheckContainer .iPhoneCheckLabelOff, .a3rev_panel_container .forminp-switcher_checkbox .iOSCheckContainer .iOSCheckLabelOff { + background: #569aef; + background: -moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5)); + background: -webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: -ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%); + background: linear-gradient(#468be0 20%, #569aef 50%, #6aa7f6 52%, #82b3f5 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5) inset, 0 1px 0 0 rgba(250, 250, 250, 0.5); + border: 1px solid #666666; + border-radius: 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + + color: #FFFFFF; + text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.6); +} + +/* Help Tip */ +.a3rev_panel_container table.form-table th img.help_tip { + float: right; + margin: 0 -12px 0 0; +} +.a3rev_panel_container table.form-table img.help_tip { + cursor: help; + line-height: 1; + margin: -4px 0 0 5px; + padding: 0; + vertical-align: middle; +} + +/* Sub tab ui */ +.subsubsub { white-space:normal; } +.subsubsub li { white-space:nowrap ;} + +/* View Doc button */ +.a3-view-docs-button { background-color: #FFFFE0 !important; border: 1px solid #E6DB55 !important; display: inline-block !important; font-weight: normal !important; margin: 5px 10px 0 !important; text-shadow: none !important; } + +/* Style for Premium Video Box */ +#a3_plugin_premium_video_container { margin-top: 10px; } +#a3_plugin_premium_video_container .a3rev_panel_box { margin-bottom: 0px; } +#a3_plugin_premium_video_container .a3-plugin-ui-panel-box { color: #006799; cursor: default; } +#a3_plugin_premium_video_container .a3-plugin-ui-panel-box::before { + color: #006799; + content: "f"; +} +#a3_plugin_premium_video_container .a3rev_panel_video_box { + border-top: 1px solid #eee; + overflow: hidden; + padding: 0; + position: relative; +} +#a3_plugin_premium_video_container .a3rev_panel_box_left_inside, +#a3_plugin_premium_video_container .a3rev_panel_box_right_inside { + width: calc( 50% - 1px ); + padding: 12px 12px 30px 12px; + box-sizing: border-box; + float: left; +} +#a3_plugin_premium_video_container .a3rev_panel_box_separate { + width: 1px; + height: 100%; + background-color: #eee; + position: absolute; + top: 0; + left: 50%; + margin-left: -2px; +} +#a3_plugin_premium_video_container .a3-plugin-premium-image { + position: relative; + float: left; + width: 50%; + margin-right: 15px; +} +#a3_plugin_premium_video_container .a3-plugin-premium-image img { + height: auto; + width: 100%; + float: left; +} +#a3_plugin_premium_video_container .a3-plugin-premium-video-play { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: url('../images/play_video.png'); + background-repeat: no-repeat; + background-position: center center; + background-size: 80px auto; + background-color: rgba(0, 0, 0, 0.2); +} +#a3_plugin_premium_video_container .a3-plugin-video-play:hover { + background-color: rgba(0, 0, 0, 0.6); +} + +/* Style for yellow box about Pro or Ultimate version */ +#a3_plugin_panel_container { position:relative; margin-top:10px; float: left; width: 100%; } +#a3_plugin_panel_fields { padding-right: 280px; } +#a3_plugin_panel_upgrade_area { float: right; padding-left:20px; width: 260px; margin-top: 10px; } +#a3_plugin_panel_extensions .a3_plugin_panel_extension_box { border:1px solid #E6DB55; color: #555555; margin-bottom: 17px; padding: 5px 10px; background:#fff; } +#a3_plugin_panel_extensions img { width:auto; max-width:100%; } +.pro_feature_top_message { font-size:11px; text-align:center; margin:10px 0; } +.pro_feature_fields { position: relative; border:2px solid #E6DB55;-webkit-border-radius:10px;-moz-border-radius:10px;-o-border-radius:10px; border-radius: 10px; } +.pro_feature_hidden { display: none !important; } + +/* Style for Blue message box */ +.a3rev_blue_message_box { + margin:0 !important; + background-color: #F0F8FF; + border-color: #CEE1EF; + padding:5px 10px; + border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + -moz-border-radius: 3px 3px 3px 3px; + border-style: solid; + border-width: 1px; +} +.a3rev_blue_message_box a { + color:#F00; +} + +/* Chosen Style */ +.a3rev_panel_container .chosen-container { + margin-bottom:5px; + margin-right:2px; +} + +/* Custom for each element web icons font */ +.a3-plugin-ui-delete-icon:before { + vertical-align:top; +} +.a3-plugin-ui-icon { + color:#46719d; + overflow:hidden; +} +.a3-plugin-ui-a3-rev-logo { + font-size: 170px; + height: 125px; + margin-top: -30px; +} +.a3-plugin-ui-help-icon { + color:#777; + float:right; + margin-right:-15px; + width:14px; + height:14px; + cursor:pointer; + font-size:12px; + margin-top:5px; +} +.a3-plugin-ui-preview-icon { + color: #000; + display: block; + width: 14px; + height: 16px; +} +.a3rev_panel_container .a3rev-ui-typography-preview-button span:before, .a3rev_panel_container .a3rev-ui-settings-preview-button span:before { + font-family: "a3-plugin-framework" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + content: "g"; + width: 14px; + height: 16px; + font-size:12px; +} +.a3rev_panel_container .a3rev-ui-typography-preview-button span.refresh:before, .a3rev_panel_container .a3rev-ui-settings-preview-button span.refresh:before { + content: "h" !important; +} +.wf-loading .a3rev_panel_container .typography-preview.current:before, .wf-loading .a3rev_panel_container .settings-preview.current:before { + content: "k" !important; +} +.a3-plugin-ui-delete-icon { + font-size:10px; + color:#C00; +} + +/* END A3 Plugin Framework Font Icons */ + +@media screen and ( max-width: 1100px ) { + .a3rev_panel_column .form-table th, + .a3rev_panel_column .form-table td { + display: block; + vertical-align: middle; + width: auto; + } + .a3rev_panel_column .form-table th { + border-bottom: 0; + padding-bottom: 0; + padding-top: 10px; + } + .a3rev_panel_column .form-table td { + margin-bottom: 0; + padding-bottom: 6px; + padding-left: 0; + padding-top: 4px; + } +} + +@media screen and ( min-width: 783px ) { + .a3rev_panel_container .chosen-container-multi { + min-width:300px; + } +} + +@media screen and ( max-width: 782px ) { + #a3_plugin_panel_fields { + width: 100%; + } + #a3_plugin_panel_upgrade_area { + display:none; + } + .a3rev_panel_container .pro_feature_fields { + margin-right: 0px; + } + .a3rev_panel_container input[type="text"], .a3rev_panel_container input[type="email"], .a3rev_panel_container input[type="number"], .a3rev_panel_container input[type="password"] { + min-width:50px; + width:100%; + } + .a3rev_panel_container .a3rev-ui-text { + max-width:none; + width:100%; + } + .a3rev_panel_container .a3rev-ui-textarea { + max-width:none !important; + width:100% !important; + } + .a3rev_panel_container .a3rev-ui-slider { + width:50px !important; + } + .a3rev_panel_container .typography-preview-container, .a3rev_panel_container .settings-preview-container { + width:90%; + } + .a3rev_panel_container .a3rev-ui-typography-preview-button:active, .a3rev_panel_container .a3rev-ui-settings-preview-button:active { + padding-top:inherit !important; + } + .a3rev_panel_container .wp-picker-container input.wp-color-picker[type="text"] { + width:75px !important; + padding:3px 10px !important; + } + .wp-core-ui .button.wp-picker-default { + padding:0 8px 1px; + } + .a3rev_panel_container input.a3rev-color-picker { margin-top: 1px !important;} + .a3rev_panel_container input.wp-picker-default { margin-top: 1px !important; padding:2px 8px !important; } + + .a3rev_panel_container .chosen-container-multi { + width: 100% !important; + } + .a3rev_blue_message_box_container { + width:100% !important; + } + .a3-plugin-ui-help-icon { + margin-right:0px; + } + .a3rev_panel_container .a3rev-ui-statistic-item { + width: 100% !important; + } +} + +@media screen and ( max-width: 640px ) { + .a3rev_panel_container .a3rev_panel_row { + display: block; + } + .a3rev_panel_container .a3rev_panel_column { + display: block; + width: 100%; + padding: 0; + } + .a3rev_panel_container .a3rev_panel_column:first-child, + .a3rev_panel_container .a3rev_panel_column:last-child { + padding: 0; + } +} + +@media screen and ( max-width: 600px ) { + #a3_plugin_premium_video_container .a3rev_panel_box_left_inside, + #a3_plugin_premium_video_container .a3rev_panel_box_right_inside { + width: 100%; + float: left; + } + #a3_plugin_premium_video_container .a3rev_panel_box_separate { + width: 100%; + height: 1px; + position: relative; + margin-left: 0; + float: left; + left: auto; + top: auto; + } +} + +@media screen and ( max-width: 480px ) { + .a3rev_panel_container .a3rev-ui-slide-container-start { + margin-top:5px; + } + .a3_subsubsub_section .subsubsub { + text-align:left; + } + .a3rev_panel_container .chosen-container-single { + max-width: 300px !important; + } + #a3_plugin_premium_video_container .a3-plugin-premium-image { + width: 100%; + margin-right: 0px; + margin-bottom: 10px; + } +} diff --git a/admin/assets/css/admin-ui-style.min.css b/admin/assets/css/admin-ui-style.min.css new file mode 100644 index 0000000..58a7397 --- /dev/null +++ b/admin/assets/css/admin-ui-style.min.css @@ -0,0 +1,276 @@ +@charset "UTF-8"; +@font-face{font-family:"a3-plugin-framework";src:url("../fonts/a3-plugin-framework.eot");src:url("../fonts/a3-plugin-framework.eot?#iefix") format("embedded-opentype"),url("../fonts/a3-plugin-framework.woff") format("woff"),url("../fonts/a3-plugin-framework.ttf") format("truetype"),url("../fonts/a3-plugin-framework.svg#a3-plugin-framework") format("svg");font-weight:normal;font-style:normal} +@-webkit-keyframes progress-bar{ + from{background-position:0 0} + to{background-position:24px 40px} +} +@keyframes progress-bar{ + from{background-position:0 0} + to{background-position:24px 40px} +} +[class^="a3-plugin-ui-"]:before, +[class*=" a3-plugin-ui-"]:before{font-family:"a3-plugin-framework"!important;font-style:normal!important;font-weight:normal!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} +.a3-plugin-ui-a3-plugins-icon:before{content:"a"} +.a3-plugin-ui-a3-rev-logo:before{content:"b"} +.a3-plugin-ui-a3-thumb-icon:before{content:"c"} +.a3-plugin-ui-delete-icon:before{content:"d"} +.a3-plugin-ui-help-icon:before{content:"e"} +.a3-plugin-ui-key-icon:before{content:"f"} +.a3-plugin-ui-preview-icon:before{content:"g"} +.a3-plugin-ui-refresh-icon:before{content:"h"} +.a3-plugin-ui-loading-icon:before{content:"k"} +.a3-plugin-ui-a3-plugins-icon-1:before{content:"i"} +.a3-plugin-ui-a3-rev-logo-1:before{content:"j"} +.a3rev_panel_container{visibility:hidden;height:0;overflow:hidden;margin-top:10px;float:left;width:100%} +.a3rev_panel_container .a3rev_panel_row{display:table;width:100%;table-layout:fixed;clear:both;position:relative} +.a3rev_panel_container .a3rev_panel_row:after{display:table;clear:both;content:''} +.a3rev_panel_container .a3rev_panel_column{display:table-cell;width:50%;box-sizing:border-box;padding:0 10px;position:relative;vertical-align:top} +.a3rev_panel_container .a3rev_panel_column:last-child{padding-right:0} +.a3rev_panel_container .a3rev_panel_column:first-child{padding-left:0;padding-right:10px} +.a3rev_panel_container .a3rev_panel_box{position:relative;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.06);box-shadow:0 1px 1px rgba(0,0,0,0.06);background:#fff;margin-bottom:20px;border-radius:0px} +.a3rev_panel_container .a3rev_panel_box .a3rev_panel_box{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)} +.a3rev_panel_container .a3rev_panel_box_handle{padding:8px 12px 8px 38px;position:relative} +.a3rev_panel_container .a3rev_panel_box_handle .pro_feature_top_message{text-align:left;margin:5px 0 0} +.a3rev_panel_container .a3-plugin-ui-panel-box{cursor:pointer;margin:0} +.a3rev_panel_container .a3-plugin-ui-panel-box:before{content:"j";color:#aaa;position:absolute;top:7px;left:10px;font-size:20px} +.a3rev_panel_container .box_active .a3-plugin-ui-panel-box:before{color:#22ef00} +.a3rev_panel_container .a3-plugin-ui-panel-box.box_open:before{content:"m";color:#000} +.a3rev_panel_container .a3-plugin-ui-panel-box:hover:before{color:#000} +.a3rev_panel_container .a3rev_panel_box_handle h3{margin:0} +.a3rev_panel_container .a3rev_panel_box_handle p{font-size:12px;margin:5px 0} +.a3rev_panel_container .a3rev_panel_box_handle p:last-child{margin-bottom:0} +.a3rev_panel_container .a3rev_panel_box_inside{overflow:hidden;height:0;visibility:hidden;border-top:1px solid #eee;padding:0 12px} +.a3rev_panel_container .a3rev_panel_box_inside.box_open{overflow:inherit;height:auto;visibility:visible} +.a3rev_panel_container .a3rev_panel_box.pro_feature_fields .a3rev_panel_box_handle{background-color:#edfed0} +.a3rev_panel_container .a3rev_panel_box.pro_feature_fields .a3rev_panel_box_inside{border-color:#7ebd14} +.a3rev_panel_container .a3rev_panel_inner{clear:both;display:block;padding-bottom:10px} +.a3rev_panel_container .a3rev_panel_inner h3{margin-bottom:0} +.a3rev_panel_container .a3rev_panel_inner .form-table{margin-bottom:0} +.icon32-a3rev-ui-settings{background:url("../images/a3-plugins.png") no-repeat left top} +.a3_subsubsub_section{float:left;width:100%} +.a3rev_panel_container input[type="text"], +.a3rev_panel_container input[type="email"], +.a3rev_panel_container input[type="number"], +.a3rev_panel_container input[type="password"]{height:24px} +.a3rev_panel_container .a3rev-ui-typography-size{width:80px} +.a3rev_panel_container .a3rev-ui-typography-line_height{width:80px} +.a3rev_panel_container .a3rev-ui-typography-face{width:160px} +.a3rev_panel_container .a3rev-ui-typography-style{width:100px} +.a3rev_panel_container .a3rev-ui-typography-preview{display:inline-block} +.a3rev_panel_container .typography-preview-container .preview_remove{background:#EEEEEE;border:1px solid #DDDDDD;border-radius:2px 2px 2px 2px;-webkit-border-radius:2px 2px 2px 2px;-moz-border-radius:2px 2px 2px 2px;cursor:pointer;height:10px;padding:2px;position:absolute;right:-10px;top:-10px;width:10px;z-index:99;text-decoration:none!important} +.a3rev_panel_container .a3rev-ui-typography-preview-button{float:left;margin:0px;padding-top:0px;height:24px;line-height:24px} +.a3rev_panel_container .typography-preview-container{clear:both;position:relative;width:50%;margin-top:10px} +.a3rev_panel_container .typography-preview{word-wrap:break-word;clear:both;padding:20px;border:1px solid #CCCCCC;background:#FDFDFD;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px} +.a3rev_panel_container .wp-picker-holder{position:absolute;z-index:10000} +.a3rev_panel_container input.wp-picker-default{height:24px!important} +.a3rev_panel_container .wp-color-result{top:0px} +.a3rev_panel_container .a3rev-ui-text{width:300px;max-width:70%} +.a3rev_panel_container .a3rev-ui-email{width:300px;max-width:70%} +.a3rev_panel_container .a3rev-ui-number{width:40px;max-width:70%} +.a3rev_panel_container .a3rev-ui-password{width:300px;max-width:70%} +.a3rev_panel_container .a3rev-ui-google_api_key{width:350px;max-width:100%} +.a3rev_panel_container .a3rev-ui-google-api-key-inside{margin-top:10px} +.a3rev_panel_container .a3rev-ui-google-valid-key-message, +.a3rev_panel_container .a3rev-ui-google-unvalid-key-message{display:none} +.a3rev_panel_container .a3rev-ui-google-valid-key, +.a3rev_panel_container .a3rev-ui-google-unvalid-key{padding:10px;box-shadow:0 1px 1px rgba(0,0,0,0.1)} +.a3rev_panel_container .a3rev-ui-google-valid-key{background-color:#dff0d8;border:1px solid #468847;color:#468847} +.a3rev_panel_container .a3rev-ui-google-unvalid-key{background-color:#ffebe8;border:1px solid #dd3d36;color:#dd3d36} +.a3rev_panel_container .a3rev-ui-google-valid-key .a3rev-ui-google-valid-key-message, +.a3rev_panel_container .a3rev-ui-google-unvalid-key .a3rev-ui-google-unvalid-key-message{display:block} +.a3rev_panel_container .a3rev-ui-version-checking{display:none;margin-top:6px;background-image:url('../images/loading-bottom.gif');background-repeat:no-repeat;background-size:100% auto;width:16px;height:16px} +.a3rev_panel_container .a3rev-ui-check-version-message{font-size:13px} +.a3rev_panel_container .a3rev-ui-new-version-message, +.a3rev_panel_container .a3rev-ui-latest-version-message{padding:8px 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-top:8px} +.a3rev_panel_container .a3rev-ui-latest-version-message{background-color:#dff0d8;border:1px solid #468847;color:#468847} +.a3rev_panel_container .a3rev-ui-new-version-message{background-color:#ffebe8;border:1px solid #dd3d36;color:#dd3d36} +.a3rev_panel_container .a3rev-ui-ajax_submit-control, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control{margin-bottom:6px} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-button, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-button{border-radius:5px;border:none;background:#2186fa;color:#fff;font-size:16px;padding:8px 15px;transition:all 0.5s ease 0.1s;cursor:pointer;height:40px;box-sizing:border-box;margin-bottom:5px} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-button:hover, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-button:hover{background:#f4741b} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-button.disabled, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-button.disabled{background:#999;cursor:default} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-successed, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-successed{display:none;color:#46b450;font-size:14px;transition:all 1.5s ease 0.1s;height:40px;box-sizing:border-box} +.a3rev_panel_container .a3rev-ui-ajax_submit-control .a3rev-ui-ajax_submit-errors, +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-errors{display:none;color:#dc3232;font-size:14px;transition:all 1.5s ease 0.1s} +.a3rev_panel_container .a3rev-ui-progress-bar-wrap{background:rgba(0,0,0,0.6) none repeat scroll 0 0;border-radius:6px;box-shadow:0 1px 5px rgba(0,0,0,0.6) inset;display:none;padding:3px;width:100%;max-width:600px;position:relative} +.a3rev_panel_container .a3rev-ui-progress-inner{animation:progress-bar 1s infinite linear;-ms-animation:progress-bar 1s infinite linear;-moz-animation:progress-bar 1s infinite linear;-webkit-animation:progress-bar 1s infinite linear;background:rgba(0,0,0,0) repeating-linear-gradient(-45deg,#0077ff,#0077ff 10px,#c3defd 10px,#c3defd 24px) repeat scroll 0 0 / 68px 68px;border-radius:4px;box-shadow:0 1px 0 rgba(0,0,0,0.75);height:34px;overflow:hidden;transition:width 2s ease 0.1s;width:0px} +.a3rev_panel_container .a3rev-ui-progressing-text, +.a3rev_panel_container .a3rev-ui-completed-text{box-sizing:border-box;color:#fff;display:block;font-size:16px;left:0;top:0;padding:0px 10px;position:absolute;text-align:center;text-shadow:0px 0px 2px #000;width:100%;height:100%;line-height:40px;z-index:1;white-space:nowrap;text-overflow:ellipsis;overflow:hidden} +.a3rev_panel_container .a3rev-ui-completed-text{display:none} +.a3rev_panel_container .a3rev-ui-ajax_multi_submit-control .a3rev-ui-ajax_multi_submit-button{margin-bottom:0px} +.a3rev_panel_container .a3rev-ui-statistics-wrap{float:left;width:100%;max-width:600px;margin-top:20px} +.a3rev_panel_container .a3rev-ui-statistic-item{float:left;width:100%;box-sizing:border-box;margin-bottom:30px} +.a3rev_panel_container .a3rev-ui-pie-wrap{height:80px;width:80px;margin:0 auto 5px auto;position:relative} +.a3rev_panel_container .a3rev-ui-pie-shadow{border:10px solid #ddd;border-radius:100%;height:100%;width:100%;box-sizing:border-box} +.a3rev_panel_container .a3rev-ui-pie{clip:rect(0px,80px,80px,40px);height:100%;width:100%;position:absolute;left:0;top:0} +.a3rev_panel_container .a3rev-ui-pie.pie-more-50{clip:rect(auto,auto,auto,auto)} +.a3rev_panel_container .a3rev-ui-pie-half-circle{clip:rect(0px,40px,80px,0px);border:10px solid #3498db;border-radius:100%;height:100%;width:100%;position:absolute;left:0;top:0;box-sizing:border-box} +.a3rev_panel_container .a3rev-ui-statistic-text{text-align:center;text-transform:uppercase;color:#777} +.a3rev_panel_container .a3rev-ui-statistic-separate, +.a3rev_panel_container .a3rev-ui-statistic-current-item, +.a3rev_panel_container .a3rev-ui-statistic-total-item{color:#000;font-size:25px;margin:0px} +.a3rev_panel_container .a3rev-ui-textarea{width:600px;max-width:70%} +.a3rev_panel_container .a3rev-ui-select{width:160px;max-width:70%} +.a3rev_panel_container .a3rev-ui-multiselect{width:300px;max-width:70%} +.a3rev_panel_container .forminp-radio ul{margin:0} +.a3rev_panel_container .a3rev-ui-image_size-width{width:40px} +.a3rev_panel_container .a3rev-ui-image_size-height{width:40px} +.a3rev_panel_container .a3rev-ui-image_size-crop{} +.a3rev_panel_container .a3rev-ui-single_select_page{width:300px;max-width:70%} +.a3rev_panel_container .a3rev-ui-settings-preview{display:inline-block} +.a3rev_panel_container .settings-apply-preview{padding:10px;background:#FF0} +.a3rev_panel_container .settings-preview-container .preview_remove{background:#EEEEEE;border:1px solid #DDDDDD;border-radius:2px 2px 2px 2px;-webkit-border-radius:2px 2px 2px 2px;-moz-border-radius:2px 2px 2px 2px;cursor:pointer;height:10px;padding:2px;position:absolute;right:-10px;top:-10px;width:10px;z-index:99;text-decoration:none!important} +.a3rev_panel_container .a3rev-ui-settings-preview-button{float:left;margin:0px;padding-top:0px;height:24px;line-height:24px} +.a3rev_panel_container .settings-preview-container{clear:both;position:relative;margin-top:12px;width:50%} +.a3rev_panel_container .settings-preview{word-wrap:break-word;clear:both;padding:30px;border:1px solid #CCCCCC;background:#FDFDFD;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px} +.a3rev_panel_container .a3rev-ui-border_styles-width{width:80px} +.a3rev_panel_container .a3rev-ui-border_styles-style{width:80px} +.a3rev_panel_container .forminp-border_corner .desc{margin-bottom:10px!important} +.a3rev_panel_container .forminp-border_corner .iPhoneCheckContainer{margin-right:30px} +.a3rev_panel_container .a3rev-ui-border-corner-value-container{float:left;width:100%} +.a3rev_panel_container .a3rev-ui-border_corner-top_left, +.a3rev_panel_container .a3rev-ui-border_corner-top_right, +.a3rev_panel_container .a3rev-ui-border_corner-bottom_left, +.a3rev_panel_container .a3rev-ui-border_corner-bottom_right{float:left;width:100%;clear:both;padding-top:5px} +.a3rev_panel_container .a3rev-ui-border_corner-span{float:left;width:140px;margin-bottom:8px} +.a3rev_panel_container .a3rev-ui-border_corner-px{float:left;margin-right:10px} +.a3rev_panel_container .forminp-border_corner .settings-apply-preview{border:1px solid #515151} +.a3rev_panel_container .forminp-border_corner .iPhoneCheckContainer .iPhoneCheckLabelOff, +.a3rev_panel_container .forminp-border_corner .iOSCheckContainer .iOSCheckLabelOff{background:#569aef;background:-moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5));background:-webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:linear-gradient(#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0);box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);border:1px solid #666666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;color:#FFFFFF;text-shadow:0px 0px 2px rgba(0,0,0,0.6)} +.a3rev_panel_container .a3rev-ui-bg_color-enable-container{margin-top:10px} +.a3rev_panel_container .a3rev-ui-box_shadow-h_shadow{width:80px} +.a3rev_panel_container .a3rev-ui-box_shadow-v_shadow{width:80px} +.a3rev_panel_container .a3rev-ui-box_shadow-blur{width:80px} +.a3rev_panel_container .a3rev-ui-box_shadow-spread{width:80px} +.a3rev_panel_container .a3rev-ui-box_shadow-enable-container{margin-top:10px} +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iPhoneCheckContainer, +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iOSCheckContainer{float:none;display:inline-block;margin-top:0;top:-12px;margin-right:0px} +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iPhoneCheckContainer .iPhoneCheckLabelOff, +.a3rev_panel_container .forminp-box_shadow .a3rev-ui-settings-control .iOSCheckContainer .iOSCheckLabelOff{background:#569aef;background:-moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5));background:-webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:linear-gradient(#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0);box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);border:1px solid #666666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;color:#FFFFFF;text-shadow:0px 0px 2px rgba(0,0,0,0.6)} +.a3rev_panel_container .a3rev-ui-upload{width:300px;height:24px} +.a3rev_panel_container .a3rev-ui-slide-container{white-space:nowrap;float:left} +.a3rev_panel_container .a3rev-ui-slide-container-start{padding-left:12px;margin-bottom:15px;margin-right:20px;float:left} +.a3rev_panel_container .a3rev-ui-slide-result-container{float:left;white-space:nowrap} +.a3rev_panel_container .a3rev-ui-slide{background:#ededed;background:-moz-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#ededed),color-stop(50%,#ededed),color-stop(52%,#f7f6f6),color-stop(100%,#ffffff));background:-webkit-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);background:-o-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);background:-ms-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);background:linear-gradient(#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdcdc',endColorstr='#ffffff',GradientType=0);border:1px solid #d0d0d9;border-radius:3px;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;height:10px;width:220px;position:relative;float:left;margin-top:4px} +.a3rev_panel_container .a3rev-ui-slide .ui-slider-handle{background:#569aef;background:-moz-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#bcbcbc),color-stop(50%,#d5d5d5),color-stop(52%,#d8d8d8),color-stop(100%,#efefef));background:-webkit-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);background:-o-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);background:-ms-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);background:linear-gradient(#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bcbcbc',endColorstr='#efefef',GradientType=0);box-shadow:0 1px 0px 0px #FFFFFF inset;-webkit-box-shadow:0 1px 0px 0px #FFFFFF inset;border:1px solid #999999;border-radius:3px;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;position:absolute;z-index:2;width:22px;height:23px;cursor:pointer;font-weight:bold;color:#1C94C4;outline:none;top:-8px;margin-left:-11px} +.a3rev_panel_container .a3rev-ui-slide .ui-slider-range{background:#569aef;background:-moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5));background:-webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:linear-gradient(#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0);box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);border:1px solid #255399;border-radius:3px;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;position:absolute;top:-1px;height:100%} +.a3rev_panel_container .a3rev-ui-slider{float:left;width:50px;padding:3px;margin-top:-1px} +.a3rev_panel_container .a3rev-ui-array_textfields{width:40px} +.a3rev_panel_container .forminp-onoff_radio ul{float:left;width:100%;margin:0} +.a3rev_panel_container .forminp-onoff_radio li{float:left;width:100%;padding-top:10px} +.a3rev_panel_container .forminp-onoff_radio .iPhoneCheckDisabled, +.a3rev_panel_container .forminp-onoff_radio .iOSCheckDisabled{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1} +.a3rev_panel_container .iPhoneCheckContainer, +.a3rev_panel_container .iOSCheckContainer{position:relative;height:25px;cursor:pointer;margin-right:10px;float:left;margin-top:-3px} +.a3rev_panel_container .iPhoneCheckContainer input, +.a3rev_panel_container .iOSCheckContainer input{display:none} +.a3rev_panel_container .iPhoneCheckContainer label, +.a3rev_panel_container .iOSCheckContainer label{white-space:nowrap;font-size:14px;line-height:24px;font-weight:bold;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;cursor:pointer;display:block;position:absolute;width:auto;top:0;overflow:hidden;user-select:none;-moz-user-select:none;-khtml-user-select:none} +.a3rev_panel_container label.iPhoneCheckLabelOff, +.a3rev_panel_container label.iOSCheckLabelOff{background:#ededed;background:-moz-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#ededed),color-stop(50%,#ededed),color-stop(52%,#f7f6f6),color-stop(100%,#ffffff));background:-webkit-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);background:-o-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);background:-ms-linear-gradient(top,#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);background:linear-gradient(#dcdcdc 20%,#ededed 50%,#f7f6f6 52%,#ffffff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdcdc',endColorstr='#ffffff',GradientType=0);box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);border:1px solid #999999;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;height:23px;color:#8b8b8b;text-shadow:0px 0px 2px rgba(255,255,255,0.6);text-align:right;right:0} +.a3rev_panel_container label.iPhoneCheckLabelOff span, +.a3rev_panel_container label.iOSCheckLabelOff span{padding-right:10px;padding-left:0px;display:inline-block;text-transform:uppercase} +.a3rev_panel_container label.iPhoneCheckLabelOn, +.a3rev_panel_container label.iOSCheckLabelOn{background:#569aef;background:-moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5));background:-webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:linear-gradient(#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0);box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);border:1px solid #999999;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;height:23px;text-align:left;color:#FFFFFF;text-shadow:0px 0px 2px rgba(0,0,0,0.6);left:0} +.a3rev_panel_container label.iPhoneCheckLabelOn span, +.a3rev_panel_container label.iOSCheckLabelOn span{padding-left:10px;display:inline-block;text-transform:uppercase} +.a3rev_panel_container .iPhoneCheckHandle, +.a3rev_panel_container .iOSCheckHandle{background:#569aef;background:-moz-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#bcbcbc),color-stop(50%,#d5d5d5),color-stop(52%,#d8d8d8),color-stop(100%,#efefef));background:-webkit-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);background:-o-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);background:-ms-linear-gradient(top,#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);background:linear-gradient(#bcbcbc 20%,#d5d5d5 50%,#d8d8d8 52%,#efefef 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bcbcbc',endColorstr='#efefef',GradientType=0);box-shadow:0 1px 0px 0px #FFFFFF inset;-webkit-box-shadow:0 1px 0px 0px #FFFFFF inset;border:1px solid #999999;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;display:block;cursor:pointer;position:absolute;top:0px;left:-1px;width:35px;height:23px} +.a3rev_panel_container .iPhoneCheckDisabled, +.a3rev_panel_container .iOSCheckDisabled{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5} +.a3rev_panel_container .forminp-switcher_checkbox .iPhoneCheckContainer .iPhoneCheckLabelOff, +.a3rev_panel_container .forminp-switcher_checkbox .iOSCheckContainer .iOSCheckLabelOff{background:#569aef;background:-moz-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#468be0),color-stop(50%,#569aef),color-stop(52%,#6aa7f6),color-stop(100%,#82b3f5));background:-webkit-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-o-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:-ms-linear-gradient(top,#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);background:linear-gradient(#468be0 20%,#569aef 50%,#6aa7f6 52%,#82b3f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#468be0',endColorstr='#82b3f5',GradientType=0);box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.5) inset,0 1px 0 0 rgba(250,250,250,0.5);border:1px solid #666666;border-radius:5px;-webkit-border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;color:#FFFFFF;text-shadow:0px 0px 2px rgba(0,0,0,0.6)} +.a3rev_panel_container table.form-table th img.help_tip{float:right;margin:0 -12px 0 0} +.a3rev_panel_container table.form-table img.help_tip{cursor:help;line-height:1;margin:-4px 0 0 5px;padding:0;vertical-align:middle} +.subsubsub{white-space:normal} +.subsubsub li{white-space:nowrap} +.a3-view-docs-button{background-color:#FFFFE0!important;border:1px solid #E6DB55!important;display:inline-block!important;font-weight:normal!important;margin:5px 10px 0!important;text-shadow:none!important} +#a3_plugin_premium_video_container{margin-top:10px} +#a3_plugin_premium_video_container .a3rev_panel_box{margin-bottom:0px} +#a3_plugin_premium_video_container .a3-plugin-ui-panel-box{color:#006799;cursor:default} +#a3_plugin_premium_video_container .a3-plugin-ui-panel-box::before{color:#006799;content:"f"} +#a3_plugin_premium_video_container .a3rev_panel_video_box{border-top:1px solid #eee;overflow:hidden;padding:0;position:relative} +#a3_plugin_premium_video_container .a3rev_panel_box_left_inside, +#a3_plugin_premium_video_container .a3rev_panel_box_right_inside{width:calc(50% - 1px);padding:12px 12px 30px 12px;box-sizing:border-box;float:left} +#a3_plugin_premium_video_container .a3rev_panel_box_separate{width:1px;height:100%;background-color:#eee;position:absolute;top:0;left:50%;margin-left:-2px} +#a3_plugin_premium_video_container .a3-plugin-premium-image{position:relative;float:left;width:50%;margin-right:15px} +#a3_plugin_premium_video_container .a3-plugin-premium-image img{height:auto;width:100%;float:left} +#a3_plugin_premium_video_container .a3-plugin-premium-video-play{position:absolute;top:0;left:0;width:100%;height:100%;background-image:url('../images/play_video.png');background-repeat:no-repeat;background-position:center center;background-size:80px auto;background-color:rgba(0,0,0,0.2)} +#a3_plugin_premium_video_container .a3-plugin-video-play:hover{background-color:rgba(0,0,0,0.6)} +#a3_plugin_panel_container{position:relative;margin-top:10px;float:left;width:100%} +#a3_plugin_panel_fields{padding-right:280px} +#a3_plugin_panel_upgrade_area{float:right;padding-left:20px;width:260px;margin-top:10px} +#a3_plugin_panel_extensions .a3_plugin_panel_extension_box{border:1px solid #E6DB55;color:#555555;margin-bottom:17px;padding:5px 10px;background:#fff} +#a3_plugin_panel_extensions img{width:auto;max-width:100%} +.pro_feature_top_message{font-size:11px;text-align:center;margin:10px 0} +.pro_feature_fields{position:relative;border:2px solid #E6DB55;-webkit-border-radius:10px;-moz-border-radius:10px;-o-border-radius:10px;border-radius:10px} +.pro_feature_hidden{display:none!important} +.a3rev_blue_message_box{margin:0!important;background-color:#F0F8FF;border-color:#CEE1EF;padding:5px 10px;border-radius:3px 3px 3px 3px;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-style:solid;border-width:1px} +.a3rev_blue_message_box a{color:#F00} +.a3rev_panel_container .chosen-container{margin-bottom:5px;margin-right:2px} +.a3-plugin-ui-delete-icon:before{vertical-align:top} +.a3-plugin-ui-icon{color:#46719d;overflow:hidden} +.a3-plugin-ui-a3-rev-logo{font-size:170px;height:125px;margin-top:-30px} +.a3-plugin-ui-help-icon{color:#777;float:right;margin-right:-15px;width:14px;height:14px;cursor:pointer;font-size:12px;margin-top:5px} +.a3-plugin-ui-preview-icon{color:#000;display:block;width:14px;height:16px} +.a3rev_panel_container .a3rev-ui-typography-preview-button span:before, +.a3rev_panel_container .a3rev-ui-settings-preview-button span:before{font-family:"a3-plugin-framework"!important;font-style:normal!important;font-weight:normal!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"g";width:14px;height:16px;font-size:12px} +.a3rev_panel_container .a3rev-ui-typography-preview-button span.refresh:before, +.a3rev_panel_container .a3rev-ui-settings-preview-button span.refresh:before{content:"h"!important} +.wf-loading .a3rev_panel_container .typography-preview.current:before, +.wf-loading .a3rev_panel_container .settings-preview.current:before{content:"k"!important} +.a3-plugin-ui-delete-icon{font-size:10px;color:#C00} +@media screen and (max-width:1100px){ + .a3rev_panel_column .form-table th, + .a3rev_panel_column .form-table td{display:block;vertical-align:middle;width:auto} + .a3rev_panel_column .form-table th{border-bottom:0;padding-bottom:0;padding-top:10px} + .a3rev_panel_column .form-table td{margin-bottom:0;padding-bottom:6px;padding-left:0;padding-top:4px} +} +@media screen and (min-width:783px){ + .a3rev_panel_container .chosen-container-multi{min-width:300px} +} +@media screen and (max-width:782px){ + #a3_plugin_panel_fields{width:100%} + #a3_plugin_panel_upgrade_area{display:none} + .a3rev_panel_container .pro_feature_fields{margin-right:0px} + .a3rev_panel_container input[type="text"], + .a3rev_panel_container input[type="email"], + .a3rev_panel_container input[type="number"], + .a3rev_panel_container input[type="password"]{min-width:50px;width:100%} + .a3rev_panel_container .a3rev-ui-text{max-width:none;width:100%} + .a3rev_panel_container .a3rev-ui-textarea{max-width:none!important;width:100%!important} + .a3rev_panel_container .a3rev-ui-slider{width:50px!important} + .a3rev_panel_container .typography-preview-container, + .a3rev_panel_container .settings-preview-container{width:90%} + .a3rev_panel_container .a3rev-ui-typography-preview-button:active, + .a3rev_panel_container .a3rev-ui-settings-preview-button:active{padding-top:inherit!important} + .a3rev_panel_container .wp-picker-container input.wp-color-picker[type="text"]{width:75px!important;padding:3px 10px!important} + .wp-core-ui .button.wp-picker-default{padding:0 8px 1px} + .a3rev_panel_container input.a3rev-color-picker{margin-top:1px!important} + .a3rev_panel_container input.wp-picker-default{margin-top:1px!important;padding:2px 8px!important} + .a3rev_panel_container .chosen-container-multi{width:100%!important} + .a3rev_blue_message_box_container{width:100%!important} + .a3-plugin-ui-help-icon{margin-right:0px} + .a3rev_panel_container .a3rev-ui-statistic-item{width:100%!important} +} +@media screen and (max-width:640px){ + .a3rev_panel_container .a3rev_panel_row{display:block} + .a3rev_panel_container .a3rev_panel_column{display:block;width:100%;padding:0} + .a3rev_panel_container .a3rev_panel_column:first-child, + .a3rev_panel_container .a3rev_panel_column:last-child{padding:0} +} +@media screen and (max-width:600px){ + #a3_plugin_premium_video_container .a3rev_panel_box_left_inside, + #a3_plugin_premium_video_container .a3rev_panel_box_right_inside{width:100%;float:left} + #a3_plugin_premium_video_container .a3rev_panel_box_separate{width:100%;height:1px;position:relative;margin-left:0;float:left;left:auto;top:auto} +} +@media screen and (max-width:480px){ + .a3rev_panel_container .a3rev-ui-slide-container-start{margin-top:5px} + .a3_subsubsub_section .subsubsub{text-align:left} + .a3rev_panel_container .chosen-container-single{max-width:300px!important} + #a3_plugin_premium_video_container .a3-plugin-premium-image{width:100%;margin-right:0px;margin-bottom:10px} +} \ No newline at end of file diff --git a/admin/assets/css/admin-ui-style.rtl.css b/admin/assets/css/admin-ui-style.rtl.css new file mode 100644 index 0000000..6f0e086 --- /dev/null +++ b/admin/assets/css/admin-ui-style.rtl.css @@ -0,0 +1,156 @@ +.clear { + clear: both; +} +.nobr { + white-space: nowrap; +} +body.rtl .a3rev_panel_container { + font-family: "Open Sans", sans-serif; +} +.a3rev_panel_container .a3rev_panel_box_handle { + padding: 8px 38px 8px 12px; +} +.a3rev_panel_container .a3rev_panel_box_handle .pro_feature_top_message { + text-align: right; +} +.a3rev_panel_container .a3-plugin-ui-panel-box:before { + left: auto; + right: 10px; +} +.a3rev_panel_container code { + float: right; +} +.a3rev_panel_container .chosen-container { + margin-right: 0px; + margin-left: 2px; +} +.a3rev_panel_container .chosen-container .chosen-drop { + left: auto; + right: -9999px; +} +.a3rev_panel_container .chosen-container.chosen-with-drop .chosen-drop { + left: auto; + right: 0; +} +.a3rev_panel_container .chosen-container.chosen-container-multi .chosen-choices li.search-choice { + margin-left: 0px; + margin-right: 5px; + float: left; + padding-left: 20px; + padding-right: 5px; +} +.a3rev_panel_container .chosen-container.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { + left: 3px; + right: auto; +} +.a3rev_panel_container span.description { + margin-right: 5px; +} +.a3rev_panel_container .typography-preview-container .preview_remove, +.a3rev_panel_container .settings-preview-container .preview_remove { + left: -10px; + right: auto; +} +.a3rev_panel_container .a3rev-ui-settings-preview-button { + float: right; +} +.a3rev_panel_container .forminp-border_corner .iPhoneCheckContainer { + margin-left: 30px; + margin-right: 0px; +} +.a3rev_panel_container .forminp-border_corner .a3rev-ui-border-corner-value-container { + float: right; +} +.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-top_left, +.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-top_right, +.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-bottom_left, +.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-bottom_right { + float: right; +} +.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-span { + float: right; +} +.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-px { + float: right; + margin-left: 10px; + margin-right: 0px; +} +.a3rev_panel_container .a3rev-ui-slide-container { + float: right; +} +.a3rev_panel_container .a3rev-ui-slide-container-start { + padding-left: 20px; + margin-right: 12px; + float: right; +} +.a3rev_panel_container .a3rev-ui-slide-result-container { + float: right; +} +.a3rev_panel_container .a3rev-ui-slider { + float: right; +} +.a3rev_panel_container .a3rev-ui-slide { + float: right; +} +.a3rev_panel_container .forminp-onoff_radio ul, +.a3rev_panel_container .forminp-onoff_radio li { + float: right; +} +.a3rev_panel_container .iPhoneCheckContainer, +.a3rev_panel_container .iOSCheckContainer { + margin-left: 10px; + margin-right: 0px; + float: right; +} +.a3rev_panel_container label.iPhoneCheckLabelOff, +.a3rev_panel_container label.iOSCheckLabelOff { + text-align: left; + left: 0; + right: auto; +} +.a3rev_panel_container label.iPhoneCheckLabelOff span, +.a3rev_panel_container label.iOSCheckLabelOff span { + padding-right: 0px; + padding-left: 10px; +} +.a3rev_panel_container label.iPhoneCheckLabelOn, +.a3rev_panel_container label.iOSCheckLabelOn { + text-align: right; + left: auto; + right: 0; +} +.a3rev_panel_container label.iPhoneCheckLabelOn span, +.a3rev_panel_container label.iOSCheckLabelOn span { + padding-left: 0px; + padding-right: 10px; +} +.a3rev_panel_container .iPhoneCheckHandle, +.a3rev_panel_container .iOSCheckHandle { + left: auto; + right: -1px; +} +.a3rev_panel_container .a3rev-ui-array_textfields-container label { + float: right; + margin-left: 5px; +} +.a3rev_panel_container table.form-table th img.help_tip { + float: left; + margin: 0 0 0 -12px; +} +.a3rev_panel_container table.form-table img.help_tip { + margin: -4px 5px 0 0; +} +#a3_plugin_panel_fields { + padding-left: 280px; + padding-right: 0px; +} +#a3_plugin_panel_upgrade_area { + padding-left: 0px; + padding-right: 20px; + float: left; +} +.a3-plugin-ui-help-icon { + float: left; + margin-left: -15px; + margin-right: 0px; +} diff --git a/admin/assets/css/admin-ui-style.rtl.less b/admin/assets/css/admin-ui-style.rtl.less new file mode 100644 index 0000000..deaa75d --- /dev/null +++ b/admin/assets/css/admin-ui-style.rtl.less @@ -0,0 +1,208 @@ +@import "mixins.less"; + +/*-------------------------------------------------------------------------------------------*/ +/* A3rev Panel RTL UI */ +/*-------------------------------------------------------------------------------------------*/ + +body.rtl { + .a3rev_panel_container { + font-family: "Open Sans",sans-serif; + } +} +.a3rev_panel_container { + + .a3rev_panel_box_handle { + padding: 8px 38px 8px 12px; + + .pro_feature_top_message { + text-align: right; + } + } + + .a3-plugin-ui-panel-box { + &:before { + left: auto; + right: 10px; + } + } + + code { + float: right; + } + + /* Chosen RTL */ + .chosen-container { + margin-right: 0px; + margin-left: 2px; + + .chosen-drop { + left: auto; + right: -9999px; + } + &.chosen-with-drop { + .chosen-drop { + left: auto; + right: 0; + } + } + &.chosen-container-multi { + .chosen-choices { + li.search-choice { + margin-left: 0px; + margin-right: 5px; + float: left; + padding-left: 20px; + padding-right: 5px; + + .search-choice-close { + left: 3px; + right: auto; + } + } + } + } + } + + /* Description */ + span.description { + margin-right: 5px; + } + + /* Preview Remove Button */ + .typography-preview-container, .settings-preview-container { + .preview_remove { + left: -10px; + right: auto; + } + + } + .a3rev-ui-settings-preview-button { + float: right; + } + + /* Border Rounded Corner Control */ + .forminp-border_corner { + .iPhoneCheckContainer { + margin-left: 30px; + margin-right: 0px; + } + + .a3rev-ui-border-corner-value-container { + float: right; + } + + .a3rev-ui-border_corner-top_left, .a3rev-ui-border_corner-top_right, .a3rev-ui-border_corner-bottom_left, .a3rev-ui-border_corner-bottom_right { + float: right; + } + + .a3rev-ui-border_corner-span { + float: right; + } + + .a3rev-ui-border_corner-px { + float: right; + margin-left: 10px; + margin-right: 0px; + } + } + + /* SLIDER Control */ + .a3rev-ui-slide-container { + float: right; + } + .a3rev-ui-slide-container-start { + padding-left: 20px; + margin-right: 12px; + float: right; + } + .a3rev-ui-slide-result-container { + float: right; + } + .a3rev-ui-slider { + float: right; + } + .a3rev-ui-slide { + float: right; + } + + /* OnOff Radio Control */ + .forminp-onoff_radio { + ul, li { + float: right; + } + } + + /* OnOff Checkbox & Radio Control */ + .iPhoneCheckContainer, .iOSCheckContainer { + margin-left: 10px; + margin-right: 0px; + float: right; + } + label.iPhoneCheckLabelOff, label.iOSCheckLabelOff { + text-align: left; + left: 0; + right: auto; + + span { + padding-right: 0px; + padding-left: 10px; + } + } + label.iPhoneCheckLabelOn, label.iOSCheckLabelOn { + text-align: right; + left: auto; + right: 0; + + span { + padding-left: 0px; + padding-right: 10px; + } + } + + .iPhoneCheckHandle, .iOSCheckHandle { + left: auto; + right: -1px; + } + + /* TextFields */ + .a3rev-ui-array_textfields-container { + label { + float: right; + margin-left: 5px; + } + } + + /* Help Tip */ + table { + &.form-table { + th { + img.help_tip { + float: left; + margin: 0 0 0 -12px; + } + } + + img.help_tip { + margin: -4px 5px 0 0; + } + } + } +} + +/* Style for yellow box about Pro or Ultimate version */ +#a3_plugin_panel_fields { + padding-left: 280px; + padding-right: 0px; +} +#a3_plugin_panel_upgrade_area { + padding-left: 0px; + padding-right:20px; + float: left; +} + +/* Custom for each element web icons font */ +.a3-plugin-ui-help-icon { + float: left; + margin-left: -15px; + margin-right: 0px; +} \ No newline at end of file diff --git a/admin/assets/css/admin-ui-style.rtl.min.css b/admin/assets/css/admin-ui-style.rtl.min.css new file mode 100644 index 0000000..b133f9f --- /dev/null +++ b/admin/assets/css/admin-ui-style.rtl.min.css @@ -0,0 +1 @@ +.clear{clear:both}.nobr{white-space:nowrap}body.rtl .a3rev_panel_container{font-family:"Open Sans", sans-serif}.a3rev_panel_container .a3rev_panel_box_handle{padding:8px 38px 8px 12px}.a3rev_panel_container .a3rev_panel_box_handle .pro_feature_top_message{text-align:right}.a3rev_panel_container .a3-plugin-ui-panel-box:before{left:auto;right:10px}.a3rev_panel_container code{float:right}.a3rev_panel_container .chosen-container{margin-right:0px;margin-left:2px}.a3rev_panel_container .chosen-container .chosen-drop{left:auto;right:-9999px}.a3rev_panel_container .chosen-container.chosen-with-drop .chosen-drop{left:auto;right:0}.a3rev_panel_container .chosen-container.chosen-container-multi .chosen-choices li.search-choice{margin-left:0px;margin-right:5px;float:left;padding-left:20px;padding-right:5px}.a3rev_panel_container .chosen-container.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{left:3px;right:auto}.a3rev_panel_container span.description{margin-right:5px}.a3rev_panel_container .typography-preview-container .preview_remove,.a3rev_panel_container .settings-preview-container .preview_remove{left:-10px;right:auto}.a3rev_panel_container .a3rev-ui-settings-preview-button{float:right}.a3rev_panel_container .forminp-border_corner .iPhoneCheckContainer{margin-left:30px;margin-right:0px}.a3rev_panel_container .forminp-border_corner .a3rev-ui-border-corner-value-container{float:right}.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-top_left,.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-top_right,.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-bottom_left,.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-bottom_right{float:right}.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-span{float:right}.a3rev_panel_container .forminp-border_corner .a3rev-ui-border_corner-px{float:right;margin-left:10px;margin-right:0px}.a3rev_panel_container .a3rev-ui-slide-container{float:right}.a3rev_panel_container .a3rev-ui-slide-container-start{padding-left:20px;margin-right:12px;float:right}.a3rev_panel_container .a3rev-ui-slide-result-container{float:right}.a3rev_panel_container .a3rev-ui-slider{float:right}.a3rev_panel_container .a3rev-ui-slide{float:right}.a3rev_panel_container .forminp-onoff_radio ul,.a3rev_panel_container .forminp-onoff_radio li{float:right}.a3rev_panel_container .iPhoneCheckContainer,.a3rev_panel_container .iOSCheckContainer{margin-left:10px;margin-right:0px;float:right}.a3rev_panel_container label.iPhoneCheckLabelOff,.a3rev_panel_container label.iOSCheckLabelOff{text-align:left;left:0;right:auto}.a3rev_panel_container label.iPhoneCheckLabelOff span,.a3rev_panel_container label.iOSCheckLabelOff span{padding-right:0px;padding-left:10px}.a3rev_panel_container label.iPhoneCheckLabelOn,.a3rev_panel_container label.iOSCheckLabelOn{text-align:right;left:auto;right:0}.a3rev_panel_container label.iPhoneCheckLabelOn span,.a3rev_panel_container label.iOSCheckLabelOn span{padding-left:0px;padding-right:10px}.a3rev_panel_container .iPhoneCheckHandle,.a3rev_panel_container .iOSCheckHandle{left:auto;right:-1px}.a3rev_panel_container .a3rev-ui-array_textfields-container label{float:right;margin-left:5px}.a3rev_panel_container table.form-table th img.help_tip{float:left;margin:0 0 0 -12px}.a3rev_panel_container table.form-table img.help_tip{margin:-4px 5px 0 0}#a3_plugin_panel_fields{padding-left:280px;padding-right:0px}#a3_plugin_panel_upgrade_area{padding-left:0px;padding-right:20px;float:left}.a3-plugin-ui-help-icon{float:left;margin-left:-15px;margin-right:0px} \ No newline at end of file diff --git a/admin/assets/css/font-awesome.css b/admin/assets/css/font-awesome.css new file mode 100644 index 0000000..b2a5fe2 --- /dev/null +++ b/admin/assets/css/font-awesome.css @@ -0,0 +1,2086 @@ +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.5.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} diff --git a/admin/assets/css/font-awesome.min.css b/admin/assets/css/font-awesome.min.css new file mode 100644 index 0000000..d0603cb --- /dev/null +++ b/admin/assets/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.5.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"} diff --git a/admin/assets/css/mixins.less b/admin/assets/css/mixins.less new file mode 100644 index 0000000..70e7780 --- /dev/null +++ b/admin/assets/css/mixins.less @@ -0,0 +1,205 @@ +@green: green; +@red: red; +@orange: orange; +@blue: blue; +@yellow: yellow; +@white: white; +@black: black; + +.clearfix() { + *zoom:1; + &:before, + &:after { + content: " "; + display: table; + } + &:after { + clear: both; + } +} +.border_radius(@radius:4px) { + -webkit-border-radius:@radius; + border-radius:@radius; +} +.border_radius_corner(@topleft:4px, @topright:4px, @bottomleft:4px, @bottomright:4px) { + -webkit-border-top-left-radius: @topleft; + border-top-left-radius: @topleft; + -webkit-border-top-right-radius: @topright; + border-top-right-radius: @topright; + -webkit-border-bottom-left-radius: @bottomleft; + border-bottom-left-radius: @bottomleft; + -webkit-border-bottom-right-radius: @bottomright; + border-bottom-right-radius: @bottomright; +} + +.border_radius_top_left(@radius:4px) { + -webkit-border-top-left-radius: @radius; + border-top-left-radius: @radius; +} +.border_radius_top_right(@radius:4px) { + -webkit-border-top-right-radius: @radius; + border-top-right-radius: @radius; +} +.border_radius_bottom_left(@radius:4px) { + -webkit-border-bottom-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.border_radius_bottom_right(@radius:4px) { + -webkit-border-bottom-right-radius: @radius; + border-bottom-right-radius: @radius; +} + +.border_radius_right(@radius:4px) { + -webkit-border-top-right-radius: @radius; + -webkit-border-bottom-right-radius: @radius; + border-top-right-radius: @radius; + border-bottom-right-radius: @radius; +} +.border_radius_left(@radius:4px) { + -webkit-border-top-left-radius: @radius; + -webkit-border-bottom-left-radius: @radius; + border-top-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.border_radius_bottom(@radius:4px) { + -webkit-border-bottom-left-radius: @radius; + -webkit-border-bottom-right-radius: @radius; + border-bottom-left-radius: @radius; + border-bottom-right-radius: @radius; +} +.border_radius_top(@radius:4px) { + -webkit-border-top-left-radius: @radius; + -webkit-border-top-right-radius: @radius; + border-top-left-radius: @radius; + border-top-right-radius: @radius; +} +.opacity(@opacity:0.75) { + filter:~"alpha(opacity=@opacity * 100)"; + -moz-opacity:@opacity; + -khtml-opacity: @opacity; + opacity: @opacity; +} +.box_shadow_none() { + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; +} +.box_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_in:3px, @shadow_color:#888) { + box-shadow:@shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; + -webkit-box-shadow:@shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; +} +.inset_box_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_in:3px, @shadow_color:#888) { + box-shadow:inset @shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; + -webkit-box-shadow:inset @shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; +} +.text_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_color:#fff) { + text-shadow:@shadow_x @shadow_y @shadow_rad @shadow_color; +} +.vertical_gradient(@from: #000, @to: #FFF) { + background: @from; + background: -webkit-gradient(linear, left top, left bottom, from(@from), to(@to)); + background: -webkit-linear-gradient(@from, @to); + background: -moz-linear-gradient(center top, @from 0%, @to 100%); + background: -moz-gradient(center top, @from 0%, @to 100%); +} +.transition(@selector:all, @animation:ease-in-out, @duration:.2s) { + -webkit-transition:@selector @animation @duration; + -moz-transition:@selector @animation @duration; + -o-transition:@selector @animation @duration; + transition:@selector @animation @duration; +} + +.scale(@ratio:1.5){ + -webkit-transform:scale(@ratio); + -moz-transform:scale(@ratio); + -ms-transform:scale(@ratio); + -o-transform:scale(@ratio); + transform:scale(@ratio); +} + +.borderbox () { + -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ + -moz-box-sizing: border-box; /* Firefox, other Gecko */ + box-sizing: border-box; /* Opera/IE 8+ */ +} + +.clear { clear: both; } +.nobr { white-space: nowrap; } + +.darkorlighttextshadow ( @a, @opacity: 0.8 ) when (lightness(@a) >= 65%) { .text_shadow( 0, -1px, 0, rgba(0,0,0,@opacity) ); } +.darkorlighttextshadow ( @a, @opacity: 0.8 ) when (lightness(@a) < 65%) { .text_shadow( 0, 1px, 0, rgba(255,255,255,@opacity) ); } + +/** + * Objects + */ +.menu() { + .clearfix; + li { + display: inline-block; + } +} +.mediaright() { + .clearfix; + img { + float:right; + height:auto; + } +} +.medialeft() { + .clearfix; + img { + float:right; + height:auto; + } +} +.ir() { + display: block; + text-indent: -9999px; + position: relative; + height:1em; + width:1em; +} + +.margin( @top:0, @right:0px, @bottom:0px , @left:0 ){ + margin-top: @top; + margin-right: @right; + margin-bottom: @bottom; + margin-left: @left; +} + +.margin_left( @left:0 ){ + margin-left: @left; +} +.margin_right( @right:0 ){ + margin-right: @right; +} +.margin_top( @top:0 ){ + margin-top: @top; +} +.margin_bottom( @bottom:0 ){ + margin-bottom: @bottom; +} + +.padding( @top:0, @right:0px, @bottom:0px , @left:0 ){ + padding-top: @top; + padding-right: @right; + padding-bottom: @bottom; + padding-left: @left; +} + +.padding_left( @left:0 ){ + padding-left: @left; +} +.padding_right( @right:0 ){ + padding-right: @right; +} +.padding_top( @top:0 ){ + padding-top: @top; +} +.padding_bottom( @bottom:0 ){ + padding-bottom: @bottom; +} + +.background( @url, @repeat:no-repeat, @hoz:0, @ver:0, @color ){ + background: url(@url) @repeat @hoz @ver @color; +} \ No newline at end of file diff --git a/admin/assets/css/modal.css b/admin/assets/css/modal.css new file mode 100755 index 0000000..a9bb6b0 --- /dev/null +++ b/admin/assets/css/modal.css @@ -0,0 +1,172 @@ +/*! + * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ + +.modal-open { + overflow: hidden; +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10500000; + display: none; + overflow: hidden; + outline: 0; +} + +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform 0.3s ease-out; + transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out; + -webkit-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} + +.modal.show .modal-dialog { + -webkit-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 50px 10px 10px 10px; +} + +.modal-content { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10400000; + background-color: #000; +} + +.fade.show { + opacity: 1; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 15px; + border-bottom: 1px solid #eceeef; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 15px; +} + +.modal-footer { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 15px; + border-top: 1px solid #eceeef; +} + +.modal-footer > :not(:first-child) { + margin-left: .25rem; +} + +.modal-footer > :not(:last-child) { + margin-right: .25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 50px auto 30px auto; + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg { + max-width: 800px; + } +} \ No newline at end of file diff --git a/admin/assets/css/modal.min.css b/admin/assets/css/modal.min.css new file mode 100755 index 0000000..a9bb6b0 --- /dev/null +++ b/admin/assets/css/modal.min.css @@ -0,0 +1,172 @@ +/*! + * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ + +.modal-open { + overflow: hidden; +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10500000; + display: none; + overflow: hidden; + outline: 0; +} + +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform 0.3s ease-out; + transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out; + -webkit-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} + +.modal.show .modal-dialog { + -webkit-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 50px 10px 10px 10px; +} + +.modal-content { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10400000; + background-color: #000; +} + +.fade.show { + opacity: 1; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 15px; + border-bottom: 1px solid #eceeef; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 15px; +} + +.modal-footer { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 15px; + border-top: 1px solid #eceeef; +} + +.modal-footer > :not(:first-child) { + margin-left: .25rem; +} + +.modal-footer > :not(:last-child) { + margin-right: .25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 50px auto 30px auto; + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg { + max-width: 800px; + } +} \ No newline at end of file diff --git a/admin/assets/fonts/a3-metabox-plugin-framework.eot b/admin/assets/fonts/a3-metabox-plugin-framework.eot new file mode 100644 index 0000000..ddf348e Binary files /dev/null and b/admin/assets/fonts/a3-metabox-plugin-framework.eot differ diff --git a/admin/assets/fonts/a3-metabox-plugin-framework.svg b/admin/assets/fonts/a3-metabox-plugin-framework.svg new file mode 100644 index 0000000..a173aa2 --- /dev/null +++ b/admin/assets/fonts/a3-metabox-plugin-framework.svg @@ -0,0 +1,16 @@ + + + +Generated by Fontastic.me + + + + + + + + + + + + diff --git a/admin/assets/fonts/a3-metabox-plugin-framework.ttf b/admin/assets/fonts/a3-metabox-plugin-framework.ttf new file mode 100644 index 0000000..dbc8060 Binary files /dev/null and b/admin/assets/fonts/a3-metabox-plugin-framework.ttf differ diff --git a/admin/assets/fonts/a3-metabox-plugin-framework.woff b/admin/assets/fonts/a3-metabox-plugin-framework.woff new file mode 100644 index 0000000..114ce3a Binary files /dev/null and b/admin/assets/fonts/a3-metabox-plugin-framework.woff differ diff --git a/admin/assets/fonts/a3-plugin-framework.eot b/admin/assets/fonts/a3-plugin-framework.eot new file mode 100644 index 0000000..a5e558a Binary files /dev/null and b/admin/assets/fonts/a3-plugin-framework.eot differ diff --git a/admin/assets/fonts/a3-plugin-framework.svg b/admin/assets/fonts/a3-plugin-framework.svg new file mode 100644 index 0000000..90ec9fc --- /dev/null +++ b/admin/assets/fonts/a3-plugin-framework.svg @@ -0,0 +1,23 @@ + + + +Generated by Fontastic.me + + + + + + + + + + + + + + + + + + + diff --git a/admin/assets/fonts/a3-plugin-framework.ttf b/admin/assets/fonts/a3-plugin-framework.ttf new file mode 100644 index 0000000..82e2673 Binary files /dev/null and b/admin/assets/fonts/a3-plugin-framework.ttf differ diff --git a/admin/assets/fonts/a3-plugin-framework.woff b/admin/assets/fonts/a3-plugin-framework.woff new file mode 100644 index 0000000..4e3c087 Binary files /dev/null and b/admin/assets/fonts/a3-plugin-framework.woff differ diff --git a/admin/assets/fonts/fontawesome-webfont.eot b/admin/assets/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..9b6afae Binary files /dev/null and b/admin/assets/fonts/fontawesome-webfont.eot differ diff --git a/admin/assets/fonts/fontawesome-webfont.svg b/admin/assets/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..d05688e --- /dev/null +++ b/admin/assets/fonts/fontawesome-webfont.svg @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/assets/fonts/fontawesome-webfont.ttf b/admin/assets/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..26dea79 Binary files /dev/null and b/admin/assets/fonts/fontawesome-webfont.ttf differ diff --git a/admin/assets/fonts/fontawesome-webfont.woff b/admin/assets/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..dc35ce3 Binary files /dev/null and b/admin/assets/fonts/fontawesome-webfont.woff differ diff --git a/admin/assets/fonts/fontawesome-webfont.woff2 b/admin/assets/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..500e517 Binary files /dev/null and b/admin/assets/fonts/fontawesome-webfont.woff2 differ diff --git a/admin/assets/images/a3-plugins.png b/admin/assets/images/a3-plugins.png new file mode 100644 index 0000000..bad30ce Binary files /dev/null and b/admin/assets/images/a3-plugins.png differ diff --git a/admin/assets/images/help.png b/admin/assets/images/help.png new file mode 100644 index 0000000..758043f Binary files /dev/null and b/admin/assets/images/help.png differ diff --git a/admin/assets/images/ico-delete.png b/admin/assets/images/ico-delete.png new file mode 100644 index 0000000..575e5a3 Binary files /dev/null and b/admin/assets/images/ico-delete.png differ diff --git a/admin/assets/images/ico-preview.png b/admin/assets/images/ico-preview.png new file mode 100644 index 0000000..62b5daf Binary files /dev/null and b/admin/assets/images/ico-preview.png differ diff --git a/admin/assets/images/ico-refresh.png b/admin/assets/images/ico-refresh.png new file mode 100644 index 0000000..080766e Binary files /dev/null and b/admin/assets/images/ico-refresh.png differ diff --git a/admin/assets/images/loading-bottom.gif b/admin/assets/images/loading-bottom.gif new file mode 100644 index 0000000..d1bc2f8 Binary files /dev/null and b/admin/assets/images/loading-bottom.gif differ diff --git a/admin/assets/images/play_video.png b/admin/assets/images/play_video.png new file mode 100644 index 0000000..0db8dbb Binary files /dev/null and b/admin/assets/images/play_video.png differ diff --git a/admin/assets/images/slider-bg-disable.png b/admin/assets/images/slider-bg-disable.png new file mode 100644 index 0000000..48f66b6 Binary files /dev/null and b/admin/assets/images/slider-bg-disable.png differ diff --git a/admin/assets/images/slider-bg-range.png b/admin/assets/images/slider-bg-range.png new file mode 100644 index 0000000..5cad1a8 Binary files /dev/null and b/admin/assets/images/slider-bg-range.png differ diff --git a/admin/assets/images/slider-bg-track1.png b/admin/assets/images/slider-bg-track1.png new file mode 100644 index 0000000..f103809 Binary files /dev/null and b/admin/assets/images/slider-bg-track1.png differ diff --git a/admin/assets/images/slider-bg.png b/admin/assets/images/slider-bg.png new file mode 100644 index 0000000..0935e60 Binary files /dev/null and b/admin/assets/images/slider-bg.png differ diff --git a/admin/assets/images/slider-bg1.jpg b/admin/assets/images/slider-bg1.jpg new file mode 100644 index 0000000..c08c4ee Binary files /dev/null and b/admin/assets/images/slider-bg1.jpg differ diff --git a/admin/assets/images/slider-container-end-disable.png b/admin/assets/images/slider-container-end-disable.png new file mode 100644 index 0000000..6cd47f8 Binary files /dev/null and b/admin/assets/images/slider-container-end-disable.png differ diff --git a/admin/assets/images/slider-container-end.png b/admin/assets/images/slider-container-end.png new file mode 100644 index 0000000..46b05bc Binary files /dev/null and b/admin/assets/images/slider-container-end.png differ diff --git a/admin/assets/images/slider-container-start-disable.png b/admin/assets/images/slider-container-start-disable.png new file mode 100644 index 0000000..1088d42 Binary files /dev/null and b/admin/assets/images/slider-container-start-disable.png differ diff --git a/admin/assets/images/slider-container-start.png b/admin/assets/images/slider-container-start.png new file mode 100644 index 0000000..7189e1a Binary files /dev/null and b/admin/assets/images/slider-container-start.png differ diff --git a/admin/assets/images/slider-handle-disable.png b/admin/assets/images/slider-handle-disable.png new file mode 100644 index 0000000..f10a4b4 Binary files /dev/null and b/admin/assets/images/slider-handle-disable.png differ diff --git a/admin/assets/images/slider-handle.png b/admin/assets/images/slider-handle.png new file mode 100644 index 0000000..c309921 Binary files /dev/null and b/admin/assets/images/slider-handle.png differ diff --git a/admin/assets/images/slider-handle1.png b/admin/assets/images/slider-handle1.png new file mode 100644 index 0000000..7b28631 Binary files /dev/null and b/admin/assets/images/slider-handle1.png differ diff --git a/admin/assets/images/slider-handle2.png b/admin/assets/images/slider-handle2.png new file mode 100644 index 0000000..4a6c50b Binary files /dev/null and b/admin/assets/images/slider-handle2.png differ diff --git a/admin/assets/js/a3rev-settings-preview.js b/admin/assets/js/a3rev-settings-preview.js new file mode 100644 index 0000000..4adb8a4 --- /dev/null +++ b/admin/assets/js/a3rev-settings-preview.js @@ -0,0 +1,188 @@ +/** + * A3revThemes Settings Live Preview + * 2011-10-07. + * + * @description The code below is designed to generate a live preview using the + * setting specified in a "custom settings" field in the ResponsiFramework. + * + * @since 4.7.0 + */ + +(function ($) { + + a3revButtonPreview = { + + /** + * loadPreviewButtons() + * + * @description Setup a "preview" button next to each type field. + * @since 4.7.0 + */ + + loadPreviewButtons: function () { + + // Register event handlers. + a3revButtonPreview.handleEvents(); + + }, // End loadPreviewButtons() + + /** + * handleEvents() + * + * @description Handle the events. + * @since 4.7.0 + */ + + handleEvents: function () { + $(document).on( 'click', 'a.a3rev-ui-border-preview-button', function () { + a3revButtonPreview.generateBorderPreview( $( this ) ); + return false; + }); + + $(document).on( 'click', 'a.a3rev-ui-box_shadow-preview-button', function () { + a3revButtonPreview.generateBoxShadowPreview( $( this ) ); + return false; + }); + + $(document).on( 'click', 'a.preview_remove', function () { + a3revButtonPreview.closePreview( $( this ) ); + return false; + }); + }, + + /** + * closePreview() + * + * @description Close the preview. + * @since 4.7.0 + */ + + closePreview: function ( target ) { + target.parents( '.section' ).find( '.a3rev-ui-settings-preview-button .refresh' ).removeClass( 'refresh' ); + target.parents( '.settings-preview-container' ).remove(); + }, + + + /** + * generateBorderPreview() + * + * @description Generate the border preview. + * @since 4.7.0 + */ + + generateBorderPreview: function ( target ) { + var previewText = '
Grumpy wizards make toxic brew for the evil Queen and Jack.
'; + var previewHTML = ''; + var previewStyles = ''; + + // Get the control parent element. + var controls = target.parents( '.a3rev-ui-settings-control' ); + + var borderSize = controls.find( '.a3rev-ui-border_styles-width' ).val(); + var borderStyle = controls.find( '.a3rev-ui-border_styles-style' ).val(); + var borderColor = controls.find( '.a3rev-ui-border_styles-color' ).val(); + var borderRoundedCorner = 0; + if ( controls.find( '.a3rev-ui-border-corner' ).is(":checked") ) { + borderRoundedCorner = 1; + } + var borderTopLeft = controls.find( '.a3rev-ui-border_top_left_corner' ).val(); + var borderTopRight = controls.find( '.a3rev-ui-border_top_right_corner' ).val(); + var borderBottomLeft = controls.find( '.a3rev-ui-border_bottom_left_corner' ).val(); + var borderBottomRight = controls.find( '.a3rev-ui-border_bottom_right_corner' ).val(); + + // Remove "current" class from previously modified border field. + $( '.settings-preview' ).removeClass( 'current' ); + + // Construct styles. + previewStyles += 'border: ' + borderSize + ' ' + borderStyle + ' ' + borderColor + ';'; + if ( borderRoundedCorner == 1 ) { + previewStyles += ' border-radius: ' + borderTopLeft + 'px ' + borderTopRight + 'px ' + borderBottomRight + 'px ' + borderBottomLeft + 'px ;'; + previewStyles += ' -webkit-border-radius: ' + borderTopLeft + 'px ' + borderTopRight + 'px ' + borderBottomRight + 'px ' + borderBottomLeft + 'px ;'; + previewStyles += ' -moz-border-radius: ' + borderTopLeft + 'px ' + borderTopRight + 'px ' + borderBottomRight + 'px ' + borderBottomLeft + 'px ;'; + } + + // Construct preview HTML. + var previewHTMLInner = $( '
' ).addClass( 'current' ).addClass( 'settings-preview' ).html( previewText ); + + previewHTML = $( '
' ).addClass( 'settings-preview-container' ).html( previewHTMLInner ).append( ' ' ); + + // If no preview display is present, add one. + if ( ! controls.next( '.settings-preview-container' ).length ) { + previewHTML.find( '.settings-apply-preview' ).attr( 'style', previewStyles ); + controls.after( previewHTML ); + } else { + // Otherwise, just update the styles of the existing preview. + controls.next( '.settings-preview-container' ).find( '.settings-apply-preview' ).attr( 'style', previewStyles ); + } + + // Set the button to "refresh" mode. + controls.find( '.a3rev-ui-settings-preview-button span' ).addClass( 'refresh' ); + }, + + /** + * generateBoxShadowPreview() + * + * @description Generate the border preview. + * @since 4.7.0 + */ + + generateBoxShadowPreview: function ( target ) { + var previewText = '
Grumpy wizards make toxic brew for the evil Queen and Jack.
'; + var previewHTML = ''; + var previewStyles = ''; + var customStyles = ''; + + // Get the control parent element. + var controls = target.parents( '.a3rev-ui-settings-control' ); + + var hShadow = controls.find( '.a3rev-ui-box_shadow-h_shadow' ).val(); + var vShadow = controls.find( '.a3rev-ui-box_shadow-v_shadow' ).val(); + var blurSize = controls.find( '.a3rev-ui-box_shadow-blur' ).val(); + var spreadSize = controls.find( '.a3rev-ui-box_shadow-spread' ).val(); + var shadowColor = controls.find( '.a3rev-ui-box_shadow-color' ).val(); + var insetShadow = ''; + if ( controls.find( '.a3rev-ui-box_shadow-inset' ).is(":checked") ) { + insetShadow = 'inset'; + } + + // Remove "current" class from previously modified border field. + $( '.settings-preview' ).removeClass( 'current' ); + + // Construct styles. + customStyles += hShadow + ' ' + vShadow + ' ' + blurSize + ' ' + spreadSize + ' ' + shadowColor + ' ' + insetShadow ; + previewStyles += ' box-shadow: ' + customStyles + ';'; + previewStyles += ' -moz-box-shadow: ' + customStyles + ';'; + previewStyles += ' -webkit-box-shadow: ' + customStyles + ';'; + + // Construct preview HTML. + var previewHTMLInner = $( '
' ).addClass( 'current' ).addClass( 'settings-preview' ).html( previewText ); + + previewHTML = $( '
' ).addClass( 'settings-preview-container' ).html( previewHTMLInner ).append( ' ' ); + + // If no preview display is present, add one. + if ( ! controls.next( '.settings-preview-container' ).length ) { + previewHTML.find( '.settings-apply-preview' ).attr( 'style', previewStyles ); + controls.after( previewHTML ); + } else { + // Otherwise, just update the styles of the existing preview. + controls.next( '.settings-preview-container' ).find( '.settings-apply-preview' ).attr( 'style', previewStyles ); + } + + // Set the button to "refresh" mode. + controls.find( '.a3rev-ui-settings-preview-button span' ).addClass( 'refresh' ); + } + + + }; // End a3revButtonPreview Object // Don't remove this, or the sky will fall on your head. + +/*-----------------------------------------------------------------------------------*/ +/* Execute the above methods in the a3revButtonPreview object. +/*-----------------------------------------------------------------------------------*/ + + $(document).ready(function () { + + a3revButtonPreview.loadPreviewButtons(); + + }); + +})(jQuery); \ No newline at end of file diff --git a/admin/assets/js/a3rev-typography-preview.js b/admin/assets/js/a3rev-typography-preview.js new file mode 100644 index 0000000..2dab6ce --- /dev/null +++ b/admin/assets/js/a3rev-typography-preview.js @@ -0,0 +1,208 @@ +/** + * A3revThemes Typography Live Preview + * 2011-10-07. + * + * @description The code below is designed to generate a live preview using the + * setting specified in a "custom typography" field in the ResponsiFramework. + * + * @since 4.7.0 + */ + +(function ($) { + + a3revTypographyPreview = { + + /** + * loadPreviewButtons() + * + * @description Setup a "preview" button next to each typography field. + * @since 4.7.0 + */ + + loadPreviewButtons: function () { + + // Register event handlers. + a3revTypographyPreview.handleEvents(); + + }, // End loadPreviewButtons() + + /** + * handleEvents() + * + * @description Handle the events. + * @since 4.7.0 + */ + + handleEvents: function () { + $(document).on( 'click', 'a.a3rev-ui-typography-preview-button', function () { + a3revTypographyPreview.generatePreview( $( this ) ); + return false; + }); + + $(document).on( 'click', 'a.preview_remove', function () { + a3revTypographyPreview.closePreview( $( this ) ); + return false; + }); + }, + + /** + * closePreview() + * + * @description Close the preview. + * @since 4.7.0 + */ + + closePreview: function ( target ) { + target.parents( '.section' ).find( '.a3rev-ui-typography-preview-button .refresh' ).removeClass( 'refresh' ); + target.parents( '.typography-preview-container' ).remove(); + }, + + /** + * generatePreview() + * + * @description Generate the typography preview. + * @since 4.7.0 + */ + + generatePreview: function ( target ) { + var previewText = 'Grumpy wizards make toxic brew for the evil Queen and Jack.'; + var previewHTML = ''; + var previewStyles = ''; + + // Get the control parent element. + var controls = target.parents( '.a3rev-ui-typography-control' ); + + var sizeSelector = '.a3rev-ui-typography-size'; + + var fontSize = controls.find( sizeSelector ).val(); + + var fontFace = controls.find( '.a3rev-ui-typography-face' ).val(); + var fontStyle = controls.find( '.a3rev-ui-typography-style' ).val(); + var fontColor = controls.find( '.a3rev-ui-typography-color' ).val(); + var lineHeight = controls.find( '.a3rev-ui-typography-line_height' ).val(); + + // Generate array of non-Google fonts. + var nonGoogleFonts = new Array( + 'Arial, sans-serif', + 'Verdana, Geneva, sans-serif', + 'Trebuchet MS, Tahoma, sans-serif', + 'Georgia, serif', + 'Times New Roman, serif', + 'Tahoma, Geneva, Verdana, sans-serif', + 'Palatino, Palatino Linotype, serif', + 'Helvetica Neue, Helvetica, sans-serif', + 'Calibri, Candara, Segoe, Optima, sans-serif', + 'Myriad Pro, Myriad, sans-serif', + 'Lucida Grande, Lucida Sans Unicode, Lucida Sans, sans-serif', + 'Arial Black, sans-serif', + 'Gill Sans, Gill Sans MT, Calibri, sans-serif', + 'Geneva, Tahoma, Verdana, sans-serif', + 'Impact, Charcoal, sans-serif', + 'Courier, Courier New, monospace', + 'Century Gothic, sans-serif' + ); + + // Remove "current" class from previously modified typography field. + $( '.typography-preview' ).removeClass( 'current' ); + + // Prepare selected fontFace for testing. + var fontFaceTest = fontFace.replace( /"/g, '"' ); + + // Load Google WebFonts, if we need to. + if ( jQuery.inArray( fontFaceTest, nonGoogleFonts ) == -1 ) { // -1 is returned if the item is not found in the array. + + // Prepare fontFace for use in the WebFont loader. + var fontFaceString = fontFace; + + // Handle fonts that require specific weights when being included. + switch ( fontFaceString ) { + case 'Allan': + case 'Cabin Sketch': + case 'Corben': + case 'UnifrakturCook': + fontFaceString += ':700'; + break; + + case 'Buda': + case 'Open Sans Condensed': + fontFaceString += ':300'; + break; + + case 'Coda': + case 'Sniglet': + fontFaceString += ':800'; + break; + + case 'Raleway': + fontFaceString += ':100'; + break; + } + + + fontFaceString += '::latin'; + fontFaceString = fontFaceString.replace( / /g, '+' ); + + // Add the fontFace in quotes for use in the style declaration, if the selected font has a number in it. + var specificFonts = new Array( 'Goudy Bookletter 1911' ); + + if ( jQuery.inArray( fontFace, specificFonts ) > -1 ) { + var fontFace = "'" + fontFace + "'"; + } + + WebFontConfig = { + google: { families: [ fontFaceString ] } + }; + + if ( $( 'script.google-webfonts-script' ).length ) { $( 'script.google-webfonts-script' ).remove(); WebFont.load({ google: {families: [ fontFaceString ]} }); } + + (function() { + var wf = document.createElement( 'script' ); + wf.src = ('https:' == document.location.protocol ? 'https' : 'http') + + '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js'; + wf.type = 'text/javascript'; + wf.async = 'true'; + var s = document.getElementsByTagName( 'script' )[0]; + s.parentNode.insertBefore( wf, s ); + + $( wf ).addClass( 'google-webfonts-script' ); + + })(); + + } + + // Construct styles. + previewStyles += 'font: ' + fontStyle + ' ' + fontSize + '/' + lineHeight + ' ' + fontFace + ';'; + if ( fontColor ) { previewStyles += ' color: ' + fontColor + ';'; } + + // Construct preview HTML. + var previewHTMLInner = $( '
' ).addClass( 'current' ).addClass( 'typography-preview' ).text( previewText ); + + previewHTML = $( '
' ).addClass( 'typography-preview-container' ).html( previewHTMLInner ).append( ' ' ); + + // If no preview display is present, add one. + if ( ! controls.next( '.typography-preview-container' ).length ) { + previewHTML.find( '.typography-preview' ).attr( 'style', previewStyles ); + controls.after( previewHTML ); + } else { + // Otherwise, just update the styles of the existing preview. + controls.next( '.typography-preview-container' ).find( '.typography-preview' ).attr( 'style', previewStyles ); + } + + // Set the button to "refresh" mode. + controls.find( '.a3rev-ui-typography-preview-button span' ).addClass( 'refresh' ); + } + + + }; // End a3revTypographyPreview Object // Don't remove this, or the sky will fall on your head. + +/*-----------------------------------------------------------------------------------*/ +/* Execute the above methods in the a3revTypographyPreview object. +/*-----------------------------------------------------------------------------------*/ + + $(document).ready(function () { + + a3revTypographyPreview.loadPreviewButtons(); + + }); + +})(jQuery); \ No newline at end of file diff --git a/admin/assets/js/admin-ui-script.js b/admin/assets/js/admin-ui-script.js new file mode 100755 index 0000000..2d39ee2 --- /dev/null +++ b/admin/assets/js/admin-ui-script.js @@ -0,0 +1,724 @@ +(function($) { + $(document).ready(function() { + + /* Apply wp color picker */ + $('.a3rev_panel_container .a3rev-color-picker').each(function(i){ + $(this).wpColorPicker({ + change: function( event, ui ) { + //bgImage.css('background-color', ui.color.toString()); + }, + clear: function() { + //bgImage.css('background-color', ''); + } + }); + }); + + /* Apply UI slider */ + $('.a3rev_panel_container div.a3rev-ui-slide').each(function(i){ + + if( $(this).attr('min') != undefined && $(this).attr('max') != undefined ) { + + $(this).slider( { + isRTL: true, + range: "min", + min: parseInt($(this).attr('min')), + max: parseInt($(this).attr('max')), + value: parseInt($(this).parent('.a3rev-ui-slide-container-end').parent('.a3rev-ui-slide-container-start').next(".a3rev-ui-slide-result-container").children("input").val()), + step: parseInt($(this).attr('inc')) , + slide: function( event, ui ) { + $( this ).parent('.a3rev-ui-slide-container-end').parent('.a3rev-ui-slide-container-start').next(".a3rev-ui-slide-result-container").children("input").val(ui.value); + } + }); + + $(this).removeAttr('min').removeAttr('max').removeAttr('inc'); + + } + + }); + + /* Apply Box Shadow */ + $('.a3rev_panel_container input.a3rev-ui-box_shadow-enable').each(function(i){ + if ( $(this).is(':checked') ) { + $(this).parent('.forminp-box_shadow').find('.a3rev-ui-box_shadow-enable-container').css( {'visibility': 'visible', 'height' : 'auto', 'overflow' : 'inherit'} ); + } else { + $(this).parent('.forminp-box_shadow').find('.a3rev-ui-box_shadow-enable-container').css( {'visibility': 'hidden', 'height' : '0px', 'overflow' : 'hidden'} ); + } + $(this).on( "a3rev-ui-onoff_checkbox-switch", function( event, value, status ) { + if ( status == 'true') { + $(this).parents('.forminp-box_shadow').find('.a3rev-ui-box_shadow-enable-container').hide().css( {'visibility': 'visible', 'height' : 'auto', 'overflow' : 'inherit'} ).slideDown(); + } else { + $(this).parents('.forminp-box_shadow').find('.a3rev-ui-box_shadow-enable-container').show().css( {'visibility': 'hidden', 'height' : '0px', 'overflow' : 'hidden'} ).slideUp(); + } + }); + }); + + /* Apply Background Color */ + $('.a3rev_panel_container input.a3rev-ui-bg_color-enable').each(function(i){ + if ( $(this).is(':checked') ) { + $(this).parent('.forminp-bg_color').find('.a3rev-ui-bg_color-enable-container').css( {'visibility': 'visible', 'height' : 'auto', 'overflow' : 'inherit'} ); + } else { + $(this).parent('.forminp-bg_color').find('.a3rev-ui-bg_color-enable-container').css( {'visibility': 'hidden', 'height' : '0px', 'overflow' : 'hidden'} ); + } + $(this).on( "a3rev-ui-onoff_checkbox-switch", function( event, value, status ) { + if ( status == 'true') { + $(this).parents('.forminp-bg_color').find('.a3rev-ui-bg_color-enable-container').hide().css( {'visibility': 'visible', 'height' : 'auto', 'overflow' : 'inherit'} ).slideDown(); + } else { + $(this).parents('.forminp-bg_color').find('.a3rev-ui-bg_color-enable-container').show().css( {'visibility': 'hidden', 'height' : '0px', 'overflow' : 'hidden'} ).slideUp(); + } + }); + }); + + /* Apply OnOff Checbox */ + $('.a3rev_panel_container input.a3rev-ui-onoff_checkbox').each(function(i){ + var checked_label = 'ON'; + var unchecked_label = 'OFF'; + var callback = "maincheck"; + + if( $(this).attr('checked_label') != undefined ) checked_label = $(this).attr('checked_label'); + if( $(this).attr('unchecked_label') != undefined ) unchecked_label = $(this).attr('unchecked_label'); + if( $(this).attr('callback') != undefined ) callback = $(this).attr('callback'); + var input_name = $(this).attr('name'); + + /* Apply for Border Corner */ + if ( $(this).prop('checked') ) { + $(this).parents('.a3rev-ui-settings-control').find('.a3rev-ui-border-corner-value-container').css( {'display': 'block'} ); + } else { + $(this).parents('.a3rev-ui-settings-control').find('.a3rev-ui-border-corner-value-container').css( {'display': 'none'} ); + } + + $(this).iphoneStyle({ + /*resizeContainer: false,*/ + resizeHandle: false, + handleMargin: 10, + handleRadius: 5, + containerRadius: 0, + checkedLabel: checked_label, + uncheckedLabel: unchecked_label, + onChange: function(elem, value) { + var status = value.toString(); + if ( status == 'true' ) { + /* Apply for Border Corner */ + elem.parents('.a3rev-ui-settings-control').find('.a3rev-ui-border-corner-value-container').slideDown(); + + /* Apply for Google API Key */ + elem.parents('.forminp-google_api_key').find('.a3rev-ui-google-api-key-container').slideDown(); + } else { + /* Apply for Border Corner */ + elem.parents('.a3rev-ui-settings-control').find('.a3rev-ui-border-corner-value-container').slideUp(); + + /* Apply for Google API Key */ + elem.parents('.forminp-google_api_key').find('.a3rev-ui-google-api-key-container').slideUp(); + } + + $('input[name="' + input_name + '"]').trigger("a3rev-ui-onoff_checkbox-switch", [elem.val(), status]); + }, + onEnd: function(elem, value) { + var status = value.toString(); + + $('input[name="' + input_name + '"]').trigger("a3rev-ui-onoff_checkbox-switch-end", [elem.val(), status]); + } + }); + }); + + /* Apply OnOff Radio */ + $('.a3rev_panel_container input.a3rev-ui-onoff_radio').each(function(i){ + var checked_label = 'ON'; + var unchecked_label = 'OFF'; + + if( $(this).attr('checked_label') != undefined ) checked_label = $(this).attr('checked_label'); + if( $(this).attr('unchecked_label') != undefined ) unchecked_label = $(this).attr('unchecked_label'); + var input_name = $(this).attr('name'); + var current_item = $(this); + + $(this).iphoneStyle({ + /*resizeContainer: false,*/ + resizeHandle: false, + handleMargin: 10, + handleRadius: 5, + containerRadius: 0, + checkedLabel: checked_label, + uncheckedLabel: unchecked_label, + onChange: function(elem, value) { + var status = value.toString(); + if ( status == 'true') { + $('input[name="' + input_name + '"]').not(current_item).removeAttr('checked').removeAttr('checkbox-disabled').iphoneStyle("refresh"); + } + $('input[name="' + input_name + '"]').trigger("a3rev-ui-onoff_radio-switch", [elem.val(), status]); + }, + onEnd: function(elem, value) { + var status = value.toString(); + if ( status == 'true') { + $('input[name="' + input_name + '"]').not(current_item).removeAttr('checkbox-disabled'); + $(current_item).attr('checkbox-disabled', 'true'); + } + $('input[name="' + input_name + '"]').trigger("a3rev-ui-onoff_radio-switch-end", [elem.val(), status]); + } + }); + }); + + /* Apply for normal checkbox */ + $('.a3rev_panel_container .hide_options_if_checked').each(function(){ + + $(this).find('input:eq(0)').change(function() { + + if ($(this).is(':checked')) { + $(this).closest('fieldset, tr').nextUntil( '.hide_options_if_checked, .show_options_if_checked', '.hidden_option').hide(); + } else { + $(this).closest('fieldset, tr').nextUntil( '.hide_options_if_checked, .show_options_if_checked', '.hidden_option').show(); + } + + }).change(); + + }); + $('.a3rev_panel_container .show_options_if_checked').each(function(){ + + $(this).find('input:eq(0)').change(function() { + + if ($(this).is(':checked')) { + $(this).closest('fieldset, tr').nextUntil( '.hide_options_if_checked, .show_options_if_checked', '.hidden_option').show(); + } else { + $(this).closest('fieldset, tr').nextUntil( '.hide_options_if_checked, .show_options_if_checked', '.hidden_option').hide(); + } + + }).change(); + + }); + + /* Apply chosen script for dropdown */ + $(".a3rev_panel_container .chzn-select").chosen(); + $(".a3rev_panel_container .chzn-select-deselect").chosen({ allow_single_deselect:true }); + + /* Apply help tip script */ + $(".a3rev_panel_container .help_tip").tipTip({ + "attribute" : "data-tip", + "fadeIn" : 50, + "fadeOut" : 50 + }); + + /* Apply Sub tab selected script */ + $('div.a3_subsubsub_section ul.subsubsub li a:eq(0)').addClass('current'); + $('div.a3_subsubsub_section .section:gt(0)').hide(); + $('div.a3_subsubsub_section ul.subsubsub li a:gt(0)').each(function(){ + if( $(this).attr('class') == 'current') { + $('div.a3_subsubsub_section ul.subsubsub li a').removeClass('current'); + $(this).addClass('current'); + $('div.a3_subsubsub_section .section').hide(); + $('div.a3_subsubsub_section ' + $(this).attr('href') ).show(); + } + }); + $('div.a3_subsubsub_section ul.subsubsub li a').click(function(){ + var clicked = $(this); + var section = clicked.closest('.a3_subsubsub_section'); + var target = clicked.attr('href'); + + section.find('a').removeClass('current'); + + if ( section.find('.section:visible').size() > 0 ) { + section.find('.section:visible').fadeOut( 100, function() { + section.find( target ).fadeIn('fast'); + }); + } else { + section.find( target ).fadeIn('fast'); + } + + clicked.addClass('current'); + $('.last_tab').val( target ); + + return false; + }); + + $('.a3rev_panel_container').each( function(i){ + $(this).css( {'visibility': 'visible', 'height' : 'auto', 'overflow' : 'inherit'} ); + }); + + $('.a3rev_panel_box_inside').each( function(i){ + if ( $(this).hasClass('box_open') ) { + $(this).css( {'visibility': 'visible', 'height' : 'auto', 'overflow' : 'inherit'} ); + } else { + $(this).hide().css( {'visibility': 'visible', 'height' : 'auto', 'overflow' : 'inherit'} ); + } + }); + + /* Apply Setting box open & close */ + $(document).on('click', '.a3-plugin-ui-panel-box', function(){ + var box_handle = $(this).parent('.a3rev_panel_box_handle'); + var box_id = box_handle.data('box-id'); + var form_key = box_handle.data('form-key'); + + var box_data = {}; + if ( typeof a3_admin_ui_script_params != 'undefined' ) { + var box_data = { + action: a3_admin_ui_script_params.plugin + '_a3_admin_ui_event', + type: 'open_close_panel_box', + form_key: form_key, + box_id: box_id, + is_open: 0, + security: a3_admin_ui_script_params.security + }; + } + + if( $(this).hasClass('box_open') ) { + box_data.is_open = 0; + $(this).removeClass('box_open'); + box_handle.siblings('.a3rev_panel_box_inside').removeClass('box_open').slideUp(500); + } else { + box_data.is_open = 1; + $(this).addClass('box_open'); + box_handle.siblings('.a3rev_panel_box_inside').addClass('box_open').slideDown(500); + box_handle.siblings('.a3rev_panel_box_inside').find('img.rwd_image_maps').each(function(i){ + $(this).rwdImageMaps(); + }); + } + + if ( $(this).hasClass('enable_toggle_box_save') && typeof a3_admin_ui_script_params != 'undefined' ) { + $.post( a3_admin_ui_script_params.ajax_url, box_data ); + } + }); + + /* Apply Manual Check version */ + $(document).on( 'click', '.a3rev-ui-manual_check_version', function(){ + var bt_check_version = $(this); + var version_message_container = $(this).siblings('.a3rev-ui-check-version-message'); + var version_checking_status = $(this).siblings('.a3rev-ui-version-checking'); + var transient_name = bt_check_version.data('transient-name'); + if ( ! bt_check_version.hasClass('a3-version-checking') ) { + bt_check_version.addClass('a3-version-checking'); + version_checking_status.css('display', 'inline-block'); + version_message_container.slideUp(); + + var check_data = { + action: a3_admin_ui_script_params.plugin + '_a3_admin_ui_event', + type: 'check_new_version', + transient_name: transient_name, + security: a3_admin_ui_script_params.security + }; + + $.post( a3_admin_ui_script_params.ajax_url, check_data, function(response){ + bt_check_version.removeClass('a3-version-checking'); + version_checking_status.css('display', 'none'); + + // Get response + data = $.parseJSON( response ); + if ( 0 == data.has_new_version ) { + version_message_container.removeClass('a3rev-ui-new-version-message'); + version_message_container.addClass('a3rev-ui-latest-version-message'); + } else { + version_message_container.addClass('a3rev-ui-new-version-message'); + version_message_container.removeClass('a3rev-ui-latest-version-message'); + } + version_message_container.html(data.version_message); + version_message_container.slideDown(); + }); + } + }); + + /* Apply Ajax Submit */ + $(document).on( 'click', '.a3rev-ui-ajax_submit-button', function(){ + var bt_ajax_submit = $(this); + var submit_data = JSON.parse( JSON.stringify( bt_ajax_submit.data('submit_data') ) ); + if ( typeof submit_data.ajax_url == 'undefined' ) return false; + + var submit_successsed = bt_ajax_submit.siblings('.a3rev-ui-ajax_submit-successed'); + var submit_errors = bt_ajax_submit.siblings('.a3rev-ui-ajax_submit-errors'); + var progress_bar_wrap = bt_ajax_submit.siblings('.a3rev-ui-progress-bar-wrap'); + var progress_inner = progress_bar_wrap.find('.a3rev-ui-progress-inner'); + var progressing_text = progress_bar_wrap.find('.a3rev-ui-progressing-text'); + var completed_text = progress_bar_wrap.find('.a3rev-ui-completed-text'); + bt_ajax_submit.hide(); + submit_successsed.hide(); + submit_errors.hide(); + progress_bar_wrap.show(); + + // Plugin have use this control type need to get this trigger to make action from plugin + $('#' + bt_ajax_submit.attr('id') ).trigger("a3rev-ui-ajax_submit-click", [bt_ajax_submit]); + + $.ajax({ + xhr: function () { + var xhr = new window.XMLHttpRequest(); + var progressLoading = null; + + // Upload progress + xhr.upload.addEventListener("progress", function (evt) { + if (evt.lengthComputable) { + var interValTime = 1000; + var startWidth = 0; + + progressLoading = setInterval( function() { + startWidth += Math.floor((Math.random() * 10) + 1); + console.log( startWidth ); + if ( 90 <= startWidth ) { + clearInterval( progressLoading ); + } else { + progress_inner.css({ + width: startWidth + '%' + }); + } + }, interValTime ); + } + }, false); + + // Download progress + xhr.addEventListener("progress", function (evt) { + if (evt.lengthComputable) { + var percentComplete = evt.loaded / evt.total; + progress_inner.css({ + width: percentComplete * 100 + '%' + }); + + if (percentComplete === 1) { + console.log( 'process completed' ); + clearInterval( progressLoading ); + } + } + }, false); + + return xhr; + }, + + type: submit_data.ajax_type, + url: submit_data.ajax_url, + data: submit_data.data, + success: function ( response ) { + data = $.parseJSON( response ); + $('#' + bt_ajax_submit.attr('id') ).trigger("a3rev-ui-ajax_submit-completed", [ bt_ajax_submit, data ]); + + setTimeout( function() { + progressing_text.hide(); + completed_text.show(); + }, 2000 ); + + setTimeout( function() { + bt_ajax_submit.show(); + submit_successsed.show(); + progress_bar_wrap.hide(); + progressing_text.show(); + completed_text.hide(); + progress_inner.css({width: '0%'}); + }, 3000 ); + }, + error: function( e ) { + console.log(e); + + $('#' + bt_ajax_submit.attr('id') ).trigger("a3rev-ui-ajax_submit-errors", [ e, bt_ajax_submit ]); + + setTimeout( function() { + progressing_text.hide(); + completed_text.show(); + }, 2000 ); + + setTimeout( function() { + bt_ajax_submit.show(); + progress_bar_wrap.hide(); + progressing_text.show(); + completed_text.hide(); + progress_inner.css({width: '0%'}); + }, 3000 ); + } + }); + }); + + /* Apply Ajax Multi Submit */ + function a3rev_ui_ajax_submit( bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ) { + var ajax_item = multi_ajax[ajax_item_id]; + var current_items = $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-statistic-current-item').data('current'); + var total_items = ajax_item.total_items; + + // Call to next ajax if current ajax have current items equal or more than total items + if ( current_items >= total_items ) { + $('#' + bt_ajax_submit.attr('id') ).trigger('a3rev-ui-ajax_multi_submit-'+ajax_item_id+'-completed', [ bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ]); + return false; + } + + var submit_successsed = bt_ajax_submit.siblings('.a3rev-ui-ajax_multi_submit-successed'); + var submit_errors = bt_ajax_submit.siblings('.a3rev-ui-ajax_multi_submit-errors'); + var progress_bar_wrap = bt_ajax_submit.siblings('.a3rev-ui-progress-bar-wrap'); + var progress_inner = progress_bar_wrap.find('.a3rev-ui-progress-inner'); + var progressing_text = progress_bar_wrap.find('.a3rev-ui-progressing-text'); + var completed_text = progress_bar_wrap.find('.a3rev-ui-completed-text'); + + progressing_text.html( ajax_item.progressing_text ); + completed_text.html( ajax_item.completed_text ); + + progressing_text.show(); + completed_text.hide(); + + var progress_current_items = progress_inner.data('current'); + var progress_total_items = progress_inner.data('total'); + var currentPercent = progress_current_items / progress_total_items; + var maximumWidth = Math.floor( total_items / progress_total_items * 100 ); + + var submit_data = ajax_item.submit_data; + + $.ajax({ + xhr: function () { + var xhr = new window.XMLHttpRequest(); + var progressLoading = null; + + // Upload progress + xhr.upload.addEventListener("progress", function (evt) { + if (evt.lengthComputable) { + var interValTime = 1000; + var startWidth = Math.floor( currentPercent * 100 ); + if ( startWidth > 100 ) startWidth = 100; + progress_inner.css({ + width: startWidth + '%' + }); + } + }, false); + + // Download progress + xhr.addEventListener("progress", function (evt) { + if (evt.lengthComputable) { + var percentComplete = evt.loaded / evt.total; + if (percentComplete === 1) { + // progress completed + } + } + }, false); + + return xhr; + }, + + type: submit_data.ajax_type, + url: submit_data.ajax_url, + data: submit_data.data, + success: function ( response ) { + result = $.parseJSON( response ); + + new_items = result.current_items; + + increase_items = new_items - current_items; + progress_current_items += increase_items; + progress_inner.data('current', progress_current_items); + + currentPercent = progress_current_items / progress_total_items; + newWidth = Math.floor( currentPercent * 100 ); + if ( newWidth > 100 ) newWidth = 100; + progress_inner.css({ + width: newWidth + '%' + }); + + a3rev_ui_ajax_multi_statistic_change( ajax_item_id, new_items, current_items, total_items, 3000, true ); + + if ( typeof result.status != 'undefined' && 'completed' != result.status ) { + $('#' + bt_ajax_submit.attr('id') ).trigger('a3rev-ui-ajax_multi_submit-'+ajax_item_id+'-'+result.status, [ bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ]); + } else { + progressing_text.hide(); + completed_text.show(); + setTimeout( function(){ + $('#' + bt_ajax_submit.attr('id') ).trigger('a3rev-ui-ajax_multi_submit-'+ajax_item_id+'-completed', [ bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ]); + }, 2000 ); + } + }, + error: function( e ) { + console.log(e); + + // Allow trigger error + $('#' + bt_ajax_submit.attr('id') ).trigger('a3rev-ui-ajax_multi_submit-'+ajax_item_id+'-errors', [ e, bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ]); + + // Stop ajax call here + $('#' + bt_ajax_submit.attr('id') ).trigger('a3rev-ui-ajax_multi_submit-errors', [ bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ]); + + setTimeout( function() { + bt_ajax_submit.show(); + submit_successsed.hide(); + submit_errors.show(); + progress_bar_wrap.hide(); + progressing_text.show(); + completed_text.hide(); + }, 2000 ); + } + }); + + return false; + } + + function a3rev_ui_ajax_multi_statistic_circle_animation( ajax_item_id, current_point, total_point ) { + current_deg = 360; + left_deg = 360; + right_deg = 180; + if ( current_point < total_point ) { + current_deg = Math.round( current_point / total_point * 360 ); + } + + if ( current_deg <= 180 ) { + left_deg = right_deg = current_deg; + $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-pie').removeClass('pie-more-50'); + } else { + right_deg = 180; + left_deg = current_deg; + $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-pie').addClass('pie-more-50'); + } + + $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-pie-left-side').css('transform', 'rotate('+left_deg+'deg)'); + $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-pie-right-side').css('transform', 'rotate('+right_deg+'deg)'); + } + + function a3rev_ui_ajax_multi_statistic_change( ajax_item_id, new_point, current_point, total_point, duration, have_effect) { + $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-statistic-current-item').data('current', new_point ); + if ( have_effect == false ) { + $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-statistic-current-item').html(new_point); + } + + $({current_point: current_point}).animate({current_point: new_point}, { + duration: duration, + easing:'swing', // can be anything + step: function() { + if ( have_effect ) { + $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-statistic-current-item').html( Math.round( this.current_point) ); + } + a3rev_ui_ajax_multi_statistic_circle_animation( ajax_item_id, this.current_point, total_point ); + }, + complete: function() { + if ( have_effect ) { + $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-statistic-current-item').html( Math.round( this.current_point ) ); + } + a3rev_ui_ajax_multi_statistic_circle_animation( ajax_item_id, this.current_point, total_point ); + } + }); + } + + $('.a3rev_panel_container .a3rev-ui-ajax_multi_submit-button').each(function(){ + var bt_ajax_submit = $(this); + var multi_ajax_registered = JSON.parse( JSON.stringify( bt_ajax_submit.data('multi_ajax') ) ); + + $.each( multi_ajax_registered, function( i, ajax_item ){ + ajax_item_id = ajax_item.item_id; + + $(document).on( 'a3rev-ui-ajax_multi_submit-'+ajax_item_id+'-start', '#' + bt_ajax_submit.attr('id'), function( event, bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ) { + console.log( 'Start - ' + ajax_item_id ); + a3rev_ui_ajax_submit( bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ); + }); + + $(document).on( 'a3rev-ui-ajax_multi_submit-'+ajax_item_id+'-continue', '#' + bt_ajax_submit.attr('id'), function( event, bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ) { + console.log( 'Continue - ' + ajax_item_id ); + a3rev_ui_ajax_submit( bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ); + }); + + $(document).on( 'a3rev-ui-ajax_multi_submit-'+ajax_item_id+'-completed', '#' + bt_ajax_submit.attr('id'), function( event, bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ) { + console.log( 'Completed - ' + ajax_item_id ); + + // Compeleted multi ajax if don't have next ajax item id + if ( '' == ajax_next_item_id ) { + $('#' + bt_ajax_submit.attr('id') ).trigger("a3rev-ui-ajax_multi_submit-end", [bt_ajax_submit, multi_ajax]); + return false; + } + + ajax_next_item = multi_ajax[ajax_next_item_id]; + new_ajax_next_item_id = ajax_next_item.next_item_id; + + console.log('trigger - '+ajax_next_item_id); + $('#' + bt_ajax_submit.attr('id') ).trigger('a3rev-ui-ajax_multi_submit-'+ajax_next_item_id+'-start', [ bt_ajax_submit, multi_ajax, ajax_next_item_id, new_ajax_next_item_id ]); + }); + }); + + $(document).on( 'a3rev-ui-ajax_multi_submit-end', '#' + bt_ajax_submit.attr('id'), function( event, bt_ajax_submit, multi_ajax ) { + console.log( 'Completed Multi Ajax' ); + + bt_ajax_submit.data( 'resubmit', 1 ); + + var submit_successsed = bt_ajax_submit.siblings('.a3rev-ui-ajax_multi_submit-successed'); + var submit_errors = bt_ajax_submit.siblings('.a3rev-ui-ajax_multi_submit-errors'); + var progress_bar_wrap = bt_ajax_submit.siblings('.a3rev-ui-progress-bar-wrap'); + var progress_inner = progress_bar_wrap.find('.a3rev-ui-progress-inner'); + var progressing_text = progress_bar_wrap.find('.a3rev-ui-progressing-text'); + var completed_text = progress_bar_wrap.find('.a3rev-ui-completed-text'); + + progress_inner.css({ + width: '100%' + }); + + setTimeout( function() { + progressing_text.hide(); + completed_text.show(); + }, 2000 ); + + setTimeout( function() { + bt_ajax_submit.show(); + submit_successsed.show(); + submit_errors.hide(); + progress_bar_wrap.hide(); + progressing_text.show(); + completed_text.hide(); + progress_inner.css({width: '0%'}); + }, 3000 ); + }); + }); + + $(document).on( 'click', '.a3rev-ui-ajax_multi_submit-button', function(){ + var bt_ajax_submit = $(this); + var resubmit = bt_ajax_submit.data('resubmit'); + bt_ajax_submit.data('resubmit', 0); + + var multi_ajax = JSON.parse( JSON.stringify( bt_ajax_submit.data('multi_ajax') ) ); + + var submit_successsed = bt_ajax_submit.siblings('.a3rev-ui-ajax_multi_submit-successed'); + var submit_errors = bt_ajax_submit.siblings('.a3rev-ui-ajax_multi_submit-errors'); + var progress_bar_wrap = bt_ajax_submit.siblings('.a3rev-ui-progress-bar-wrap'); + var progress_inner = progress_bar_wrap.find('.a3rev-ui-progress-inner'); + var progressing_text = progress_bar_wrap.find('.a3rev-ui-progressing-text'); + var completed_text = progress_bar_wrap.find('.a3rev-ui-completed-text'); + + bt_ajax_submit.hide(); + submit_successsed.hide(); + submit_errors.hide(); + progress_bar_wrap.show(); + + // Reset progressing start point to 0 for resubmit + if ( resubmit == 1 ) { + progress_inner.data('current', 0); + } + + + // Plugin have use this control type need to get this trigger to make action from plugin + $('#' + bt_ajax_submit.attr('id') ).trigger("a3rev-ui-ajax_multi_submit-click", [bt_ajax_submit]); + + var progress_current_items = progress_inner.data('current'); + var progress_total_items = progress_inner.data('total') + var currentPercent = progress_current_items / progress_total_items; + if ( currentPercent < 1 ) { + progress_inner.animate({ + width: Math.floor( currentPercent * 100 ) + '%' + }, 0 ); + } else { + currentPercent = 0; + } + + var have_first_ajax_item = false; + var first_ajax_item = null; + $.each( multi_ajax, function( i, ajax_item ){ + if ( ! have_first_ajax_item ) { + first_ajax_item = ajax_item; + have_first_ajax_item = true; + } + ajax_item_id = ajax_item.item_id; + current_items = $('.a3rev-ui-statistic-'+ajax_item_id).find('.a3rev-ui-statistic-current-item').data('current'); + total_items = ajax_item.total_items; + + // Reset current items of each ajax to 0 for resubmit + if ( resubmit == 1 ) { + a3rev_ui_ajax_multi_statistic_change( ajax_item_id, 0, current_items, total_items, 500, false ); + } + }); + + // Just call first ajax submit + ajax_item_id = first_ajax_item.item_id; + ajax_next_item_id = first_ajax_item.next_item_id; + + $('#' + bt_ajax_submit.attr('id') ).trigger("a3rev-ui-ajax_multi_submit-start", [bt_ajax_submit, multi_ajax]); + + console.log('trigger - '+ajax_item_id); + $('#' + bt_ajax_submit.attr('id') ).trigger('a3rev-ui-ajax_multi_submit-'+ajax_item_id+'-start', [ bt_ajax_submit, multi_ajax, ajax_item_id, ajax_next_item_id ]); + + return false; + }); + + /* Apply Image Maps script */ + $('.a3rev_panel_container img.rwd_image_maps').each(function(i){ + $(this).rwdImageMaps(); + }); + + $(document).trigger("a3rev-ui-script-loaded"); + + }); +})(jQuery); diff --git a/admin/assets/js/bootstrap/modal.js b/admin/assets/js/bootstrap/modal.js new file mode 100755 index 0000000..73d203e --- /dev/null +++ b/admin/assets/js/bootstrap/modal.js @@ -0,0 +1,535 @@ +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * -------------------------------------------------------------------------- + * Bootstrap (v4.0.0-alpha.6): modal.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + +var Modal = function ($) { + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'modal'; + var VERSION = '4.0.0-alpha.6'; + var DATA_KEY = 'bs.modal'; + var EVENT_KEY = '.' + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var TRANSITION_DURATION = 300; + var BACKDROP_TRANSITION_DURATION = 150; + var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key + + var Default = { + backdrop: true, + keyboard: true, + focus: true, + show: true + }; + + var DefaultType = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean', + show: 'boolean' + }; + + var Event = { + HIDE: 'hide' + EVENT_KEY, + HIDDEN: 'hidden' + EVENT_KEY, + SHOW: 'show' + EVENT_KEY, + SHOWN: 'shown' + EVENT_KEY, + FOCUSIN: 'focusin' + EVENT_KEY, + RESIZE: 'resize' + EVENT_KEY, + CLICK_DISMISS: 'click.dismiss' + EVENT_KEY, + KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY, + MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY, + MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY, + CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY + }; + + var ClassName = { + SCROLLBAR_MEASURER: 'modal-scrollbar-measure', + BACKDROP: 'modal-backdrop', + OPEN: 'modal-open', + FADE: 'fade', + SHOW: 'show' + }; + + var Selector = { + DIALOG: '.modal-dialog', + DATA_TOGGLE: '[data-toggle="modal"]', + DATA_DISMISS: '[data-dismiss="modal"]', + FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top' + }; + + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Modal = function () { + function Modal(element, config) { + _classCallCheck(this, Modal); + + this._config = this._getConfig(config); + this._element = element; + this._dialog = $(element).find(Selector.DIALOG)[0]; + this._backdrop = null; + this._isShown = false; + this._isBodyOverflowing = false; + this._ignoreBackdropClick = false; + this._isTransitioning = false; + this._originalBodyPadding = 0; + this._scrollbarWidth = 0; + } + + // getters + + // public + + Modal.prototype.toggle = function toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + }; + + Modal.prototype.show = function show(relatedTarget) { + var _this = this; + + if (this._isTransitioning) { + throw new Error('Modal is transitioning'); + } + + if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) { + this._isTransitioning = true; + } + var showEvent = $.Event(Event.SHOW, { + relatedTarget: relatedTarget + }); + + $(this._element).trigger(showEvent); + + if (this._isShown || showEvent.isDefaultPrevented()) { + return; + } + + this._isShown = true; + + this._checkScrollbar(); + this._setScrollbar(); + + $(document.body).addClass(ClassName.OPEN); + + this._setEscapeEvent(); + this._setResizeEvent(); + + $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) { + return _this.hide(event); + }); + + $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () { + $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) { + if ($(event.target).is(_this._element)) { + _this._ignoreBackdropClick = true; + } + }); + }); + + this._showBackdrop(function () { + return _this._showElement(relatedTarget); + }); + }; + + Modal.prototype.hide = function hide(event) { + var _this2 = this; + + if (event) { + event.preventDefault(); + } + + if (this._isTransitioning) { + throw new Error('Modal is transitioning'); + } + + var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE); + if (transition) { + this._isTransitioning = true; + } + + var hideEvent = $.Event(Event.HIDE); + $(this._element).trigger(hideEvent); + + if (!this._isShown || hideEvent.isDefaultPrevented()) { + return; + } + + this._isShown = false; + + this._setEscapeEvent(); + this._setResizeEvent(); + + $(document).off(Event.FOCUSIN); + + $(this._element).removeClass(ClassName.SHOW); + + $(this._element).off(Event.CLICK_DISMISS); + $(this._dialog).off(Event.MOUSEDOWN_DISMISS); + + if (transition) { + $(this._element).one(Util.TRANSITION_END, function (event) { + return _this2._hideModal(event); + }).emulateTransitionEnd(TRANSITION_DURATION); + } else { + this._hideModal(); + } + }; + + Modal.prototype.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + + $(window, document, this._element, this._backdrop).off(EVENT_KEY); + + this._config = null; + this._element = null; + this._dialog = null; + this._backdrop = null; + this._isShown = null; + this._isBodyOverflowing = null; + this._ignoreBackdropClick = null; + this._originalBodyPadding = null; + this._scrollbarWidth = null; + }; + + // private + + Modal.prototype._getConfig = function _getConfig(config) { + config = $.extend({}, Default, config); + Util.typeCheckConfig(NAME, config, DefaultType); + return config; + }; + + Modal.prototype._showElement = function _showElement(relatedTarget) { + var _this3 = this; + + var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE); + + if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { + // don't move modals dom position + document.body.appendChild(this._element); + } + + this._element.style.display = 'block'; + this._element.removeAttribute('aria-hidden'); + this._element.scrollTop = 0; + + if (transition) { + Util.reflow(this._element); + } + + $(this._element).addClass(ClassName.SHOW); + + if (this._config.focus) { + this._enforceFocus(); + } + + var shownEvent = $.Event(Event.SHOWN, { + relatedTarget: relatedTarget + }); + + var transitionComplete = function transitionComplete() { + if (_this3._config.focus) { + _this3._element.focus(); + } + _this3._isTransitioning = false; + $(_this3._element).trigger(shownEvent); + }; + + if (transition) { + $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION); + } else { + transitionComplete(); + } + }; + + Modal.prototype._enforceFocus = function _enforceFocus() { + var _this4 = this; + + $(document).off(Event.FOCUSIN) // guard against infinite focus loop + .on(Event.FOCUSIN, function (event) { + if (document !== event.target && _this4._element !== event.target && !$(_this4._element).has(event.target).length) { + _this4._element.focus(); + } + }); + }; + + Modal.prototype._setEscapeEvent = function _setEscapeEvent() { + var _this5 = this; + + if (this._isShown && this._config.keyboard) { + $(this._element).on(Event.KEYDOWN_DISMISS, function (event) { + if (event.which === ESCAPE_KEYCODE) { + _this5.hide(); + } + }); + } else if (!this._isShown) { + $(this._element).off(Event.KEYDOWN_DISMISS); + } + }; + + Modal.prototype._setResizeEvent = function _setResizeEvent() { + var _this6 = this; + + if (this._isShown) { + $(window).on(Event.RESIZE, function (event) { + return _this6._handleUpdate(event); + }); + } else { + $(window).off(Event.RESIZE); + } + }; + + Modal.prototype._hideModal = function _hideModal() { + var _this7 = this; + + this._element.style.display = 'none'; + this._element.setAttribute('aria-hidden', 'true'); + this._isTransitioning = false; + this._showBackdrop(function () { + $(document.body).removeClass(ClassName.OPEN); + _this7._resetAdjustments(); + _this7._resetScrollbar(); + $(_this7._element).trigger(Event.HIDDEN); + }); + }; + + Modal.prototype._removeBackdrop = function _removeBackdrop() { + if (this._backdrop) { + $(this._backdrop).remove(); + this._backdrop = null; + } + }; + + Modal.prototype._showBackdrop = function _showBackdrop(callback) { + var _this8 = this; + + var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : ''; + + if (this._isShown && this._config.backdrop) { + var doAnimate = Util.supportsTransitionEnd() && animate; + + this._backdrop = document.createElement('div'); + this._backdrop.className = ClassName.BACKDROP; + + if (animate) { + $(this._backdrop).addClass(animate); + } + + $(this._backdrop).appendTo(document.body); + + $(this._element).on(Event.CLICK_DISMISS, function (event) { + if (_this8._ignoreBackdropClick) { + _this8._ignoreBackdropClick = false; + return; + } + if (event.target !== event.currentTarget) { + return; + } + if (_this8._config.backdrop === 'static') { + _this8._element.focus(); + } else { + _this8.hide(); + } + }); + + if (doAnimate) { + Util.reflow(this._backdrop); + } + + $(this._backdrop).addClass(ClassName.SHOW); + + if (!callback) { + return; + } + + if (!doAnimate) { + callback(); + return; + } + + $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION); + } else if (!this._isShown && this._backdrop) { + $(this._backdrop).removeClass(ClassName.SHOW); + + var callbackRemove = function callbackRemove() { + _this8._removeBackdrop(); + if (callback) { + callback(); + } + }; + + if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) { + $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION); + } else { + callbackRemove(); + } + } else if (callback) { + callback(); + } + }; + + // ---------------------------------------------------------------------- + // the following methods are used to handle overflowing modals + // todo (fat): these should probably be refactored out of modal.js + // ---------------------------------------------------------------------- + + Modal.prototype._handleUpdate = function _handleUpdate() { + this._adjustDialog(); + }; + + Modal.prototype._adjustDialog = function _adjustDialog() { + var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + if (!this._isBodyOverflowing && isModalOverflowing) { + this._element.style.paddingLeft = this._scrollbarWidth + 'px'; + } + + if (this._isBodyOverflowing && !isModalOverflowing) { + this._element.style.paddingRight = this._scrollbarWidth + 'px'; + } + }; + + Modal.prototype._resetAdjustments = function _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + }; + + Modal.prototype._checkScrollbar = function _checkScrollbar() { + this._isBodyOverflowing = document.body.clientWidth < window.innerWidth; + this._scrollbarWidth = this._getScrollbarWidth(); + }; + + Modal.prototype._setScrollbar = function _setScrollbar() { + var bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10); + + this._originalBodyPadding = document.body.style.paddingRight || ''; + + if (this._isBodyOverflowing) { + document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px'; + } + }; + + Modal.prototype._resetScrollbar = function _resetScrollbar() { + document.body.style.paddingRight = this._originalBodyPadding; + }; + + Modal.prototype._getScrollbarWidth = function _getScrollbarWidth() { + // thx d.walsh + var scrollDiv = document.createElement('div'); + scrollDiv.className = ClassName.SCROLLBAR_MEASURER; + document.body.appendChild(scrollDiv); + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; + }; + + // static + + Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { + return this.each(function () { + var data = $(this).data(DATA_KEY); + var _config = $.extend({}, Modal.Default, $(this).data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config); + + if (!data) { + data = new Modal(this, _config); + $(this).data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (data[config] === undefined) { + throw new Error('No method named "' + config + '"'); + } + data[config](relatedTarget); + } else if (_config.show) { + data.show(relatedTarget); + } + }); + }; + + _createClass(Modal, null, [{ + key: 'VERSION', + get: function get() { + return VERSION; + } + }, { + key: 'Default', + get: function get() { + return Default; + } + }]); + + return Modal; + }(); + + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { + var _this9 = this; + + var target = void 0; + var selector = Util.getSelectorFromElement(this); + + if (selector) { + target = $(selector)[0]; + } + + var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data()); + + if (this.tagName === 'A' || this.tagName === 'AREA') { + event.preventDefault(); + } + + var $target = $(target).one(Event.SHOW, function (showEvent) { + if (showEvent.isDefaultPrevented()) { + // only register focus restorer if modal will actually get shown + return; + } + + $target.one(Event.HIDDEN, function () { + if ($(_this9).is(':visible')) { + _this9.focus(); + } + }); + }); + + Modal._jQueryInterface.call($(target), config, this); + }); + + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Modal._jQueryInterface; + $.fn[NAME].Constructor = Modal; + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Modal._jQueryInterface; + }; + + return Modal; +}(jQuery); +//# sourceMappingURL=modal.js.map diff --git a/admin/assets/js/bootstrap/modal.min.js b/admin/assets/js/bootstrap/modal.min.js new file mode 100755 index 0000000..dcbd52d --- /dev/null +++ b/admin/assets/js/bootstrap/modal.min.js @@ -0,0 +1 @@ +function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_createClass=function(){function a(a,b){for(var c=0;cdocument.documentElement.clientHeight;!this._isBodyOverflowing&&b&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!b&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},f.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},f.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth\"\'\`]/.test(text)) { + return text; + } + map = { + "<": "<", + ">": ">", + '"': """, + "'": "'", + "`": "`" + }; + unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g; + return text.replace(unsafe_chars, function(chr) { + return map[chr] || "&"; + }); + }; + + return SelectParser; + + })(); + + SelectParser.select_to_array = function(select) { + var child, parser, _i, _len, _ref; + parser = new SelectParser(); + _ref = select.childNodes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + parser.add_node(child); + } + return parser.parsed; + }; + + AbstractChosen = (function() { + function AbstractChosen(form_field, options) { + this.form_field = form_field; + this.options = options != null ? options : {}; + if (!AbstractChosen.browser_is_supported()) { + return; + } + this.is_multiple = this.form_field.multiple; + this.set_default_text(); + this.set_default_values(); + this.setup(); + this.set_up_html(); + this.register_observers(); + } + + AbstractChosen.prototype.set_default_values = function() { + var _this = this; + this.click_test_action = function(evt) { + return _this.test_active_click(evt); + }; + this.activate_action = function(evt) { + return _this.activate_field(evt); + }; + this.active_field = false; + this.mouse_on_container = false; + this.results_showing = false; + this.result_highlighted = null; + this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; + this.disable_search_threshold = this.options.disable_search_threshold || 0; + this.disable_search = this.options.disable_search || false; + this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; + this.group_search = this.options.group_search != null ? this.options.group_search : true; + this.search_contains = this.options.search_contains || false; + this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; + this.max_selected_options = this.options.max_selected_options || Infinity; + this.inherit_select_classes = this.options.inherit_select_classes || false; + this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; + return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; + }; + + AbstractChosen.prototype.set_default_text = function() { + if (this.form_field.getAttribute("data-placeholder")) { + this.default_text = this.form_field.getAttribute("data-placeholder"); + } else if (this.is_multiple) { + this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; + } else { + this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; + } + return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; + }; + + AbstractChosen.prototype.mouse_enter = function() { + return this.mouse_on_container = true; + }; + + AbstractChosen.prototype.mouse_leave = function() { + return this.mouse_on_container = false; + }; + + AbstractChosen.prototype.input_focus = function(evt) { + var _this = this; + if (this.is_multiple) { + if (!this.active_field) { + return setTimeout((function() { + return _this.container_mousedown(); + }), 50); + } + } else { + if (!this.active_field) { + return this.activate_field(); + } + } + }; + + AbstractChosen.prototype.input_blur = function(evt) { + var _this = this; + if (!this.mouse_on_container) { + this.active_field = false; + return setTimeout((function() { + return _this.blur_test(); + }), 100); + } + }; + + AbstractChosen.prototype.results_option_build = function(options) { + var content, data, _i, _len, _ref; + content = ''; + _ref = this.results_data; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + data = _ref[_i]; + if (data.group) { + content += this.result_add_group(data); + } else { + content += this.result_add_option(data); + } + if (options != null ? options.first : void 0) { + if (data.selected && this.is_multiple) { + this.choice_build(data); + } else if (data.selected && !this.is_multiple) { + this.single_set_selected_text(data.text); + } + } + } + return content; + }; + + AbstractChosen.prototype.result_add_option = function(option) { + var classes, option_el; + if (!option.search_match) { + return ''; + } + if (!this.include_option_in_results(option)) { + return ''; + } + classes = []; + if (!option.disabled && !(option.selected && this.is_multiple)) { + classes.push("active-result"); + } + if (option.disabled && !(option.selected && this.is_multiple)) { + classes.push("disabled-result"); + } + if (option.selected) { + classes.push("result-selected"); + } + if (option.group_array_index != null) { + classes.push("group-option"); + } + if (option.classes !== "") { + classes.push(option.classes); + } + option_el = document.createElement("li"); + option_el.className = classes.join(" "); + option_el.style.cssText = option.style; + option_el.setAttribute("data-option-array-index", option.array_index); + option_el.innerHTML = option.search_text; + return this.outerHTML(option_el); + }; + + AbstractChosen.prototype.result_add_group = function(group) { + var group_el; + if (!(group.search_match || group.group_match)) { + return ''; + } + if (!(group.active_options > 0)) { + return ''; + } + group_el = document.createElement("li"); + group_el.className = "group-result"; + group_el.innerHTML = group.search_text; + return this.outerHTML(group_el); + }; + + AbstractChosen.prototype.results_update_field = function() { + this.set_default_text(); + if (!this.is_multiple) { + this.results_reset_cleanup(); + } + this.result_clear_highlight(); + this.results_build(); + if (this.results_showing) { + return this.winnow_results(); + } + }; + + AbstractChosen.prototype.reset_single_select_options = function() { + var result, _i, _len, _ref, _results; + _ref = this.results_data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + result = _ref[_i]; + if (result.selected) { + _results.push(result.selected = false); + } else { + _results.push(void 0); + } + } + return _results; + }; + + AbstractChosen.prototype.results_toggle = function() { + if (this.results_showing) { + return this.results_hide(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.results_search = function(evt) { + if (this.results_showing) { + return this.winnow_results(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.winnow_results = function() { + var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref; + this.no_results_clear(); + results = 0; + searchText = this.get_search_text(); + escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + regexAnchor = this.search_contains ? "" : "^"; + regex = new RegExp(regexAnchor + escapedSearchText, 'i'); + zregex = new RegExp(escapedSearchText, 'i'); + _ref = this.results_data; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + option.search_match = false; + results_group = null; + if (this.include_option_in_results(option)) { + if (option.group) { + option.group_match = false; + option.active_options = 0; + } + if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { + results_group = this.results_data[option.group_array_index]; + if (results_group.active_options === 0 && results_group.search_match) { + results += 1; + } + results_group.active_options += 1; + } + if (!(option.group && !this.group_search)) { + option.search_text = option.group ? option.label : option.html; + option.search_match = this.search_string_match(option.search_text, regex); + if (option.search_match && !option.group) { + results += 1; + } + if (option.search_match) { + if (searchText.length) { + startpos = option.search_text.search(zregex); + text = option.search_text.substr(0, startpos + searchText.length) + '' + option.search_text.substr(startpos + searchText.length); + option.search_text = text.substr(0, startpos) + '' + text.substr(startpos); + } + if (results_group != null) { + results_group.group_match = true; + } + } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { + option.search_match = true; + } + } + } + } + this.result_clear_highlight(); + if (results < 1 && searchText.length) { + this.update_results_content(""); + return this.no_results(searchText); + } else { + this.update_results_content(this.results_option_build()); + return this.winnow_results_set_highlight(); + } + }; + + AbstractChosen.prototype.search_string_match = function(search_string, regex) { + var part, parts, _i, _len; + if (regex.test(search_string)) { + return true; + } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) { + parts = search_string.replace(/\[|\]/g, "").split(" "); + if (parts.length) { + for (_i = 0, _len = parts.length; _i < _len; _i++) { + part = parts[_i]; + if (regex.test(part)) { + return true; + } + } + } + } + }; + + AbstractChosen.prototype.choices_count = function() { + var option, _i, _len, _ref; + if (this.selected_option_count != null) { + return this.selected_option_count; + } + this.selected_option_count = 0; + _ref = this.form_field.options; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + if (option.selected) { + this.selected_option_count += 1; + } + } + return this.selected_option_count; + }; + + AbstractChosen.prototype.choices_click = function(evt) { + evt.preventDefault(); + if (!(this.results_showing || this.is_disabled)) { + return this.results_show(); + } + }; + + AbstractChosen.prototype.keyup_checker = function(evt) { + var stroke, _ref; + stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; + this.search_field_scale(); + switch (stroke) { + case 8: + if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { + return this.keydown_backstroke(); + } else if (!this.pending_backstroke) { + this.result_clear_highlight(); + return this.results_search(); + } + break; + case 13: + evt.preventDefault(); + if (this.results_showing) { + return this.result_select(evt); + } + break; + case 27: + if (this.results_showing) { + this.results_hide(); + } + return true; + case 9: + case 38: + case 40: + case 16: + case 91: + case 17: + break; + default: + return this.results_search(); + } + }; + + AbstractChosen.prototype.clipboard_event_checker = function(evt) { + var _this = this; + return setTimeout((function() { + return _this.results_search(); + }), 50); + }; + + AbstractChosen.prototype.container_width = function() { + if (this.options.width != null) { + return this.options.width; + } else { + return "" + this.form_field.offsetWidth + "px"; + } + }; + + AbstractChosen.prototype.include_option_in_results = function(option) { + if (this.is_multiple && (!this.display_selected_options && option.selected)) { + return false; + } + if (!this.display_disabled_options && option.disabled) { + return false; + } + if (option.empty) { + return false; + } + return true; + }; + + AbstractChosen.prototype.search_results_touchstart = function(evt) { + this.touch_started = true; + return this.search_results_mouseover(evt); + }; + + AbstractChosen.prototype.search_results_touchmove = function(evt) { + this.touch_started = false; + return this.search_results_mouseout(evt); + }; + + AbstractChosen.prototype.search_results_touchend = function(evt) { + if (this.touch_started) { + return this.search_results_mouseup(evt); + } + }; + + AbstractChosen.prototype.outerHTML = function(element) { + var tmp; + if (element.outerHTML) { + return element.outerHTML; + } + tmp = document.createElement("div"); + tmp.appendChild(element); + return tmp.innerHTML; + }; + + AbstractChosen.browser_is_supported = function() { + if (window.navigator.appName === "Microsoft Internet Explorer") { + return document.documentMode >= 8; + } + if (/iP(od|hone)/i.test(window.navigator.userAgent)) { + return false; + } + if (/Android/i.test(window.navigator.userAgent)) { + if (/Mobile/i.test(window.navigator.userAgent)) { + return false; + } + } + return true; + }; + + AbstractChosen.default_multiple_text = "Select Some Options"; + + AbstractChosen.default_single_text = "Select an Option"; + + AbstractChosen.default_no_result_text = "No results match"; + + return AbstractChosen; + + })(); + + $ = jQuery; + + $.fn.extend({ + chosen: function(options) { + if (!AbstractChosen.browser_is_supported()) { + return this; + } + return this.each(function(input_field) { + var $this, chosen; + $this = $(this); + chosen = $this.data('chosen'); + if (options === 'destroy' && chosen) { + chosen.destroy(); + } else if (!chosen) { + $this.data('chosen', new Chosen(this, options)); + } + }); + } + }); + + Chosen = (function(_super) { + __extends(Chosen, _super); + + function Chosen() { + _ref = Chosen.__super__.constructor.apply(this, arguments); + return _ref; + } + + Chosen.prototype.setup = function() { + this.form_field_jq = $(this.form_field); + this.current_selectedIndex = this.form_field.selectedIndex; + return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl"); + }; + + Chosen.prototype.set_up_html = function() { + var container_classes, container_props; + container_classes = ["chosen-container"]; + container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); + if (this.inherit_select_classes && this.form_field.className) { + container_classes.push(this.form_field.className); + } + if (this.is_rtl) { + container_classes.push("chosen-rtl"); + } + container_props = { + 'class': container_classes.join(' '), + 'style': "width: " + (this.container_width()) + ";", + 'title': this.form_field.title + }; + if (this.form_field.id.length) { + container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; + } + this.container = $("
", container_props); + if (this.is_multiple) { + this.container.html('
    '); + } else { + this.container.html('' + this.default_text + '
      '); + } + this.form_field_jq.hide().after(this.container); + this.dropdown = this.container.find('div.chosen-drop').first(); + this.search_field = this.container.find('input').first(); + this.search_results = this.container.find('ul.chosen-results').first(); + this.search_field_scale(); + this.search_no_results = this.container.find('li.no-results').first(); + if (this.is_multiple) { + this.search_choices = this.container.find('ul.chosen-choices').first(); + this.search_container = this.container.find('li.search-field').first(); + } else { + this.search_container = this.container.find('div.chosen-search').first(); + this.selected_item = this.container.find('.chosen-single').first(); + } + this.results_build(); + this.set_tab_index(); + this.set_label_behavior(); + return this.form_field_jq.trigger("chosen:ready", { + chosen: this + }); + }; + + Chosen.prototype.register_observers = function() { + var _this = this; + this.container.bind('mousedown.chosen', function(evt) { + _this.container_mousedown(evt); + }); + this.container.bind('mouseup.chosen', function(evt) { + _this.container_mouseup(evt); + }); + this.container.bind('mouseenter.chosen', function(evt) { + _this.mouse_enter(evt); + }); + this.container.bind('mouseleave.chosen', function(evt) { + _this.mouse_leave(evt); + }); + this.search_results.bind('mouseup.chosen', function(evt) { + _this.search_results_mouseup(evt); + }); + this.search_results.bind('mouseover.chosen', function(evt) { + _this.search_results_mouseover(evt); + }); + this.search_results.bind('mouseout.chosen', function(evt) { + _this.search_results_mouseout(evt); + }); + this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) { + _this.search_results_mousewheel(evt); + }); + this.search_results.bind('touchstart.chosen', function(evt) { + _this.search_results_touchstart(evt); + }); + this.search_results.bind('touchmove.chosen', function(evt) { + _this.search_results_touchmove(evt); + }); + this.search_results.bind('touchend.chosen', function(evt) { + _this.search_results_touchend(evt); + }); + this.form_field_jq.bind("chosen:updated.chosen", function(evt) { + _this.results_update_field(evt); + }); + this.form_field_jq.bind("chosen:activate.chosen", function(evt) { + _this.activate_field(evt); + }); + this.form_field_jq.bind("chosen:open.chosen", function(evt) { + _this.container_mousedown(evt); + }); + this.form_field_jq.bind("chosen:close.chosen", function(evt) { + _this.input_blur(evt); + }); + this.search_field.bind('blur.chosen', function(evt) { + _this.input_blur(evt); + }); + this.search_field.bind('keyup.chosen', function(evt) { + _this.keyup_checker(evt); + }); + this.search_field.bind('keydown.chosen', function(evt) { + _this.keydown_checker(evt); + }); + this.search_field.bind('focus.chosen', function(evt) { + _this.input_focus(evt); + }); + this.search_field.bind('cut.chosen', function(evt) { + _this.clipboard_event_checker(evt); + }); + this.search_field.bind('paste.chosen', function(evt) { + _this.clipboard_event_checker(evt); + }); + if (this.is_multiple) { + return this.search_choices.bind('click.chosen', function(evt) { + _this.choices_click(evt); + }); + } else { + return this.container.bind('click.chosen', function(evt) { + evt.preventDefault(); + }); + } + }; + + Chosen.prototype.destroy = function() { + $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); + if (this.search_field[0].tabIndex) { + this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; + } + this.container.remove(); + this.form_field_jq.removeData('chosen'); + return this.form_field_jq.show(); + }; + + Chosen.prototype.search_field_disabled = function() { + this.is_disabled = this.form_field_jq[0].disabled; + if (this.is_disabled) { + this.container.addClass('chosen-disabled'); + this.search_field[0].disabled = true; + if (!this.is_multiple) { + this.selected_item.unbind("focus.chosen", this.activate_action); + } + return this.close_field(); + } else { + this.container.removeClass('chosen-disabled'); + this.search_field[0].disabled = false; + if (!this.is_multiple) { + return this.selected_item.bind("focus.chosen", this.activate_action); + } + } + }; + + Chosen.prototype.container_mousedown = function(evt) { + if (!this.is_disabled) { + if (evt && evt.type === "mousedown" && !this.results_showing) { + evt.preventDefault(); + } + if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { + if (!this.active_field) { + if (this.is_multiple) { + this.search_field.val(""); + } + $(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action); + this.results_show(); + } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { + evt.preventDefault(); + this.results_toggle(); + } + return this.activate_field(); + } + } + }; + + Chosen.prototype.container_mouseup = function(evt) { + if (evt.target.nodeName === "ABBR" && !this.is_disabled) { + return this.results_reset(evt); + } + }; + + Chosen.prototype.search_results_mousewheel = function(evt) { + var delta; + if (evt.originalEvent) { + delta = -evt.originalEvent.wheelDelta || evt.originalEvent.detail; + } + if (delta != null) { + evt.preventDefault(); + if (evt.type === 'DOMMouseScroll') { + delta = delta * 40; + } + return this.search_results.scrollTop(delta + this.search_results.scrollTop()); + } + }; + + Chosen.prototype.blur_test = function(evt) { + if (!this.active_field && this.container.hasClass("chosen-container-active")) { + return this.close_field(); + } + }; + + Chosen.prototype.close_field = function() { + $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); + this.active_field = false; + this.results_hide(); + this.container.removeClass("chosen-container-active"); + this.clear_backstroke(); + this.show_search_field_default(); + return this.search_field_scale(); + }; + + Chosen.prototype.activate_field = function() { + this.container.addClass("chosen-container-active"); + this.active_field = true; + this.search_field.val(this.search_field.val()); + return this.search_field.focus(); + }; + + Chosen.prototype.test_active_click = function(evt) { + var active_container; + active_container = $(evt.target).closest('.chosen-container'); + if (active_container.length && this.container[0] === active_container[0]) { + return this.active_field = true; + } else { + return this.close_field(); + } + }; + + Chosen.prototype.results_build = function() { + this.parsing = true; + this.selected_option_count = null; + this.results_data = SelectParser.select_to_array(this.form_field); + if (this.is_multiple) { + this.search_choices.find("li.search-choice").remove(); + } else if (!this.is_multiple) { + this.single_set_selected_text(); + if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { + this.search_field[0].readOnly = true; + this.container.addClass("chosen-container-single-nosearch"); + } else { + this.search_field[0].readOnly = false; + this.container.removeClass("chosen-container-single-nosearch"); + } + } + this.update_results_content(this.results_option_build({ + first: true + })); + this.search_field_disabled(); + this.show_search_field_default(); + this.search_field_scale(); + return this.parsing = false; + }; + + Chosen.prototype.result_do_highlight = function(el) { + var high_bottom, high_top, maxHeight, visible_bottom, visible_top; + if (el.length) { + this.result_clear_highlight(); + this.result_highlight = el; + this.result_highlight.addClass("highlighted"); + maxHeight = parseInt(this.search_results.css("maxHeight"), 10); + visible_top = this.search_results.scrollTop(); + visible_bottom = maxHeight + visible_top; + high_top = this.result_highlight.position().top + this.search_results.scrollTop(); + high_bottom = high_top + this.result_highlight.outerHeight(); + if (high_bottom >= visible_bottom) { + return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); + } else if (high_top < visible_top) { + return this.search_results.scrollTop(high_top); + } + } + }; + + Chosen.prototype.result_clear_highlight = function() { + if (this.result_highlight) { + this.result_highlight.removeClass("highlighted"); + } + return this.result_highlight = null; + }; + + Chosen.prototype.results_show = function() { + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { + this.form_field_jq.trigger("chosen:maxselected", { + chosen: this + }); + return false; + } + this.container.addClass("chosen-with-drop"); + this.results_showing = true; + this.search_field.focus(); + this.search_field.val(this.search_field.val()); + this.winnow_results(); + return this.form_field_jq.trigger("chosen:showing_dropdown", { + chosen: this + }); + }; + + Chosen.prototype.update_results_content = function(content) { + return this.search_results.html(content); + }; + + Chosen.prototype.results_hide = function() { + if (this.results_showing) { + this.result_clear_highlight(); + this.container.removeClass("chosen-with-drop"); + this.form_field_jq.trigger("chosen:hiding_dropdown", { + chosen: this + }); + } + return this.results_showing = false; + }; + + Chosen.prototype.set_tab_index = function(el) { + var ti; + if (this.form_field.tabIndex) { + ti = this.form_field.tabIndex; + this.form_field.tabIndex = -1; + return this.search_field[0].tabIndex = ti; + } + }; + + Chosen.prototype.set_label_behavior = function() { + var _this = this; + this.form_field_label = this.form_field_jq.parents("label"); + if (!this.form_field_label.length && this.form_field.id.length) { + this.form_field_label = $("label[for='" + this.form_field.id + "']"); + } + if (this.form_field_label.length > 0) { + return this.form_field_label.bind('click.chosen', function(evt) { + if (_this.is_multiple) { + return _this.container_mousedown(evt); + } else { + return _this.activate_field(); + } + }); + } + }; + + Chosen.prototype.show_search_field_default = function() { + if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { + this.search_field.val(this.default_text); + return this.search_field.addClass("default"); + } else { + this.search_field.val(""); + return this.search_field.removeClass("default"); + } + }; + + Chosen.prototype.search_results_mouseup = function(evt) { + var target; + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); + if (target.length) { + this.result_highlight = target; + this.result_select(evt); + return this.search_field.focus(); + } + }; + + Chosen.prototype.search_results_mouseover = function(evt) { + var target; + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); + if (target) { + return this.result_do_highlight(target); + } + }; + + Chosen.prototype.search_results_mouseout = function(evt) { + if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { + return this.result_clear_highlight(); + } + }; + + Chosen.prototype.choice_build = function(item) { + var choice, close_link, + _this = this; + choice = $('
    • ', { + "class": "search-choice" + }).html("" + item.html + ""); + if (item.disabled) { + choice.addClass('search-choice-disabled'); + } else { + close_link = $('', { + "class": 'search-choice-close', + 'data-option-array-index': item.array_index + }); + close_link.bind('click.chosen', function(evt) { + return _this.choice_destroy_link_click(evt); + }); + choice.append(close_link); + } + return this.search_container.before(choice); + }; + + Chosen.prototype.choice_destroy_link_click = function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + if (!this.is_disabled) { + return this.choice_destroy($(evt.target)); + } + }; + + Chosen.prototype.choice_destroy = function(link) { + if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { + this.show_search_field_default(); + if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) { + this.results_hide(); + } + link.parents('li').first().remove(); + return this.search_field_scale(); + } + }; + + Chosen.prototype.results_reset = function() { + this.reset_single_select_options(); + this.form_field.options[0].selected = true; + this.single_set_selected_text(); + this.show_search_field_default(); + this.results_reset_cleanup(); + this.form_field_jq.trigger("change"); + if (this.active_field) { + return this.results_hide(); + } + }; + + Chosen.prototype.results_reset_cleanup = function() { + this.current_selectedIndex = this.form_field.selectedIndex; + return this.selected_item.find("abbr").remove(); + }; + + Chosen.prototype.result_select = function(evt) { + var high, item; + if (this.result_highlight) { + high = this.result_highlight; + this.result_clear_highlight(); + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { + this.form_field_jq.trigger("chosen:maxselected", { + chosen: this + }); + return false; + } + if (this.is_multiple) { + high.removeClass("active-result"); + } else { + this.reset_single_select_options(); + } + item = this.results_data[high[0].getAttribute("data-option-array-index")]; + item.selected = true; + this.form_field.options[item.options_index].selected = true; + this.selected_option_count = null; + if (this.is_multiple) { + this.choice_build(item); + } else { + this.single_set_selected_text(item.text); + } + if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) { + this.results_hide(); + } + this.search_field.val(""); + if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { + this.form_field_jq.trigger("change", { + 'selected': this.form_field.options[item.options_index].value + }); + } + this.current_selectedIndex = this.form_field.selectedIndex; + return this.search_field_scale(); + } + }; + + Chosen.prototype.single_set_selected_text = function(text) { + if (text == null) { + text = this.default_text; + } + if (text === this.default_text) { + this.selected_item.addClass("chosen-default"); + } else { + this.single_deselect_control_build(); + this.selected_item.removeClass("chosen-default"); + } + return this.selected_item.find("span").text(text); + }; + + Chosen.prototype.result_deselect = function(pos) { + var result_data; + result_data = this.results_data[pos]; + if (!this.form_field.options[result_data.options_index].disabled) { + result_data.selected = false; + this.form_field.options[result_data.options_index].selected = false; + this.selected_option_count = null; + this.result_clear_highlight(); + if (this.results_showing) { + this.winnow_results(); + } + this.form_field_jq.trigger("change", { + deselected: this.form_field.options[result_data.options_index].value + }); + this.search_field_scale(); + return true; + } else { + return false; + } + }; + + Chosen.prototype.single_deselect_control_build = function() { + if (!this.allow_single_deselect) { + return; + } + if (!this.selected_item.find("abbr").length) { + this.selected_item.find("span").first().after(""); + } + return this.selected_item.addClass("chosen-single-with-deselect"); + }; + + Chosen.prototype.get_search_text = function() { + if (this.search_field.val() === this.default_text) { + return ""; + } else { + return $('
      ').text($.trim(this.search_field.val())).html(); + } + }; + + Chosen.prototype.winnow_results_set_highlight = function() { + var do_high, selected_results; + selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; + do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); + if (do_high != null) { + return this.result_do_highlight(do_high); + } + }; + + Chosen.prototype.no_results = function(terms) { + var no_results_html; + no_results_html = $('
    • ' + this.results_none_found + ' ""
    • '); + no_results_html.find("span").first().html(terms); + this.search_results.append(no_results_html); + return this.form_field_jq.trigger("chosen:no_results", { + chosen: this + }); + }; + + Chosen.prototype.no_results_clear = function() { + return this.search_results.find(".no-results").remove(); + }; + + Chosen.prototype.keydown_arrow = function() { + var next_sib; + if (this.results_showing && this.result_highlight) { + next_sib = this.result_highlight.nextAll("li.active-result").first(); + if (next_sib) { + return this.result_do_highlight(next_sib); + } + } else { + return this.results_show(); + } + }; + + Chosen.prototype.keyup_arrow = function() { + var prev_sibs; + if (!this.results_showing && !this.is_multiple) { + return this.results_show(); + } else if (this.result_highlight) { + prev_sibs = this.result_highlight.prevAll("li.active-result"); + if (prev_sibs.length) { + return this.result_do_highlight(prev_sibs.first()); + } else { + if (this.choices_count() > 0) { + this.results_hide(); + } + return this.result_clear_highlight(); + } + } + }; + + Chosen.prototype.keydown_backstroke = function() { + var next_available_destroy; + if (this.pending_backstroke) { + this.choice_destroy(this.pending_backstroke.find("a").first()); + return this.clear_backstroke(); + } else { + next_available_destroy = this.search_container.siblings("li.search-choice").last(); + if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { + this.pending_backstroke = next_available_destroy; + if (this.single_backstroke_delete) { + return this.keydown_backstroke(); + } else { + return this.pending_backstroke.addClass("search-choice-focus"); + } + } + } + }; + + Chosen.prototype.clear_backstroke = function() { + if (this.pending_backstroke) { + this.pending_backstroke.removeClass("search-choice-focus"); + } + return this.pending_backstroke = null; + }; + + Chosen.prototype.keydown_checker = function(evt) { + var stroke, _ref1; + stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode; + this.search_field_scale(); + if (stroke !== 8 && this.pending_backstroke) { + this.clear_backstroke(); + } + switch (stroke) { + case 8: + this.backstroke_length = this.search_field.val().length; + break; + case 9: + if (this.results_showing && !this.is_multiple) { + this.result_select(evt); + } + this.mouse_on_container = false; + break; + case 13: + evt.preventDefault(); + break; + case 38: + evt.preventDefault(); + this.keyup_arrow(); + break; + case 40: + evt.preventDefault(); + this.keydown_arrow(); + break; + } + }; + + Chosen.prototype.search_field_scale = function() { + var div, f_width, h, style, style_block, styles, w, _i, _len; + if (this.is_multiple) { + h = 0; + w = 0; + style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"; + styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing']; + for (_i = 0, _len = styles.length; _i < _len; _i++) { + style = styles[_i]; + style_block += style + ":" + this.search_field.css(style) + ";"; + } + div = $('
      ', { + 'style': style_block + }); + div.text(this.search_field.val()); + $('body').append(div); + w = div.width() + 25; + div.remove(); + f_width = this.container.outerWidth(); + if (w > f_width - 10) { + w = f_width - 10; + } + return this.search_field.css({ + 'width': w + 'px' + }); + } + }; + + return Chosen; + + })(AbstractChosen); + +}).call(this); diff --git a/admin/assets/js/chosen/chosen.jquery.min.js b/admin/assets/js/chosen/chosen.jquery.min.js new file mode 100644 index 0000000..cece231 --- /dev/null +++ b/admin/assets/js/chosen/chosen.jquery.min.js @@ -0,0 +1,2 @@ +/* Chosen v1.1.0 | (c) 2011-2013 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ +!function(){var a,AbstractChosen,Chosen,SelectParser,b,c={}.hasOwnProperty,d=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};SelectParser=function(){function SelectParser(){this.options_index=0,this.parsed=[]}return SelectParser.prototype.add_node=function(a){return"OPTGROUP"===a.nodeName.toUpperCase()?this.add_group(a):this.add_option(a)},SelectParser.prototype.add_group=function(a){var b,c,d,e,f,g;for(b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:this.escapeExpression(a.label),children:0,disabled:a.disabled}),f=a.childNodes,g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},SelectParser.prototype.add_option=function(a,b,c){return"OPTION"===a.nodeName.toUpperCase()?(""!==a.text?(null!=b&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1):void 0},SelectParser.prototype.escapeExpression=function(a){var b,c;return null==a||a===!1?"":/[\&\<\>\"\'\`]/.test(a)?(b={"<":"<",">":">",'"':""","'":"'","`":"`"},c=/&(?!\w+;)|[\<\>\"\'\`]/g,a.replace(c,function(a){return b[a]||"&"})):a},SelectParser}(),SelectParser.select_to_array=function(a){var b,c,d,e,f;for(c=new SelectParser,f=a.childNodes,d=0,e=f.length;e>d;d++)b=f[d],c.add_node(b);return c.parsed},AbstractChosen=function(){function AbstractChosen(a,b){this.form_field=a,this.options=null!=b?b:{},AbstractChosen.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers())}return AbstractChosen.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null!=this.options.enable_split_word_search?this.options.enable_split_word_search:!0,this.group_search=null!=this.options.group_search?this.options.group_search:!0,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null!=this.options.single_backstroke_delete?this.options.single_backstroke_delete:!0,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null!=this.options.display_selected_options?this.options.display_selected_options:!0,this.display_disabled_options=null!=this.options.display_disabled_options?this.options.display_disabled_options:!0},AbstractChosen.prototype.set_default_text=function(){return this.default_text=this.form_field.getAttribute("data-placeholder")?this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.options.placeholder_text_multiple||this.options.placeholder_text||AbstractChosen.default_multiple_text:this.options.placeholder_text_single||this.options.placeholder_text||AbstractChosen.default_single_text,this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||AbstractChosen.default_no_result_text},AbstractChosen.prototype.mouse_enter=function(){return this.mouse_on_container=!0},AbstractChosen.prototype.mouse_leave=function(){return this.mouse_on_container=!1},AbstractChosen.prototype.input_focus=function(){var a=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return a.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},AbstractChosen.prototype.input_blur=function(){var a=this;return this.mouse_on_container?void 0:(this.active_field=!1,setTimeout(function(){return a.blur_test()},100))},AbstractChosen.prototype.results_option_build=function(a){var b,c,d,e,f;for(b="",f=this.results_data,d=0,e=f.length;e>d;d++)c=f[d],b+=c.group?this.result_add_group(c):this.result_add_option(c),(null!=a?a.first:void 0)&&(c.selected&&this.is_multiple?this.choice_build(c):c.selected&&!this.is_multiple&&this.single_set_selected_text(c.text));return b},AbstractChosen.prototype.result_add_option=function(a){var b,c;return a.search_match?this.include_option_in_results(a)?(b=[],a.disabled||a.selected&&this.is_multiple||b.push("active-result"),!a.disabled||a.selected&&this.is_multiple||b.push("disabled-result"),a.selected&&b.push("result-selected"),null!=a.group_array_index&&b.push("group-option"),""!==a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.style.cssText=a.style,c.setAttribute("data-option-array-index",a.array_index),c.innerHTML=a.search_text,this.outerHTML(c)):"":""},AbstractChosen.prototype.result_add_group=function(a){var b;return a.search_match||a.group_match?a.active_options>0?(b=document.createElement("li"),b.className="group-result",b.innerHTML=a.search_text,this.outerHTML(b)):"":""},AbstractChosen.prototype.results_update_field=function(){return this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing?this.winnow_results():void 0},AbstractChosen.prototype.reset_single_select_options=function(){var a,b,c,d,e;for(d=this.results_data,e=[],b=0,c=d.length;c>b;b++)a=d[b],a.selected?e.push(a.selected=!1):e.push(void 0);return e},AbstractChosen.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},AbstractChosen.prototype.results_search=function(){return this.results_showing?this.winnow_results():this.results_show()},AbstractChosen.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(this.no_results_clear(),e=0,g=this.get_search_text(),a=g.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),d=this.search_contains?"":"^",c=new RegExp(d+a,"i"),j=new RegExp(a,"i"),m=this.results_data,k=0,l=m.length;l>k;k++)b=m[k],b.search_match=!1,f=null,this.include_option_in_results(b)&&(b.group&&(b.group_match=!1,b.active_options=0),null!=b.group_array_index&&this.results_data[b.group_array_index]&&(f=this.results_data[b.group_array_index],0===f.active_options&&f.search_match&&(e+=1),f.active_options+=1),(!b.group||this.group_search)&&(b.search_text=b.group?b.label:b.html,b.search_match=this.search_string_match(b.search_text,c),b.search_match&&!b.group&&(e+=1),b.search_match?(g.length&&(h=b.search_text.search(j),i=b.search_text.substr(0,h+g.length)+""+b.search_text.substr(h+g.length),b.search_text=i.substr(0,h)+""+i.substr(h)),null!=f&&(f.group_match=!0)):null!=b.group_array_index&&this.results_data[b.group_array_index].search_match&&(b.search_match=!0)));return this.result_clear_highlight(),1>e&&g.length?(this.update_results_content(""),this.no_results(g)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},AbstractChosen.prototype.search_string_match=function(a,b){var c,d,e,f;if(b.test(a))return!0;if(this.enable_split_word_search&&(a.indexOf(" ")>=0||0===a.indexOf("["))&&(d=a.replace(/\[|\]/g,"").split(" "),d.length))for(e=0,f=d.length;f>e;e++)if(c=d[e],b.test(c))return!0},AbstractChosen.prototype.choices_count=function(){var a,b,c,d;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,d=this.form_field.options,b=0,c=d.length;c>b;b++)a=d[b],a.selected&&(this.selected_option_count+=1);return this.selected_option_count},AbstractChosen.prototype.choices_click=function(a){return a.preventDefault(),this.results_showing||this.is_disabled?void 0:this.results_show()},AbstractChosen.prototype.keyup_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(a.preventDefault(),this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},AbstractChosen.prototype.clipboard_event_checker=function(){var a=this;return setTimeout(function(){return a.results_search()},50)},AbstractChosen.prototype.container_width=function(){return null!=this.options.width?this.options.width:""+this.form_field.offsetWidth+"px"},AbstractChosen.prototype.include_option_in_results=function(a){return this.is_multiple&&!this.display_selected_options&&a.selected?!1:!this.display_disabled_options&&a.disabled?!1:a.empty?!1:!0},AbstractChosen.prototype.search_results_touchstart=function(a){return this.touch_started=!0,this.search_results_mouseover(a)},AbstractChosen.prototype.search_results_touchmove=function(a){return this.touch_started=!1,this.search_results_mouseout(a)},AbstractChosen.prototype.search_results_touchend=function(a){return this.touch_started?this.search_results_mouseup(a):void 0},AbstractChosen.prototype.outerHTML=function(a){var b;return a.outerHTML?a.outerHTML:(b=document.createElement("div"),b.appendChild(a),b.innerHTML)},AbstractChosen.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:/iP(od|hone)/i.test(window.navigator.userAgent)?!1:/Android/i.test(window.navigator.userAgent)&&/Mobile/i.test(window.navigator.userAgent)?!1:!0},AbstractChosen.default_multiple_text="Select Some Options",AbstractChosen.default_single_text="Select an Option",AbstractChosen.default_no_result_text="No results match",AbstractChosen}(),a=jQuery,a.fn.extend({chosen:function(b){return AbstractChosen.browser_is_supported()?this.each(function(){var c,d;c=a(this),d=c.data("chosen"),"destroy"===b&&d?d.destroy():d||c.data("chosen",new Chosen(this,b))}):this}}),Chosen=function(c){function Chosen(){return b=Chosen.__super__.constructor.apply(this,arguments)}return d(Chosen,c),Chosen.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field_jq.hasClass("chosen-rtl")},Chosen.prototype.set_up_html=function(){var b,c;return b=["chosen-container"],b.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&b.push(this.form_field.className),this.is_rtl&&b.push("chosen-rtl"),c={"class":b.join(" "),style:"width: "+this.container_width()+";",title:this.form_field.title},this.form_field.id.length&&(c.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=a("
      ",c),this.is_multiple?this.container.html('
        '):this.container.html('
        '+this.default_text+'
          '),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior(),this.form_field_jq.trigger("chosen:ready",{chosen:this})},Chosen.prototype.register_observers=function(){var a=this;return this.container.bind("mousedown.chosen",function(b){a.container_mousedown(b)}),this.container.bind("mouseup.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mouseenter.chosen",function(b){a.mouse_enter(b)}),this.container.bind("mouseleave.chosen",function(b){a.mouse_leave(b)}),this.search_results.bind("mouseup.chosen",function(b){a.search_results_mouseup(b)}),this.search_results.bind("mouseover.chosen",function(b){a.search_results_mouseover(b)}),this.search_results.bind("mouseout.chosen",function(b){a.search_results_mouseout(b)}),this.search_results.bind("mousewheel.chosen DOMMouseScroll.chosen",function(b){a.search_results_mousewheel(b)}),this.search_results.bind("touchstart.chosen",function(b){a.search_results_touchstart(b)}),this.search_results.bind("touchmove.chosen",function(b){a.search_results_touchmove(b)}),this.search_results.bind("touchend.chosen",function(b){a.search_results_touchend(b)}),this.form_field_jq.bind("chosen:updated.chosen",function(b){a.results_update_field(b)}),this.form_field_jq.bind("chosen:activate.chosen",function(b){a.activate_field(b)}),this.form_field_jq.bind("chosen:open.chosen",function(b){a.container_mousedown(b)}),this.form_field_jq.bind("chosen:close.chosen",function(b){a.input_blur(b)}),this.search_field.bind("blur.chosen",function(b){a.input_blur(b)}),this.search_field.bind("keyup.chosen",function(b){a.keyup_checker(b)}),this.search_field.bind("keydown.chosen",function(b){a.keydown_checker(b)}),this.search_field.bind("focus.chosen",function(b){a.input_focus(b)}),this.search_field.bind("cut.chosen",function(b){a.clipboard_event_checker(b)}),this.search_field.bind("paste.chosen",function(b){a.clipboard_event_checker(b)}),this.is_multiple?this.search_choices.bind("click.chosen",function(b){a.choices_click(b)}):this.container.bind("click.chosen",function(a){a.preventDefault()})},Chosen.prototype.destroy=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},Chosen.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field_jq[0].disabled,this.is_disabled?(this.container.addClass("chosen-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus.chosen",this.activate_action),this.close_field()):(this.container.removeClass("chosen-disabled"),this.search_field[0].disabled=!1,this.is_multiple?void 0:this.selected_item.bind("focus.chosen",this.activate_action))},Chosen.prototype.container_mousedown=function(b){return this.is_disabled||(b&&"mousedown"===b.type&&!this.results_showing&&b.preventDefault(),null!=b&&a(b.target).hasClass("search-choice-close"))?void 0:(this.active_field?this.is_multiple||!b||a(b.target)[0]!==this.selected_item[0]&&!a(b.target).parents("a.chosen-single").length||(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(this.container[0].ownerDocument).bind("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},Chosen.prototype.container_mouseup=function(a){return"ABBR"!==a.target.nodeName||this.is_disabled?void 0:this.results_reset(a)},Chosen.prototype.search_results_mousewheel=function(a){var b;return a.originalEvent&&(b=-a.originalEvent.wheelDelta||a.originalEvent.detail),null!=b?(a.preventDefault(),"DOMMouseScroll"===a.type&&(b=40*b),this.search_results.scrollTop(b+this.search_results.scrollTop())):void 0},Chosen.prototype.blur_test=function(){return!this.active_field&&this.container.hasClass("chosen-container-active")?this.close_field():void 0},Chosen.prototype.close_field=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},Chosen.prototype.activate_field=function(){return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},Chosen.prototype.test_active_click=function(b){var c;return c=a(b.target).closest(".chosen-container"),c.length&&this.container[0]===c[0]?this.active_field=!0:this.close_field()},Chosen.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=SelectParser.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},Chosen.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){if(this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight(),b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(f>c)return this.search_results.scrollTop(c)}},Chosen.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},Chosen.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.container.addClass("chosen-with-drop"),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results(),this.form_field_jq.trigger("chosen:showing_dropdown",{chosen:this}))},Chosen.prototype.update_results_content=function(a){return this.search_results.html(a)},Chosen.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClass("chosen-with-drop"),this.form_field_jq.trigger("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},Chosen.prototype.set_tab_index=function(){var a;return this.form_field.tabIndex?(a=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field[0].tabIndex=a):void 0},Chosen.prototype.set_label_behavior=function(){var b=this;return this.form_field_label=this.form_field_jq.parents("label"),!this.form_field_label.length&&this.form_field.id.length&&(this.form_field_label=a("label[for='"+this.form_field.id+"']")),this.form_field_label.length>0?this.form_field_label.bind("click.chosen",function(a){return b.is_multiple?b.container_mousedown(a):b.activate_field()}):void 0},Chosen.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},Chosen.prototype.search_results_mouseup=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c.length?(this.result_highlight=c,this.result_select(b),this.search_field.focus()):void 0},Chosen.prototype.search_results_mouseover=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c?this.result_do_highlight(c):void 0},Chosen.prototype.search_results_mouseout=function(b){return a(b.target).hasClass("active-result")?this.result_clear_highlight():void 0},Chosen.prototype.choice_build=function(b){var c,d,e=this;return c=a("
        • ",{"class":"search-choice"}).html(""+b.html+""),b.disabled?c.addClass("search-choice-disabled"):(d=a("",{"class":"search-choice-close","data-option-array-index":b.array_index}),d.bind("click.chosen",function(a){return e.choice_destroy_link_click(a)}),c.append(d)),this.search_container.before(c)},Chosen.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),b.stopPropagation(),this.is_disabled?void 0:this.choice_destroy(a(b.target))},Chosen.prototype.choice_destroy=function(a){return this.result_deselect(a[0].getAttribute("data-option-array-index"))?(this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.val().length<1&&this.results_hide(),a.parents("li").first().remove(),this.search_field_scale()):void 0},Chosen.prototype.results_reset=function(){return this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change"),this.active_field?this.results_hide():void 0},Chosen.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},Chosen.prototype.result_select=function(a){var b,c;return this.result_highlight?(b=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?b.removeClass("active-result"):this.reset_single_select_options(),c=this.results_data[b[0].getAttribute("data-option-array-index")],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(c):this.single_set_selected_text(c.text),(a.metaKey||a.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[c.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,this.search_field_scale())):void 0},Chosen.prototype.single_set_selected_text=function(a){return null==a&&(a=this.default_text),a===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").text(a)},Chosen.prototype.result_deselect=function(a){var b;return b=this.results_data[a],this.form_field.options[b.options_index].disabled?!1:(b.selected=!1,this.form_field.options[b.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[b.options_index].value}),this.search_field_scale(),!0)},Chosen.prototype.single_deselect_control_build=function(){return this.allow_single_deselect?(this.selected_item.find("abbr").length||this.selected_item.find("span").first().after(''),this.selected_item.addClass("chosen-single-with-deselect")):void 0},Chosen.prototype.get_search_text=function(){return this.search_field.val()===this.default_text?"":a("
          ").text(a.trim(this.search_field.val())).html()},Chosen.prototype.winnow_results_set_highlight=function(){var a,b;return b=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),a=b.length?b.first():this.search_results.find(".active-result").first(),null!=a?this.result_do_highlight(a):void 0},Chosen.prototype.no_results=function(b){var c;return c=a('
        • '+this.results_none_found+' ""
        • '),c.find("span").first().html(b),this.search_results.append(c),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},Chosen.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},Chosen.prototype.keydown_arrow=function(){var a;return this.results_showing&&this.result_highlight?(a=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(a):void 0:this.results_show()},Chosen.prototype.keyup_arrow=function(){var a;return this.results_showing||this.is_multiple?this.result_highlight?(a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},Chosen.prototype.keydown_backstroke=function(){var a;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(a=this.search_container.siblings("li.search-choice").last(),a.length&&!a.hasClass("search-choice-disabled")?(this.pending_backstroke=a,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0)},Chosen.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},Chosen.prototype.keydown_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),8!==b&&this.pending_backstroke&&this.clear_backstroke(),b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:a.preventDefault(),this.keydown_arrow()}},Chosen.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){for(d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"],i=0,j=g.length;j>i;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";return b=a("
          ",{style:f}),b.text(this.search_field.val()),a("body").append(b),h=b.width()+25,b.remove(),c=this.container.outerWidth(),h>c-10&&(h=c-10),this.search_field.css({width:h+"px"})}},Chosen}(AbstractChosen)}.call(this); \ No newline at end of file diff --git a/admin/assets/js/chosen/chosen.min.css b/admin/assets/js/chosen/chosen.min.css new file mode 100644 index 0000000..9a2baab --- /dev/null +++ b/admin/assets/js/chosen/chosen.min.css @@ -0,0 +1,3 @@ +/* Chosen v1.1.0 | (c) 2011-2013 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ + +.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;zoom:1;*display:inline;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chosen-container .chosen-drop{position:absolute;top:100%;left:-9999px;z-index:1010;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15)}.chosen-container.chosen-with-drop .chosen-drop{left:0}.chosen-container a{cursor:pointer}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:23px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-moz-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-o-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url(chosen-sprite.png) no-repeat 0 2px}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:#fff url(chosen-sprite.png) no-repeat 100% -20px;background:url(chosen-sprite.png) no-repeat 100% -20px;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:-webkit-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-moz-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-o-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;width:100%;height:auto!important;height:1%;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(#eee 1%,#fff 15%);background-image:-moz-linear-gradient(#eee 1%,#fff 15%);background-image:-o-linear-gradient(#eee 1%,#fff 15%);background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:5px;height:15px;outline:0;border:0!important;background:transparent!important;box-shadow:none;color:#666;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 0 3px 5px;padding:3px 20px 3px 5px;border:1px solid #aaa;border-radius:3px;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-clip:padding-box;box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#eee),color-stop(80%,#fff));background-image:-webkit-linear-gradient(#eee 20%,#fff 80%);background-image:-moz-linear-gradient(#eee 20%,#fff 80%);background-image:-o-linear-gradient(#eee 20%,#fff 80%);background-image:linear-gradient(#eee 20%,#fff 80%);box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:0;background:transparent}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#111!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single-nosearch .chosen-search,.chosen-rtl .chosen-drop{left:9999px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:0}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:#fff url(chosen-sprite.png) no-repeat -30px -20px;background:url(chosen-sprite.png) no-repeat -30px -20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:144dpi){.chosen-rtl .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-container-single .chosen-search input[type=text],.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span{background-image:url(chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}} \ No newline at end of file diff --git a/admin/assets/js/data-meta-boxes.js b/admin/assets/js/data-meta-boxes.js new file mode 100644 index 0000000..6eddb3a --- /dev/null +++ b/admin/assets/js/data-meta-boxes.js @@ -0,0 +1,39 @@ +jQuery( function ( $ ) { + + // TABS + $('ul.a3-metabox-data-tabs').show(); + $('div.a3-metabox-panel-wrap').each(function(){ + $(this).find('div.a3-metabox-panel:not(:first)').hide(); + }); + $('ul.a3-metabox-data-tabs a').click(function(){ + var panel_wrap = $(this).closest('div.a3-metabox-panel-wrap'); + $('ul.a3-metabox-data-tabs li', panel_wrap).removeClass('active'); + $(this).parent().addClass('active'); + $('div.a3-metabox-panel', panel_wrap).hide(); + $( $(this).attr('href') ).show(); + return false; + }); + $('ul.a3-metabox-data-tabs li:visible').eq(0).find('a').click(); + + // META BOXES - Open/close + $('.a3-metabox-wrapper').on('click', '.a3-metabox-item h3', function(event){ + // If the user clicks on some form input inside the h3, like a select list (for variations), the box should not be toggled + if ($(event.target).filter(':input, option').length) return; + $( this ).parent( '.a3-metabox-item' ).toggleClass( 'closed' ).toggleClass( 'open' ); + $(this).next('.a3-metabox-item-content').slideToggle(); + }) + .on('click', '.expand_all', function(event){ + $(this).closest('.a3-metabox-wrapper').find('.a3-metabox-item').removeClass( 'closed' ).addClass( 'open' ); + $(this).closest('.a3-metabox-wrapper').find('.a3-metabox-item-content').slideDown(); + return false; + }) + .on('click', '.close_all', function(event){ + $(this).closest('.a3-metabox-wrapper').find('.a3-metabox-item').removeClass( 'open' ).addClass( 'closed' ); + $(this).closest('.a3-metabox-wrapper').find('.a3-metabox-item-content').slideUp(); + return false; + }); + $('.a3-metabox-item.closed').each(function(){ + $(this).find('.a3-metabox-item-content').slideUp(); + }); + +}); diff --git a/admin/assets/js/iphone-style-checkboxes.js b/admin/assets/js/iphone-style-checkboxes.js new file mode 100644 index 0000000..2cb3ec0 --- /dev/null +++ b/admin/assets/js/iphone-style-checkboxes.js @@ -0,0 +1,381 @@ +// Generated by CoffeeScript 1.6.2 +(function($) { +(function() { + var iOSCheckbox, matched, userAgent, + __slice = [].slice; + + if ($.browser == null) { + userAgent = navigator.userAgent || ""; + jQuery.uaMatch = function(ua) { + var match; + + ua = ua.toLowerCase(); + match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+))?/.exec(ua) || []; + return { + browser: match[1] || "", + version: match[2] || "0" + }; + }; + matched = jQuery.uaMatch(userAgent); + jQuery.browser = {}; + if (matched.browser) { + jQuery.browser[matched.browser] = true; + jQuery.browser.version = matched.version; + } + if (jQuery.browser.webkit) { + jQuery.browser.safari = true; + } + } + + iOSCheckbox = (function() { + function iOSCheckbox(elem, options) { + var key, opts, value; + + this.elem = $(elem); + opts = $.extend({}, iOSCheckbox.defaults, options); + for (key in opts) { + value = opts[key]; + this[key] = value; + } + this.elem.data(this.dataName, this); + this.wrapCheckboxWithDivs(); + this.attachEvents(); + this.disableTextSelection(); + this.calculateDimensions(); + } + + iOSCheckbox.prototype.calculateDimensions = function() { + if (this.resizeHandle) { + this.optionallyResize('handle'); + } + if (this.resizeContainer) { + this.optionallyResize('container'); + } + return this.initialPosition(); + }; + + iOSCheckbox.prototype.isDisabled = function() { + if ( this.elem.is(':disabled') ) + return true; + else if ( this.elem.attr('checkbox-disabled') == 'true' ) + return true; + else + return false; + }; + + iOSCheckbox.prototype.wrapCheckboxWithDivs = function() { + this.elem.wrap("
          "); + this.container = this.elem.parent(); + this.offLabel = $("").appendTo(this.container); + this.offSpan = this.offLabel.children('span'); + this.onLabel = $("").appendTo(this.container); + this.onSpan = this.onLabel.children('span'); + return this.handle = $("
          \n
          \n
          \n
          \n
          ").appendTo(this.container).before("  "); + }; + + iOSCheckbox.prototype.disableTextSelection = function() { + if ($.browser.msie) { + return $([this.handle, this.offLabel, this.onLabel, this.container]).attr("unselectable", "on"); + } + }; + + iOSCheckbox.prototype._getDimension = function(elem, dimension) { + if ($.fn.actual != null) { + return elem.actual(dimension); + } else { + return elem[dimension](); + } + }; + + iOSCheckbox.prototype.optionallyResize = function(mode) { + var newWidth, offLabelWidth, offSpan, onLabelWidth, onSpan; + + onSpan = this.onLabel.find('span'); + onLabelWidth = this._getDimension(onSpan, "width"); + onLabelWidth += parseInt(onSpan.css('padding-left'), 10); + offSpan = this.offLabel.find('span'); + offLabelWidth = this._getDimension(offSpan, "width"); + offLabelWidth += parseInt(offSpan.css('padding-right'), 10); + if (mode === "container") { + newWidth = onLabelWidth > offLabelWidth ? onLabelWidth : offLabelWidth; + newWidth += this._getDimension(this.handle, "width") + this.handleMargin; + return this.container.css({ + width: newWidth + }); + } else { + newWidth = onLabelWidth > offLabelWidth ? onLabelWidth : offLabelWidth; + return this.handle.css({ + width: newWidth + }); + } + }; + + iOSCheckbox.prototype.onMouseDown = function(event) { + var x; + + event.preventDefault(); + if (this.isDisabled()) { + return; + } + x = event.pageX || event.originalEvent.changedTouches[0].pageX; + iOSCheckbox.currentlyClicking = this.handle; + iOSCheckbox.dragStartPosition = x; + return iOSCheckbox.handleLeftOffset = parseInt(this.handle.css('left'), 10) || 0; + }; + + iOSCheckbox.prototype.onDragMove = function(event, x) { + var newWidth, p, leftHandle; + + if (iOSCheckbox.currentlyClicking !== this.handle) { + return; + } + p = (x + iOSCheckbox.handleLeftOffset - iOSCheckbox.dragStartPosition) / this.rightSide; + if (p < 0) { + p = 0; + } + if (p > 1) { + p = 1; + } + newWidth = p * this.rightSide; + leftHandle = newWidth; + if ( leftHandle == 0 ) leftHandle = -1; + this.handle.css({ + left: leftHandle + }); + this.onLabel.css({ + width: newWidth + this.handleRadius + }); + this.offSpan.css({ + marginRight: -newWidth + }); + return this.onSpan.css({ + marginLeft: -(1 - p) * this.rightSide + }); + }; + + iOSCheckbox.prototype.onDragEnd = function(event, x) { + var p; + + if (iOSCheckbox.currentlyClicking !== this.handle) { + return; + } + if (this.isDisabled()) { + return; + } + if (iOSCheckbox.dragging) { + p = (x - iOSCheckbox.dragStartPosition) / this.rightSide; + this.elem.prop('checked', p >= 0.5); + } else { + this.elem.prop('checked', !this.elem.prop('checked')); + } + iOSCheckbox.currentlyClicking = null; + iOSCheckbox.dragging = null; + return this.didChange(); + }; + + iOSCheckbox.prototype.refresh = function() { + return this.didChange(); + }; + + iOSCheckbox.prototype.didChange = function() { + var new_left, leftHandle; + + if (typeof this.onChange === "function") { + this.onChange(this.elem, this.elem.prop('checked')); + } + if (this.isDisabled()) { + this.container.addClass(this.disabledClass); + return false; + } else { + this.container.removeClass(this.disabledClass); + } + new_left = this.elem.prop('checked') ? this.rightSide : 0; + leftHandle = new_left; + if ( leftHandle == 0 ) leftHandle = -1; + this.handle.animate({ + left: leftHandle + }, this.duration); + this.onLabel.animate({ + width: new_left + this.handleRadius + }, this.duration); + this.offSpan.animate({ + marginRight: -new_left + }, this.duration); + this.onSpan.animate({ + marginLeft: new_left - this.rightSide + }, this.duration); + if (typeof this.onEnd === "function") { + this.onEnd(this.elem, this.elem.prop('checked')); + } + return true; + }; + + iOSCheckbox.prototype.attachEvents = function() { + var localMouseMove, localMouseUp, self; + + self = this; + localMouseMove = function(event) { + return self.onGlobalMove.apply(self, arguments); + }; + localMouseUp = function(event) { + self.onGlobalUp.apply(self, arguments); + $(document).unbind('mousemove touchmove', localMouseMove); + return $(document).unbind('mouseup touchend', localMouseUp); + }; + this.elem.change(function() { + return self.refresh(); + }); + return this.container.bind('mousedown touchstart', function(event) { + self.onMouseDown.apply(self, arguments); + $(document).bind('mousemove touchmove', localMouseMove); + return $(document).bind('mouseup touchend', localMouseUp); + }); + }; + + iOSCheckbox.prototype.initialPosition = function() { + var containerWidth, offset, leftHandle; + + containerWidth = this._getDimension(this.container, "width"); + this.offLabel.css({ + width: containerWidth - this.containerRadius - 16 + }); + offset = this.containerRadius + 1; + if ($.browser.msie && $.browser.version < 7) { + offset -= 3; + } + this.rightSide = containerWidth - this._getDimension(this.handle, "width") - offset; + leftHandle = this.rightSide; + if ( leftHandle == 0 ) leftHandle = -1; + if (this.elem.is(':checked')) { + this.handle.css({ + left: leftHandle + }); + this.onLabel.css({ + width: this.rightSide + this.handleRadius + }); + this.offSpan.css({ + marginRight: -this.rightSide + }); + } else { + this.onLabel.css({ + width: this.handleRadius + }); + this.onSpan.css({ + marginLeft: -this.rightSide + }); + } + if (this.isDisabled()) { + return this.container.addClass(this.disabledClass); + } + }; + + iOSCheckbox.prototype.onGlobalMove = function(event) { + var x; + + if (!(!this.isDisabled() && iOSCheckbox.currentlyClicking)) { + return; + } + event.preventDefault(); + x = event.pageX || event.originalEvent.changedTouches[0].pageX; + if (!iOSCheckbox.dragging && (Math.abs(iOSCheckbox.dragStartPosition - x) > this.dragThreshold)) { + iOSCheckbox.dragging = true; + } + return this.onDragMove(event, x); + }; + + iOSCheckbox.prototype.onGlobalUp = function(event) { + var x; + + if (!iOSCheckbox.currentlyClicking) { + return; + } + event.preventDefault(); + x = event.pageX || event.originalEvent.changedTouches[0].pageX; + this.onDragEnd(event, x); + return false; + }; + + iOSCheckbox.defaults = { + duration: 200, + checkedLabel: 'ON', + uncheckedLabel: 'OFF', + resizeHandle: true, + resizeContainer: true, + disabledClass: 'iPhoneCheckDisabled', + containerClass: 'iPhoneCheckContainer', + labelOnClass: 'iPhoneCheckLabelOn', + labelOffClass: 'iPhoneCheckLabelOff', + handleClass: 'iPhoneCheckHandle', + handleCenterClass: 'iPhoneCheckHandleCenter', + handleRightClass: 'iPhoneCheckHandleRight', + dragThreshold: 5, + handleMargin: 15, + handleRadius: 4, + containerRadius: 5, + dataName: "iphoneStyle", + onChange: function() {}, + onEnd: function() {} + }; + + return iOSCheckbox; + + })(); + + $.iphoneStyle = this.iOSCheckbox = iOSCheckbox; + + $.fn.iphoneStyle = function() { + var args, checkbox, dataName, existingControl, method, params, _i, _len, _ref, _ref1, _ref2, _ref3, _refradio; + + args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + dataName = (_ref = (_ref1 = args[0]) != null ? _ref1.dataName : void 0) != null ? _ref : iOSCheckbox.defaults.dataName; + _ref2 = this.filter(':checkbox'); + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + checkbox = _ref2[_i]; + existingControl = $(checkbox).data(dataName); + if (existingControl != null) { + method = args[0], params = 2 <= args.length ? __slice.call(args, 1) : []; + if ((_ref3 = existingControl[method]) != null) { + _ref3.apply(existingControl, params); + } + } else { + new iOSCheckbox(checkbox, args[0]); + } + } + _refradio = this.filter(':radio'); + for (_i = 0, _len = _refradio.length; _i < _len; _i++) { + checkbox = _refradio[_i]; + existingControl = $(checkbox).data(dataName); + if (existingControl != null) { + method = args[0], params = 2 <= args.length ? __slice.call(args, 1) : []; + if ((_ref3 = existingControl[method]) != null) { + _ref3.apply(existingControl, params); + } + } else { + new iOSCheckbox(checkbox, args[0]); + } + } + return this; + }; + + $.fn.iOSCheckbox = function(options) { + var opts; + + if (options == null) { + options = {}; + } + opts = $.extend({}, options, { + resizeHandle: false, + disabledClass: 'iOSCheckDisabled', + containerClass: 'iOSCheckContainer', + labelOnClass: 'iOSCheckLabelOn', + labelOffClass: 'iOSCheckLabelOff', + handleClass: 'iOSCheckHandle', + handleCenterClass: 'iOSCheckHandleCenter', + handleRightClass: 'iOSCheckHandleRight', + dataName: 'iOSCheckbox' + }); + return this.iphoneStyle(opts); + }; + +}).call(this); +})(jQuery); \ No newline at end of file diff --git a/admin/assets/js/iphone-style-checkboxes.rtl.js b/admin/assets/js/iphone-style-checkboxes.rtl.js new file mode 100644 index 0000000..42d93d4 --- /dev/null +++ b/admin/assets/js/iphone-style-checkboxes.rtl.js @@ -0,0 +1,381 @@ +// Generated by CoffeeScript 1.6.2 +(function($) { +(function() { + var iOSCheckbox, matched, userAgent, + __slice = [].slice; + + if ($.browser == null) { + userAgent = navigator.userAgent || ""; + jQuery.uaMatch = function(ua) { + var match; + + ua = ua.toLowerCase(); + match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+))?/.exec(ua) || []; + return { + browser: match[1] || "", + version: match[2] || "0" + }; + }; + matched = jQuery.uaMatch(userAgent); + jQuery.browser = {}; + if (matched.browser) { + jQuery.browser[matched.browser] = true; + jQuery.browser.version = matched.version; + } + if (jQuery.browser.webkit) { + jQuery.browser.safari = true; + } + } + + iOSCheckbox = (function() { + function iOSCheckbox(elem, options) { + var key, opts, value; + + this.elem = $(elem); + opts = $.extend({}, iOSCheckbox.defaults, options); + for (key in opts) { + value = opts[key]; + this[key] = value; + } + this.elem.data(this.dataName, this); + this.wrapCheckboxWithDivs(); + this.attachEvents(); + this.disableTextSelection(); + this.calculateDimensions(); + } + + iOSCheckbox.prototype.calculateDimensions = function() { + if (this.resizeHandle) { + this.optionallyResize('handle'); + } + if (this.resizeContainer) { + this.optionallyResize('container'); + } + return this.initialPosition(); + }; + + iOSCheckbox.prototype.isDisabled = function() { + if ( this.elem.is(':disabled') ) + return true; + else if ( this.elem.attr('checkbox-disabled') == 'true' ) + return true; + else + return false; + }; + + iOSCheckbox.prototype.wrapCheckboxWithDivs = function() { + this.elem.wrap("
          "); + this.container = this.elem.parent(); + this.offLabel = $("").appendTo(this.container); + this.offSpan = this.offLabel.children('span'); + this.onLabel = $("").appendTo(this.container); + this.onSpan = this.onLabel.children('span'); + return this.handle = $("
          \n
          \n
          \n
          \n
          ").appendTo(this.container).before("  "); + }; + + iOSCheckbox.prototype.disableTextSelection = function() { + if ($.browser.msie) { + return $([this.handle, this.offLabel, this.onLabel, this.container]).attr("unselectable", "on"); + } + }; + + iOSCheckbox.prototype._getDimension = function(elem, dimension) { + if ($.fn.actual != null) { + return elem.actual(dimension); + } else { + return elem[dimension](); + } + }; + + iOSCheckbox.prototype.optionallyResize = function(mode) { + var newWidth, offLabelWidth, offSpan, onLabelWidth, onSpan; + + onSpan = this.onLabel.find('span'); + onLabelWidth = this._getDimension(onSpan, "width"); + onLabelWidth += parseInt(onSpan.css('padding-right'), 10); + offSpan = this.offLabel.find('span'); + offLabelWidth = this._getDimension(offSpan, "width"); + offLabelWidth += parseInt(offSpan.css('padding-left'), 10); + if (mode === "container") { + newWidth = onLabelWidth > offLabelWidth ? onLabelWidth : offLabelWidth; + newWidth += this._getDimension(this.handle, "width") + this.handleMargin; + return this.container.css({ + width: newWidth + }); + } else { + newWidth = onLabelWidth > offLabelWidth ? onLabelWidth : offLabelWidth; + return this.handle.css({ + width: newWidth + }); + } + }; + + iOSCheckbox.prototype.onMouseDown = function(event) { + var x; + + event.preventDefault(); + if (this.isDisabled()) { + return; + } + x = event.pageX || event.originalEvent.changedTouches[0].pageX; + iOSCheckbox.currentlyClicking = this.handle; + iOSCheckbox.dragStartPosition = x; + return iOSCheckbox.handleLeftOffset = parseInt(this.handle.css('right'), 10) || 0; + }; + + iOSCheckbox.prototype.onDragMove = function(event, x) { + var newWidth, p, leftHandle; + + if (iOSCheckbox.currentlyClicking !== this.handle) { + return; + } + p = (x + iOSCheckbox.handleLeftOffset - iOSCheckbox.dragStartPosition) / this.rightSide; + if (p < 0) { + p = 0; + } + if (p > 1) { + p = 1; + } + newWidth = p * this.rightSide; + leftHandle = newWidth; + if ( leftHandle == 0 ) leftHandle = -1; + this.handle.css({ + right: leftHandle + }); + this.onLabel.css({ + width: newWidth + this.handleRadius + }); + this.offSpan.css({ + marginLeft: -newWidth + }); + return this.onSpan.css({ + marginRight: -(1 - p) * this.rightSide + }); + }; + + iOSCheckbox.prototype.onDragEnd = function(event, x) { + var p; + + if (iOSCheckbox.currentlyClicking !== this.handle) { + return; + } + if (this.isDisabled()) { + return; + } + if (iOSCheckbox.dragging) { + p = (x - iOSCheckbox.dragStartPosition) / this.rightSide; + this.elem.prop('checked', p >= 0.5); + } else { + this.elem.prop('checked', !this.elem.prop('checked')); + } + iOSCheckbox.currentlyClicking = null; + iOSCheckbox.dragging = null; + return this.didChange(); + }; + + iOSCheckbox.prototype.refresh = function() { + return this.didChange(); + }; + + iOSCheckbox.prototype.didChange = function() { + var new_left, leftHandle; + + if (typeof this.onChange === "function") { + this.onChange(this.elem, this.elem.prop('checked')); + } + if (this.isDisabled()) { + this.container.addClass(this.disabledClass); + return false; + } else { + this.container.removeClass(this.disabledClass); + } + new_left = this.elem.prop('checked') ? this.rightSide : 0; + leftHandle = new_left; + if ( leftHandle == 0 ) leftHandle = -1; + this.handle.animate({ + right: leftHandle + }, this.duration); + this.onLabel.animate({ + width: new_left + this.handleRadius + }, this.duration); + this.offSpan.animate({ + marginLeft: -new_left + }, this.duration); + this.onSpan.animate({ + marginRight: new_left - this.rightSide + }, this.duration); + if (typeof this.onEnd === "function") { + this.onEnd(this.elem, this.elem.prop('checked')); + } + return true; + }; + + iOSCheckbox.prototype.attachEvents = function() { + var localMouseMove, localMouseUp, self; + + self = this; + localMouseMove = function(event) { + return self.onGlobalMove.apply(self, arguments); + }; + localMouseUp = function(event) { + self.onGlobalUp.apply(self, arguments); + $(document).unbind('mousemove touchmove', localMouseMove); + return $(document).unbind('mouseup touchend', localMouseUp); + }; + this.elem.change(function() { + return self.refresh(); + }); + return this.container.bind('mousedown touchstart', function(event) { + self.onMouseDown.apply(self, arguments); + $(document).bind('mousemove touchmove', localMouseMove); + return $(document).bind('mouseup touchend', localMouseUp); + }); + }; + + iOSCheckbox.prototype.initialPosition = function() { + var containerWidth, offset, leftHandle; + + containerWidth = this._getDimension(this.container, "width"); + this.offLabel.css({ + width: containerWidth - this.containerRadius - 16 + }); + offset = this.containerRadius + 1; + if ($.browser.msie && $.browser.version < 7) { + offset -= 3; + } + this.rightSide = containerWidth - this._getDimension(this.handle, "width") - offset; + leftHandle = this.rightSide; + if ( leftHandle == 0 ) leftHandle = -1; + if (this.elem.is(':checked')) { + this.handle.css({ + right: leftHandle + }); + this.onLabel.css({ + width: this.rightSide + this.handleRadius + }); + this.offSpan.css({ + marginLeft: -this.rightSide + }); + } else { + this.onLabel.css({ + width: this.handleRadius + }); + this.onSpan.css({ + marginRight: -this.rightSide + }); + } + if (this.isDisabled()) { + return this.container.addClass(this.disabledClass); + } + }; + + iOSCheckbox.prototype.onGlobalMove = function(event) { + var x; + + if (!(!this.isDisabled() && iOSCheckbox.currentlyClicking)) { + return; + } + event.preventDefault(); + x = event.pageX || event.originalEvent.changedTouches[0].pageX; + if (!iOSCheckbox.dragging && (Math.abs(iOSCheckbox.dragStartPosition - x) > this.dragThreshold)) { + iOSCheckbox.dragging = true; + } + return this.onDragMove(event, x); + }; + + iOSCheckbox.prototype.onGlobalUp = function(event) { + var x; + + if (!iOSCheckbox.currentlyClicking) { + return; + } + event.preventDefault(); + x = event.pageX || event.originalEvent.changedTouches[0].pageX; + this.onDragEnd(event, x); + return false; + }; + + iOSCheckbox.defaults = { + duration: 200, + checkedLabel: 'ON', + uncheckedLabel: 'OFF', + resizeHandle: true, + resizeContainer: true, + disabledClass: 'iPhoneCheckDisabled', + containerClass: 'iPhoneCheckContainer', + labelOnClass: 'iPhoneCheckLabelOn', + labelOffClass: 'iPhoneCheckLabelOff', + handleClass: 'iPhoneCheckHandle', + handleCenterClass: 'iPhoneCheckHandleCenter', + handleRightClass: 'iPhoneCheckHandleRight', + dragThreshold: 5, + handleMargin: 15, + handleRadius: 4, + containerRadius: 5, + dataName: "iphoneStyle", + onChange: function() {}, + onEnd: function() {} + }; + + return iOSCheckbox; + + })(); + + $.iphoneStyle = this.iOSCheckbox = iOSCheckbox; + + $.fn.iphoneStyle = function() { + var args, checkbox, dataName, existingControl, method, params, _i, _len, _ref, _ref1, _ref2, _ref3, _refradio; + + args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + dataName = (_ref = (_ref1 = args[0]) != null ? _ref1.dataName : void 0) != null ? _ref : iOSCheckbox.defaults.dataName; + _ref2 = this.filter(':checkbox'); + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + checkbox = _ref2[_i]; + existingControl = $(checkbox).data(dataName); + if (existingControl != null) { + method = args[0], params = 2 <= args.length ? __slice.call(args, 1) : []; + if ((_ref3 = existingControl[method]) != null) { + _ref3.apply(existingControl, params); + } + } else { + new iOSCheckbox(checkbox, args[0]); + } + } + _refradio = this.filter(':radio'); + for (_i = 0, _len = _refradio.length; _i < _len; _i++) { + checkbox = _refradio[_i]; + existingControl = $(checkbox).data(dataName); + if (existingControl != null) { + method = args[0], params = 2 <= args.length ? __slice.call(args, 1) : []; + if ((_ref3 = existingControl[method]) != null) { + _ref3.apply(existingControl, params); + } + } else { + new iOSCheckbox(checkbox, args[0]); + } + } + return this; + }; + + $.fn.iOSCheckbox = function(options) { + var opts; + + if (options == null) { + options = {}; + } + opts = $.extend({}, options, { + resizeHandle: false, + disabledClass: 'iOSCheckDisabled', + containerClass: 'iOSCheckContainer', + labelOnClass: 'iOSCheckLabelOn', + labelOffClass: 'iOSCheckLabelOff', + handleClass: 'iOSCheckHandle', + handleCenterClass: 'iOSCheckHandleCenter', + handleRightClass: 'iOSCheckHandleRight', + dataName: 'iOSCheckbox' + }); + return this.iphoneStyle(opts); + }; + +}).call(this); +})(jQuery); \ No newline at end of file diff --git a/admin/assets/js/rwdImageMaps/jquery.rwdImageMaps.min.js b/admin/assets/js/rwdImageMaps/jquery.rwdImageMaps.min.js new file mode 100755 index 0000000..7ea76b1 --- /dev/null +++ b/admin/assets/js/rwdImageMaps/jquery.rwdImageMaps.min.js @@ -0,0 +1,11 @@ +/* +* rwdImageMaps jQuery plugin v1.5 +* +* Allows image maps to be used in a responsive design by recalculating the area coordinates to match the actual image size on load and window.resize +* +* Copyright (c) 2013 Matt Stow +* https://github.com/stowball/jQuery-rwdImageMaps +* http://mattstow.com +* Licensed under the MIT license +*/ +;(function(a){a.fn.rwdImageMaps=function(){var c=this;var b=function(){c.each(function(){if(typeof(a(this).attr("usemap"))=="undefined"){return}var e=this,d=a(e);a("").load(function(){var g="width",m="height",n=d.attr(g),j=d.attr(m);if(!n||!j){var o=new Image();o.src=d.attr("src");if(!n){n=o.width}if(!j){j=o.height}}var f=d.width()/100,k=d.height()/100,i=d.attr("usemap").replace("#",""),l="coords";a('map[name="'+i+'"]').find("area").each(function(){var r=a(this);if(!r.data(l)){r.data(l,r.attr(l))}var q=r.data(l).split(","),p=new Array(q.length);for(var h=0;h
          '); + var tiptip_content = $('
          '); + var tiptip_arrow = $('
          '); + $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('
          '))); + } else { + var tiptip_holder = $("#tiptip_holder"); + var tiptip_content = $("#tiptip_content"); + var tiptip_arrow = $("#tiptip_arrow"); + } + + return this.each(function(){ + var org_elem = $(this); + if(opts.content){ + var org_title = opts.content; + } else { + var org_title = org_elem.attr(opts.attribute); + } + if(org_title != ""){ + if(!opts.content){ + org_elem.removeAttr(opts.attribute); //remove original Attribute + } + var timeout = false; + + if(opts.activation == "hover"){ + org_elem.hover(function(){ + active_tiptip(); + }, function(){ + if(!opts.keepAlive){ + deactive_tiptip(); + } + }); + if(opts.keepAlive){ + tiptip_holder.hover(function(){}, function(){ + deactive_tiptip(); + }); + } + } else if(opts.activation == "focus"){ + org_elem.focus(function(){ + active_tiptip(); + }).blur(function(){ + deactive_tiptip(); + }); + } else if(opts.activation == "click"){ + org_elem.click(function(){ + active_tiptip(); + return false; + }).hover(function(){},function(){ + if(!opts.keepAlive){ + deactive_tiptip(); + } + }); + if(opts.keepAlive){ + tiptip_holder.hover(function(){}, function(){ + deactive_tiptip(); + }); + } + } + + function active_tiptip(){ + opts.enter.call(this); + tiptip_content.html(org_title); + tiptip_holder.hide().removeAttr("class").css("margin","0"); + tiptip_arrow.removeAttr("style"); + + var top = parseInt(org_elem.offset()['top']); + var left = parseInt(org_elem.offset()['left']); + var org_width = parseInt(org_elem.outerWidth()); + var org_height = parseInt(org_elem.outerHeight()); + var tip_w = tiptip_holder.outerWidth(); + var tip_h = tiptip_holder.outerHeight(); + var w_compare = Math.round((org_width - tip_w) / 2); + var h_compare = Math.round((org_height - tip_h) / 2); + var marg_left = Math.round(left + w_compare); + var marg_top = Math.round(top + org_height + opts.edgeOffset); + var t_class = ""; + var arrow_top = ""; + var arrow_left = Math.round(tip_w - 12) / 2; + + if(opts.defaultPosition == "bottom"){ + t_class = "_bottom"; + } else if(opts.defaultPosition == "top"){ + t_class = "_top"; + } else if(opts.defaultPosition == "left"){ + t_class = "_left"; + } else if(opts.defaultPosition == "right"){ + t_class = "_right"; + } + + var right_compare = (w_compare + left) < parseInt($(window).scrollLeft()); + var left_compare = (tip_w + left) > parseInt($(window).width()); + + if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){ + t_class = "_right"; + arrow_top = Math.round(tip_h - 13) / 2; + arrow_left = -12; + marg_left = Math.round(left + org_width + opts.edgeOffset); + marg_top = Math.round(top + h_compare); + } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){ + t_class = "_left"; + arrow_top = Math.round(tip_h - 13) / 2; + arrow_left = Math.round(tip_w); + marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5)); + marg_top = Math.round(top + h_compare); + } + + var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop()); + var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0; + + if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){ + if(t_class == "_top" || t_class == "_bottom"){ + t_class = "_top"; + } else { + t_class = t_class+"_top"; + } + arrow_top = tip_h; + marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset)); + } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){ + if(t_class == "_top" || t_class == "_bottom"){ + t_class = "_bottom"; + } else { + t_class = t_class+"_bottom"; + } + arrow_top = -12; + marg_top = Math.round(top + org_height + opts.edgeOffset); + } + + if(t_class == "_right_top" || t_class == "_left_top"){ + marg_top = marg_top + 5; + } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){ + marg_top = marg_top - 5; + } + if(t_class == "_left_top" || t_class == "_left_bottom"){ + marg_left = marg_left + 5; + } + tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"}); + tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class); + + if (timeout){ clearTimeout(timeout); } + timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay); + } + + function deactive_tiptip(){ + opts.exit.call(this); + if (timeout){ clearTimeout(timeout); } + tiptip_holder.fadeOut(opts.fadeOut); + } + } + }); + } +})(jQuery); \ No newline at end of file diff --git a/admin/assets/js/tipTip/jquery.tipTip.min.js b/admin/assets/js/tipTip/jquery.tipTip.min.js new file mode 100644 index 0000000..cdf3a89 --- /dev/null +++ b/admin/assets/js/tipTip/jquery.tipTip.min.js @@ -0,0 +1,21 @@ + /* + * TipTip + * Copyright 2010 Drew Wilson + * www.drewwilson.com + * code.drewwilson.com/entry/tiptip-jquery-plugin + * + * Version 1.3 - Updated: Mar. 23, 2010 + * + * This Plug-In will create a custom tooltip to replace the default + * browser tooltip. It is extremely lightweight and very smart in + * that it detects the edges of the browser window and will make sure + * the tooltip stays within the current window size. As a result the + * tooltip will adjust itself to be displayed above, below, to the left + * or to the right depending on what is necessary to stay within the + * browser window. It is completely customizable as well via CSS. + * + * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +(function($){$.fn.tipTip=function(options){var defaults={activation:"hover",keepAlive:false,maxWidth:"200px",edgeOffset:3,defaultPosition:"bottom",delay:400,fadeIn:200,fadeOut:200,attribute:"title",content:false,enter:function(){},exit:function(){}};var opts=$.extend(defaults,options);if($("#tiptip_holder").length<=0){var tiptip_holder=$('
          ');var tiptip_content=$('
          ');var tiptip_arrow=$('
          ');$("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('
          ')))}else{var tiptip_holder=$("#tiptip_holder");var tiptip_content=$("#tiptip_content");var tiptip_arrow=$("#tiptip_arrow")}return this.each(function(){var org_elem=$(this);if(opts.content){var org_title=opts.content}else{var org_title=org_elem.attr(opts.attribute)}if(org_title!=""){if(!opts.content){org_elem.removeAttr(opts.attribute)}var timeout=false;if(opts.activation=="hover"){org_elem.hover(function(){active_tiptip()},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}else if(opts.activation=="focus"){org_elem.focus(function(){active_tiptip()}).blur(function(){deactive_tiptip()})}else if(opts.activation=="click"){org_elem.click(function(){active_tiptip();return false}).hover(function(){},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}function active_tiptip(){opts.enter.call(this);tiptip_content.html(org_title);tiptip_holder.hide().removeAttr("class").css("margin","0");tiptip_arrow.removeAttr("style");var top=parseInt(org_elem.offset()['top']);var left=parseInt(org_elem.offset()['left']);var org_width=parseInt(org_elem.outerWidth());var org_height=parseInt(org_elem.outerHeight());var tip_w=tiptip_holder.outerWidth();var tip_h=tiptip_holder.outerHeight();var w_compare=Math.round((org_width-tip_w)/2);var h_compare=Math.round((org_height-tip_h)/2);var marg_left=Math.round(left+w_compare);var marg_top=Math.round(top+org_height+opts.edgeOffset);var t_class="";var arrow_top="";var arrow_left=Math.round(tip_w-12)/2;if(opts.defaultPosition=="bottom"){t_class="_bottom"}else if(opts.defaultPosition=="top"){t_class="_top"}else if(opts.defaultPosition=="left"){t_class="_left"}else if(opts.defaultPosition=="right"){t_class="_right"}var right_compare=(w_compare+left)parseInt($(window).width());if((right_compare&&w_compare<0)||(t_class=="_right"&&!left_compare)||(t_class=="_left"&&left<(tip_w+opts.edgeOffset+5))){t_class="_right";arrow_top=Math.round(tip_h-13)/2;arrow_left=-12;marg_left=Math.round(left+org_width+opts.edgeOffset);marg_top=Math.round(top+h_compare)}else if((left_compare&&w_compare<0)||(t_class=="_left"&&!right_compare)){t_class="_left";arrow_top=Math.round(tip_h-13)/2;arrow_left=Math.round(tip_w);marg_left=Math.round(left-(tip_w+opts.edgeOffset+5));marg_top=Math.round(top+h_compare)}var top_compare=(top+org_height+opts.edgeOffset+tip_h+8)>parseInt($(window).height()+$(window).scrollTop());var bottom_compare=((top+org_height)-(opts.edgeOffset+tip_h+8))<0;if(top_compare||(t_class=="_bottom"&&top_compare)||(t_class=="_top"&&!bottom_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_top"}else{t_class=t_class+"_top"}arrow_top=tip_h;marg_top=Math.round(top-(tip_h+5+opts.edgeOffset))}else if(bottom_compare|(t_class=="_top"&&bottom_compare)||(t_class=="_bottom"&&!top_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_bottom"}else{t_class=t_class+"_bottom"}arrow_top=-12;marg_top=Math.round(top+org_height+opts.edgeOffset)}if(t_class=="_right_top"||t_class=="_left_top"){marg_top=marg_top+5}else if(t_class=="_right_bottom"||t_class=="_left_bottom"){marg_top=marg_top-5}if(t_class=="_left_top"||t_class=="_left_bottom"){marg_left=marg_left+5}tiptip_arrow.css({"margin-left":arrow_left+"px","margin-top":arrow_top+"px"});tiptip_holder.css({"margin-left":marg_left+"px","margin-top":marg_top+"px"}).attr("class","tip"+t_class);if(timeout){clearTimeout(timeout)}timeout=setTimeout(function(){tiptip_holder.stop(true,true).fadeIn(opts.fadeIn)},opts.delay)}function deactive_tiptip(){opts.exit.call(this);if(timeout){clearTimeout(timeout)}tiptip_holder.fadeOut(opts.fadeOut)}}})}})(jQuery); \ No newline at end of file diff --git a/admin/assets/js/tipTip/tipTip.css b/admin/assets/js/tipTip/tipTip.css new file mode 100644 index 0000000..4fb95d3 --- /dev/null +++ b/admin/assets/js/tipTip/tipTip.css @@ -0,0 +1,113 @@ +/* TipTip CSS - Version 1.2 */ + +#tiptip_holder { + display: none; + position: absolute; + top: 0; + left: 0; + z-index: 99999; +} + +#tiptip_holder.tip_top { + padding-bottom: 5px; +} + +#tiptip_holder.tip_bottom { + padding-top: 5px; +} + +#tiptip_holder.tip_right { + padding-left: 5px; +} + +#tiptip_holder.tip_left { + padding-right: 5px; +} + +#tiptip_content { + font-size: 11px; + color: #fff; + text-shadow: 0 0 2px #000; + padding: 4px 8px; + border: 1px solid rgba(255,255,255,0.25); + background-color: rgb(25,25,25); + background-color: rgba(25,25,25,0.92); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000)); + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + box-shadow: 0 0 3px #555; + -webkit-box-shadow: 0 0 3px #555; + -moz-box-shadow: 0 0 3px #555; +} + +#tiptip_arrow, #tiptip_arrow_inner { + position: absolute; + border-color: transparent; + border-style: solid; + border-width: 6px; + height: 0; + width: 0; +} + +#tiptip_holder.tip_top #tiptip_arrow { + border-top-color: #fff; + border-top-color: rgba(255,255,255,0.35); +} + +#tiptip_holder.tip_bottom #tiptip_arrow { + border-bottom-color: #fff; + border-bottom-color: rgba(255,255,255,0.35); +} + +#tiptip_holder.tip_right #tiptip_arrow { + border-right-color: #fff; + border-right-color: rgba(255,255,255,0.35); +} + +#tiptip_holder.tip_left #tiptip_arrow { + border-left-color: #fff; + border-left-color: rgba(255,255,255,0.35); +} + +#tiptip_holder.tip_top #tiptip_arrow_inner { + margin-top: -7px; + margin-left: -6px; + border-top-color: rgb(25,25,25); + border-top-color: rgba(25,25,25,0.92); +} + +#tiptip_holder.tip_bottom #tiptip_arrow_inner { + margin-top: -5px; + margin-left: -6px; + border-bottom-color: rgb(25,25,25); + border-bottom-color: rgba(25,25,25,0.92); +} + +#tiptip_holder.tip_right #tiptip_arrow_inner { + margin-top: -6px; + margin-left: -5px; + border-right-color: rgb(25,25,25); + border-right-color: rgba(25,25,25,0.92); +} + +#tiptip_holder.tip_left #tiptip_arrow_inner { + margin-top: -6px; + margin-left: -7px; + border-left-color: rgb(25,25,25); + border-left-color: rgba(25,25,25,0.92); +} + +/* Webkit Hacks */ +@media screen and (-webkit-min-device-pixel-ratio:0) { + #tiptip_content { + padding: 4px 8px 5px 8px; + background-color: rgba(45,45,45,0.88); + } + #tiptip_holder.tip_bottom #tiptip_arrow_inner { + border-bottom-color: rgba(45,45,45,0.88); + } + #tiptip_holder.tip_top #tiptip_arrow_inner { + border-top-color: rgba(20,20,20,0.92); + } +} \ No newline at end of file diff --git a/admin/assets/js/ui-slider/jquery.ui.slider.rtl.js b/admin/assets/js/ui-slider/jquery.ui.slider.rtl.js new file mode 100644 index 0000000..1bff1bd --- /dev/null +++ b/admin/assets/js/ui-slider/jquery.ui.slider.rtl.js @@ -0,0 +1,711 @@ +/* + * jQuery UI Slider 1.8.9.rtl.1 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function( $, undefined ) { + +// number of pages in a slider +// (how many times can you page up/down to go through the whole range) +var numPages = 5; + +$.widget( "ui.slider", $.ui.mouse, { + + widgetEventPrefix: "slide", + + options: { + animate: false, + distance: 0, + max: 100, + min: 0, + orientation: "horizontal", + isRTL: false, // RTL + range: false, + step: 1, + value: 0, + values: null + }, + + _create: function() { + var self = this, + o = this.options; + + this._keySliding = false; + this._mouseSliding = false; + this._animateOff = true; + this._handleIndex = null; + this._detectOrientation(); + this._mouseInit(); + + this.element + .addClass( "ui-slider" + + " ui-slider-" + this.orientation + + ( o.isRTL ? " ui-slider-rtl" : "" ) + // RTL + " ui-widget" + + " ui-widget-content" + + " ui-corner-all" ); + + if ( o.disabled ) { + this.element.addClass( "ui-slider-disabled ui-disabled" ); + } + + this.range = $([]); + + if ( o.range ) { + if ( o.range === true ) { + this.range = $( "
          " ); + if ( !o.values ) { + o.values = [ this._valueMin(), this._valueMin() ]; + } + if ( o.values.length && o.values.length !== 2 ) { + o.values = [ o.values[0], o.values[0] ]; + } + } else { + this.range = $( "
          " ); + } + + this.range + .appendTo( this.element ) + .addClass( "ui-slider-range" ); + + if ( o.range === "min" || o.range === "max" ) { + this.range.addClass( "ui-slider-range-" + o.range ); + } + + // note: this isn't the most fittingly semantic framework class for this element, + // but worked best visually with a variety of themes + this.range.addClass( "ui-widget-header" ); + } + + if ( $( ".ui-slider-handle", this.element ).length === 0 ) { + $( "
          " ) + .appendTo( this.element ) + .addClass( "ui-slider-handle" ); + } + + if ( o.values && o.values.length ) { + while ( $(".ui-slider-handle", this.element).length < o.values.length ) { + $( "" ) + .appendTo( this.element ) + .addClass( "ui-slider-handle" ); + } + } + + this.handles = $( ".ui-slider-handle", this.element ) + .addClass( "ui-state-default" + + " ui-corner-all" ); + + this.handle = this.handles.eq( 0 ); + + this.handles.add( this.range ).filter( "a" ) + .click(function( event ) { + event.preventDefault(); + }) + .hover(function() { + if ( !o.disabled ) { + $( this ).addClass( "ui-state-hover" ); + } + }, function() { + $( this ).removeClass( "ui-state-hover" ); + }) + .focus(function() { + if ( !o.disabled ) { + $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" ); + $( this ).addClass( "ui-state-focus" ); + } else { + $( this ).blur(); + } + }) + .blur(function() { + $( this ).removeClass( "ui-state-focus" ); + }); + + this.handles.each(function( i ) { + $( this ).data( "index.ui-slider-handle", i ); + }); + + this.handles + .keydown(function( event ) { + var ret = true, + index = $( this ).data( "index.ui-slider-handle" ), + allowed, + curVal, + newVal, + step; + + if ( self.options.disabled ) { + return; + } + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_UP: + case $.ui.keyCode.PAGE_DOWN: + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + ret = false; + if ( !self._keySliding ) { + self._keySliding = true; + $( this ).addClass( "ui-state-active" ); + allowed = self._start( event, index ); + if ( allowed === false ) { + return; + } + } + break; + } + + step = self.options.step; + if ( self.options.values && self.options.values.length ) { + curVal = newVal = self.values( index ); + } else { + curVal = newVal = self.value(); + } + + var adjust = function( minMax, offset ) { // RTL + if ( curVal === minMax ) { + return; + } + newVal = self._trimAlignValue( curVal + offset ); + }; + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + newVal = self._valueMin(); + break; + case $.ui.keyCode.END: + newVal = self._valueMax(); + break; + case $.ui.keyCode.PAGE_UP: + newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) ); + break; + case $.ui.keyCode.PAGE_DOWN: + newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) ); + break; + case $.ui.keyCode.UP: + adjust( self._valueMax(), step ); // RTL + break; + case $.ui.keyCode.RIGHT: + adjust( self._valueMax(), self.options.isRTL ? -step : step ); // RTL + break; + case $.ui.keyCode.DOWN: + adjust( self._valueMin(), -step ); // RTL + break; + case $.ui.keyCode.LEFT: + adjust( self._valueMin(), self.options.isRTL ? step : -step ); // RTL + break; + } + + self._slide( event, index, newVal ); + + return ret; + + }) + .keyup(function( event ) { + var index = $( this ).data( "index.ui-slider-handle" ); + + if ( self._keySliding ) { + self._keySliding = false; + self._stop( event, index ); + self._change( event, index ); + $( this ).removeClass( "ui-state-active" ); + } + + }); + + this._refreshValue(); + + this._animateOff = false; + }, + + destroy: function() { + this.handles.remove(); + this.range.remove(); + + this.element + .removeClass( "ui-slider" + + " ui-slider-horizontal" + + " ui-slider-vertical" + + " ui-slider-disabled" + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all" ) + .removeData( "slider" ) + .unbind( ".slider" ); + + this._mouseDestroy(); + + return this; + }, + + _mouseCapture: function( event ) { + var o = this.options, + position, + normValue, + distance, + closestHandle, + self, + index, + allowed, + offset, + mouseOverHandle; + + if ( o.disabled ) { + return false; + } + + this.elementSize = { + width: this.element.outerWidth(), + height: this.element.outerHeight() + }; + this.elementOffset = this.element.offset(); + + position = { x: event.pageX, y: event.pageY }; + normValue = this._normValueFromMouse( position ); + distance = this._valueMax() - this._valueMin() + 1; + self = this; + this.handles.each(function( i ) { + var thisDistance = Math.abs( normValue - self.values(i) ); + if ( distance > thisDistance ) { + distance = thisDistance; + closestHandle = $( this ); + index = i; + } + }); + + // workaround for bug #3736 (if both handles of a range are at 0, + // the first is always used as the one with least distance, + // and moving it is obviously prevented by preventing negative ranges) + if( o.range === true && this.values(1) === o.min ) { + index += 1; + closestHandle = $( this.handles[index] ); + } + + allowed = this._start( event, index ); + if ( allowed === false ) { + return false; + } + this._mouseSliding = true; + + self._handleIndex = index; + + closestHandle + .addClass( "ui-state-active" ) + .focus(); + + offset = closestHandle.offset(); + mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" ); + this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : { + left: event.pageX - offset.left - ( closestHandle.width() / 2 ), + top: event.pageY - offset.top - + ( closestHandle.height() / 2 ) - + ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) - + ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) + + ( parseInt( closestHandle.css("marginTop"), 10 ) || 0) + }; + + if ( !this.handles.hasClass( "ui-state-hover" ) ) { + this._slide( event, index, normValue ); + } + this._animateOff = true; + return true; + }, + + _mouseStart: function( event ) { + return true; + }, + + _mouseDrag: function( event ) { + var position = { x: event.pageX, y: event.pageY }, + normValue = this._normValueFromMouse( position ); + + this._slide( event, this._handleIndex, normValue ); + + return false; + }, + + _mouseStop: function( event ) { + this.handles.removeClass( "ui-state-active" ); + this._mouseSliding = false; + + this._stop( event, this._handleIndex ); + this._change( event, this._handleIndex ); + + this._handleIndex = null; + this._clickOffset = null; + this._animateOff = false; + + return false; + }, + + _detectOrientation: function() { + this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal"; + }, + + _normValueFromMouse: function( position ) { + var pixelTotal, + pixelMouse, + percentMouse, + valueTotal, + valueMouse; + + if ( this.orientation === "horizontal" ) { + pixelTotal = this.elementSize.width; + pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 ); + } else { + pixelTotal = this.elementSize.height; + pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 ); + } + + percentMouse = ( pixelMouse / pixelTotal ); + if ( percentMouse > 1 ) { + percentMouse = 1; + } + if ( percentMouse < 0 ) { + percentMouse = 0; + } + if ( this.orientation === "vertical" ) { + percentMouse = 1 - percentMouse; + } + if ( this.options.isRTL ) { // RTL + percentMouse = 1 - percentMouse; + } + + valueTotal = this._valueMax() - this._valueMin(); + valueMouse = this._valueMin() + percentMouse * valueTotal; + + return this._trimAlignValue( valueMouse ); + }, + + _start: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + return this._trigger( "start", event, uiHash ); + }, + + _slide: function( event, index, newVal ) { + var otherVal, + newValues, + allowed; + + if ( this.options.values && this.options.values.length ) { + otherVal = this.values( index ? 0 : 1 ); + + if ( ( this.options.values.length === 2 && this.options.range === true ) && + ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) ) + ) { + newVal = otherVal; + } + + if ( newVal !== this.values( index ) ) { + newValues = this.values(); + newValues[ index ] = newVal; + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal, + values: newValues + } ); + otherVal = this.values( index ? 0 : 1 ); + if ( allowed !== false ) { + this.values( index, newVal, true ); + } + } + } else { + if ( newVal !== this.value() ) { + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal + } ); + if ( allowed !== false ) { + this.value( newVal ); + } + } + } + }, + + _stop: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "stop", event, uiHash ); + }, + + _change: function( event, index ) { + if ( !this._keySliding && !this._mouseSliding ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "change", event, uiHash ); + } + }, + + value: function( newValue ) { + if ( arguments.length ) { + this.options.value = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, 0 ); + } + + return this._value(); + }, + + values: function( index, newValue ) { + var vals, + newValues, + i; + + if ( arguments.length > 1 ) { + this.options.values[ index ] = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, index ); + } + + if ( arguments.length ) { + if ( $.isArray( arguments[ 0 ] ) ) { + vals = this.options.values; + newValues = arguments[ 0 ]; + for ( i = 0; i < vals.length; i += 1 ) { + vals[ i ] = this._trimAlignValue( newValues[ i ] ); + this._change( null, i ); + } + this._refreshValue(); + } else { + if ( this.options.values && this.options.values.length ) { + return this._values( index ); + } else { + return this.value(); + } + } + } else { + return this._values(); + } + }, + + _setOption: function( key, value ) { + var i, + valsLength = 0; + + if ( $.isArray( this.options.values ) ) { + valsLength = this.options.values.length; + } + + $.Widget.prototype._setOption.apply( this, arguments ); + + switch ( key ) { + case "disabled": + if ( value ) { + this.handles.filter( ".ui-state-focus" ).blur(); + this.handles.removeClass( "ui-state-hover" ); + this.handles.attr( "disabled", "disabled" ); + this.element.addClass( "ui-disabled" ); + } else { + this.handles.removeAttr( "disabled" ); + this.element.removeClass( "ui-disabled" ); + } + break; + case "orientation": + this._detectOrientation(); + this.element + .removeClass( "ui-slider-horizontal ui-slider-vertical" ) + .addClass( "ui-slider-" + this.orientation ); + this._refreshValue(); + break; + case "isRTL": // RTL + this.element.toggleClass( "ui-slider-rtl", value ); + this._refreshValue(); + break; + case "value": + this._animateOff = true; + this._refreshValue(); + this._change( null, 0 ); + this._animateOff = false; + break; + case "values": + this._animateOff = true; + this._refreshValue(); + for ( i = 0; i < valsLength; i += 1 ) { + this._change( null, i ); + } + this._animateOff = false; + break; + } + }, + + //internal value getter + // _value() returns value trimmed by min and max, aligned by step + _value: function() { + var val = this.options.value; + val = this._trimAlignValue( val ); + + return val; + }, + + //internal values getter + // _values() returns array of values trimmed by min and max, aligned by step + // _values( index ) returns single value trimmed by min and max, aligned by step + _values: function( index ) { + var val, + vals, + i; + + if ( arguments.length ) { + val = this.options.values[ index ]; + val = this._trimAlignValue( val ); + + return val; + } else { + // .slice() creates a copy of the array + // this copy gets trimmed by min and max and then returned + vals = this.options.values.slice(); + for ( i = 0; i < vals.length; i+= 1) { + vals[ i ] = this._trimAlignValue( vals[ i ] ); + } + + return vals; + } + }, + + // returns the step-aligned value that val is closest to, between (inclusive) min and max + _trimAlignValue: function( val ) { + if ( val <= this._valueMin() ) { + return this._valueMin(); + } + if ( val >= this._valueMax() ) { + return this._valueMax(); + } + var step = ( this.options.step > 0 ) ? this.options.step : 1, + valModStep = (val - this._valueMin()) % step; + alignValue = val - valModStep; + + if ( Math.abs(valModStep) * 2 >= step ) { + alignValue += ( valModStep > 0 ) ? step : ( -step ); + } + + // Since JavaScript has problems with large floats, round + // the final value to 5 digits after the decimal point (see #4124) + return parseFloat( alignValue.toFixed(5) ); + }, + + _valueMin: function() { + return this.options.min; + }, + + _valueMax: function() { + return this.options.max; + }, + + _refreshValue: function() { + var oRange = this.options.range, + o = this.options, + self = this, + animate = ( !this._animateOff ) ? o.animate : false, + valPercent, + _set = {}, + lastValPercent, + value, + valueMin, + valueMax; + + if ( this.options.values && this.options.values.length ) { + this.handles.each(function( i, j ) { + valPercent = ( self.values( i ) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100; + valPercent = ( self.options.isRTL ? 100 - valPercent : valPercent ); // RTL + _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + if ( self.options.range === true ) { + if ( self.orientation === "horizontal" ) { + if ( i === 0 ) { + self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( + self.options.isRTL ? { right: ( 100 - valPercent ) + "%"} : // RTL + { left: valPercent + "%" }, o.animate ); + } + if ( i === 1 ) { + self.range[ animate ? "animate" : "css" ]( { + width: ( ( self.options.isRTL ? -1 : +1 ) * ( valPercent - lastValPercent ) ) + "%" }, // RTL + { queue: false, duration: o.animate } ); + } + } else { + if ( i === 0 ) { + self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( + self.options.isRTL ? { top: ( 100 - valPercent ) + "%" } : // RTL + { bottom: ( valPercent ) + "%" }, o.animate ); + } + if ( i === 1 ) { + self.range[ animate ? "animate" : "css" ]( { + height: ( ( self.options.isRTL ? -1 : +1 ) * ( valPercent - lastValPercent ) ) + "%" }, // RTL + { queue: false, duration: o.animate } ); + } + } + } + lastValPercent = valPercent; + }); + } else { + value = this.value(); + valueMin = this._valueMin(); + valueMax = this._valueMax(); + valPercent = ( valueMax !== valueMin ) ? + ( value - valueMin ) / ( valueMax - valueMin ) * 100 : + 0; + valPercent = ( self.options.isRTL ? 100 - valPercent : valPercent ); // RTL + _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + + if ( oRange === "min" && this.orientation === "horizontal" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( + { width: ( self.options.isRTL ? 100 - valPercent : valPercent ) + "%" }, o.animate ); // RTL + } + if ( oRange === "max" && this.orientation === "horizontal" ) { + this.range[ animate ? "animate" : "css" ]( { + width: ( self.options.isRTL ? valPercent : 100 - valPercent ) + "%" }, // RTL + { queue: false, duration: o.animate } ); + } + if ( oRange === "min" && this.orientation === "vertical" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( + { height: ( self.options.isRTL ? 100 - valPercent : valPercent ) + "%" }, o.animate ); // RTL + } + if ( oRange === "max" && this.orientation === "vertical" ) { + this.range[ animate ? "animate" : "css" ]( + { height: ( self.options.isRTL ? valPercent : 100 - valPercent ) + "%" }, // RTL + { queue: false, duration: o.animate } ); + } + } + } + +}); + +$.extend( $.ui.slider, { + version: "1.8.9" +}); + +}(jQuery)); diff --git a/admin/assets/js/ui-slider/jquery.ui.slider.rtl.min.js b/admin/assets/js/ui-slider/jquery.ui.slider.rtl.min.js new file mode 100644 index 0000000..6295680 --- /dev/null +++ b/admin/assets/js/ui-slider/jquery.ui.slider.rtl.min.js @@ -0,0 +1,15 @@ +/* + * jQuery UI Slider 1.8.9.rtl.1 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($,g){var h=5;$.widget("ui.slider",$.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",isRTL:false,range:false,step:1,value:0,values:null},_create:function(){var f=this,o=this.options;this._keySliding=false;this._mouseSliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider"+" ui-slider-"+this.orientation+(o.isRTL?" ui-slider-rtl":"")+" ui-widget"+" ui-widget-content"+" ui-corner-all");if(o.disabled){this.element.addClass("ui-slider-disabled ui-disabled")}this.range=$([]);if(o.range){if(o.range===true){this.range=$("
          ");if(!o.values){o.values=[this._valueMin(),this._valueMin()]}if(o.values.length&&o.values.length!==2){o.values=[o.values[0],o.values[0]]}}else{this.range=$("
          ")}this.range.appendTo(this.element).addClass("ui-slider-range");if(o.range==="min"||o.range==="max"){this.range.addClass("ui-slider-range-"+o.range)}this.range.addClass("ui-widget-header")}if($(".ui-slider-handle",this.element).length===0){$("").appendTo(this.element).addClass("ui-slider-handle")}if(o.values&&o.values.length){while($(".ui-slider-handle",this.element).length").appendTo(this.element).addClass("ui-slider-handle")}}this.handles=$(".ui-slider-handle",this.element).addClass("ui-state-default"+" ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(a){a.preventDefault()}).hover(function(){if(!o.disabled){$(this).addClass("ui-state-hover")}},function(){$(this).removeClass("ui-state-hover")}).focus(function(){if(!o.disabled){$(".ui-slider .ui-state-focus").removeClass("ui-state-focus");$(this).addClass("ui-state-focus")}else{$(this).blur()}}).blur(function(){$(this).removeClass("ui-state-focus")});this.handles.each(function(i){$(this).data("index.ui-slider-handle",i)});this.handles.keydown(function(c){var d=true,index=$(this).data("index.ui-slider-handle"),allowed,curVal,newVal,step;if(f.options.disabled){return}switch(c.keyCode){case $.ui.keyCode.HOME:case $.ui.keyCode.END:case $.ui.keyCode.PAGE_UP:case $.ui.keyCode.PAGE_DOWN:case $.ui.keyCode.UP:case $.ui.keyCode.RIGHT:case $.ui.keyCode.DOWN:case $.ui.keyCode.LEFT:d=false;if(!f._keySliding){f._keySliding=true;$(this).addClass("ui-state-active");allowed=f._start(c,index);if(allowed===false){return}}break}step=f.options.step;if(f.options.values&&f.options.values.length){curVal=newVal=f.values(index)}else{curVal=newVal=f.value()}var e=function(a,b){if(curVal===a){return}newVal=f._trimAlignValue(curVal+b)};switch(c.keyCode){case $.ui.keyCode.HOME:newVal=f._valueMin();break;case $.ui.keyCode.END:newVal=f._valueMax();break;case $.ui.keyCode.PAGE_UP:newVal=f._trimAlignValue(curVal+((f._valueMax()-f._valueMin())/h));break;case $.ui.keyCode.PAGE_DOWN:newVal=f._trimAlignValue(curVal-((f._valueMax()-f._valueMin())/h));break;case $.ui.keyCode.UP:e(f._valueMax(),step);break;case $.ui.keyCode.RIGHT:e(f._valueMax(),f.options.isRTL?-step:step);break;case $.ui.keyCode.DOWN:e(f._valueMin(),-step);break;case $.ui.keyCode.LEFT:e(f._valueMin(),f.options.isRTL?step:-step);break}f._slide(c,index,newVal);return d}).keyup(function(a){var b=$(this).data("index.ui-slider-handle");if(f._keySliding){f._keySliding=false;f._stop(a,b);f._change(a,b);$(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider"+" ui-slider-horizontal"+" ui-slider-vertical"+" ui-slider-disabled"+" ui-widget"+" ui-widget-content"+" ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy();return this},_mouseCapture:function(b){var o=this.options,position,normValue,distance,closestHandle,self,index,allowed,offset,mouseOverHandle;if(o.disabled){return false}this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();position={x:b.pageX,y:b.pageY};normValue=this._normValueFromMouse(position);distance=this._valueMax()-this._valueMin()+1;self=this;this.handles.each(function(i){var a=Math.abs(normValue-self.values(i));if(distance>a){distance=a;closestHandle=$(this);index=i}});if(o.range===true&&this.values(1)===o.min){index+=1;closestHandle=$(this.handles[index])}allowed=this._start(b,index);if(allowed===false){return false}this._mouseSliding=true;self._handleIndex=index;closestHandle.addClass("ui-state-active").focus();offset=closestHandle.offset();mouseOverHandle=!$(b.target).parents().andSelf().is(".ui-slider-handle");this._clickOffset=mouseOverHandle?{left:0,top:0}:{left:b.pageX-offset.left-(closestHandle.width()/2),top:b.pageY-offset.top-(closestHandle.height()/2)-(parseInt(closestHandle.css("borderTopWidth"),10)||0)-(parseInt(closestHandle.css("borderBottomWidth"),10)||0)+(parseInt(closestHandle.css("marginTop"),10)||0)};if(!this.handles.hasClass("ui-state-hover")){this._slide(b,index,normValue)}this._animateOff=true;return true},_mouseStart:function(a){return true},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},normValue=this._normValueFromMouse(b);this._slide(a,this._handleIndex,normValue);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._handleIndex=null;this._clickOffset=null;this._animateOff=false;return false},_detectOrientation:function(){this.orientation=(this.options.orientation==="vertical")?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,pixelMouse,percentMouse,valueTotal,valueMouse;if(this.orientation==="horizontal"){b=this.elementSize.width;pixelMouse=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;pixelMouse=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}percentMouse=(pixelMouse/b);if(percentMouse>1){percentMouse=1}if(percentMouse<0){percentMouse=0}if(this.orientation==="vertical"){percentMouse=1-percentMouse}if(this.options.isRTL){percentMouse=1-percentMouse}valueTotal=this._valueMax()-this._valueMin();valueMouse=this._valueMin()+percentMouse*valueTotal;return this._trimAlignValue(valueMouse)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var d,newValues,allowed;if(this.options.values&&this.options.values.length){d=this.values(b?0:1);if((this.options.values.length===2&&this.options.range===true)&&((b===0&&c>d)||(b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}if(arguments.length){if($.isArray(arguments[0])){c=this.options.values;newValues=arguments[0];for(i=0;i=this._valueMax()){return this._valueMax()}var b=(this.options.step>0)?this.options.step:1,valModStep=(a-this._valueMin())%b;alignValue=a-valModStep;if(Math.abs(valModStep)*2>=b){alignValue+=(valModStep>0)?b:(-b)}return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a=this.options.range,o=this.options,self=this,animate=(!this._animateOff)?o.animate:false,valPercent,_set={},lastValPercent,value,valueMin,valueMax;if(this.options.values&&this.options.values.length){this.handles.each(function(i,j){valPercent=(self.values(i)-self._valueMin())/(self._valueMax()-self._valueMin())*100;valPercent=(self.options.isRTL?100-valPercent:valPercent);_set[self.orientation==="horizontal"?"left":"bottom"]=valPercent+"%";$(this).stop(1,1)[animate?"animate":"css"](_set,o.animate);if(self.options.range===true){if(self.orientation==="horizontal"){if(i===0){self.range.stop(1,1)[animate?"animate":"css"](self.options.isRTL?{right:(100-valPercent)+"%"}:{left:valPercent+"%"},o.animate)}if(i===1){self.range[animate?"animate":"css"]({width:((self.options.isRTL?-1:+1)*(valPercent-lastValPercent))+"%"},{queue:false,duration:o.animate})}}else{if(i===0){self.range.stop(1,1)[animate?"animate":"css"](self.options.isRTL?{top:(100-valPercent)+"%"}:{bottom:(valPercent)+"%"},o.animate)}if(i===1){self.range[animate?"animate":"css"]({height:((self.options.isRTL?-1:+1)*(valPercent-lastValPercent))+"%"},{queue:false,duration:o.animate})}}}lastValPercent=valPercent})}else{value=this.value();valueMin=this._valueMin();valueMax=this._valueMax();valPercent=(valueMax!==valueMin)?(value-valueMin)/(valueMax-valueMin)*100:0;valPercent=(self.options.isRTL?100-valPercent:valPercent);_set[self.orientation==="horizontal"?"left":"bottom"]=valPercent+"%";this.handle.stop(1,1)[animate?"animate":"css"](_set,o.animate);if(a==="min"&&this.orientation==="horizontal"){this.range.stop(1,1)[animate?"animate":"css"]({width:(self.options.isRTL?100-valPercent:valPercent)+"%"},o.animate)}if(a==="max"&&this.orientation==="horizontal"){this.range[animate?"animate":"css"]({width:(self.options.isRTL?valPercent:100-valPercent)+"%"},{queue:false,duration:o.animate})}if(a==="min"&&this.orientation==="vertical"){this.range.stop(1,1)[animate?"animate":"css"]({height:(self.options.isRTL?100-valPercent:valPercent)+"%"},o.animate)}if(a==="max"&&this.orientation==="vertical"){this.range[animate?"animate":"css"]({height:(self.options.isRTL?valPercent:100-valPercent)+"%"},{queue:false,duration:o.animate})}}}});$.extend($.ui.slider,{version:"1.8.9"})}(jQuery)); \ No newline at end of file diff --git a/admin/assets/webfonts/webfonts.json b/admin/assets/webfonts/webfonts.json new file mode 100644 index 0000000..21dca9a --- /dev/null +++ b/admin/assets/webfonts/webfonts.json @@ -0,0 +1,13203 @@ +{ + "kind": "webfonts#webfontList", + "items": [ + { + "kind": "webfonts#webfont", + "family": "ABeeZee", + "category": "sans-serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/abeezee/v4/mE5BOuZKGln_Ex0uYKpIaw.ttf", + "italic": "http://fonts.gstatic.com/s/abeezee/v4/kpplLynmYgP0YtlJA3atRw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Abel", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/abel/v6/RpUKfqNxoyNe_ka23bzQ2A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Abril Fatface", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/abrilfatface/v8/X1g_KwGeBV3ajZIXQ9VnDojjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Aclonica", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/aclonica/v6/M6pHZMPwK3DiBSlo3jwAKQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Acme", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/acme/v5/-J6XNtAHPZBEbsifCdBt-g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Actor", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/actor/v6/ugMf40CrRK6Jf6Yz_xNSmQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Adamina", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/adamina/v7/RUQfOodOMiVVYqFZcSlT9w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Advent Pro", + "category": "sans-serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext", + "greek" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/adventpro/v4/87-JOpSUecTG50PBYK4ysi3USBnSvpkopQaUR-2r7iU.ttf", + "200": "http://fonts.gstatic.com/s/adventpro/v4/URTSSjIp0Wr-GrjxFdFWnGeudeTO44zf-ht3k-KNzwg.ttf", + "300": "http://fonts.gstatic.com/s/adventpro/v4/sJaBfJYSFgoB80OL1_66m0eOrDcLawS7-ssYqLr2Xp4.ttf", + "regular": "http://fonts.gstatic.com/s/adventpro/v4/1NxMBeKVcNNH2H46AUR3wfesZW2xOQ-xsNqO47m55DA.ttf", + "500": "http://fonts.gstatic.com/s/adventpro/v4/7kBth2-rT8tP40RmMMXMLJp-63r6doWhTEbsfBIRJ7A.ttf", + "600": "http://fonts.gstatic.com/s/adventpro/v4/3Jo-2maCzv2QLzQBzaKHV_pTEJqju4Hz1txDWij77d4.ttf", + "700": "http://fonts.gstatic.com/s/adventpro/v4/M4I6QiICt-ey_wZTpR2gKwJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Aguafina Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/aguafinascript/v5/65g7cgMtMGnNlNyq_Z6CvMxLhO8OSNnfAp53LK1_iRs.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Akronim", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/akronim/v5/qA0L2CSArk3tuOWE1AR1DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Aladin", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/aladin/v5/PyuJ5cVHkduO0j5fAMKvAA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Aldrich", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/aldrich/v6/kMMW1S56gFx7RP_mW1g-Eg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alef", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "hebrew" + ], + "version": "v5", + "lastModified": "2015-04-08", + "files": { + "regular": "http://fonts.gstatic.com/s/alef/v5/ENvZ_P0HBDQxNZYCQO0lUA.ttf", + "700": "http://fonts.gstatic.com/s/alef/v5/VDgZJhEwudtOzOFQpZ8MEA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alegreya", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/alegreya/v7/62J3atXd6bvMU4qO_ca-eA.ttf", + "italic": "http://fonts.gstatic.com/s/alegreya/v7/cbshnQGxwmlHBjUil7DaIfesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/alegreya/v7/5oZtdI5-wQwgAFrd9erCsaCWcynf_cDxXwCLxiixG1c.ttf", + "700italic": "http://fonts.gstatic.com/s/alegreya/v7/IWi8e5bpnqhMRsZKTcTUWgJKKGfqHaYFsRG-T3ceEVo.ttf", + "900": "http://fonts.gstatic.com/s/alegreya/v7/oQeMxX-vxGImzDgX6nxA7KCWcynf_cDxXwCLxiixG1c.ttf", + "900italic": "http://fonts.gstatic.com/s/alegreya/v7/-L71QLH_XqgYWaI1GbOVhp0EAVxt0G0biEntp43Qt6E.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alegreya SC", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/alegreyasc/v6/3ozeFnTbygMK6PfHh8B-iqCWcynf_cDxXwCLxiixG1c.ttf", + "italic": "http://fonts.gstatic.com/s/alegreyasc/v6/GOqmv3FLsJ2r6ZALMZVBmkeOrDcLawS7-ssYqLr2Xp4.ttf", + "700": "http://fonts.gstatic.com/s/alegreyasc/v6/M9OIREoxDkvynwTpBAYUq3e1Pd76Vl7zRpE7NLJQ7XU.ttf", + "700italic": "http://fonts.gstatic.com/s/alegreyasc/v6/5PCoU7IUfCicpKBJtBmP6c_zJjSACmk0BRPxQqhnNLU.ttf", + "900": "http://fonts.gstatic.com/s/alegreyasc/v6/M9OIREoxDkvynwTpBAYUqyenaqEuufTBk9XMKnKmgDA.ttf", + "900italic": "http://fonts.gstatic.com/s/alegreyasc/v6/5PCoU7IUfCicpKBJtBmP6U_yTOUGsoC54csJe1b-IRw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alegreya Sans", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "vietnamese", + "latin-ext" + ], + "version": "v3", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/alegreyasans/v3/TKyx_-JJ6MdpQruNk-t-PJFGFO4uyVFMfB6LZsii7kI.ttf", + "100italic": "http://fonts.gstatic.com/s/alegreyasans/v3/gRkSP2lBpqoMTVxg7DmVn2cDnjsrnI9_xJ-5gnBaHsE.ttf", + "300": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9acB1LjARzAvdqa1uQC32v70.ttf", + "300italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CnfqlVoxTUFFx1C8tBqmbcg.ttf", + "regular": "http://fonts.gstatic.com/s/alegreyasans/v3/KYNzioYhDai7mTMnx_gDgn8f0n03UdmQgF_CLvNR2vg.ttf", + "italic": "http://fonts.gstatic.com/s/alegreyasans/v3/TKyx_-JJ6MdpQruNk-t-PD4G9C9ttb0Oz5Cvf0qOitE.ttf", + "500": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aQqQmZ7VjhwksfpNVG0pqGc.ttf", + "500italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9Cs7DCVO6wo6i5LKIyZDzK40.ttf", + "700": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aVCbmAUID8LN-q3pJpOk3Ys.ttf", + "700italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CpF66r9C4AnxxlBlGd7xY4g.ttf", + "800": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9acxnD5BewVtRRHHljCwR2bM.ttf", + "800italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CicOAJ_9MkLPbDmrtXDPbIU.ttf", + "900": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aW42xlVP-j5dagE7-AU2zwg.ttf", + "900italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9ChRaDUI9aE8-k7PrIG2iiuo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alegreya Sans SC", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "vietnamese", + "latin-ext" + ], + "version": "v3", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/alegreyasanssc/v3/trwFkDJLOJf6hqM93944kVnzStfdnFU-MXbO84aBs_M.ttf", + "100italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/qG3gA9iy5RpXMH4crZboqqakMVR0XlJhO7VdJ8yYvA4.ttf", + "300": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46-1IqtfxJspFjzJp0SaQRcI.ttf", + "300italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0CnTKaH808trtzttbEg4yVA.ttf", + "regular": "http://fonts.gstatic.com/s/alegreyasanssc/v3/6kgb6ZvOagoVIRZyl8XV-EklWX-XdLVn1WTiuGuvKIU.ttf", + "italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/trwFkDJLOJf6hqM93944kTfqo69HNOlCNZvbwAmUtiA.ttf", + "500": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46_hHTluI57wqxl55RvSYo3s.ttf", + "500italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0NqVvxKdFVwqwzilqfVd39U.ttf", + "700": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR4600aId5t1FC-xZ8nmpa_XLk.ttf", + "700italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0IBYn3VD6xMEnodOh8pnFw4.ttf", + "800": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46wQgSHD3Lo1Mif2Wkk5swWA.ttf", + "800italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0HStmCm6Rs90XeztCALm0H8.ttf", + "900": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR461Rf9EWUSEX_PR1d_gLKfpM.ttf", + "900italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0IvtwEfTCJoOJugANj-jWDI.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alex Brush", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/alexbrush/v6/ooh3KJFbKJSUoIRWfiu8o_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alfa Slab One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/alfaslabone/v5/Qx6FPcitRwTC_k88tLPc-Yjjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alice", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/alice/v7/wZTAfivekBqIg-rk63nFvQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alike", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/alike/v7/Ho8YpRKNk_202fwDiGNIyw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Alike Angular", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/alikeangular/v6/OpeCu4xxI3qO1C7CZcJtPT3XH2uEnVI__ynTBvNyki8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Allan", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/allan/v7/T3lemhgZmLQkQI2Qc2bQHA.ttf", + "700": "http://fonts.gstatic.com/s/allan/v7/zSxQiwo7wgnr7KkMXhSiag.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Allerta", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/allerta/v7/s9FOEuiJFTNbMe06ifzV8g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Allerta Stencil", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/allertastencil/v7/CdSZfRtHbQrBohqmzSdDYFf2eT4jUldwg_9fgfY_tHc.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Allura", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/allura/v4/4hcqgZanyuJ2gMYWffIR6A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Almendra", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/almendra/v8/PDpbB-ZF7deXAAEYPkQOeg.ttf", + "italic": "http://fonts.gstatic.com/s/almendra/v8/CNWLyiDucqVKVgr4EMidi_esZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/almendra/v8/ZpLdQMj7Q2AFio4nNO6A76CWcynf_cDxXwCLxiixG1c.ttf", + "700italic": "http://fonts.gstatic.com/s/almendra/v8/-tXHKMcnn6FqrhJV3l1e3QJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Almendra Display", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/almendradisplay/v6/2Zuu97WJ_ez-87yz5Ai8fF6uyC_qD11hrFQ6EGgTJWI.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Almendra SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/almendrasc/v6/IuiLd8Fm9I6raSalxMoWeaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Amarante", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/amarante/v4/2dQHjIBWSpydit5zkJZnOw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Amaranth", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/amaranth/v6/7VcBog22JBHsHXHdnnycTA.ttf", + "italic": "http://fonts.gstatic.com/s/amaranth/v6/UrJlRY9LcVERJSvggsdBqPesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/amaranth/v6/j5OFHqadfxyLnQRxFeox6qCWcynf_cDxXwCLxiixG1c.ttf", + "700italic": "http://fonts.gstatic.com/s/amaranth/v6/BHyuYFj9nqLFNvOvGh0xTwJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Amatic SC", + "category": "handwriting", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/amaticsc/v6/MldbRWLFytvqxU1y81xSVg.ttf", + "700": "http://fonts.gstatic.com/s/amaticsc/v6/IDnkRTPGcrSVo50UyYNK7y3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Amethysta", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/amethysta/v4/1jEo9tOFIJDolAUpBnWbnA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Amiri", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "arabic" + ], + "version": "v7", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/amiri/v7/ATARrPmSew75SlpOw2YABQ.ttf", + "italic": "http://fonts.gstatic.com/s/amiri/v7/3t1yTQlLUXBw8htrqlXBrw.ttf", + "700": "http://fonts.gstatic.com/s/amiri/v7/WQsR_moz-FNqVwGYgptqiA.ttf", + "700italic": "http://fonts.gstatic.com/s/amiri/v7/uF8aNEyD0bxMeTBg9bFDSPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Amita", + "category": "monospace", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-05-21", + "files": { + "regular": "http://fonts.gstatic.com/s/amita/v1/RhdhGBXSJqkHo6g7miTEcQ.ttf", + "700": "http://fonts.gstatic.com/s/amita/v1/cIYA2Lzp7l2pcGsqpUidBg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Anaheim", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/anaheim/v4/t-z8aXHMpgI2gjN_rIflKA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Andada", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/andada/v7/rSFaDqNNQBRw3y19MB5Y4w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Andika", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/andika/v6/oe-ag1G0lcqZ3IXfeEgaGg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Angkor", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/angkor/v8/DLpLgIS-8F10ecwKqCm95Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Annie Use Your Telescope", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/annieuseyourtelescope/v6/2cuiO5VmaR09C8SLGEQjGqbp7mtG8sPlcZvOaO8HBak.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Anonymous Pro", + "category": "monospace", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/anonymouspro/v8/Zhfjj_gat3waL4JSju74E-V_5zh5b-_HiooIRUBwn1A.ttf", + "italic": "http://fonts.gstatic.com/s/anonymouspro/v8/q0u6LFHwttnT_69euiDbWKwIsuKDCXG0NQm7BvAgx-c.ttf", + "700": "http://fonts.gstatic.com/s/anonymouspro/v8/WDf5lZYgdmmKhO8E1AQud--Cz_5MeePnXDAcLNWyBME.ttf", + "700italic": "http://fonts.gstatic.com/s/anonymouspro/v8/_fVr_XGln-cetWSUc-JpfA1LL9bfs7wyIp6F8OC9RxA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Antic", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/antic/v7/hEa8XCNM7tXGzD0Uk0AipA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Antic Didone", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/anticdidone/v4/r3nJcTDuOluOL6LGDV1vRy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Antic Slab", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/anticslab/v4/PSbJCTKkAS7skPdkd7AKEvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Anton", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/anton/v6/XIbCenm-W0IRHWYIh7CGUQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Arapey", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/arapey/v5/dqu823lrSYn8T2gApTdslA.ttf", + "italic": "http://fonts.gstatic.com/s/arapey/v5/pY-Xi5JNBpaWxy2tZhEm5A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Arbutus", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/arbutus/v5/Go_hurxoUsn5MnqNVQgodQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Arbutus Slab", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/arbutusslab/v4/6k3Yp6iS9l4jRIpynA8qMy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Architects Daughter", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/architectsdaughter/v6/RXTgOOQ9AAtaVOHxx0IUBMCy0EhZjHzu-y0e6uLf4Fg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Archivo Black", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/archivoblack/v4/WoAoVT7K3k7hHfxKbvB6B51XQG8isOYYJhPIYAyrESQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Archivo Narrow", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/archivonarrow/v5/DsLzC9scoPnrGiwYYMQXppTvAuddT2xDMbdz0mdLyZY.ttf", + "italic": "http://fonts.gstatic.com/s/archivonarrow/v5/vqsrtPCpTU3tJlKfuXP5zUpmlyBQEFfdE6dERLXdQGQ.ttf", + "700": "http://fonts.gstatic.com/s/archivonarrow/v5/M__Wu4PAmHf4YZvQM8tWsMLtdzs3iyjn_YuT226ZsLU.ttf", + "700italic": "http://fonts.gstatic.com/s/archivonarrow/v5/wG6O733y5zHl4EKCOh8rSTg5KB8MNJ4uPAETq9naQO8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Arimo", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "hebrew", + "greek" + ], + "version": "v9", + "lastModified": "2015-04-28", + "files": { + "regular": "http://fonts.gstatic.com/s/arimo/v9/Gpeo80g-5ji2CcyXWnzh7g.ttf", + "italic": "http://fonts.gstatic.com/s/arimo/v9/_OdGbnX2-qQ96C4OjhyuPw.ttf", + "700": "http://fonts.gstatic.com/s/arimo/v9/ZItXugREyvV9LnbY_gxAmw.ttf", + "700italic": "http://fonts.gstatic.com/s/arimo/v9/__nOLWqmeXdhfr0g7GaFePesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Arizonia", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/arizonia/v6/yzJqkHZqryZBTM7RKYV9Wg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Armata", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/armata/v6/1H8FwGgIRrbYtxSfXhOHlQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Artifika", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/artifika/v6/Ekfp4H4QG7D-WsABDOyj8g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Arvo", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/arvo/v8/vvWPwz-PlZEwjOOIKqoZzA.ttf", + "italic": "http://fonts.gstatic.com/s/arvo/v8/id5a4BCjbenl5Gkqonw_Rw.ttf", + "700": "http://fonts.gstatic.com/s/arvo/v8/OB3FDST7U38u3OjPK_vvRQ.ttf", + "700italic": "http://fonts.gstatic.com/s/arvo/v8/Hvl2MuWoXLaCy2v6MD4Yvw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Arya", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-05-21", + "files": { + "regular": "http://fonts.gstatic.com/s/arya/v1/xEVqtU3v8QLospHKpDaYEw.ttf", + "700": "http://fonts.gstatic.com/s/arya/v1/N13tgOvG7VTXawiI-fJiQA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Asap", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/asap/v4/2lf-1MDR8tsTpEtvJmr2hA.ttf", + "italic": "http://fonts.gstatic.com/s/asap/v4/mwxNHf8QS8gNWCAMwkJNIg.ttf", + "700": "http://fonts.gstatic.com/s/asap/v4/o5RUA7SsJ80M8oDFBnrDbg.ttf", + "700italic": "http://fonts.gstatic.com/s/asap/v4/_rZz9y2oXc09jT5T6BexLQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Asset", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/asset/v6/hfPmqY-JzuR1lULlQf9iTg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Astloch", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/astloch/v6/fmbitVmHYLQP7MGPuFgpag.ttf", + "700": "http://fonts.gstatic.com/s/astloch/v6/aPkhM2tL-tz1jX6aX2rvo_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Asul", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/asul/v5/9qpsNR_OOwyOYyo2N0IbBw.ttf", + "700": "http://fonts.gstatic.com/s/asul/v5/uO8uNmxaq87-DdPmkEg5Gg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Atomic Age", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/atomicage/v6/WvBMe4FxANIKpo6Oi0mVJ_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Aubrey", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/aubrey/v8/zo9w8klO8bmOQIMajQ2aTA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Audiowide", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/audiowide/v4/yGcwRZB6VmoYhPUYT-mEow.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Autour One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/autourone/v4/2xmQBcg7FN72jaQRFZPIDvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Average", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/average/v4/aHUibBqdDbVYl5FM48pxyQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Average Sans", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/averagesans/v4/dnU3R-5A_43y5bIyLztPsS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Averia Gruesa Libre", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/averiagruesalibre/v4/10vbZTOoN6T8D-nvDzwRFyXcKHuZXlCN8VkWHpkUzKM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Averia Libre", + "category": "display", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/averialibre/v4/r6hGL8sSLm4dTzOPXgx5XacQoVhARpoaILP7amxE_8g.ttf", + "300italic": "http://fonts.gstatic.com/s/averialibre/v4/I6wAYuAvOgT7el2ePj2nkina0FLWfcB-J_SAYmcAXaI.ttf", + "regular": "http://fonts.gstatic.com/s/averialibre/v4/rYVgHZZQICWnhjguGsBspC3USBnSvpkopQaUR-2r7iU.ttf", + "italic": "http://fonts.gstatic.com/s/averialibre/v4/1etzuoNxVHR8F533EkD1WfMZXuCXbOrAvx5R0IT5Oyo.ttf", + "700": "http://fonts.gstatic.com/s/averialibre/v4/r6hGL8sSLm4dTzOPXgx5XUD2ttfZwueP-QU272T9-k4.ttf", + "700italic": "http://fonts.gstatic.com/s/averialibre/v4/I6wAYuAvOgT7el2ePj2nkvAs9-1nE9qOqhChW0m4nDE.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Averia Sans Libre", + "category": "display", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/averiasanslibre/v4/_9-jTfQjaBsWAF_yp5z-V4CP_KG_g80s1KXiBtJHoNc.ttf", + "300italic": "http://fonts.gstatic.com/s/averiasanslibre/v4/o7BEIK-fG3Ykc5Rzteh88YuyGu4JqttndUh4gRKxic0.ttf", + "regular": "http://fonts.gstatic.com/s/averiasanslibre/v4/yRJpjT39KxACO9F31mj_LqV8_KRn4epKAjTFK1s1fsg.ttf", + "italic": "http://fonts.gstatic.com/s/averiasanslibre/v4/COEzR_NPBSUOl3pFwPbPoCZU2HnUZT1xVKaIrHDioao.ttf", + "700": "http://fonts.gstatic.com/s/averiasanslibre/v4/_9-jTfQjaBsWAF_yp5z-V8QwVOrz1y5GihpZmtKLhlI.ttf", + "700italic": "http://fonts.gstatic.com/s/averiasanslibre/v4/o7BEIK-fG3Ykc5Rzteh88bXy1DXgmJcVtKjM5UWamMs.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Averia Serif Libre", + "category": "display", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/averiaseriflibre/v5/yvITAdr5D1nlsdFswJAb8SmC4gFJ2PHmfdVKEd_5S9M.ttf", + "300italic": "http://fonts.gstatic.com/s/averiaseriflibre/v5/YOLFXyye4sZt6AZk1QybCG2okl0bU63CauowU4iApig.ttf", + "regular": "http://fonts.gstatic.com/s/averiaseriflibre/v5/fdtF30xa_Erw0zAzOoG4BZqY66i8AUyI16fGqw0iAew.ttf", + "italic": "http://fonts.gstatic.com/s/averiaseriflibre/v5/o9qhvK9iT5iDWfyhQUe-6Ru_b0bTq5iipbJ9hhgHJ6U.ttf", + "700": "http://fonts.gstatic.com/s/averiaseriflibre/v5/yvITAdr5D1nlsdFswJAb8Q50KV5TaOVolur4zV2iZsg.ttf", + "700italic": "http://fonts.gstatic.com/s/averiaseriflibre/v5/YOLFXyye4sZt6AZk1QybCNxohRXP4tNDqG3X4Hqn21k.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bad Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "cyrillic" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/badscript/v5/cRyUs0nJ2eMQFHwBsZNRXfesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Balthazar", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/balthazar/v5/WgbaSIs6dJAGXJ0qbz2xlw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bangers", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bangers/v7/WAffdge5w99Xif-DLeqmcA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Basic", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/basic/v6/hNII2mS5Dxw5C0u_m3mXgA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Battambang", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "khmer" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/battambang/v9/MzrUfQLefYum5vVGM3EZVPesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/battambang/v9/dezbRtMzfzAA99DmrCYRMgJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Baumans", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/baumans/v5/o0bFdPW1H5kd5saqqOcoVg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bayon", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/bayon/v8/yTubusjTnpNRZwA4_50iVw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Belgrano", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/belgrano/v6/iq8DUa2s7g6WRCeMiFrmtQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Belleza", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/belleza/v4/wchA3BWJlVqvIcSeNZyXew.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "BenchNine", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/benchnine/v4/ah9xtUy9wLQ3qnWa2p-piS3USBnSvpkopQaUR-2r7iU.ttf", + "regular": "http://fonts.gstatic.com/s/benchnine/v4/h3OAlYqU3aOeNkuXgH2Q2w.ttf", + "700": "http://fonts.gstatic.com/s/benchnine/v4/qZpi6ZVZg3L2RL_xoBLxWS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bentham", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bentham/v6/5-Mo8Fe7yg5tzV0GlQIuzQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Berkshire Swash", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/berkshireswash/v4/4RZJjVRPjYnC2939hKCAimKfbtsIjCZP_edQljX9gR0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bevan", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bevan/v7/Rtg3zDsCeQiaJ_Qno22OJA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bigelow Rules", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/bigelowrules/v4/FEJCPLwo07FS-6SK6Al50X8f0n03UdmQgF_CLvNR2vg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bigshot One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bigshotone/v6/wSyZjBNTWDQHnvWE2jt6j6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bilbo", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bilbo/v6/-ty-lPs5H7OIucWbnpFrkA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bilbo Swash Caps", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bilboswashcaps/v7/UB_-crLvhx-PwGKW1oosDmYeFSdnSpRYv5h9gpdlD1g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Biryani", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-22", + "files": { + "200": "http://fonts.gstatic.com/s/biryani/v1/Xx38YzyTFF8n6mRS1Yd88vesZW2xOQ-xsNqO47m55DA.ttf", + "300": "http://fonts.gstatic.com/s/biryani/v1/u-bneRbizmFMd0VQp5Ze6vesZW2xOQ-xsNqO47m55DA.ttf", + "regular": "http://fonts.gstatic.com/s/biryani/v1/W7bfR8-IY76Xz0QoB8L2xw.ttf", + "600": "http://fonts.gstatic.com/s/biryani/v1/1EdcPCVxBR2txgjrza6_YPesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/biryani/v1/qN2MTZ0j1sKSCtfXLB2dR_esZW2xOQ-xsNqO47m55DA.ttf", + "800": "http://fonts.gstatic.com/s/biryani/v1/DJyziS7FEy441v22InYdevesZW2xOQ-xsNqO47m55DA.ttf", + "900": "http://fonts.gstatic.com/s/biryani/v1/trcLkrIut0lM_PPSyQfAMPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bitter", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bitter/v7/w_BNdJvVZDRmqy5aSfB2kQ.ttf", + "italic": "http://fonts.gstatic.com/s/bitter/v7/TC0FZEVzXQIGgzmRfKPZbA.ttf", + "700": "http://fonts.gstatic.com/s/bitter/v7/4dUtr_4BvHuoRU35suyOAg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Black Ops One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/blackopsone/v7/2XW-DmDsGbDLE372KrMW1Yjjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bokor", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bokor/v8/uAKdo0A85WW23Gs6mcbw7A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bonbon", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/bonbon/v6/IW3u1yzG1knyW5oz0s9_6Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Boogaloo", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/boogaloo/v6/4Wu1tvFMoB80fSu8qLgQfQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bowlby One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bowlbyone/v7/eKpHjHfjoxM2bX36YNucefesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bowlby One SC", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bowlbyonesc/v8/8ZkeXftTuzKBtmxOYXoRedDkZCMxWJecxjvKm2f8MJw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Brawler", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/brawler/v6/3gfSw6imxQnQxweVITqUrg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bree Serif", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/breeserif/v5/5h9crBVIrvZqgf34FHcnEfesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bubblegum Sans", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bubblegumsans/v5/Y9iTUUNz6lbl6TrvV4iwsytnKWgpfO2iSkLzTz-AABg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Bubbler One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/bubblerone/v4/e8S0qevkZAFaBybtt_SU4qCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Buda", + "category": "display", + "variants": [ + "300" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/buda/v6/hLtAmNUmEMJH2yx7NGUjnA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Buenard", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/buenard/v6/NSpMPGKAUgrLrlstYVvIXQ.ttf", + "700": "http://fonts.gstatic.com/s/buenard/v6/yUlGE115dGr7O9w9FlP3UvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Butcherman", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/butcherman/v7/bxiJmD567sPBVpJsT0XR0vesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Butterfly Kids", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/butterflykids/v4/J4NTF5M25htqeTffYImtlUZaDk62iwTBnbnvwSjZciA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cabin", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cabin/v7/XeuAFYo2xAPHxZGBbQtHhA.ttf", + "italic": "http://fonts.gstatic.com/s/cabin/v7/0tJ9k3DI5xC4GBgs1E_Jxw.ttf", + "500": "http://fonts.gstatic.com/s/cabin/v7/HgsCQ-k3_Z_uQ86aFolNBg.ttf", + "500italic": "http://fonts.gstatic.com/s/cabin/v7/50sjhrGE0njyO-7mGDhGP_esZW2xOQ-xsNqO47m55DA.ttf", + "600": "http://fonts.gstatic.com/s/cabin/v7/eUDAvKhBtmTCkeVBsFk34A.ttf", + "600italic": "http://fonts.gstatic.com/s/cabin/v7/sFQpQDBd3G2om0Nl5dD2CvesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/cabin/v7/4EKhProuY1hq_WCAomq9Dg.ttf", + "700italic": "http://fonts.gstatic.com/s/cabin/v7/K83QKi8MOKLEqj6bgZ7LrfesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cabin Condensed", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cabincondensed/v7/B0txb0blf2N29WdYPJjMSiQPsWWoiv__AzYJ9Zzn9II.ttf", + "500": "http://fonts.gstatic.com/s/cabincondensed/v7/Ez4zJbsGr2BgXcNUWBVgEARL_-ABKXdjsJSPT0lc2Bk.ttf", + "600": "http://fonts.gstatic.com/s/cabincondensed/v7/Ez4zJbsGr2BgXcNUWBVgELS5sSASxc8z4EQTQj7DCAI.ttf", + "700": "http://fonts.gstatic.com/s/cabincondensed/v7/Ez4zJbsGr2BgXcNUWBVgEMAWgzcA047xWLixhLCofl8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cabin Sketch", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cabinsketch/v8/d9fijO34zQajqQvl3YHRCS3USBnSvpkopQaUR-2r7iU.ttf", + "700": "http://fonts.gstatic.com/s/cabinsketch/v8/ki3SSN5HMOO0-IOLOj069ED2ttfZwueP-QU272T9-k4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Caesar Dressing", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/caesardressing/v5/2T_WzBgE2Xz3FsyJMq34T9gR43u4FvCuJwIfF5Zxl6Y.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cagliostro", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cagliostro/v5/i85oXbtdSatNEzss99bpj_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Calligraffitti", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/calligraffitti/v7/vLVN2Y-z65rVu1R7lWdvyDXz_orj3gX0_NzfmYulrko.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cambay", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/cambay/v1/etU9Bab4VuhzS-OKsb1VXg.ttf", + "italic": "http://fonts.gstatic.com/s/cambay/v1/ZEz9yNqpEOgejaw1rBhugQ.ttf", + "700": "http://fonts.gstatic.com/s/cambay/v1/jw9niBxa04eEhnSwTWCEgw.ttf", + "700italic": "http://fonts.gstatic.com/s/cambay/v1/j-5v_uUr0NXTumWN0siOiaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cambo", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cambo/v5/PnwpRuTdkYCf8qk4ajmNRA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Candal", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/candal/v6/x44dDW28zK7GR1gGDBmj9g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cantarell", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cantarell/v6/p5ydP_uWQ5lsFzcP_XVMEw.ttf", + "italic": "http://fonts.gstatic.com/s/cantarell/v6/DTCLtOSqP-7dgM-V_xKUjqCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/cantarell/v6/Yir4ZDsCn4g1kWopdg-ehC3USBnSvpkopQaUR-2r7iU.ttf", + "700italic": "http://fonts.gstatic.com/s/cantarell/v6/weehrwMeZBXb0QyrWnRwFXe1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cantata One", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cantataone/v5/-a5FDvnBqaBMDaGgZYnEfqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cantora One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cantoraone/v5/oI-DS62RbHI8ZREjp73ehqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Capriola", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/capriola/v4/JxXPlkdzWwF9Cwelbvi9jA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cardo", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "greek-ext", + "latin-ext", + "greek" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cardo/v8/jbkF2_R0FKUEZTq5dwSknQ.ttf", + "italic": "http://fonts.gstatic.com/s/cardo/v8/pcv4Np9tUkq0YREYUcEEJQ.ttf", + "700": "http://fonts.gstatic.com/s/cardo/v8/lQN30weILimrKvp8rZhF1w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Carme", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/carme/v7/08E0NP1eRBEyFRUadmMfgA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Carrois Gothic", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/carroisgothic/v4/GCgb7bssGpwp7V5ynxmWy2x3d0cwUleGuRTmCYfCUaM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Carrois Gothic SC", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/carroisgothicsc/v4/bVp4nhwFIXU-r3LqUR8DSJTdPW1ioadGi2uRiKgJVCY.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Carter One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/carterone/v8/5X_LFvdbcB7OBG7hBgZ7fPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Caudex", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "greek-ext", + "latin-ext", + "greek" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/caudex/v6/PWEexiHLDmQbn2b1OPZWfg.ttf", + "italic": "http://fonts.gstatic.com/s/caudex/v6/XjMZF6XCisvV3qapD4oJdw.ttf", + "700": "http://fonts.gstatic.com/s/caudex/v6/PetCI4GyQ5Q3LiOzUu_mMg.ttf", + "700italic": "http://fonts.gstatic.com/s/caudex/v6/yT8YeHLjaJvQXlUEYOA8gqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cedarville Cursive", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cedarvillecursive/v6/cuCe6HrkcqrWTWTUE7dw-41zwq9-z_Lf44CzRAA0d0Y.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ceviche One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cevicheone/v6/WOaXIMBD4VYMy39MsobJhKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Changa One", + "category": "display", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/changaone/v9/dr4qjce4W3kxFrZRkVD87fesZW2xOQ-xsNqO47m55DA.ttf", + "italic": "http://fonts.gstatic.com/s/changaone/v9/wJVQlUs1lAZel-WdTo2U9y3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Chango", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/chango/v5/3W3AeMMtRTH08t5qLOjBmg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Chau Philomene One", + "category": "sans-serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/chauphilomeneone/v4/KKc5egCL-a2fFVoOA2x6tBFi5dxgSTdxqnMJgWkBJcg.ttf", + "italic": "http://fonts.gstatic.com/s/chauphilomeneone/v4/eJj1PY_iN4KiIuyOvtMHJP6uyLkxyiC4WcYA74sfquE.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Chela One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/chelaone/v4/h5O0dEnpnIq6jQnWxZybrA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Chelsea Market", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/chelseamarket/v4/qSdzwh2A4BbNemy78sJLfAAI1i8fIftCBXsBF2v9UMI.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Chenla", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v9", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/chenla/v9/aLNpdAUDq2MZbWz2U1a16g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cherry Cream Soda", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cherrycreamsoda/v6/OrD-AUnFcZeeKa6F_c0_WxOiHiuAPYA9ry3O1RG2XIU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cherry Swash", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cherryswash/v4/HqOk7C7J1TZ5i3L-ejF0vi3USBnSvpkopQaUR-2r7iU.ttf", + "700": "http://fonts.gstatic.com/s/cherryswash/v4/-CfyMyQqfucZPQNB0nvYyED2ttfZwueP-QU272T9-k4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Chewy", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/chewy/v7/hcDN5cvQdIu6Bx4mg_TSyw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Chicle", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/chicle/v5/xg4q57Ut9ZmyFwLp51JLgg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Chivo", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "900", + "900italic" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/chivo/v7/L88PEuzS9eRfHRZhAPhZyw.ttf", + "italic": "http://fonts.gstatic.com/s/chivo/v7/Oe3-Q-a2kBzPnhHck_baMg.ttf", + "900": "http://fonts.gstatic.com/s/chivo/v7/JAdkiWd46QCW4vOsj3dzTA.ttf", + "900italic": "http://fonts.gstatic.com/s/chivo/v7/LoszYnE86q2wJEOjCigBQ_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cinzel", + "category": "serif", + "variants": [ + "regular", + "700", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cinzel/v4/GF7dy_Nc-a6EaHYSyGd-EA.ttf", + "700": "http://fonts.gstatic.com/s/cinzel/v4/nYcFQ6_3pf_6YDrOFjBR8Q.ttf", + "900": "http://fonts.gstatic.com/s/cinzel/v4/FTBj72ozM2cEOSxiVsRb3A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cinzel Decorative", + "category": "display", + "variants": [ + "regular", + "700", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cinzeldecorative/v4/fmgK7oaJJIXAkhd9798yQgT5USbJx2F82lQbogPy2bY.ttf", + "700": "http://fonts.gstatic.com/s/cinzeldecorative/v4/pXhIVnhFtL_B9Vb1wq2F95-YYVDmZkJErg0zgx9XuZI.ttf", + "900": "http://fonts.gstatic.com/s/cinzeldecorative/v4/pXhIVnhFtL_B9Vb1wq2F97Khqbv0zQZa0g-9HOXAalU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Clicker Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/clickerscript/v4/Zupmk8XwADjufGxWB9KThBnpV0hQCek3EmWnCPrvGRM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Coda", + "category": "display", + "variants": [ + "regular", + "800" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/coda/v10/yHDvulhg-P-p2KRgRrnUYw.ttf", + "800": "http://fonts.gstatic.com/s/coda/v10/6ZIw0sbALY0KTMWllZB3hQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Coda Caption", + "category": "sans-serif", + "variants": [ + "800" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "800": "http://fonts.gstatic.com/s/codacaption/v8/YDl6urZh-DUFhiMBTgAnz_qsay_1ZmRGmC8pVRdIfAg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Codystar", + "category": "display", + "variants": [ + "300", + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/codystar/v4/EVaUzfJkcb8Zqx9kzQLXqqCWcynf_cDxXwCLxiixG1c.ttf", + "regular": "http://fonts.gstatic.com/s/codystar/v4/EN-CPFKYowSI7SuR7-0cZA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Combo", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/combo/v5/Nab98KjR3JZSSPGtzLyXNw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Comfortaa", + "category": "display", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/comfortaa/v7/r_tUZNl0G8xCoOmp_JkSCi3USBnSvpkopQaUR-2r7iU.ttf", + "regular": "http://fonts.gstatic.com/s/comfortaa/v7/lZx6C1VViPgSOhCBUP7hXA.ttf", + "700": "http://fonts.gstatic.com/s/comfortaa/v7/fND5XPYKrF2tQDwwfWZJIy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Coming Soon", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/comingsoon/v6/Yz2z3IAe2HSQAOWsSG8COKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Concert One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/concertone/v7/N5IWCIGhUNdPZn_efTxKN6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Condiment", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/condiment/v4/CstmdiPpgFSV0FUNL5LrJA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Content", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/content/v8/l8qaLjygvOkDEU2G6-cjfQ.ttf", + "700": "http://fonts.gstatic.com/s/content/v8/7PivP8Zvs2qn6F6aNbSQe_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Contrail One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/contrailone/v6/b41KxjgiyqX-hkggANDU6C3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Convergence", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/convergence/v5/eykrGz1NN_YpQmkAZjW-qKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cookie", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cookie/v7/HxeUC62y_YdDbiFlze357A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Copse", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/copse/v6/wikLrtPGjZDvZ5w2i5HLWg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Corben", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/corben/v8/tTysMZkt-j8Y5yhkgsoajQ.ttf", + "700": "http://fonts.gstatic.com/s/corben/v8/lirJaFSQWdGQuV--fksg5g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Courgette", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/courgette/v4/2YO0EYtyE9HUPLZprahpZA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cousine", + "category": "monospace", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "hebrew", + "greek" + ], + "version": "v10", + "lastModified": "2015-04-28", + "files": { + "regular": "http://fonts.gstatic.com/s/cousine/v10/GYX4bPXObJNJo63QJEUnLg.ttf", + "italic": "http://fonts.gstatic.com/s/cousine/v10/1WtIuajLoo8vjVwsrZ3eOg.ttf", + "700": "http://fonts.gstatic.com/s/cousine/v10/FXEOnNUcCzhdtoBxiq-lovesZW2xOQ-xsNqO47m55DA.ttf", + "700italic": "http://fonts.gstatic.com/s/cousine/v10/y_AZ5Sz-FwL1lux2xLSTZS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Coustard", + "category": "serif", + "variants": [ + "regular", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/coustard/v6/iO2Rs5PmqAEAXoU3SkMVBg.ttf", + "900": "http://fonts.gstatic.com/s/coustard/v6/W02OCWO6OfMUHz6aVyegQ6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Covered By Your Grace", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/coveredbyyourgrace/v6/6ozZp4BPlrbDRWPe3EBGA6CVUMdvnk-GcAiZQrX9Gek.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Crafty Girls", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/craftygirls/v5/0Sv8UWFFdhQmesHL32H8oy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Creepster", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/creepster/v5/0vdr5kWJ6aJlOg5JvxnXzQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Crete Round", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/creteround/v5/B8EwN421qqOCCT8vOH4wJ6CWcynf_cDxXwCLxiixG1c.ttf", + "italic": "http://fonts.gstatic.com/s/creteround/v5/5xAt7XK2vkUdjhGtt98unUeOrDcLawS7-ssYqLr2Xp4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Crimson Text", + "category": "serif", + "variants": [ + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/crimsontext/v6/3IFMwfRa07i-auYR-B-zNS3USBnSvpkopQaUR-2r7iU.ttf", + "italic": "http://fonts.gstatic.com/s/crimsontext/v6/a5QZnvmn5amyNI-t2BMkWPMZXuCXbOrAvx5R0IT5Oyo.ttf", + "600": "http://fonts.gstatic.com/s/crimsontext/v6/rEy5tGc5HdXy56Xvd4f3I2v8CylhIUtwUiYO7Z2wXbE.ttf", + "600italic": "http://fonts.gstatic.com/s/crimsontext/v6/4j4TR-EfnvCt43InYpUNDIR-5-urNOGAobhAyctHvW8.ttf", + "700": "http://fonts.gstatic.com/s/crimsontext/v6/rEy5tGc5HdXy56Xvd4f3I0D2ttfZwueP-QU272T9-k4.ttf", + "700italic": "http://fonts.gstatic.com/s/crimsontext/v6/4j4TR-EfnvCt43InYpUNDPAs9-1nE9qOqhChW0m4nDE.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Croissant One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/croissantone/v4/mPjsOObnC77fp1cvZlOfIYjjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Crushed", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/crushed/v6/aHwSejs3Kt0Lg95u7j32jA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cuprum", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cuprum/v7/JgXs0F_UiaEdAS74msmFNg.ttf", + "italic": "http://fonts.gstatic.com/s/cuprum/v7/cLEz0KV6OxInnktSzpk58g.ttf", + "700": "http://fonts.gstatic.com/s/cuprum/v7/6tl3_FkDeXSD72oEHuJh4w.ttf", + "700italic": "http://fonts.gstatic.com/s/cuprum/v7/bnkXaBfoYvaJ75axRPSwVKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cutive", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cutive/v7/G2bW-ImyOCwKxBkLyz39YQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Cutive Mono", + "category": "monospace", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/cutivemono/v4/ncWQtFVKcSs8OW798v30k6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Damion", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/damion/v6/13XtECwKxhD_VrOqXL4SiA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dancing Script", + "category": "handwriting", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/dancingscript/v6/DK0eTGXiZjN6yA8zAEyM2RnpV0hQCek3EmWnCPrvGRM.ttf", + "700": "http://fonts.gstatic.com/s/dancingscript/v6/KGBfwabt0ZRLA5W1ywjowb_dAmXiKjTPGCuO6G2MbfA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dangrek", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/dangrek/v8/LOaFhBT-EHNxZjV8DAW_ew.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dawning of a New Day", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/dawningofanewday/v7/JiDsRhiKZt8uz3NJ5xA06gXLnohmOYWQZqo_sW8GLTk.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Days One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/daysone/v6/kzwZjNhc1iabMsrc_hKBIA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dekko", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v2", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/dekko/v2/AKtgABKC1rUxgIgS-bpojw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Delius", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/delius/v6/TQA163qafki2-gV-B6F_ag.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Delius Swash Caps", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/deliusswashcaps/v8/uXyrEUnoWApxIOICunRq7yIrxb5zDVgU2N3VzXm7zq4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Delius Unicase", + "category": "handwriting", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/deliusunicase/v9/b2sKujV3Q48RV2PQ0k1vqu6rPKfVZo7L2bERcf0BDns.ttf", + "700": "http://fonts.gstatic.com/s/deliusunicase/v9/7FTMTITcb4dxUp99FAdTqNy5weKXdcrx-wE0cgECMq8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Della Respira", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/dellarespira/v4/F4E6Lo_IZ6L9AJCcbqtDVeDcg5akpSnIcsPhLOFv7l8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Denk One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/denkone/v4/TdXOeA4eA_hEx4W8Sh9wPw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Devonshire", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/devonshire/v5/I3ct_2t12SYizP8ZC-KFi_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dhurjati", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v4", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/dhurjati/v4/uV6jO5e2iFMbGB0z79Cy5g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Didact Gothic", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/didactgothic/v7/v8_72sD3DYMKyM0dn3LtWotBLojGU5Qdl8-5NL4v70w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Diplomata", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-03-20", + "files": { + "regular": "http://fonts.gstatic.com/s/diplomata/v6/u-ByBiKgN6rTMA36H3kcKg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Diplomata SC", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/diplomatasc/v5/JdVwAwfE1a_pahXjk5qpNi3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Domine", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/domine/v4/wfVIgamVFjMNQAEWurCiHA.ttf", + "700": "http://fonts.gstatic.com/s/domine/v4/phBcG1ZbQFxUIt18hPVxnw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Donegal One", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/donegalone/v4/6kN4-fDxz7T9s5U61HwfF6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Doppio One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/doppioone/v4/WHZ3HJQotpk_4aSMNBo_t_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dorsa", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/dorsa/v7/wCc3cUe6XrmG2LQE6GlIrw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dosis", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "200": "http://fonts.gstatic.com/s/dosis/v4/ztftab0r6hcd7AeurUGrSQ.ttf", + "300": "http://fonts.gstatic.com/s/dosis/v4/awIB6L0h5mb0plIKorXmuA.ttf", + "regular": "http://fonts.gstatic.com/s/dosis/v4/rJRlixu-w0JZ1MyhJpao_Q.ttf", + "500": "http://fonts.gstatic.com/s/dosis/v4/ruEXDOFMxDPGnjCBKRqdAQ.ttf", + "600": "http://fonts.gstatic.com/s/dosis/v4/KNAswRNwm3tfONddYyidxg.ttf", + "700": "http://fonts.gstatic.com/s/dosis/v4/AEEAj0ONidK8NQQMBBlSig.ttf", + "800": "http://fonts.gstatic.com/s/dosis/v4/nlrKd8E69vvUU39XGsvR7Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dr Sugiyama", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/drsugiyama/v5/S5Yx3MIckgoyHhhS4C9Tv6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Droid Sans", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/droidsans/v6/rS9BT6-asrfjpkcV3DXf__esZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/droidsans/v6/EFpQQyG9GqCrobXxL-KRMQJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Droid Sans Mono", + "category": "monospace", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/droidsansmono/v7/ns-m2xQYezAtqh7ai59hJcwD6PD0c3_abh9zHKQtbGU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Droid Serif", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/droidserif/v6/DgAtPy6rIVa2Zx3Xh9KaNaCWcynf_cDxXwCLxiixG1c.ttf", + "italic": "http://fonts.gstatic.com/s/droidserif/v6/cj2hUnSRBhwmSPr9kS5890eOrDcLawS7-ssYqLr2Xp4.ttf", + "700": "http://fonts.gstatic.com/s/droidserif/v6/QQt14e8dY39u-eYBZmppwXe1Pd76Vl7zRpE7NLJQ7XU.ttf", + "700italic": "http://fonts.gstatic.com/s/droidserif/v6/c92rD_x0V1LslSFt3-QEps_zJjSACmk0BRPxQqhnNLU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Duru Sans", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/durusans/v8/R1xHvAOARPh8_so9_UKw1w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Dynalight", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/dynalight/v5/-CWsIe8OUDWTIHjSAh41kA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "EB Garamond", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "vietnamese", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ebgaramond/v7/CDR0kuiFK7I1OZ2hSdR7G6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Eagle Lake", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/eaglelake/v4/ZKlYin7caemhx9eSg6RvPfesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Eater", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/eater/v5/gm6f3OmYEdbs3lPQtUfBkA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Economica", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/economica/v4/G4rJRujzZbq9Nxngu9l3hg.ttf", + "italic": "http://fonts.gstatic.com/s/economica/v4/p5O9AVeUqx_n35xQRinNYaCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/economica/v4/UK4l2VEpwjv3gdcwbwXE9C3USBnSvpkopQaUR-2r7iU.ttf", + "700italic": "http://fonts.gstatic.com/s/economica/v4/ac5dlUsedQ03RqGOeay-3Xe1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ek Mukta", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "200": "http://fonts.gstatic.com/s/ekmukta/v7/crtkNHh5JcM3VJKG0E-B36CWcynf_cDxXwCLxiixG1c.ttf", + "300": "http://fonts.gstatic.com/s/ekmukta/v7/mpaAv7CIyk0VnZlqSneVxKCWcynf_cDxXwCLxiixG1c.ttf", + "regular": "http://fonts.gstatic.com/s/ekmukta/v7/aFcjXdC5jyJ1p8w54wIIrg.ttf", + "500": "http://fonts.gstatic.com/s/ekmukta/v7/PZ1y2MstFczWvBlFSgzMyaCWcynf_cDxXwCLxiixG1c.ttf", + "600": "http://fonts.gstatic.com/s/ekmukta/v7/Z5Mfzeu6M3emakcJO2QeTqCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/ekmukta/v7/4ugcOGR28Jn-oBIn0-qLYaCWcynf_cDxXwCLxiixG1c.ttf", + "800": "http://fonts.gstatic.com/s/ekmukta/v7/O68TH5OjEhVmn9_gIrcfS6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Electrolize", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/electrolize/v5/yFVu5iokC-nt4B1Cyfxb9aCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Elsie", + "category": "display", + "variants": [ + "regular", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/elsie/v5/gwspePauE45BJu6Ok1QrfQ.ttf", + "900": "http://fonts.gstatic.com/s/elsie/v5/1t-9f0N2NFYwAgN7oaISqg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Elsie Swash Caps", + "category": "display", + "variants": [ + "regular", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/elsieswashcaps/v4/9L3hIJMPCf6sxCltnxd6X2YeFSdnSpRYv5h9gpdlD1g.ttf", + "900": "http://fonts.gstatic.com/s/elsieswashcaps/v4/iZnus9qif0tR5pGaDv5zdKoKBWBozTtxi30NfZDOXXU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Emblema One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/emblemaone/v5/7IlBUjBWPIiw7cr_O2IfSaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Emilys Candy", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/emilyscandy/v4/PofLVm6v1SwZGOzC8s-I3S3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Engagement", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/engagement/v5/4Uz0Jii7oVPcaFRYmbpU6vesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Englebert", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/englebert/v4/sll38iOvOuarDTYBchlP3Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Enriqueta", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/enriqueta/v5/_p90TrIwR1SC-vDKtmrv6A.ttf", + "700": "http://fonts.gstatic.com/s/enriqueta/v5/I27Pb-wEGH2ajLYP0QrtSC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Erica One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/ericaone/v6/cIBnH2VAqQMIGYAcE4ufvQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Esteban", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/esteban/v4/ESyhLgqDDyK5JcFPp2svDw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Euphoria Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/euphoriascript/v4/c4XB4Iijj_NvSsCF4I0O2MxLhO8OSNnfAp53LK1_iRs.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ewert", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ewert/v4/Em8hrzuzSbfHcTVqMjbAQg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Exo", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/exo/v4/RI7A9uwjRmPbVp0n8e-Jvg.ttf", + "100italic": "http://fonts.gstatic.com/s/exo/v4/qtGyZZlWb2EEvby3ZPosxw.ttf", + "200": "http://fonts.gstatic.com/s/exo/v4/F8OfC_swrRRxpFt-tlXZQg.ttf", + "200italic": "http://fonts.gstatic.com/s/exo/v4/fr4HBfXHYiIngW2_bhlgRw.ttf", + "300": "http://fonts.gstatic.com/s/exo/v4/SBrN7TKUqgGUvfxqHqsnNw.ttf", + "300italic": "http://fonts.gstatic.com/s/exo/v4/3gmiLjBegIfcDLISjTGA1g.ttf", + "regular": "http://fonts.gstatic.com/s/exo/v4/eUEzTFueNXRVhbt4PEB8kQ.ttf", + "italic": "http://fonts.gstatic.com/s/exo/v4/cfgolWisMSURhpQeVHl_NA.ttf", + "500": "http://fonts.gstatic.com/s/exo/v4/jCg6DmGGXt_OVyp5ofQHPw.ttf", + "500italic": "http://fonts.gstatic.com/s/exo/v4/lo5eTdCNJZQVN08p8RnzAQ.ttf", + "600": "http://fonts.gstatic.com/s/exo/v4/q_SG5kXUmOcIvFpgtdZnlw.ttf", + "600italic": "http://fonts.gstatic.com/s/exo/v4/0cExa8K_pxS2lTuMr68XUA.ttf", + "700": "http://fonts.gstatic.com/s/exo/v4/3_jwsL4v9uHjl5Q37G57mw.ttf", + "700italic": "http://fonts.gstatic.com/s/exo/v4/0me55yJIxd5vyQ9bF7SsiA.ttf", + "800": "http://fonts.gstatic.com/s/exo/v4/yLPuxBuV0lzqibRJyooOJg.ttf", + "800italic": "http://fonts.gstatic.com/s/exo/v4/n3LejeKVj_8gtZq5fIgNYw.ttf", + "900": "http://fonts.gstatic.com/s/exo/v4/97d0nd6Yv4-SA_X92xAuZA.ttf", + "900italic": "http://fonts.gstatic.com/s/exo/v4/JHTkQVhzyLtkY13Ye95TJQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Exo 2", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v3", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/exo2/v3/oVOtQy53isv97g4UhBUDqg.ttf", + "100italic": "http://fonts.gstatic.com/s/exo2/v3/LNYVgsJcaCxoKFHmd4AZcg.ttf", + "200": "http://fonts.gstatic.com/s/exo2/v3/qa-Ci2pBwJdCxciE1ErifQ.ttf", + "200italic": "http://fonts.gstatic.com/s/exo2/v3/DCrVxDVvS69n50O-5erZVvesZW2xOQ-xsNqO47m55DA.ttf", + "300": "http://fonts.gstatic.com/s/exo2/v3/nLUBdz_lHHoVIPor05Byhw.ttf", + "300italic": "http://fonts.gstatic.com/s/exo2/v3/iSy9VTeUTiqiurQg2ywtu_esZW2xOQ-xsNqO47m55DA.ttf", + "regular": "http://fonts.gstatic.com/s/exo2/v3/Pf_kZuIH5c5WKVkQUaeSWQ.ttf", + "italic": "http://fonts.gstatic.com/s/exo2/v3/xxA5ZscX9sTU6U0lZJUlYA.ttf", + "500": "http://fonts.gstatic.com/s/exo2/v3/oM0rzUuPqVJpW-VEIpuW5w.ttf", + "500italic": "http://fonts.gstatic.com/s/exo2/v3/amzRVCB-gipwdihZZ2LtT_esZW2xOQ-xsNqO47m55DA.ttf", + "600": "http://fonts.gstatic.com/s/exo2/v3/YnSn3HsyvyI1feGSdRMYqA.ttf", + "600italic": "http://fonts.gstatic.com/s/exo2/v3/Vmo58BiptGwfVFb0teU5gPesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/exo2/v3/2DiK4XkdTckfTk6we73-bQ.ttf", + "700italic": "http://fonts.gstatic.com/s/exo2/v3/Sdo-zW-4_--pDkTg6bYrY_esZW2xOQ-xsNqO47m55DA.ttf", + "800": "http://fonts.gstatic.com/s/exo2/v3/IVYl_7dJruOg8zKRpC8Hrw.ttf", + "800italic": "http://fonts.gstatic.com/s/exo2/v3/p0TA6KeOz1o4rySEbvUxI_esZW2xOQ-xsNqO47m55DA.ttf", + "900": "http://fonts.gstatic.com/s/exo2/v3/e8csG8Wnu87AF6uCndkFRQ.ttf", + "900italic": "http://fonts.gstatic.com/s/exo2/v3/KPhsGCoT2-7Uj6pMlRscH_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Expletus Sans", + "category": "display", + "variants": [ + "regular", + "italic", + "500", + "500italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/expletussans/v7/gegTSDBDs5le3g6uxU1ZsX8f0n03UdmQgF_CLvNR2vg.ttf", + "italic": "http://fonts.gstatic.com/s/expletussans/v7/Y-erXmY0b6DU_i2Qu0hTJj4G9C9ttb0Oz5Cvf0qOitE.ttf", + "500": "http://fonts.gstatic.com/s/expletussans/v7/cl6rhMY77Ilk8lB_uYRRwAqQmZ7VjhwksfpNVG0pqGc.ttf", + "500italic": "http://fonts.gstatic.com/s/expletussans/v7/sRBNtc46w65uJE451UYmW87DCVO6wo6i5LKIyZDzK40.ttf", + "600": "http://fonts.gstatic.com/s/expletussans/v7/cl6rhMY77Ilk8lB_uYRRwCvj1tU7IJMS3CS9kCx2B3U.ttf", + "600italic": "http://fonts.gstatic.com/s/expletussans/v7/sRBNtc46w65uJE451UYmW8yKH23ZS6zCKOFHG0e_4JE.ttf", + "700": "http://fonts.gstatic.com/s/expletussans/v7/cl6rhMY77Ilk8lB_uYRRwFCbmAUID8LN-q3pJpOk3Ys.ttf", + "700italic": "http://fonts.gstatic.com/s/expletussans/v7/sRBNtc46w65uJE451UYmW5F66r9C4AnxxlBlGd7xY4g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fanwood Text", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fanwoodtext/v6/hDNDHUlsSb8bgnEmDp4T_i3USBnSvpkopQaUR-2r7iU.ttf", + "italic": "http://fonts.gstatic.com/s/fanwoodtext/v6/0J3SBbkMZqBV-3iGxs5E9_MZXuCXbOrAvx5R0IT5Oyo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fascinate", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/fascinate/v5/ZE0637WWkBPKt1AmFaqD3Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fascinate Inline", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/fascinateinline/v6/lRguYfMfWArflkm5aOQ5QJmp8DTZ6iHear7UV05iykg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Faster One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fasterone/v5/YxTOW2sf56uxD1T7byP5K_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fasthand", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v7", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/fasthand/v7/6XAagHH_KmpZL67wTvsETQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fauna One", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/faunaone/v4/8kL-wpAPofcAMELI_5NRnQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Federant", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/federant/v7/tddZFSiGvxICNOGra0i5aA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Federo", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/federo/v8/JPhe1S2tujeyaR79gXBLeQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Felipa", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/felipa/v4/SeyfyFZY7abAQXGrOIYnYg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fenix", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fenix/v4/Ak8wR3VSlAN7VN_eMeJj7Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Finger Paint", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fingerpaint/v4/m_ZRbiY-aPb13R3DWPBGXy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fira Mono", + "category": "monospace", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v3", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/firamono/v3/WQOm1D4RO-yvA9q9trJc8g.ttf", + "700": "http://fonts.gstatic.com/s/firamono/v3/l24Wph3FsyKAbJ8dfExTZy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fira Sans", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/firasans/v5/VTBnrK42EiOBncVyQXZ7jy3USBnSvpkopQaUR-2r7iU.ttf", + "300italic": "http://fonts.gstatic.com/s/firasans/v5/6s0YCA9oCTF6hM60YM-qTS9-WlPSxbfiI49GsXo3q0g.ttf", + "regular": "http://fonts.gstatic.com/s/firasans/v5/nsT0isDy56OkSX99sFQbXw.ttf", + "italic": "http://fonts.gstatic.com/s/firasans/v5/cPT_2ddmoxsUuMtQqa8zGqCWcynf_cDxXwCLxiixG1c.ttf", + "500": "http://fonts.gstatic.com/s/firasans/v5/zM2u8V3CuPVwAAXFQcDi4C3USBnSvpkopQaUR-2r7iU.ttf", + "500italic": "http://fonts.gstatic.com/s/firasans/v5/6s0YCA9oCTF6hM60YM-qTcCNfqCYlB_eIx7H1TVXe60.ttf", + "700": "http://fonts.gstatic.com/s/firasans/v5/DugPdSljmOTocZOR2CItOi3USBnSvpkopQaUR-2r7iU.ttf", + "700italic": "http://fonts.gstatic.com/s/firasans/v5/6s0YCA9oCTF6hM60YM-qTXe1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fjalla One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fjallaone/v4/3b7vWCfOZsU53vMa8LWsf_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fjord One", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fjordone/v5/R_YHK8au2uFPw5tNu5N7zw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Flamenco", + "category": "display", + "variants": [ + "300", + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/flamenco/v6/x9iI5CogvuZVCGoRHwXuo6CWcynf_cDxXwCLxiixG1c.ttf", + "regular": "http://fonts.gstatic.com/s/flamenco/v6/HC0ugfLLgt26I5_BWD1PZA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Flavors", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/flavors/v5/SPJi5QclATvon8ExcKGRvQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fondamento", + "category": "handwriting", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fondamento/v5/6LWXcjT1B7bnWluAOSNfMPesZW2xOQ-xsNqO47m55DA.ttf", + "italic": "http://fonts.gstatic.com/s/fondamento/v5/y6TmwhSbZ8rYq7OTFyo7OS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fontdiner Swanky", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fontdinerswanky/v6/8_GxIO5ixMtn5P6COsF3TlBjMPLzPAFJwRBn-s1U7kA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Forum", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/forum/v7/MZUpsq1VfLrqv8eSDcbrrQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Francois One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/francoisone/v9/bYbkq2nU2TSx4SwFbz5sCC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Freckle Face", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/freckleface/v4/7-B8j9BPJgazdHIGqPNv8y3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fredericka the Great", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/frederickathegreat/v5/7Es8Lxoku-e5eOZWpxw18nrnet6gXN1McwdQxS1dVrI.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fredoka One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fredokaone/v4/QKfwXi-z-KtJAlnO2ethYqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Freehand", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/freehand/v8/uEBQxvA0lnn_BrD6krlxMw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fresca", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fresca/v5/2q7Qm9sCo1tWvVgSDVWNIw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Frijole", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/frijole/v5/L2MfZse-2gCascuD-nLhWg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fruktur", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/fruktur/v6/PnQvfEi1LssAvhJsCwH__w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Fugaz One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/fugazone/v6/5tteVDCwxsr8-5RuSiRWOw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "GFS Didot", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "greek" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gfsdidot/v6/jQKxZy2RU-h9tkPZcRVluA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "GFS Neohellenic", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "greek" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gfsneohellenic/v7/B4xRqbn-tANVqVgamMsSDiayCZa0z7CpFzlkqoCHztc.ttf", + "italic": "http://fonts.gstatic.com/s/gfsneohellenic/v7/KnaWrO4awITAqigQIIYXKkCTdomiyJpIzPbEbIES3rU.ttf", + "700": "http://fonts.gstatic.com/s/gfsneohellenic/v7/7HwjPQa7qNiOsnUce2h4448_BwCLZY3eDSV6kppAwI8.ttf", + "700italic": "http://fonts.gstatic.com/s/gfsneohellenic/v7/FwWjoX6XqT-szJFyqsu_GYFF0fM4h-krcpQk7emtCpE.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gabriela", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gabriela/v4/B-2ZfbAO3HDrxqV6lR5tdA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gafata", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gafata/v5/aTFqlki_3Dc3geo-FxHTvQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Galdeano", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/galdeano/v6/ZKFMQI6HxEG1jOT0UGSZUg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Galindo", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/galindo/v4/2lafAS_ZEfB33OJryhXDUg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gentium Basic", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gentiumbasic/v7/KCktj43blvLkhOTolFn-MYtBLojGU5Qdl8-5NL4v70w.ttf", + "italic": "http://fonts.gstatic.com/s/gentiumbasic/v7/qoFz4NSMaYC2UmsMAG3lyTj3mvXnCeAk09uTtmkJGRc.ttf", + "700": "http://fonts.gstatic.com/s/gentiumbasic/v7/2qL6yulgGf0wwgOp-UqGyLNuTeOOLg3nUymsEEGmdO0.ttf", + "700italic": "http://fonts.gstatic.com/s/gentiumbasic/v7/8N9-c_aQDJ8LbI1NGVMrwtswO1vWwP9exiF8s0wqW10.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gentium Book Basic", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gentiumbookbasic/v6/IRFxB2matTxrjZt6a3FUnrWDjKAyldGEr6eEi2MBNeY.ttf", + "italic": "http://fonts.gstatic.com/s/gentiumbookbasic/v6/qHqW2lwKO8-uTfIkh8FsUfXfjMwrYnmPVsQth2IcAPY.ttf", + "700": "http://fonts.gstatic.com/s/gentiumbookbasic/v6/T2vUYmWzlqUtgLYdlemGnaWESMHIjnSjm9UUxYtEOko.ttf", + "700italic": "http://fonts.gstatic.com/s/gentiumbookbasic/v6/632u7TMIoFDWQYUaHFUp5PA2A9KyRZEkn4TZVuhsWRM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Geo", + "category": "sans-serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/geo/v8/mJuJYk5Pww84B4uHAQ1XaA.ttf", + "italic": "http://fonts.gstatic.com/s/geo/v8/8_r1wToF7nPdDuX1qxel6Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Geostar", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/geostar/v6/A8WQbhQbpYx3GWWaShJ9GA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Geostar Fill", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/geostarfill/v6/Y5ovXPPOHYTfQzK2aM-hui3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Germania One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/germaniaone/v4/3_6AyUql_-FbDi1e68jHdC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gidugu", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v3", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/gidugu/v3/Ey6Eq3hrT6MM58iFItFcgw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gilda Display", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gildadisplay/v4/8yAVUZLLZ3wb7dSsjix0CADHmap7fRWINAsw8-RaxNg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Give You Glory", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/giveyouglory/v6/DFEWZFgGmfseyIdGRJAxuBwwkpSPZdvjnMtysdqprfI.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Glass Antiqua", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/glassantiqua/v4/0yLrXKplgdUDIMz5TnCHNODcg5akpSnIcsPhLOFv7l8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Glegoo", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/glegoo/v5/2tf-h3n2A_SNYXEO0C8bKw.ttf", + "700": "http://fonts.gstatic.com/s/glegoo/v5/TlLolbauH0-0Aiz1LUH5og.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gloria Hallelujah", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gloriahallelujah/v7/CA1k7SlXcY5kvI81M_R28Q3RdPdyebSUyJECJouPsvA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Goblin One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/goblinone/v6/331XtzoXgpVEvNTVcBJ_C_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gochi Hand", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gochihand/v7/KT1-WxgHsittJ34_20IfAPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gorditas", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gorditas/v4/uMgZhXUyH6qNGF3QsjQT5Q.ttf", + "700": "http://fonts.gstatic.com/s/gorditas/v4/6-XCeknmxaon8AUqVkMnHaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Goudy Bookletter 1911", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/goudybookletter1911/v6/l5lwlGTN3pEY5Bf-rQEuIIjNDsyURsIKu4GSfvSE4mA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Graduate", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/graduate/v4/JpAmYLHqcIh9_Ff35HHwiA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Grand Hotel", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/grandhotel/v4/C_A8HiFZjXPpnMt38XnK7qCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gravitas One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gravitasone/v6/nBHdBv6zVNU8MtP6w9FwTS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Great Vibes", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/greatvibes/v4/4Mi5RG_9LjQYrTU55GN_L6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Griffy", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/griffy/v4/vWkyYGBSyE5xjnShNtJtzw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gruppo", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gruppo/v7/pS_JM0cK_piBZve-lfUq9w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gudea", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/gudea/v4/S-4QqBlkMPiiA3jNeCR5yw.ttf", + "italic": "http://fonts.gstatic.com/s/gudea/v4/7mNgsGw_vfS-uUgRVXNDSw.ttf", + "700": "http://fonts.gstatic.com/s/gudea/v4/lsip4aiWhJ9bx172Y9FN_w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Gurajada", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v4", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/gurajada/v4/6Adfkl4PCRyq6XTENACEyA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Habibi", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/habibi/v5/YYyqXF6pWpL7kmKgS_2iUA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Halant", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-01", + "files": { + "300": "http://fonts.gstatic.com/s/halant/v1/dM3ItAOWNNod_Cf3MnLlEg.ttf", + "regular": "http://fonts.gstatic.com/s/halant/v1/rEs7Jk3SVyt3cTx6DoTu1w.ttf", + "500": "http://fonts.gstatic.com/s/halant/v1/tlsNj3K-hJKtiirTDtUbkQ.ttf", + "600": "http://fonts.gstatic.com/s/halant/v1/zNR2WvI_V8o652vIZp3X4Q.ttf", + "700": "http://fonts.gstatic.com/s/halant/v1/D9FN7OH89AuCmZDLHbPQfA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Hammersmith One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/hammersmithone/v7/FWNn6ITYqL6or7ZTmBxRhjjVlsJB_M_Q_LtZxsoxvlw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Hanalei", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/hanalei/v6/Sx8vVMBnXSQyK6Cn0CBJ3A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Hanalei Fill", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/hanaleifill/v5/5uPeWLnaDdtm4UBG26Ds6C3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Handlee", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/handlee/v5/6OfkXkyC0E5NZN80ED8u3A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Hanuman", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/hanuman/v8/hRhwOGGmElJSl6KSPvEnOQ.ttf", + "700": "http://fonts.gstatic.com/s/hanuman/v8/lzzXZ2l84x88giDrbfq76vesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Happy Monkey", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/happymonkey/v5/c2o0ps8nkBmaOYctqBq1rS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Headland One", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/headlandone/v4/iGmBeOvQGfq9DSbjJ8jDVy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Henny Penny", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/hennypenny/v4/XRgo3ogXyi3tpsFfjImRF6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Herr Von Muellerhoff", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/herrvonmuellerhoff/v6/mmy24EUmk4tjm4gAEjUd7NLGIYrUsBdh-JWHYgiDiMU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Hind", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/hind/v5/qa346Adgv9kPDXoD1my4kA.ttf", + "regular": "http://fonts.gstatic.com/s/hind/v5/mktFHh5Z5P9YjGKSslSUtA.ttf", + "500": "http://fonts.gstatic.com/s/hind/v5/2cs8RCVcYtiv4iNDH1UsQQ.ttf", + "600": "http://fonts.gstatic.com/s/hind/v5/TUKUmFMXSoxloBP1ni08oA.ttf", + "700": "http://fonts.gstatic.com/s/hind/v5/cXJJavLdUbCfjxlsA6DqTw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Holtwood One SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/holtwoodonesc/v7/sToOq3cIxbfnhbEkgYNuBbAgSRh1LpJXlLfl8IbsmHg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Homemade Apple", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/homemadeapple/v6/yg3UMEsefgZ8IHz_ryz86BiPOmFWYV1WlrJkRafc4c0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Homenaje", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/homenaje/v5/v0YBU0iBRrGdVjDNQILxtA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell DW Pica", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfelldwpica/v6/W81bfaWiUicLSPbJhW-ATsA5qm663gJGVdtpamafG5A.ttf", + "italic": "http://fonts.gstatic.com/s/imfelldwpica/v6/alQJ8SK5aSOZVaelYoyT4PL2asmh5DlYQYCosKo6yQs.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell DW Pica SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfelldwpicasc/v6/xBKKJV4z2KsrtQnmjGO17JZ9RBdEL0H9o5qzT1Rtof4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell Double Pica", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfelldoublepica/v6/yN1wY_01BkQnO0LYAhXdUol14jEdVOhEmvtCMCVwYak.ttf", + "italic": "http://fonts.gstatic.com/s/imfelldoublepica/v6/64odUh2hAw8D9dkFKTlWYq0AWwkgdQfsRHec8TYi4mI.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell Double Pica SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfelldoublepicasc/v6/jkrUtrLFpMw4ZazhfkKsGwc4LoC4OJUqLw9omnT3VOU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell English", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfellenglish/v6/xwIisCqGFi8pff-oa9uSVHGNmx1fDm-u2eBJHQkdrmk.ttf", + "italic": "http://fonts.gstatic.com/s/imfellenglish/v6/Z3cnIAI_L3XTRfz4JuZKbuewladMPCWTthtMv9cPS-c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell English SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfellenglishsc/v6/h3Tn6yWfw4b5qaLD1RWvz5ATixNthKRRR1XVH3rJNiw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell French Canon", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfellfrenchcanon/v6/iKB0WL1BagSpNPz3NLMdsJ3V2FNpBrlLSvqUnERhBP8.ttf", + "italic": "http://fonts.gstatic.com/s/imfellfrenchcanon/v6/owCuNQkLLFW7TBBPJbMnhRa-QL94KdW80H29tcyld2A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell French Canon SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfellfrenchcanonsc/v6/kA3bS19-tQbeT_iG32EZmaiyyzHwYrAbmNulTz423iM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell Great Primer", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfellgreatprimer/v6/AL8ALGNthei20f9Cu3e93rgeX3ROgtTz44CitKAxzKI.ttf", + "italic": "http://fonts.gstatic.com/s/imfellgreatprimer/v6/1a-artkXMVg682r7TTxVY1_YG2SFv8Ma7CxRl1S3o7g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "IM Fell Great Primer SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imfellgreatprimersc/v6/A313vRj97hMMGFjt6rgSJtRg-ciw1Y27JeXb2Zv4lZQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Iceberg", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/iceberg/v4/p2XVm4M-N0AOEEOymFKC5w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Iceland", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/iceland/v5/kq3uTMGgvzWGNi39B_WxGA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Imprima", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/imprima/v4/eRjquWLjwLGnTEhLH7u3kA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Inconsolata", + "category": "monospace", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2015-05-14", + "files": { + "regular": "http://fonts.gstatic.com/s/inconsolata/v11/7bMKuoy6Nh0ft0SHnIGMuaCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/inconsolata/v11/AIed271kqQlcIRSOnQH0yXe1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Inder", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/inder/v5/C38TwecLTfKxIHDc_Adcrw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Indie Flower", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/indieflower/v7/10JVD_humAd5zP2yrFqw6i3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Inika", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/inika/v4/eZCrULQGaIxkrRoGz_DjhQ.ttf", + "700": "http://fonts.gstatic.com/s/inika/v4/bl3ZoTyrWsFun2zYbsgJrA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Irish Grover", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/irishgrover/v6/kUp7uUPooL-KsLGzeVJbBC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Istok Web", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/istokweb/v8/RYLSjEXQ0nNtLLc4n7--dQ.ttf", + "italic": "http://fonts.gstatic.com/s/istokweb/v8/kvcT2SlTjmGbC3YlZxmrl6CWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/istokweb/v8/2koEo4AKFSvK4B52O_Mwai3USBnSvpkopQaUR-2r7iU.ttf", + "700italic": "http://fonts.gstatic.com/s/istokweb/v8/ycQ3g52ELrh3o_HYCNNUw3e1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Italiana", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/italiana/v4/dt95fkCSTOF-c6QNjwSycA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Italianno", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/italianno/v6/HsyHnLpKf8uP7aMpDQHZmg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Jacques Francois", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/jacquesfrancois/v4/_-0XWPQIW6tOzTHg4KaJ_M13D_4KM32Q4UmTSjpuNGQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Jacques Francois Shadow", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/jacquesfrancoisshadow/v4/V14y0H3vq56fY9SV4OL_FASt0D_oLVawA8L8b9iKjbs.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Jaldi", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-22", + "files": { + "regular": "http://fonts.gstatic.com/s/jaldi/v1/x1vR-bPW9a1EB-BUVqttCw.ttf", + "700": "http://fonts.gstatic.com/s/jaldi/v1/OIbtgjjEp3aVWtjF6WY8mA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Jim Nightshade", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/jimnightshade/v4/_n43lYHXVWNgXegdYRIK9CF1W_bo0EdycfH0kHciIic.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Jockey One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/jockeyone/v6/cAucnOZLvFo07w2AbufBCfesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Jolly Lodger", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/jollylodger/v4/RX8HnkBgaEKQSHQyP9itiS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Josefin Sans", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/josefinsans/v9/q9w3H4aeBxj0hZ8Osfi3d8SVQ0giZ-l_NELu3lgGyYw.ttf", + "100italic": "http://fonts.gstatic.com/s/josefinsans/v9/s7-P1gqRNRNn-YWdOYnAOXXcj1rQwlNLIS625o-SrL0.ttf", + "300": "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z6cQoVhARpoaILP7amxE_8g.ttf", + "300italic": "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33Gyna0FLWfcB-J_SAYmcAXaI.ttf", + "regular": "http://fonts.gstatic.com/s/josefinsans/v9/xgzbb53t8j-Mo-vYa23n5i3USBnSvpkopQaUR-2r7iU.ttf", + "italic": "http://fonts.gstatic.com/s/josefinsans/v9/q9w3H4aeBxj0hZ8Osfi3d_MZXuCXbOrAvx5R0IT5Oyo.ttf", + "600": "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z2v8CylhIUtwUiYO7Z2wXbE.ttf", + "600italic": "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33G4R-5-urNOGAobhAyctHvW8.ttf", + "700": "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z0D2ttfZwueP-QU272T9-k4.ttf", + "700italic": "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33G_As9-1nE9qOqhChW0m4nDE.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Josefin Slab", + "category": "serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/josefinslab/v6/etsUjZYO8lTLU85lDhZwUsSVQ0giZ-l_NELu3lgGyYw.ttf", + "100italic": "http://fonts.gstatic.com/s/josefinslab/v6/8BjDChqLgBF3RJKfwHIYh3Xcj1rQwlNLIS625o-SrL0.ttf", + "300": "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2KcQoVhARpoaILP7amxE_8g.ttf", + "300italic": "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJulyyna0FLWfcB-J_SAYmcAXaI.ttf", + "regular": "http://fonts.gstatic.com/s/josefinslab/v6/46aYWdgz-1oFX11flmyEfS3USBnSvpkopQaUR-2r7iU.ttf", + "italic": "http://fonts.gstatic.com/s/josefinslab/v6/etsUjZYO8lTLU85lDhZwUvMZXuCXbOrAvx5R0IT5Oyo.ttf", + "600": "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2Gv8CylhIUtwUiYO7Z2wXbE.ttf", + "600italic": "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJuly4R-5-urNOGAobhAyctHvW8.ttf", + "700": "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2ED2ttfZwueP-QU272T9-k4.ttf", + "700italic": "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJuly_As9-1nE9qOqhChW0m4nDE.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Joti One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/jotione/v4/P3r_Th0ESHJdzunsvWgUfQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Judson", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/judson/v7/znM1AAs0eytUaJzf1CrYZQ.ttf", + "italic": "http://fonts.gstatic.com/s/judson/v7/GVqQW9P52ygW-ySq-CLwAA.ttf", + "700": "http://fonts.gstatic.com/s/judson/v7/he4a2LwiPJc7r8x0oKCKiA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Julee", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/julee/v6/CAib-jsUsSO8SvVRnE9fHA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Julius Sans One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-22", + "files": { + "regular": "http://fonts.gstatic.com/s/juliussansone/v5/iU65JP9acQHPDLkdalCF7jjVlsJB_M_Q_LtZxsoxvlw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Junge", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/junge/v4/j4IXCXtxrw9qIBheercp3A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Jura", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/jura/v7/Rqx_xy1UnN0C7wD3FUSyPQ.ttf", + "regular": "http://fonts.gstatic.com/s/jura/v7/YAWMwF3sN0KCbynMq-Yr_Q.ttf", + "500": "http://fonts.gstatic.com/s/jura/v7/16xhfjHCiaLj3tsqqgmtGg.ttf", + "600": "http://fonts.gstatic.com/s/jura/v7/iwseduOwJSdY8wQ1Y6CJdA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Just Another Hand", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/justanotherhand/v7/fKV8XYuRNNagXr38eqbRf99BnJIEGrvoojniP57E51c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Just Me Again Down Here", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/justmeagaindownhere/v8/sN06iTc9ITubLTgXoG-kc3M9eVLpVTSK6TqZTIgBrWQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kalam", + "category": "handwriting", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/kalam/v6/MgQQlk1SgPEHdlkWMNh7Jg.ttf", + "regular": "http://fonts.gstatic.com/s/kalam/v6/hNEJkp2K-aql7e5WQish4Q.ttf", + "700": "http://fonts.gstatic.com/s/kalam/v6/95nLItUGyWtNLZjSckluLQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kameron", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kameron/v7/9r8HYhqDSwcq9WMjupL82A.ttf", + "700": "http://fonts.gstatic.com/s/kameron/v7/rabVVbzlflqvmXJUFlKnu_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kantumruy", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "khmer" + ], + "version": "v3", + "lastModified": "2015-04-03", + "files": { + "300": "http://fonts.gstatic.com/s/kantumruy/v3/ERRwQE0WG5uanaZWmOFXNi3USBnSvpkopQaUR-2r7iU.ttf", + "regular": "http://fonts.gstatic.com/s/kantumruy/v3/kQfXNYElQxr5dS8FyjD39Q.ttf", + "700": "http://fonts.gstatic.com/s/kantumruy/v3/gie_zErpGf_rNzs920C2Ji3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Karla", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/karla/v5/78UgGRwJFkhqaoFimqoKpQ.ttf", + "italic": "http://fonts.gstatic.com/s/karla/v5/51UBKly9RQOnOkj95ZwEFw.ttf", + "700": "http://fonts.gstatic.com/s/karla/v5/JS501sZLxZ4zraLQdncOUA.ttf", + "700italic": "http://fonts.gstatic.com/s/karla/v5/3YDyi09gQjCRh-5-SVhTTvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Karma", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/karma/v5/lH6ijJnguWR2Sz7tEl6MQQ.ttf", + "regular": "http://fonts.gstatic.com/s/karma/v5/wvqTxAGBUrTqU0urTEoPIw.ttf", + "500": "http://fonts.gstatic.com/s/karma/v5/9YGjxi6Hcvz2Kh-rzO_cAw.ttf", + "600": "http://fonts.gstatic.com/s/karma/v5/h_CVzXXtqSxjfS2sIwaejA.ttf", + "700": "http://fonts.gstatic.com/s/karma/v5/smuSM08oApsQPPVYbHd1CA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kaushan Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kaushanscript/v4/qx1LSqts-NtiKcLw4N03IBnpV0hQCek3EmWnCPrvGRM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kavoon", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kavoon/v4/382m-6baKXqJFQjEgobt6Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kdam Thmor", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v3", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kdamthmor/v3/otCdP6UU-VBIrBfVDWBQJ_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Keania One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/keaniaone/v4/PACrDKZWngXzgo-ucl6buvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kelly Slab", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kellyslab/v6/F_2oS1e9XdYx1MAi8XEVefesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kenia", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kenia/v8/OLM9-XfITK9PsTLKbGBrwg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Khand", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/khand/v4/072zRl4OU9Pinjjkg174LA.ttf", + "regular": "http://fonts.gstatic.com/s/khand/v4/HdLdTNFqNIDGJZl1ZEj84w.ttf", + "500": "http://fonts.gstatic.com/s/khand/v4/46_p-SqtuMe56nxQdteWxg.ttf", + "600": "http://fonts.gstatic.com/s/khand/v4/zggGWYIiPJyMTgkfxP_kaA.ttf", + "700": "http://fonts.gstatic.com/s/khand/v4/0I0UWaN-X5QBmfexpXKhqg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Khmer", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/khmer/v9/vWaBJIbaQuBNz02ALIKJ3A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Khula", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "600", + "700", + "800" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/khula/v1/_1LySU5Upq-sc4OZ1b_GIw.ttf", + "regular": "http://fonts.gstatic.com/s/khula/v1/izcPIFyCSd16XI1Ak_Wk7Q.ttf", + "600": "http://fonts.gstatic.com/s/khula/v1/4ZH86Hce-aeFDaedTnbkbg.ttf", + "700": "http://fonts.gstatic.com/s/khula/v1/UGVExGl-Jjs-YPpGv-MZ6w.ttf", + "800": "http://fonts.gstatic.com/s/khula/v1/Sccp_oOo8FWgbx5smie7xQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kite One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kiteone/v4/8ojWmgUc97m0f_i6sTqLoQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Knewave", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/knewave/v5/KGHM4XWr4iKnBMqzZLkPBg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kotta One", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kottaone/v4/AB2Q7hVw6niJYDgLvFXu5w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Koulen", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v10", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/koulen/v10/AAYOK8RSRO7FTskTzFuzNw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kranky", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kranky/v6/C8dxxTS99-fZ84vWk8SDrg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kreon", + "category": "serif", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/kreon/v9/HKtJRiq5C2zbq5N1IX32sA.ttf", + "regular": "http://fonts.gstatic.com/s/kreon/v9/zA_IZt0u0S3cvHJu-n1oEg.ttf", + "700": "http://fonts.gstatic.com/s/kreon/v9/jh0dSmaPodjxISiblIUTkw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kristi", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kristi/v7/aRsgBQrkQkMlu4UPSnJyOQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Krona One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/kronaone/v4/zcQj4ljqTo166AdourlF9w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Kurale", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext", + "cyrillic" + ], + "version": "v1", + "lastModified": "2015-05-14", + "files": { + "regular": "http://fonts.gstatic.com/s/kurale/v1/rxeyIcvQlT4XAWwNbXFCfw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "La Belle Aurore", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/labelleaurore/v6/Irdbc4ASuUoWDjd_Wc3md123K2iuuhwZgaKapkyRTY8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Laila", + "category": "serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-01", + "files": { + "300": "http://fonts.gstatic.com/s/laila/v1/bLbIVEZF3IWSZ-in72GJvA.ttf", + "regular": "http://fonts.gstatic.com/s/laila/v1/6iYor3edprH7360qtBGoag.ttf", + "500": "http://fonts.gstatic.com/s/laila/v1/tkf8VtFvW9g3VsxQCA6WOQ.ttf", + "600": "http://fonts.gstatic.com/s/laila/v1/3EMP2L6JRQ4GaHIxCldCeA.ttf", + "700": "http://fonts.gstatic.com/s/laila/v1/R7P4z1xjcjecmjZ9GyhqHQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lakki Reddy", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v3", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/lakkireddy/v3/Q5EpFa91FjW37t0FCnedaKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lancelot", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lancelot/v5/XMT7T_oo_MQUGAnU2v-sdA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lateef", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "arabic" + ], + "version": "v10", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/lateef/v10/PAsKCgi1qc7XPwvzo_I-DQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lato", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v11", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/lato/v11/Upp-ka9rLQmHYCsFgwL-eg.ttf", + "100italic": "http://fonts.gstatic.com/s/lato/v11/zLegi10uS_9-fnUDISl0KA.ttf", + "300": "http://fonts.gstatic.com/s/lato/v11/Ja02qOppOVq9jeRjWekbHg.ttf", + "300italic": "http://fonts.gstatic.com/s/lato/v11/dVebFcn7EV7wAKwgYestUg.ttf", + "regular": "http://fonts.gstatic.com/s/lato/v11/h7rISIcQapZBpei-sXwIwg.ttf", + "italic": "http://fonts.gstatic.com/s/lato/v11/P_dJOFJylV3A870UIOtr0w.ttf", + "700": "http://fonts.gstatic.com/s/lato/v11/iX_QxBBZLhNj5JHlTzHQzg.ttf", + "700italic": "http://fonts.gstatic.com/s/lato/v11/WFcZakHrrCKeUJxHA4T_gw.ttf", + "900": "http://fonts.gstatic.com/s/lato/v11/8TPEV6NbYWZlNsXjbYVv7w.ttf", + "900italic": "http://fonts.gstatic.com/s/lato/v11/draWperrI7n2xi35Cl08fA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "League Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/leaguescript/v7/wnRFLvfabWK_DauqppD6vSeUSrabuTpOsMEiRLtKwk0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Leckerli One", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/leckerlione/v7/S2Y_iLrItTu8kIJTkS7DrC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ledger", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ledger/v4/G432jp-tahOfWHbCYkI0jw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lekton", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lekton/v7/r483JYmxf5PjIm4jVAm8Yg.ttf", + "italic": "http://fonts.gstatic.com/s/lekton/v7/_UbDIPBA1wDqSbhp-OED7A.ttf", + "700": "http://fonts.gstatic.com/s/lekton/v7/WZw-uL8WTkx3SBVfTlevXQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lemon", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lemon/v5/wed1nNu4LNSu-3RoRVUhUw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Libre Baskerville", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/librebaskerville/v4/pR0sBQVcY0JZc_ciXjFsKyyZRYCSvpCzQKuMWnP5NDY.ttf", + "italic": "http://fonts.gstatic.com/s/librebaskerville/v4/QHIOz1iKF3bIEzRdDFaf5QnhapNS5Oi8FPrBRDLbsW4.ttf", + "700": "http://fonts.gstatic.com/s/librebaskerville/v4/kH7K4InNTm7mmOXXjrA5v-xuswJKUVpBRfYFpz0W3Iw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Life Savers", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lifesavers/v6/g49cUDk4Y1P0G5NMkMAm7qCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/lifesavers/v6/THQKqChyYUm97rNPVFdGGXe1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lilita One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lilitaone/v4/vTxJQjbNV6BCBHx8sGDCVvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lily Script One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lilyscriptone/v4/uPWsLVW8uiXqIBnE8ZwGPDjVlsJB_M_Q_LtZxsoxvlw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Limelight", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/limelight/v7/5dTfN6igsXjLjOy8QQShcg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Linden Hill", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lindenhill/v6/UgsC0txqd-E1yjvjutwm_KCWcynf_cDxXwCLxiixG1c.ttf", + "italic": "http://fonts.gstatic.com/s/lindenhill/v6/OcS3bZcu8vJvIDH8Zic83keOrDcLawS7-ssYqLr2Xp4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lobster", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v14", + "lastModified": "2015-05-19", + "files": { + "regular": "http://fonts.gstatic.com/s/lobster/v14/w5HPj52zZZcV_MSiWg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lobster Two", + "category": "display", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lobstertwo/v7/xb9aY4w9ceh8JRzobID1naCWcynf_cDxXwCLxiixG1c.ttf", + "italic": "http://fonts.gstatic.com/s/lobstertwo/v7/Ul_16MSbfayQv1I4QhLEoEeOrDcLawS7-ssYqLr2Xp4.ttf", + "700": "http://fonts.gstatic.com/s/lobstertwo/v7/bmdxOflBqMqjEC0-kGsIiHe1Pd76Vl7zRpE7NLJQ7XU.ttf", + "700italic": "http://fonts.gstatic.com/s/lobstertwo/v7/LEkN2_no_6kFvRfiBZ8xpM_zJjSACmk0BRPxQqhnNLU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Londrina Outline", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/londrinaoutline/v5/lls08GOa1eT74p072l1AWJmp8DTZ6iHear7UV05iykg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Londrina Shadow", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/londrinashadow/v4/dNYuzPS_7eYgXFJBzMoKdbw6Z3rVA5KDSi7aQxS92Nk.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Londrina Sketch", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/londrinasketch/v4/p7Ai06aT1Ycp_D2fyE3z69d6z_uhFGnpCOifUY1fJQo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Londrina Solid", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/londrinasolid/v4/yysorIEiYSBb0ylZjg791MR125CwGqh8XBqkBzea0LA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lora", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lora/v9/aXJ7KVIGcejEy1abawZazg.ttf", + "italic": "http://fonts.gstatic.com/s/lora/v9/AN2EZaj2tFRpyveuNn9BOg.ttf", + "700": "http://fonts.gstatic.com/s/lora/v9/enKND5SfzQKkggBA_VnT1A.ttf", + "700italic": "http://fonts.gstatic.com/s/lora/v9/ivs9j3kYU65pR9QD9YFdzQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Love Ya Like A Sister", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/loveyalikeasister/v7/LzkxWS-af0Br2Sk_YgSJY-ad1xEP8DQfgfY8MH9aBUg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Loved by the King", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lovedbytheking/v6/wg03xD4cWigj4YDufLBSr8io2AFEwwMpu7y5KyiyAJc.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lovers Quarrel", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/loversquarrel/v4/gipdZ8b7pKb89MzQLAtJHLHLxci2ElvNEmOB303HLk0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Luckiest Guy", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/luckiestguy/v6/5718gH8nDy3hFVihOpkY5C3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lusitana", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lusitana/v4/l1h9VDomkwbdzbPdmLcUIw.ttf", + "700": "http://fonts.gstatic.com/s/lusitana/v4/GWtZyUsONxgkdl3Mc1P7FKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Lustria", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/lustria/v4/gXAk0s4ai0X-TAOhYzZd1w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Macondo", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/macondo/v5/G6yPNUscRPQ8ufBXs_8yRQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Macondo Swash Caps", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/macondoswashcaps/v4/SsSR706z-MlvEH7_LS6JAPkkgYRHs6GSG949m-K6x2k.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Magra", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/magra/v4/hoZ13bwCXBxuGZqAudgc5A.ttf", + "700": "http://fonts.gstatic.com/s/magra/v4/6fOM5sq5cIn8D0RjX8Lztw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Maiden Orange", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/maidenorange/v6/ZhKIA2SPisEwdhW7g0RUWojjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mako", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mako/v7/z5zSLmfPlv1uTVAdmJBLXg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mallanna", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v4", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/mallanna/v4/krCTa-CfMbtxqF0689CbuQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mandali", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v4", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/mandali/v4/0lF8yJ7fkyjXuqtSi5bWbQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Marcellus", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/marcellus/v4/UjiLZzumxWC9whJ86UtaYw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Marcellus SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/marcellussc/v4/_jugwxhkkynrvsfrxVx8gS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Marck Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/marckscript/v7/O_D1NAZVOFOobLbVtW3bci3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Margarine", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/margarine/v5/DJnJwIrcO_cGkjSzY3MERw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Marko One", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/markoone/v6/hpP7j861sOAco43iDc4n4w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Marmelad", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/marmelad/v6/jI0_FBlSOIRLL0ePWOhOwQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Martel", + "category": "serif", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-22", + "files": { + "200": "http://fonts.gstatic.com/s/martel/v1/_wfGdswZbat7P4tupHLA1w.ttf", + "300": "http://fonts.gstatic.com/s/martel/v1/SghoV2F2VPdVU3P0a4fa9w.ttf", + "regular": "http://fonts.gstatic.com/s/martel/v1/9ALu5czkaaf5zsYk6GJEnQ.ttf", + "600": "http://fonts.gstatic.com/s/martel/v1/Kt9uPhH1PvUwuZ5Y6zuAMQ.ttf", + "700": "http://fonts.gstatic.com/s/martel/v1/4OzIiKB5wE36xXL2U0vzWQ.ttf", + "800": "http://fonts.gstatic.com/s/martel/v1/RVF8drcQoRkRL7l_ZkpTlQ.ttf", + "900": "http://fonts.gstatic.com/s/martel/v1/iS0YUpFJoiLRlnyl40rpEA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Martel Sans", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-07", + "files": { + "200": "http://fonts.gstatic.com/s/martelsans/v1/7ajme85aKKx_SCWF59ImQEnzyIngrzGjGh22wPb6cGM.ttf", + "300": "http://fonts.gstatic.com/s/martelsans/v1/7ajme85aKKx_SCWF59ImQC9-WlPSxbfiI49GsXo3q0g.ttf", + "regular": "http://fonts.gstatic.com/s/martelsans/v1/91c8DPDZncMc0RFfhmc2RqCWcynf_cDxXwCLxiixG1c.ttf", + "600": "http://fonts.gstatic.com/s/martelsans/v1/7ajme85aKKx_SCWF59ImQJZ7xm-Bj30Bj2KNdXDzSZg.ttf", + "700": "http://fonts.gstatic.com/s/martelsans/v1/7ajme85aKKx_SCWF59ImQHe1Pd76Vl7zRpE7NLJQ7XU.ttf", + "800": "http://fonts.gstatic.com/s/martelsans/v1/7ajme85aKKx_SCWF59ImQA89PwPrYLaRFJ-HNCU9NbA.ttf", + "900": "http://fonts.gstatic.com/s/martelsans/v1/7ajme85aKKx_SCWF59ImQCenaqEuufTBk9XMKnKmgDA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Marvel", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/marvel/v6/Fg1dO8tWVb-MlyqhsbXEkg.ttf", + "italic": "http://fonts.gstatic.com/s/marvel/v6/HzyjFB-oR5usrc7Lxz9g8w.ttf", + "700": "http://fonts.gstatic.com/s/marvel/v6/WrHDBL1RupWGo2UcdgxB3Q.ttf", + "700italic": "http://fonts.gstatic.com/s/marvel/v6/Gzf5NT09Y6xskdQRj2kz1qCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mate", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mate/v5/ooFviPcJ6hZP5bAE71Cawg.ttf", + "italic": "http://fonts.gstatic.com/s/mate/v5/5XwW6_cbisGvCX5qmNiqfA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mate SC", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/matesc/v5/-YkIT2TZoPZF6pawKzDpWw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Maven Pro", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "700", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mavenpro/v7/sqPJIFG4gqsjl-0q_46Gbw.ttf", + "500": "http://fonts.gstatic.com/s/mavenpro/v7/SQVfzoJBbj9t3aVcmbspRi3USBnSvpkopQaUR-2r7iU.ttf", + "700": "http://fonts.gstatic.com/s/mavenpro/v7/uDssvmXgp7Nj3i336k_dSi3USBnSvpkopQaUR-2r7iU.ttf", + "900": "http://fonts.gstatic.com/s/mavenpro/v7/-91TwiFzqeL1F7Kh91APwS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "McLaren", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mclaren/v4/OprvTGxaiINBKW_1_U0eoQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Meddon", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-08", + "files": { + "regular": "http://fonts.gstatic.com/s/meddon/v8/f8zJO98uu2EtSj9p7ci9RA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "MedievalSharp", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/medievalsharp/v8/85X_PjV6tftJ0-rX7KYQkOe45sJkivqprK7VkUlzfg0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Medula One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/medulaone/v6/AasPgDQak81dsTGQHc5zUPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Megrim", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/megrim/v7/e-9jVUC9lv1zxaFQARuftw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Meie Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/meiescript/v4/oTIWE5MmPye-rCyVp_6KEqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Merienda", + "category": "handwriting", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/merienda/v4/MYY6Og1qZlOQtPW2G95Y3A.ttf", + "700": "http://fonts.gstatic.com/s/merienda/v4/GlwcvRLlgiVE2MBFQ4r0sKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Merienda One", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/meriendaone/v7/bCA-uDdUx6nTO8SjzCLXvS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Merriweather", + "category": "serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/merriweather/v8/ZvcMqxEwPfh2qDWBPxn6nqcQoVhARpoaILP7amxE_8g.ttf", + "300italic": "http://fonts.gstatic.com/s/merriweather/v8/EYh7Vl4ywhowqULgRdYwICna0FLWfcB-J_SAYmcAXaI.ttf", + "regular": "http://fonts.gstatic.com/s/merriweather/v8/RFda8w1V0eDZheqfcyQ4EC3USBnSvpkopQaUR-2r7iU.ttf", + "italic": "http://fonts.gstatic.com/s/merriweather/v8/So5lHxHT37p2SS4-t60SlPMZXuCXbOrAvx5R0IT5Oyo.ttf", + "700": "http://fonts.gstatic.com/s/merriweather/v8/ZvcMqxEwPfh2qDWBPxn6nkD2ttfZwueP-QU272T9-k4.ttf", + "700italic": "http://fonts.gstatic.com/s/merriweather/v8/EYh7Vl4ywhowqULgRdYwIPAs9-1nE9qOqhChW0m4nDE.ttf", + "900": "http://fonts.gstatic.com/s/merriweather/v8/ZvcMqxEwPfh2qDWBPxn6nqObDOjC3UL77puoeHsE3fw.ttf", + "900italic": "http://fonts.gstatic.com/s/merriweather/v8/EYh7Vl4ywhowqULgRdYwIBd0_s6jQr9r5s5OZYvtzBY.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Merriweather Sans", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "800", + "800italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/merriweathersans/v5/6LmGj5dOJopQKEkt88Gowan5N8K-_DP0e9e_v51obXQ.ttf", + "300italic": "http://fonts.gstatic.com/s/merriweathersans/v5/nAqt4hiqwq3tzCecpgPmVdytE4nGXk2hYD5nJ740tBw.ttf", + "regular": "http://fonts.gstatic.com/s/merriweathersans/v5/AKu1CjQ4qnV8MUltkAX3sOAj_ty82iuwwDTNEYXGiyQ.ttf", + "italic": "http://fonts.gstatic.com/s/merriweathersans/v5/3Mz4hOHzs2npRMG3B1ascZ32VBCoA_HLsn85tSWZmdo.ttf", + "700": "http://fonts.gstatic.com/s/merriweathersans/v5/6LmGj5dOJopQKEkt88GowbqxG25nQNOioCZSK4sU-CA.ttf", + "700italic": "http://fonts.gstatic.com/s/merriweathersans/v5/nAqt4hiqwq3tzCecpgPmVbuqAJxizi8Dk_SK5et7kMg.ttf", + "800": "http://fonts.gstatic.com/s/merriweathersans/v5/6LmGj5dOJopQKEkt88GowYufzO2zUYSj5LqoJ3UGkco.ttf", + "800italic": "http://fonts.gstatic.com/s/merriweathersans/v5/nAqt4hiqwq3tzCecpgPmVdDmPrYMy3aZO4LmnZsxTQw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Metal", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v9", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/metal/v9/zA3UOP13ooQcxjv04BZX5g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Metal Mania", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/metalmania/v6/isriV_rAUgj6bPWPN6l9QKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Metamorphous", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/metamorphous/v6/wGqUKXRinIYggz-BTRU9ei3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Metrophobic", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/metrophobic/v6/SaglWZWCrrv_D17u1i4v_aCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Michroma", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/michroma/v7/0c2XrW81_QsiKV8T9thumA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Milonga", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/milonga/v4/dzNdIUSTGFmy2ahovDRcWg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Miltonian", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/miltonian/v8/Z4HrYZyqm0BnNNzcCUfzoQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Miltonian Tattoo", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/miltoniantattoo/v9/1oU_8OGYwW46eh02YHydn2uk0YtI6thZkz1Hmh-odwg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Miniver", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/miniver/v5/4yTQohOH_cWKRS5laRFhYg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Miss Fajardose", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/missfajardose/v6/WcXjlQPKn6nBfr8LY3ktNu6rPKfVZo7L2bERcf0BDns.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Modak", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/modak/v1/lMsN0QIKid-pCPvL0hH4nw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Modern Antiqua", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/modernantiqua/v6/8qX_tr6Xzy4t9fvZDXPkh6rFJ4O13IHVxZbM6yoslpo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Molengo", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/molengo/v7/jcjgeGuzv83I55AzOTpXNQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Molle", + "category": "handwriting", + "variants": [ + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "italic": "http://fonts.gstatic.com/s/molle/v4/9XTdCsjPXifLqo5et-YoGA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Monda", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/monda/v4/qFMHZ9zvR6B_gnoIgosPrw.ttf", + "700": "http://fonts.gstatic.com/s/monda/v4/EVOzZUyc_j1w2GuTgTAW1g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Monofett", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/monofett/v6/C6K5L799Rgxzg2brgOaqAw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Monoton", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/monoton/v6/aCz8ja_bE4dg-7agSvExdw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Monsieur La Doulaise", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/monsieurladoulaise/v5/IMAdMj6Eq9jZ46CPctFtMKP61oAqTJXlx5ZVOBmcPdM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Montaga", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/montaga/v4/PwTwUboiD-M4-mFjZfJs2A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Montez", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/montez/v6/kx58rLOWQQLGFM4pDHv5Ng.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Montserrat", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/montserrat/v6/Kqy6-utIpx_30Xzecmeo8_esZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/montserrat/v6/IQHow_FEYlDC4Gzy_m8fcgJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Montserrat Alternates", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/montserratalternates/v4/z2n1Sjxk9souK3HCtdHuklPuEVRGaG9GCQnmM16YWq0.ttf", + "700": "http://fonts.gstatic.com/s/montserratalternates/v4/YENqOGAVzwIHjYNjmKuAZpeqBKvsAhm-s2I4RVSXFfc.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Montserrat Subrayada", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/montserratsubrayada/v4/nzoCWCz0e9c7Mr2Gl8bbgrJymm6ilkk9f0nDA_sC_qk.ttf", + "700": "http://fonts.gstatic.com/s/montserratsubrayada/v4/wf-IKpsHcfm0C9uaz9IeGJvEcF1LWArDbGWgKZSH9go.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Moul", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/moul/v8/Kb0ALQnfyXawP1a_P_gpTQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Moulpali", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v9", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/moulpali/v9/diD74BprGhmVkJoerKmrKA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mountains of Christmas", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mountainsofchristmas/v8/dVGBFPwd6G44IWDbQtPew2Auds3jz1Fxb61CgfaGDr4.ttf", + "700": "http://fonts.gstatic.com/s/mountainsofchristmas/v8/PymufKtHszoLrY0uiAYKNM9cPTbSBTrQyTa5TWAe3vE.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mouse Memoirs", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mousememoirs/v4/NBFaaJFux_j0AQbAsW3QeH8f0n03UdmQgF_CLvNR2vg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mr Bedfort", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/mrbedfort/v5/81bGgHTRikLs_puEGshl7_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mr Dafoe", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mrdafoe/v5/s32Q1S6ZkT7EaX53mUirvQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mr De Haviland", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mrdehaviland/v5/fD8y4L6PJ4vqDk7z8Y8e27v4lrhng1lzu7-weKO6cw8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mrs Saint Delafield", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mrssaintdelafield/v4/vuWagfFT7bj9lFtZOFBwmjHMBelqWf3tJeGyts2SmKU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mrs Sheppards", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mrssheppards/v5/2WFsWMV3VUeCz6UVH7UjCn8f0n03UdmQgF_CLvNR2vg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Muli", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/muli/v7/VJw4F3ZHRAZ7Hmg3nQu5YQ.ttf", + "300italic": "http://fonts.gstatic.com/s/muli/v7/s-NKMCru8HiyjEt0ZDoBoA.ttf", + "regular": "http://fonts.gstatic.com/s/muli/v7/KJiP6KznxbALQgfJcDdPAw.ttf", + "italic": "http://fonts.gstatic.com/s/muli/v7/Cg0K_IWANs9xkNoxV7H1_w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Mystery Quest", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/mysteryquest/v4/467jJvg0c7HgucvBB9PLDyeUSrabuTpOsMEiRLtKwk0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "NTR", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v4", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/ntr/v4/e7H4ZLtGfVOYyOupo6T12g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Neucha", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/neucha/v7/bijdhB-TzQdtpl0ykhGh4Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Neuton", + "category": "serif", + "variants": [ + "200", + "300", + "regular", + "italic", + "700", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "200": "http://fonts.gstatic.com/s/neuton/v8/DA3Mkew3XqSkPpi1f4tJow.ttf", + "300": "http://fonts.gstatic.com/s/neuton/v8/xrc_aZ2hx-gdeV0mlY8Vww.ttf", + "regular": "http://fonts.gstatic.com/s/neuton/v8/9R-MGIOQUdjAVeB6nE6PcQ.ttf", + "italic": "http://fonts.gstatic.com/s/neuton/v8/uVMT3JOB5BNFi3lgPp6kEg.ttf", + "700": "http://fonts.gstatic.com/s/neuton/v8/gnWpkWY7DirkKiovncYrfg.ttf", + "800": "http://fonts.gstatic.com/s/neuton/v8/XPzBQV4lY6enLxQG9cF1jw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "New Rocker", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/newrocker/v5/EFUWzHJedEkpW399zYOHofesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "News Cycle", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v13", + "lastModified": "2015-04-16", + "files": { + "regular": "http://fonts.gstatic.com/s/newscycle/v13/xyMAr8VfiUzIOvS1abHJO_esZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/newscycle/v13/G28Ny31cr5orMqEQy6ljtwJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Niconne", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/niconne/v6/ZA-mFw2QNXodx5y7kfELBg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nixie One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/nixieone/v7/h6kQfmzm0Shdnp3eswRaqQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nobile", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/nobile/v7/lC_lPi1ddtN38iXTCRh6ow.ttf", + "italic": "http://fonts.gstatic.com/s/nobile/v7/vGmrpKzWQQSrb-PR6FWBIA.ttf", + "700": "http://fonts.gstatic.com/s/nobile/v7/9p6M-Yrg_r_QPmSD1skrOg.ttf", + "700italic": "http://fonts.gstatic.com/s/nobile/v7/oQ1eYPaXV638N03KvsNvyKCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nokora", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "khmer" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/nokora/v9/dRyz1JfnyKPNaRcBNX9F9A.ttf", + "700": "http://fonts.gstatic.com/s/nokora/v9/QMqqa4QEOhQpiig3cAPmbQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Norican", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/norican/v4/SHnSqhYAWG5sZTWcPzEHig.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nosifer", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/nosifer/v5/7eJGoIuHRrtcG00j6CptSA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nothing You Could Do", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/nothingyoucoulddo/v6/jpk1K3jbJoyoK0XKaSyQAf-TpkXjXYGWiJZAEtBRjPU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Noticia Text", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "vietnamese", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/noticiatext/v6/wdyV6x3eKpdeUPQ7BJ5uUC3USBnSvpkopQaUR-2r7iU.ttf", + "italic": "http://fonts.gstatic.com/s/noticiatext/v6/dAuxVpkYE_Q_IwIm6elsKPMZXuCXbOrAvx5R0IT5Oyo.ttf", + "700": "http://fonts.gstatic.com/s/noticiatext/v6/pEko-RqEtp45bE2P80AAKUD2ttfZwueP-QU272T9-k4.ttf", + "700italic": "http://fonts.gstatic.com/s/noticiatext/v6/-rQ7V8ARjf28_b7kRa0JuvAs9-1nE9qOqhChW0m4nDE.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Noto Sans", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "vietnamese", + "devanagari", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/notosans/v6/0Ue9FiUJwVhi4NGfHJS5uA.ttf", + "italic": "http://fonts.gstatic.com/s/notosans/v6/dLcNKMgJ1H5RVoZFraDz0qCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/notosans/v6/PIbvSEyHEdL91QLOQRnZ1y3USBnSvpkopQaUR-2r7iU.ttf", + "700italic": "http://fonts.gstatic.com/s/notosans/v6/9Z3uUWMRR7crzm1TjRicDne1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Noto Serif", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/notoserif/v4/zW6mc7bC1CWw8dH0yxY8JfesZW2xOQ-xsNqO47m55DA.ttf", + "italic": "http://fonts.gstatic.com/s/notoserif/v4/HQXBIwLHsOJCNEQeX9kNzy3USBnSvpkopQaUR-2r7iU.ttf", + "700": "http://fonts.gstatic.com/s/notoserif/v4/lJAvZoKA5NttpPc9yc6lPQJKKGfqHaYFsRG-T3ceEVo.ttf", + "700italic": "http://fonts.gstatic.com/s/notoserif/v4/Wreg0Be4tcFGM2t6VWytvED2ttfZwueP-QU272T9-k4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nova Cut", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/novacut/v8/6q12jWcBvj0KO2cMRP97tA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nova Flat", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/novaflat/v8/pK7a0CoGzI684qe_XSHBqQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nova Mono", + "category": "monospace", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "greek" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/novamono/v7/6-SChr5ZIaaasJFBkgrLNw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nova Oval", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/novaoval/v8/VuukVpKP8BwUf8o9W5LYQQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nova Round", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/novaround/v8/7-cK3Ari_8XYYFgVMxVhDvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nova Script", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/novascript/v8/dEvxQDLgx1M1TKY-NmBWYaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nova Slim", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/novaslim/v8/rPYXC81_VL2EW-4CzBX65g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nova Square", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/novasquare/v8/BcBzXoaDzYX78rquGXVuSqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Numans", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/numans/v6/g5snI2p6OEjjTNmTHyBdiQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Nunito", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/nunito/v7/zXQvrWBJqUooM7Xv98MrQw.ttf", + "regular": "http://fonts.gstatic.com/s/nunito/v7/ySZTeT3IuzJj0GK6uGpbBg.ttf", + "700": "http://fonts.gstatic.com/s/nunito/v7/aEdlqgMuYbpe4U3TnqOQMA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Odor Mean Chey", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/odormeanchey/v8/GK3E7EjPoBkeZhYshGFo0eVKG8sq4NyGgdteJLvqLDs.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Offside", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/offside/v4/v0C913SB8wqQUvcu1faUqw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Old Standard TT", + "category": "serif", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/oldstandardtt/v7/n6RTCDcIPWSE8UNBa4k-DLcB5jyhm1VsHs65c3QNDr0.ttf", + "italic": "http://fonts.gstatic.com/s/oldstandardtt/v7/QQT_AUSp4AV4dpJfIN7U5PWrQzeMtsHf8QsWQ2cZg3c.ttf", + "700": "http://fonts.gstatic.com/s/oldstandardtt/v7/5Ywdce7XEbTSbxs__4X1_HJqbZqK7TdZ58X80Q_Lw8Y.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Oldenburg", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/oldenburg/v4/dqA_M_uoCVXZbCO-oKBTnQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Oleo Script", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/oleoscript/v5/21stZcmPyzbQVXtmGegyqKCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/oleoscript/v5/hudNQFKFl98JdNnlo363fne1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Oleo Script Swash Caps", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/oleoscriptswashcaps/v4/vdWhGqsBUAP-FF3NOYTe4iMF4kXAPemmyaDpMXQ31P0.ttf", + "700": "http://fonts.gstatic.com/s/oleoscriptswashcaps/v4/HMO3ftxA9AU5floml9c755reFYaXZ4zuJXJ8fr8OO1g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Open Sans", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "800", + "800italic" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v13", + "lastModified": "2015-05-18", + "files": { + "300": "http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTS3USBnSvpkopQaUR-2r7iU.ttf", + "300italic": "http://fonts.gstatic.com/s/opensans/v13/PRmiXeptR36kaC0GEAetxi9-WlPSxbfiI49GsXo3q0g.ttf", + "regular": "http://fonts.gstatic.com/s/opensans/v13/IgZJs4-7SA1XX_edsoXWog.ttf", + "italic": "http://fonts.gstatic.com/s/opensans/v13/O4NhV7_qs9r9seTo7fnsVKCWcynf_cDxXwCLxiixG1c.ttf", + "600": "http://fonts.gstatic.com/s/opensans/v13/MTP_ySUJH_bn48VBG8sNSi3USBnSvpkopQaUR-2r7iU.ttf", + "600italic": "http://fonts.gstatic.com/s/opensans/v13/PRmiXeptR36kaC0GEAetxpZ7xm-Bj30Bj2KNdXDzSZg.ttf", + "700": "http://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzC3USBnSvpkopQaUR-2r7iU.ttf", + "700italic": "http://fonts.gstatic.com/s/opensans/v13/PRmiXeptR36kaC0GEAetxne1Pd76Vl7zRpE7NLJQ7XU.ttf", + "800": "http://fonts.gstatic.com/s/opensans/v13/EInbV5DfGHOiMmvb1Xr-hi3USBnSvpkopQaUR-2r7iU.ttf", + "800italic": "http://fonts.gstatic.com/s/opensans/v13/PRmiXeptR36kaC0GEAetxg89PwPrYLaRFJ-HNCU9NbA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Open Sans Condensed", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "700" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v10", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/opensanscondensed/v10/gk5FxslNkTTHtojXrkp-xEMwSSh38KQVJx4ABtsZTnA.ttf", + "300italic": "http://fonts.gstatic.com/s/opensanscondensed/v10/jIXlqT1WKafUSwj6s9AzV4_LkTZ_uhAwfmGJ084hlvM.ttf", + "700": "http://fonts.gstatic.com/s/opensanscondensed/v10/gk5FxslNkTTHtojXrkp-xBEM87DM3yorPOrvA-vB930.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Oranienbaum", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/oranienbaum/v4/M98jYwCSn0PaFhXXgviCoaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Orbitron", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "700", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/orbitron/v6/DY8swouAZjR3RaUPRf0HDQ.ttf", + "500": "http://fonts.gstatic.com/s/orbitron/v6/p-y_ffzMdo5JN_7ia0vYEqCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/orbitron/v6/PS9_6SLkY1Y6OgPO3APr6qCWcynf_cDxXwCLxiixG1c.ttf", + "900": "http://fonts.gstatic.com/s/orbitron/v6/2I3-8i9hT294TE_pyjy9SaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Oregano", + "category": "display", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/oregano/v4/UiLhqNixVv2EpjRoBG6axA.ttf", + "italic": "http://fonts.gstatic.com/s/oregano/v4/_iwqGEht6XsAuEaCbYG64Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Orienta", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/orienta/v4/_NKSk93mMs0xsqtfjCsB3Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Original Surfer", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/originalsurfer/v5/gdHw6HpSIN4D6Xt7pi1-qIkEz33TDwAZczo_6fY7eg0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Oswald", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v10", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/oswald/v10/y3tZpCdiRD4oNRRYFcAR5Q.ttf", + "regular": "http://fonts.gstatic.com/s/oswald/v10/uLEd2g2vJglLPfsBF91DCg.ttf", + "700": "http://fonts.gstatic.com/s/oswald/v10/7wj8ldV_5Ti37rHa0m1DDw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Over the Rainbow", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/overtherainbow/v7/6gp-gkpI2kie2dHQQLM2jQBdxkZd83xOSx-PAQ2QmiI.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Overlock", + "category": "display", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/overlock/v5/Z8oYsGi88-E1cUB8YBFMAg.ttf", + "italic": "http://fonts.gstatic.com/s/overlock/v5/rq6EacukHROOBrFrK_zF6_esZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/overlock/v5/Fexr8SqXM8Bm_gEVUA7AKaCWcynf_cDxXwCLxiixG1c.ttf", + "700italic": "http://fonts.gstatic.com/s/overlock/v5/wFWnYgeXKYBks6gEUwYnfAJKKGfqHaYFsRG-T3ceEVo.ttf", + "900": "http://fonts.gstatic.com/s/overlock/v5/YPJCVTT8ZbG3899l_-KIGqCWcynf_cDxXwCLxiixG1c.ttf", + "900italic": "http://fonts.gstatic.com/s/overlock/v5/iOZhxT2zlg7W5ij_lb-oDp0EAVxt0G0biEntp43Qt6E.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Overlock SC", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/overlocksc/v5/8D7HYDsvS_g1GhBnlHzgzaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ovo", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ovo/v7/mFg27dimu3s9t09qjCwB1g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Oxygen", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/oxygen/v5/lZ31r0bR1Bzt_DfGZu1S8A.ttf", + "regular": "http://fonts.gstatic.com/s/oxygen/v5/uhoyAE7XlQL22abzQieHjw.ttf", + "700": "http://fonts.gstatic.com/s/oxygen/v5/yLqkmDwuNtt5pSqsJmhyrg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Oxygen Mono", + "category": "monospace", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/oxygenmono/v4/DigTu7k4b7OmM8ubt1Qza6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "PT Mono", + "category": "monospace", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ptmono/v4/QUbM8H9yJK5NhpQ0REO6Wg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "PT Sans", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ptsans/v8/UFoEz2uiuMypUGZL1NKoeg.ttf", + "italic": "http://fonts.gstatic.com/s/ptsans/v8/yls9EYWOd496wiu7qzfgNg.ttf", + "700": "http://fonts.gstatic.com/s/ptsans/v8/F51BEgHuR0tYHxF0bD4vwvesZW2xOQ-xsNqO47m55DA.ttf", + "700italic": "http://fonts.gstatic.com/s/ptsans/v8/lILlYDvubYemzYzN7GbLkC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "PT Sans Caption", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ptsanscaption/v9/OXYTDOzBcXU8MTNBvBHeSW8by34Z3mUMtM-o4y-SHCY.ttf", + "700": "http://fonts.gstatic.com/s/ptsanscaption/v9/Q-gJrFokeE7JydPpxASt25tc0eyfI4QDEsobEEpk_hA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "PT Sans Narrow", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ptsansnarrow/v7/UyYrYy3ltEffJV9QueSi4ZTvAuddT2xDMbdz0mdLyZY.ttf", + "700": "http://fonts.gstatic.com/s/ptsansnarrow/v7/Q_pTky3Sc3ubRibGToTAYsLtdzs3iyjn_YuT226ZsLU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "PT Serif", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ptserif/v8/sAo427rn3-QL9sWCbMZXhA.ttf", + "italic": "http://fonts.gstatic.com/s/ptserif/v8/9khWhKzhpkH0OkNnBKS3n_esZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/ptserif/v8/kyZw18tqQ5if-_wpmxxOeKCWcynf_cDxXwCLxiixG1c.ttf", + "700italic": "http://fonts.gstatic.com/s/ptserif/v8/Foydq9xJp--nfYIx2TBz9QJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "PT Serif Caption", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ptserifcaption/v8/7xkFOeTxxO1GMC1suOUYWVsRioCqs5fohhaYel24W3k.ttf", + "italic": "http://fonts.gstatic.com/s/ptserifcaption/v8/0kfPsmrmTSgiec7u_Wa0DB1mqvzPHelJwRcF_s_EUM0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Pacifico", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/pacifico/v7/GIrpeRY1r5CzbfL8r182lw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Palanquin", + "category": "sans-serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-22", + "files": { + "100": "http://fonts.gstatic.com/s/palanquin/v1/Hu0eGDVGK_g4saUFu6AK3KCWcynf_cDxXwCLxiixG1c.ttf", + "200": "http://fonts.gstatic.com/s/palanquin/v1/pqXYXD7-VI5ezTjeqQOcyC3USBnSvpkopQaUR-2r7iU.ttf", + "300": "http://fonts.gstatic.com/s/palanquin/v1/c0-J5OCAagpFCKkKraz-Ey3USBnSvpkopQaUR-2r7iU.ttf", + "regular": "http://fonts.gstatic.com/s/palanquin/v1/xCwBUoAEV0kzCDwerAZ0Aw.ttf", + "500": "http://fonts.gstatic.com/s/palanquin/v1/wLvvkEcZMKy95afLWh2EfC3USBnSvpkopQaUR-2r7iU.ttf", + "600": "http://fonts.gstatic.com/s/palanquin/v1/405UIAv95_yZkCECrH6y-i3USBnSvpkopQaUR-2r7iU.ttf", + "700": "http://fonts.gstatic.com/s/palanquin/v1/-UtkePo3NFvxEN3rGCtTvi3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Palanquin Dark", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-22", + "files": { + "regular": "http://fonts.gstatic.com/s/palanquindark/v1/PamTqrrgbBh_M3702w39rOfChn3JSg5yz_Q_xmrKQN0.ttf", + "500": "http://fonts.gstatic.com/s/palanquindark/v1/iXyBGf5UbFUu6BG8hOY-maMZTo-EwKMRQt3RWHocLi0.ttf", + "600": "http://fonts.gstatic.com/s/palanquindark/v1/iXyBGf5UbFUu6BG8hOY-mVNxaunw8i4Gywrk2SigRnk.ttf", + "700": "http://fonts.gstatic.com/s/palanquindark/v1/iXyBGf5UbFUu6BG8hOY-mWToair6W0TEE44XrlfKbiM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Paprika", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/paprika/v4/b-VpyoRSieBdB5BPJVF8HQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Parisienne", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/parisienne/v4/TW74B5QISJNx9moxGlmJfvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Passero One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/passeroone/v8/Yc-7nH5deCCv9Ed0MMnAQqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Passion One", + "category": "display", + "variants": [ + "regular", + "700", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/passionone/v6/1UIK1tg3bKJ4J3o35M4heqCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/passionone/v6/feOcYDy2R-f3Ysy72PYJ2ne1Pd76Vl7zRpE7NLJQ7XU.ttf", + "900": "http://fonts.gstatic.com/s/passionone/v6/feOcYDy2R-f3Ysy72PYJ2ienaqEuufTBk9XMKnKmgDA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Pathway Gothic One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/pathwaygothicone/v4/Lqv9ztoTUV8Q0FmQZzPqaA6A6xIYD7vYcYDop1i-K-c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Patrick Hand", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "vietnamese", + "latin-ext" + ], + "version": "v10", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/patrickhand/v10/9BG3JJgt_HlF3NpEUehL0C3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Patrick Hand SC", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "vietnamese", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/patrickhandsc/v4/OYFWCgfCR-7uHIovjUZXsbAgSRh1LpJXlLfl8IbsmHg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Patua One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/patuaone/v6/njZwotTYjswR4qdhsW-kJw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Paytone One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/paytoneone/v8/3WCxC7JAJjQHQVoIE0ZwvqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Peddana", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v4", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/peddana/v4/zaSZuj_GhmC8AOTugOROnA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Peralta", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/peralta/v4/cTJX5KEuc0GKRU9NXSm-8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Permanent Marker", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/permanentmarker/v5/9vYsg5VgPHKK8SXYbf3sMol14xj5tdg9OHF8w4E7StQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Petit Formal Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/petitformalscript/v4/OEZwr2-ovBsq2n3ACCKoEvVPl2Gjtxj0D6F7QLy1VQc.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Petrona", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/petrona/v5/nnQwxlP6dhrGovYEFtemTg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Philosopher", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/philosopher/v7/oZLTrB9jmJsyV0u_T0TKEaCWcynf_cDxXwCLxiixG1c.ttf", + "italic": "http://fonts.gstatic.com/s/philosopher/v7/_9Hnc_gz9k7Qq6uKaeHKmUeOrDcLawS7-ssYqLr2Xp4.ttf", + "700": "http://fonts.gstatic.com/s/philosopher/v7/napvkewXG9Gqby5vwGHICHe1Pd76Vl7zRpE7NLJQ7XU.ttf", + "700italic": "http://fonts.gstatic.com/s/philosopher/v7/PuKlryTcvTj7-qZWfLCFIM_zJjSACmk0BRPxQqhnNLU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Piedra", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/piedra/v5/owf-AvEEyAj9LJ2tVZ_3Mw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Pinyon Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/pinyonscript/v6/TzghnhfCn7TuE73f-CBQ0CeUSrabuTpOsMEiRLtKwk0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Pirata One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/pirataone/v4/WnbD86B4vB2ckYcL7oxuhvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Plaster", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/plaster/v7/O4QG9Z5116CXyfJdR9zxLw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Play", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/play/v6/GWvfObW8LhtsOX333MCpBg.ttf", + "700": "http://fonts.gstatic.com/s/play/v6/crPhg6I0alLI-MpB3vW-zw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Playball", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/playball/v6/3hOFiQm_EUzycTpcN9uz4w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Playfair Display", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v10", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/playfairdisplay/v10/2NBgzUtEeyB-Xtpr9bm1CV6uyC_qD11hrFQ6EGgTJWI.ttf", + "italic": "http://fonts.gstatic.com/s/playfairdisplay/v10/9MkijrV-dEJ0-_NWV7E6NzMsbnvDNEBX25F5HWk9AhI.ttf", + "700": "http://fonts.gstatic.com/s/playfairdisplay/v10/UC3ZEjagJi85gF9qFaBgICsv6SrURqJprbhH_C1Mw8w.ttf", + "700italic": "http://fonts.gstatic.com/s/playfairdisplay/v10/n7G4PqJvFP2Kubl0VBLDECsYW3XoOVcYyYdp9NzzS9E.ttf", + "900": "http://fonts.gstatic.com/s/playfairdisplay/v10/UC3ZEjagJi85gF9qFaBgIKqwMe2wjvZrAR44M0BJZ48.ttf", + "900italic": "http://fonts.gstatic.com/s/playfairdisplay/v10/n7G4PqJvFP2Kubl0VBLDEC0JfJ4xmm7j1kL6D7mPxrA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Playfair Display SC", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/G0-tvBxd4eQRdwFKB8dRkcpjYTDWIvcAwAccqeW9uNM.ttf", + "italic": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/myuYiFR-4NTrUT4w6TKls2klJsJYggW8rlNoTOTuau0.ttf", + "700": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/5ggqGkvWJU_TtW2W8cEubA-Amcyomnuy4WsCiPxGHjw.ttf", + "700italic": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/6X0OQrQhEEnPo56RalREX4krgPi80XvBcbTwmz-rgmU.ttf", + "900": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/5ggqGkvWJU_TtW2W8cEubKXL3C32k275YmX_AcBPZ7w.ttf", + "900italic": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/6X0OQrQhEEnPo56RalREX8Zag2q3ssKz8uH1RU4a9gs.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Podkova", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/podkova/v8/eylljyGVfB8ZUQjYY3WZRQ.ttf", + "700": "http://fonts.gstatic.com/s/podkova/v8/SqW4aa8m_KVrOgYSydQ33vesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Poiret One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/poiretone/v4/dWcYed048E5gHGDIt8i1CPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Poller One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/pollerone/v6/dkctmDlTPcZ6boC8662RA_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Poly", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/poly/v7/bcMAuiacS2qkd54BcwW6_Q.ttf", + "italic": "http://fonts.gstatic.com/s/poly/v7/Zkx-eIlZSjKUrPGYhV5PeA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Pompiere", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/pompiere/v6/o_va2p9CD5JfmFohAkGZIA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Pontano Sans", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/pontanosans/v4/gTHiwyxi6S7iiHpqAoiE3C3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Port Lligat Sans", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/portlligatsans/v5/CUEdhRk7oC7up0p6t0g4P6mASEpx5X0ZpsuJOuvfOGA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Port Lligat Slab", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/portlligatslab/v5/CUEdhRk7oC7up0p6t0g4PxLSPACXvawUYCBEnHsOe30.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Pragati Narrow", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-22", + "files": { + "regular": "http://fonts.gstatic.com/s/pragatinarrow/v1/HzG2TfC862qPNsZsV_djPpTvAuddT2xDMbdz0mdLyZY.ttf", + "700": "http://fonts.gstatic.com/s/pragatinarrow/v1/DnSI1zRkc0CY-hI5SC3q3MLtdzs3iyjn_YuT226ZsLU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Prata", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/prata/v6/3gmx8r842loRRm9iQkCDGg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Preahvihear", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/preahvihear/v8/82tDI-xTc53CxxOzEG4hDaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Press Start 2P", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/pressstart2p/v4/8Lg6LX8-ntOHUQnvQ0E7o1jfl3W46Sz5gOkEVhcFWF4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Princess Sofia", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/princesssofia/v4/8g5l8r9BM0t1QsXLTajDe-wjmA7ie-lFcByzHGRhCIg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Prociono", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/prociono/v6/43ZYDHWogdFeNBWTl6ksmw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Prosto One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/prostoone/v4/bsqnAElAqk9kX7eABTRFJPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Puritan", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/puritan/v7/wv_RtgVBSCn-or2MC0n4Kg.ttf", + "italic": "http://fonts.gstatic.com/s/puritan/v7/BqZX8Tp200LeMv1KlzXgLQ.ttf", + "700": "http://fonts.gstatic.com/s/puritan/v7/pJS2SdwI0SCiVnO0iQSFT_esZW2xOQ-xsNqO47m55DA.ttf", + "700italic": "http://fonts.gstatic.com/s/puritan/v7/rFG3XkMJL75nUNZwCEIJqC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Purple Purse", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/purplepurse/v5/Q5heFUrdmei9axbMITxxxS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Quando", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/quando/v4/03nDiEZuO2-h3xvtG6UmHg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Quantico", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/quantico/v5/pwSnP8Xpaix2rIz99HrSlQ.ttf", + "italic": "http://fonts.gstatic.com/s/quantico/v5/KQhDd2OsZi6HiITUeFQ2U_esZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/quantico/v5/OVZZzjcZ3Hkq2ojVcUtDjaCWcynf_cDxXwCLxiixG1c.ttf", + "700italic": "http://fonts.gstatic.com/s/quantico/v5/HeCYRcZbdRso3ZUu01ELbQJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Quattrocento", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/quattrocento/v7/WZDISdyil4HsmirlOdBRFC3USBnSvpkopQaUR-2r7iU.ttf", + "700": "http://fonts.gstatic.com/s/quattrocento/v7/Uvi-cRwyvqFpl9j3oT2mqkD2ttfZwueP-QU272T9-k4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Quattrocento Sans", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/quattrocentosans/v8/efd6FGWWGX5Z3ztwLBrG9eAj_ty82iuwwDTNEYXGiyQ.ttf", + "italic": "http://fonts.gstatic.com/s/quattrocentosans/v8/8PXYbvM__bjl0rBnKiByg532VBCoA_HLsn85tSWZmdo.ttf", + "700": "http://fonts.gstatic.com/s/quattrocentosans/v8/tXSgPxDl7Lk8Zr_5qX8FIbqxG25nQNOioCZSK4sU-CA.ttf", + "700italic": "http://fonts.gstatic.com/s/quattrocentosans/v8/8N1PdXpbG6RtFvTjl-5E7buqAJxizi8Dk_SK5et7kMg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Questrial", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/questrial/v6/MoHHaw_WwNs_hd9ob1zTVw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Quicksand", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/quicksand/v5/qhfoJiLu10kFjChCCTvGlC3USBnSvpkopQaUR-2r7iU.ttf", + "regular": "http://fonts.gstatic.com/s/quicksand/v5/Ngv3fIJjKB7sD-bTUGIFCA.ttf", + "700": "http://fonts.gstatic.com/s/quicksand/v5/32nyIRHyCu6iqEka_hbKsi3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Quintessential", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/quintessential/v4/mmk6ioesnTrEky_Zb92E5s02lXbtMOtZWfuxKeMZO8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Qwigley", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/qwigley/v6/aDqxws-KubFID85TZHFouw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Racing Sans One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/racingsansone/v4/1r3DpWaCiT7y3PD4KgkNyDjVlsJB_M_Q_LtZxsoxvlw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Radley", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/radley/v9/FgE9di09a-mXGzAIyI6Q9Q.ttf", + "italic": "http://fonts.gstatic.com/s/radley/v9/Z_JcACuPAOO2f9kzQcGRug.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rajdhani", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/rajdhani/v5/9pItuEhQZVGdq8spnHTku6CWcynf_cDxXwCLxiixG1c.ttf", + "regular": "http://fonts.gstatic.com/s/rajdhani/v5/Wfy5zp4PGFAFS7-Wetehzw.ttf", + "500": "http://fonts.gstatic.com/s/rajdhani/v5/nd_5ZpVwm710HcLual0fBqCWcynf_cDxXwCLxiixG1c.ttf", + "600": "http://fonts.gstatic.com/s/rajdhani/v5/5fnmZahByDeTtgxIiqbJSaCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/rajdhani/v5/UBK6d2Hg7X7wYLlF92aXW6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Raleway", + "category": "sans-serif", + "variants": [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/raleway/v9/UDfD6oxBaBnmFJwQ7XAFNw.ttf", + "200": "http://fonts.gstatic.com/s/raleway/v9/LAQwev4hdCtYkOYX4Oc7nPesZW2xOQ-xsNqO47m55DA.ttf", + "300": "http://fonts.gstatic.com/s/raleway/v9/2VvSZU2kb4DZwFfRM4fLQPesZW2xOQ-xsNqO47m55DA.ttf", + "regular": "http://fonts.gstatic.com/s/raleway/v9/_dCzxpXzIS3sL-gdJWAP8A.ttf", + "500": "http://fonts.gstatic.com/s/raleway/v9/348gn6PEmbLDWlHbbV15d_esZW2xOQ-xsNqO47m55DA.ttf", + "600": "http://fonts.gstatic.com/s/raleway/v9/M7no6oPkwKYJkedjB1wqEvesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/raleway/v9/VGEV9-DrblisWOWLbK-1XPesZW2xOQ-xsNqO47m55DA.ttf", + "800": "http://fonts.gstatic.com/s/raleway/v9/mMh0JrsYMXcLO69jgJwpUvesZW2xOQ-xsNqO47m55DA.ttf", + "900": "http://fonts.gstatic.com/s/raleway/v9/ajQQGcDBLcyLpaUfD76UuPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Raleway Dots", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ralewaydots/v4/lhLgmWCRcyz-QXo8LCzTfC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ramabhadra", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v5", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/ramabhadra/v5/JyhxLXRVQChLDGADS_c5MPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ramaraja", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v1", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/ramaraja/v1/XIqzxFapVczstBedHdQTiw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rambla", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rambla/v4/YaTmpvm5gFg_ShJKTQmdzg.ttf", + "italic": "http://fonts.gstatic.com/s/rambla/v4/mhUgsKmp0qw3uATdDDAuwA.ttf", + "700": "http://fonts.gstatic.com/s/rambla/v4/C5VZH8BxQKmnBuoC00UPpw.ttf", + "700italic": "http://fonts.gstatic.com/s/rambla/v4/ziMzUZya6QahrKONSI1TzqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rammetto One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rammettoone/v5/mh0uQ1tV8QgSx9v_KyEYPC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ranchers", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ranchers/v4/9ya8CZYhqT66VERfjQ7eLA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rancho", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rancho/v6/ekp3-4QykC4--6KaslRgHA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ranga", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/ranga/v1/xpW6zFTNzY1JykoBIqE1Zg.ttf", + "700": "http://fonts.gstatic.com/s/ranga/v1/h8G_gEUH7vHKH-NkjAs34A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rationale", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rationale/v7/7M2eN-di0NGLQse7HzJRfg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ravi Prakash", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v3", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/raviprakash/v3/8EzbM7Rymjk25jWeHxbO6C3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Redressed", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/redressed/v6/3aZ5sTBppH3oSm5SabegtA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Reenie Beanie", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/reeniebeanie/v6/ljpKc6CdXusL1cnGUSamX4jjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Revalia", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/revalia/v4/1TKw66fF5_poiL0Ktgo4_A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ribeye", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ribeye/v5/e5w3VE8HnWBln4Ll6lUj3Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ribeye Marrow", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ribeyemarrow/v6/q7cBSA-4ErAXBCDFPrhlY0cTNmV93fYG7UKgsLQNQWs.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Righteous", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/righteous/v5/0nRRWM_gCGCt2S-BCfN8WQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Risque", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/risque/v4/92RnElGnl8yHP97-KV3Fyg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Roboto", + "category": "sans-serif", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v15", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/roboto/v15/7MygqTe2zs9YkP0adA9QQQ.ttf", + "100italic": "http://fonts.gstatic.com/s/roboto/v15/T1xnudodhcgwXCmZQ490TPesZW2xOQ-xsNqO47m55DA.ttf", + "300": "http://fonts.gstatic.com/s/roboto/v15/dtpHsbgPEm2lVWciJZ0P-A.ttf", + "300italic": "http://fonts.gstatic.com/s/roboto/v15/iE8HhaRzdhPxC93dOdA056CWcynf_cDxXwCLxiixG1c.ttf", + "regular": "http://fonts.gstatic.com/s/roboto/v15/W5F8_SL0XFawnjxHGsZjJA.ttf", + "italic": "http://fonts.gstatic.com/s/roboto/v15/hcKoSgxdnKlbH5dlTwKbow.ttf", + "500": "http://fonts.gstatic.com/s/roboto/v15/Uxzkqj-MIMWle-XP2pDNAA.ttf", + "500italic": "http://fonts.gstatic.com/s/roboto/v15/daIfzbEw-lbjMyv4rMUUTqCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/roboto/v15/bdHGHleUa-ndQCOrdpfxfw.ttf", + "700italic": "http://fonts.gstatic.com/s/roboto/v15/owYYXKukxFDFjr0ZO8NXh6CWcynf_cDxXwCLxiixG1c.ttf", + "900": "http://fonts.gstatic.com/s/roboto/v15/H1vB34nOKWXqzKotq25pcg.ttf", + "900italic": "http://fonts.gstatic.com/s/roboto/v15/b9PWBSMHrT2zM5FgUdtu0aCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Roboto Condensed", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v13", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nJRhFVcex_hajThhFkHyhYk.ttf", + "300italic": "http://fonts.gstatic.com/s/robotocondensed/v13/mg0cGfGRUERshzBlvqxeAPYa9bgCHecWXGgisnodcS0.ttf", + "regular": "http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsKDbm6fPDOZJsR8PmdG62gY.ttf", + "italic": "http://fonts.gstatic.com/s/robotocondensed/v13/BP5K8ZAJv9qEbmuFp8RpJY_eiqgTfYGaH0bJiUDZ5GA.ttf", + "700": "http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nPOYkGiSOYDq_T7HbIOV1hA.ttf", + "700italic": "http://fonts.gstatic.com/s/robotocondensed/v13/mg0cGfGRUERshzBlvqxeAE2zk2RGRC3SlyyLLQfjS_8.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Roboto Mono", + "category": "monospace", + "variants": [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v4", + "lastModified": "2015-05-28", + "files": { + "100": "http://fonts.gstatic.com/s/robotomono/v4/aOIeRp72J9_Hp_8KwQ9M-YAWxXGWZ3yJw6KhWS7MxOk.ttf", + "100italic": "http://fonts.gstatic.com/s/robotomono/v4/rqQ1zSE-ZGCKVZgew-A9dgyDtfpXZi-8rXUZYR4dumU.ttf", + "300": "http://fonts.gstatic.com/s/robotomono/v4/N4duVc9C58uwPiY8_59Fzy9-WlPSxbfiI49GsXo3q0g.ttf", + "300italic": "http://fonts.gstatic.com/s/robotomono/v4/1OsMuiiO6FCF2x67vzDKA2o9eWDfYYxG3A176Zl7aIg.ttf", + "regular": "http://fonts.gstatic.com/s/robotomono/v4/eJ4cxQe85Lo39t-LVoKa26CWcynf_cDxXwCLxiixG1c.ttf", + "italic": "http://fonts.gstatic.com/s/robotomono/v4/mE0EPT_93c7f86_WQexR3EeOrDcLawS7-ssYqLr2Xp4.ttf", + "500": "http://fonts.gstatic.com/s/robotomono/v4/N4duVc9C58uwPiY8_59Fz8CNfqCYlB_eIx7H1TVXe60.ttf", + "500italic": "http://fonts.gstatic.com/s/robotomono/v4/1OsMuiiO6FCF2x67vzDKA2nWRcJAYo5PSCx8UfGMHCI.ttf", + "700": "http://fonts.gstatic.com/s/robotomono/v4/N4duVc9C58uwPiY8_59Fz3e1Pd76Vl7zRpE7NLJQ7XU.ttf", + "700italic": "http://fonts.gstatic.com/s/robotomono/v4/1OsMuiiO6FCF2x67vzDKA8_zJjSACmk0BRPxQqhnNLU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Roboto Slab", + "category": "serif", + "variants": [ + "100", + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "100": "http://fonts.gstatic.com/s/robotoslab/v6/MEz38VLIFL-t46JUtkIEgIAWxXGWZ3yJw6KhWS7MxOk.ttf", + "300": "http://fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJS9-WlPSxbfiI49GsXo3q0g.ttf", + "regular": "http://fonts.gstatic.com/s/robotoslab/v6/3__ulTNA7unv0UtplybPiqCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJXe1Pd76Vl7zRpE7NLJQ7XU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rochester", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rochester/v6/bnj8tmQBiOkdji_G_yvypg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rock Salt", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rocksalt/v6/Zy7JF9h9WbhD9V3SFMQ1UQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rokkitt", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rokkitt/v8/GMA7Z_ToF8uSvpZAgnp_VQ.ttf", + "700": "http://fonts.gstatic.com/s/rokkitt/v8/gxlo-sr3rPmvgSixYog_ofesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Romanesco", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/romanesco/v5/2udIjUrpK_CPzYSxRVzD4Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ropa Sans", + "category": "sans-serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ropasans/v5/Gba7ZzVBuhg6nX_AoSwlkQ.ttf", + "italic": "http://fonts.gstatic.com/s/ropasans/v5/V1zbhZQscNrh63dy5Jk2nqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rosario", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v10", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rosario/v10/bL-cEh8dXtDupB2WccA2LA.ttf", + "italic": "http://fonts.gstatic.com/s/rosario/v10/pkflNy18HEuVVx4EOjeb_Q.ttf", + "700": "http://fonts.gstatic.com/s/rosario/v10/nrS6PJvDWN42RP4TFWccd_esZW2xOQ-xsNqO47m55DA.ttf", + "700italic": "http://fonts.gstatic.com/s/rosario/v10/EOgFX2Va5VGrkhn_eDpIRS3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rosarivo", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rosarivo/v4/EmPiINK0qyqc7KSsNjJamA.ttf", + "italic": "http://fonts.gstatic.com/s/rosarivo/v4/u3VuWsWQlX1pDqsbz4paNPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rouge Script", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rougescript/v5/AgXDSqZJmy12qS0ixjs6Vy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rozha One", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v2", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/rozhaone/v2/PyrMHQ6lucEIxwKmhqsX8A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rubik Mono One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/rubikmonoone/v3/e_cupPtD4BrZzotubJD7UbAREgn5xbW23GEXXnhMQ5Y.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rubik One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/rubikone/v3/Zs6TtctNRSIR8T5PO018rQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ruda", + "category": "sans-serif", + "variants": [ + "regular", + "700", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ruda/v7/jPEIPB7DM2DNK_uBGv2HGw.ttf", + "700": "http://fonts.gstatic.com/s/ruda/v7/JABOu1SYOHcGXVejUq4w6g.ttf", + "900": "http://fonts.gstatic.com/s/ruda/v7/Uzusv-enCjoIrznlJJaBRw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rufina", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rufina/v4/s9IFr_fIemiohfZS-ZRDbQ.ttf", + "700": "http://fonts.gstatic.com/s/rufina/v4/D0RUjXFr55y4MVZY2Ww_RA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ruge Boogie", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/rugeboogie/v7/U-TTmltL8aENLVIqYbI5QaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ruluko", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ruluko/v4/lv4cMwJtrx_dzmlK5SDc1g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rum Raisin", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rumraisin/v4/kDiL-ntDOEq26B7kYM7cx_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ruslan Display", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ruslandisplay/v7/SREdhlyLNUfU1VssRBfs3rgH88D3l9N4auRNHrNS708.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Russo One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/russoone/v4/zfwxZ--UhUc7FVfgT21PRQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ruthie", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ruthie/v6/vJ2LorukHSbWYoEs5juivg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Rye", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/rye/v4/VUrJlpPpSZxspl3w_yNOrQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sacramento", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sacramento/v4/_kv-qycSHMNdhjiv0Kj7BvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sail", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sail/v6/iuEoG6kt-bePGvtdpL0GUQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Salsa", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/salsa/v6/BnpUCBmYdvggScEPs5JbpA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sanchez", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sanchez/v4/BEL8ao-E2LJ5eHPLB2UAiw.ttf", + "italic": "http://fonts.gstatic.com/s/sanchez/v4/iSrhkWLexUZzDeNxNEHtzA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sancreek", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sancreek/v7/8ZacBMraWMvHly4IJI3esw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sansita One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sansitaone/v6/xWqf68oB50JXqGIRR0h2hqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sarina", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sarina/v5/XYtRfaSknHIU3NHdfTdXoQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sarpanch", + "category": "sans-serif", + "variants": [ + "regular", + "500", + "600", + "700", + "800", + "900" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/sarpanch/v1/YMBZdT27b6O5a1DADbAGSg.ttf", + "500": "http://fonts.gstatic.com/s/sarpanch/v1/Ov7BxSrFSZYrfuJxL1LzQaCWcynf_cDxXwCLxiixG1c.ttf", + "600": "http://fonts.gstatic.com/s/sarpanch/v1/WTnP2wnc0qSbUaaDG-2OQ6CWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/sarpanch/v1/57kYsSpovYmFaEt2hsZhv6CWcynf_cDxXwCLxiixG1c.ttf", + "800": "http://fonts.gstatic.com/s/sarpanch/v1/OKyqPLjdnuVghR-1TV6RzaCWcynf_cDxXwCLxiixG1c.ttf", + "900": "http://fonts.gstatic.com/s/sarpanch/v1/JhYc2cr6kqWTo_P0vfvJR6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Satisfy", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/satisfy/v6/PRlyepkd-JCGHiN8e9WV2w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Scada", + "category": "sans-serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/scada/v4/iZNC3ZEYwe3je6H-28d5Ug.ttf", + "italic": "http://fonts.gstatic.com/s/scada/v4/PCGyLT1qNawkOUQ3uHFhBw.ttf", + "700": "http://fonts.gstatic.com/s/scada/v4/t6XNWdMdVWUz93EuRVmifQ.ttf", + "700italic": "http://fonts.gstatic.com/s/scada/v4/kLrBIf7V4mDMwcd_Yw7-D_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Scheherazade", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "arabic" + ], + "version": "v10", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/scheherazade/v10/AuKlqGWzUC-8XqMOmsqXiy3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Schoolbell", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/schoolbell/v6/95-3djEuubb3cJx-6E7j4vesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Seaweed Script", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/seaweedscript/v4/eorWAPpOvvWrPw5IHwE60BnpV0hQCek3EmWnCPrvGRM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sevillana", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/sevillana/v4/6m1Nh35oP7YEt00U80Smiw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Seymour One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/seymourone/v4/HrdG2AEG_870Xb7xBVv6C6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Shadows Into Light", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/shadowsintolight/v6/clhLqOv7MXn459PTh0gXYAW_5bEze-iLRNvGrRpJsfM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Shadows Into Light Two", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/shadowsintolighttwo/v4/gDxHeefcXIo-lOuZFCn2xVQrZk-Pga5KeEE_oZjkQjQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Shanti", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/shanti/v7/lc4nG_JG6Q-2FQSOMMhb_w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Share", + "category": "display", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/share/v5/1ytD7zSb_-g9I2GG67vmVw.ttf", + "italic": "http://fonts.gstatic.com/s/share/v5/a9YGdQWFRlNJ0zClJVaY3Q.ttf", + "700": "http://fonts.gstatic.com/s/share/v5/XrU8e7a1YKurguyY2azk1Q.ttf", + "700italic": "http://fonts.gstatic.com/s/share/v5/A992-bLVYwAflKu6iaznufesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Share Tech", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sharetech/v4/Dq3DuZ5_0SW3oEfAWFpen_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Share Tech Mono", + "category": "monospace", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sharetechmono/v4/RQxK-3RA0Lnf3gnnnNrAscwD6PD0c3_abh9zHKQtbGU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Shojumaru", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/shojumaru/v4/WP8cxonzQQVAoI3RJQ2wug.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Short Stack", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/shortstack/v6/v4dXPI0Rm8XN9gk4SDdqlqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Siemreap", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/siemreap/v9/JSK-mOIsXwxo-zE9XDDl_g.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sigmar One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sigmarone/v6/oh_5NxD5JBZksdo2EntKefesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Signika", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/signika/v6/0wDPonOzsYeEo-1KO78w4fesZW2xOQ-xsNqO47m55DA.ttf", + "regular": "http://fonts.gstatic.com/s/signika/v6/WvDswbww0oAtvBg2l1L-9w.ttf", + "600": "http://fonts.gstatic.com/s/signika/v6/lQMOF6NUN2ooR7WvB7tADvesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/signika/v6/lEcnfPBICWJPv5BbVNnFJPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Signika Negative", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FjYFXpUPtCmIEFDvjUnLLaI.ttf", + "regular": "http://fonts.gstatic.com/s/signikanegative/v5/Z-Q1hzbY8uAo3TpTyPFMXVM1lnCWMnren5_v6047e5A.ttf", + "600": "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FrKLaDJM01OezSVA2R_O3qI.ttf", + "700": "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FpYzPxtVvobH1w3hEppR8WI.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Simonetta", + "category": "display", + "variants": [ + "regular", + "italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/simonetta/v5/fN8puNuahBo4EYMQgp12Yg.ttf", + "italic": "http://fonts.gstatic.com/s/simonetta/v5/ynxQ3FqfF_Nziwy3T9ZwL6CWcynf_cDxXwCLxiixG1c.ttf", + "900": "http://fonts.gstatic.com/s/simonetta/v5/22EwvvJ2r1VwVCxit5LcVi3USBnSvpkopQaUR-2r7iU.ttf", + "900italic": "http://fonts.gstatic.com/s/simonetta/v5/WUXOpCgBZaRPrWtMCpeKoienaqEuufTBk9XMKnKmgDA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sintony", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sintony/v4/IDhCijoIMev2L6Lg5QsduQ.ttf", + "700": "http://fonts.gstatic.com/s/sintony/v4/zVXQB1wqJn6PE4dWXoYpvPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sirin Stencil", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/sirinstencil/v5/pRpLdo0SawzO7MoBpvowsImg74kgS1F7KeR8rWhYwkU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Six Caps", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sixcaps/v7/_XeDnO0HOV8Er9u97If1tQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Skranji", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/skranji/v4/jnOLPS0iZmDL7dfWnW3nIw.ttf", + "700": "http://fonts.gstatic.com/s/skranji/v4/Lcrhg-fviVkxiEgoadsI1vesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Slabo 13px", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/slabo13px/v3/jPGWFTjRXfCSzy0qd1nqdvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Slabo 27px", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v3", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/slabo27px/v3/gC0o8B9eU21EafNkXlRAfPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Slackey", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/slackey/v6/evRIMNhGVCRJvCPv4kteeA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Smokum", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/smokum/v6/8YP4BuAcy97X8WfdKfxVRw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Smythe", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/smythe/v7/yACD1gy_MpbB9Ft42fUvYw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sniglet", + "category": "display", + "variants": [ + "regular", + "800" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sniglet/v7/XWhyQLHH4SpCVsHRPRgu9w.ttf", + "800": "http://fonts.gstatic.com/s/sniglet/v7/NLF91nBmcEfkBgcEWbHFa_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Snippet", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/snippet/v6/eUcYMLq2GtHZovLlQH_9kA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Snowburst One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/snowburstone/v4/zSQzKOPukXRux2oTqfYJjIjjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sofadi One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sofadione/v4/nirf4G12IcJ6KI8Eoj119fesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sofia", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sofia/v5/Imnvx0Ag9r6iDBFUY5_RaQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sonsie One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sonsieone/v5/KSP7xT1OSy0q2ob6RQOTWPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sorts Mill Goudy", + "category": "serif", + "variants": [ + "regular", + "italic" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sortsmillgoudy/v6/JzRrPKdwEnE8F1TDmDLMUlIL2Qjg-Xlsg_fhGbe2P5U.ttf", + "italic": "http://fonts.gstatic.com/s/sortsmillgoudy/v6/UUu1lKiy4hRmBWk599VL1TYNkCNSzLyoucKmbTguvr0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Source Code Pro", + "category": "monospace", + "variants": [ + "200", + "300", + "regular", + "500", + "600", + "700", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "200": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqaXvKVW_haheDNrHjziJZVk.ttf", + "300": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqVP7R5lD_au4SZC6Ks_vyWs.ttf", + "regular": "http://fonts.gstatic.com/s/sourcecodepro/v6/mrl8jkM18OlOQN8JLgasD9Rl0pGnog23EMYRrBmUzJQ.ttf", + "500": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqX63uKwMO11Of4rJWV582wg.ttf", + "600": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqeiMeWyi5E_-XkTgB5psiDg.ttf", + "700": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqfgXsetDviZcdR5OzC1KPcw.ttf", + "900": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqRA_awHl7mXRjE_LQVochcU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Source Sans Pro", + "category": "sans-serif", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "900", + "900italic" + ], + "subsets": [ + "latin", + "vietnamese", + "latin-ext" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "200": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGKXvKVW_haheDNrHjziJZVk.ttf", + "200italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6OptKU7UIBg2hLM7eMTU8bI.ttf", + "300": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGFP7R5lD_au4SZC6Ks_vyWs.ttf", + "300italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6DUpNKoQAsDux-Todp8f29w.ttf", + "regular": "http://fonts.gstatic.com/s/sourcesanspro/v9/ODelI1aHBYDBqgeIAH2zlNRl0pGnog23EMYRrBmUzJQ.ttf", + "italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/M2Jd71oPJhLKp0zdtTvoMwRX4TIfMQQEXLu74GftruE.ttf", + "600": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGOiMeWyi5E_-XkTgB5psiDg.ttf", + "600italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6Pp6lGoTTgjlW0sC4r900Co.ttf", + "700": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGPgXsetDviZcdR5OzC1KPcw.ttf", + "700italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6LVT4locI09aamSzFGQlDMY.ttf", + "900": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGBA_awHl7mXRjE_LQVochcU.ttf", + "900italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6A0NcF6HPGWR298uWIdxWv0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Source Serif Pro", + "category": "serif", + "variants": [ + "regular", + "600", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sourceserifpro/v4/CeUM4np2c42DV49nanp55YGL0S0YDpKs5GpLtZIQ0m4.ttf", + "600": "http://fonts.gstatic.com/s/sourceserifpro/v4/yd5lDMt8Sva2PE17yiLarGi4cQnvCGV11m1KlXh97aQ.ttf", + "700": "http://fonts.gstatic.com/s/sourceserifpro/v4/yd5lDMt8Sva2PE17yiLarEkpYHRvxGNSCrR82n_RDNk.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Special Elite", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/specialelite/v6/9-wW4zu3WNoD5Fjka35Jm4jjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Spicy Rice", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/spicyrice/v5/WGCtz7cLoggXARPi9OGD6_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Spinnaker", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/spinnaker/v8/MQdIXivKITpjROUdiN6Jgg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Spirax", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/spirax/v5/IOKqhk-Ccl7y31yDsePPkw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Squada One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/squadaone/v5/3tzGuaJdD65cZVgfQzN8uvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sree Krushnadevaraya", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v4", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/sreekrushnadevaraya/v4/CdsXmnHyEqVl1ahzOh5qnzjDZVem5Eb4d0dXjXa0F_Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Stalemate", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/stalemate/v4/wQLCnG0qB6mOu2Wit2dt_w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Stalinist One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/stalinistone/v6/ltOD4Zj3WJDXYjAIR-9vZojjx0o0jr6fNXxPgYh_a8Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Stardos Stencil", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/stardosstencil/v6/ygEOyTW9a6u4fi4OXEZeTFf2eT4jUldwg_9fgfY_tHc.ttf", + "700": "http://fonts.gstatic.com/s/stardosstencil/v6/h4ExtgvoXhPtv9Ieqd-XC81wDCbBgmIo8UyjIhmkeSM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Stint Ultra Condensed", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/stintultracondensed/v5/8DqLK6-YSClFZt3u3EgOUYelbRYnLTTQA1Z5cVLnsI4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Stint Ultra Expanded", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/stintultraexpanded/v4/FeigX-wDDgHMCKuhekhedQ7dxr0N5HY0cZKknTIL6n4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Stoke", + "category": "serif", + "variants": [ + "300", + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/stoke/v6/Sell9475FOS8jUqQsfFsUQ.ttf", + "regular": "http://fonts.gstatic.com/s/stoke/v6/A7qJNoqOm2d6o1E6e0yUFg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Strait", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/strait/v4/m4W73ViNmProETY2ybc-Bg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sue Ellen Francisco", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sueellenfrancisco/v7/TwHX4vSxMUnJUdEz1JIgrhzazJzPVbGl8jnf1tisRz4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sumana", + "category": "serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v1", + "lastModified": "2015-05-04", + "files": { + "regular": "http://fonts.gstatic.com/s/sumana/v1/wgdl__wAK7pzliiWs0Nlog.ttf", + "700": "http://fonts.gstatic.com/s/sumana/v1/8AcM-KAproitONSBBHj3sQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Sunshiney", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/sunshiney/v6/kaWOb4pGbwNijM7CkxK1sQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Supermercado One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/supermercadoone/v6/kMGPVTNFiFEp1U274uBMb4mm5hmSKNFf3C5YoMa-lrM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Suranna", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v4", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/suranna/v4/PYmfr6TQeTqZ-r8HnPM-kA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Suravaram", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v3", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/suravaram/v3/G4dPee4pel_w2HqzavW4MA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Suwannaphum", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/suwannaphum/v9/1jIPOyXied3T79GCnSlCN6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Swanky and Moo Moo", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/swankyandmoomoo/v6/orVNZ9kDeE3lWp3U3YELu9DVLKqNC3_XMNHhr8S94FU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Syncopate", + "category": "sans-serif", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/syncopate/v6/RQVwO52fAH6MI764EcaYtw.ttf", + "700": "http://fonts.gstatic.com/s/syncopate/v6/S5z8ixiOoC4WJ1im6jAlYC3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Tangerine", + "category": "handwriting", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/tangerine/v6/DTPeM3IROhnkz7aYG2a9sA.ttf", + "700": "http://fonts.gstatic.com/s/tangerine/v6/UkFsr-RwJB_d2l9fIWsx3i3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Taprom", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "khmer" + ], + "version": "v8", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/taprom/v8/-KByU3BaUsyIvQs79qFObg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Tauri", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/tauri/v4/XIWeYJDXNqiVNej0zEqtGg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Teko", + "category": "sans-serif", + "variants": [ + "300", + "regular", + "500", + "600", + "700" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/teko/v5/OobFGE9eo24rcBpN6zXDaQ.ttf", + "regular": "http://fonts.gstatic.com/s/teko/v5/UtekqODEqZXSN2L-njejpA.ttf", + "500": "http://fonts.gstatic.com/s/teko/v5/FQ0duU7gWM4cSaImOfAjBA.ttf", + "600": "http://fonts.gstatic.com/s/teko/v5/QDx_i8H-TZ1IK1JEVrqwEQ.ttf", + "700": "http://fonts.gstatic.com/s/teko/v5/xKfTxe_SWpH4xU75vmvylA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Telex", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/telex/v4/24-3xP9ywYeHOcFU3iGk8A.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Tenali Ramakrishna", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v3", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/tenaliramakrishna/v3/M0nTmDqv2M7AGoGh-c946BZak5pSBHqWX6uyVMiMFoA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Tenor Sans", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/tenorsans/v7/dUBulmjNJJInvK5vL7O9yfesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Text Me One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/textmeone/v4/9em_3ckd_P5PQkP4aDyDLqCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "The Girl Next Door", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/thegirlnextdoor/v7/cWRA4JVGeEcHGcPl5hmX7kzo0nFFoM60ux_D9BUymX4.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Tienne", + "category": "serif", + "variants": [ + "regular", + "700", + "900" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/tienne/v8/-IIfDl701C0z7-fy2kmGvA.ttf", + "700": "http://fonts.gstatic.com/s/tienne/v8/JvoCDOlyOSEyYGRwCyfs3g.ttf", + "900": "http://fonts.gstatic.com/s/tienne/v8/FBano5T521OWexj2iRYLMw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Timmana", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "telugu", + "latin" + ], + "version": "v1", + "lastModified": "2015-04-07", + "files": { + "regular": "http://fonts.gstatic.com/s/timmana/v1/T25SicsJUJkc2s2sbBsDnA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Tinos", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "vietnamese", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "hebrew", + "greek" + ], + "version": "v9", + "lastModified": "2015-04-28", + "files": { + "regular": "http://fonts.gstatic.com/s/tinos/v9/EqpUbkVmutfwZ0PjpoGwCg.ttf", + "italic": "http://fonts.gstatic.com/s/tinos/v9/slfyzlasCr9vTsaP4lUh9A.ttf", + "700": "http://fonts.gstatic.com/s/tinos/v9/vHXfhX8jZuQruowfon93yQ.ttf", + "700italic": "http://fonts.gstatic.com/s/tinos/v9/M6kfzvDMM0CdxdraoFpG6vesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Titan One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/titanone/v4/FbvpRvzfV_oipS0De3iAZg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Titillium Web", + "category": "sans-serif", + "variants": [ + "200", + "200italic", + "300", + "300italic", + "regular", + "italic", + "600", + "600italic", + "700", + "700italic", + "900" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "200": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wprzOdCrLccoxq42eaxM802O0.ttf", + "200italic": "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPj4N98U-66ThNJvtgddRfBE.ttf", + "300": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr9ZAkYT8DuUZELiKLwMGWAo.ttf", + "300italic": "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPrfzCkqg7ORZlRf2cc4mXu8.ttf", + "regular": "http://fonts.gstatic.com/s/titilliumweb/v4/7XUFZ5tgS-tD6QamInJTcTyagQBwYgYywpS70xNq8SQ.ttf", + "italic": "http://fonts.gstatic.com/s/titilliumweb/v4/r9OmwyQxrgzUAhaLET_KO-ixohbIP6lHkU-1Mgq95cY.ttf", + "600": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr28K9dEd5Ue-HTQrlA7E2xQ.ttf", + "600italic": "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPgOhzTSndyK8UWja2yJjKLc.ttf", + "700": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr2-6tpSbB9YhmWtmd1_gi_U.ttf", + "700italic": "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPio3LEw-4MM8Ao2j9wPOfpw.ttf", + "900": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr7L0GmZLri-m-nfoo0Vul4Y.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Trade Winds", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/tradewinds/v5/sDOCVgAxw6PEUi2xdMsoDaCWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Trocchi", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/trocchi/v4/uldNPaKrUGVeGCVsmacLwA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Trochut", + "category": "display", + "variants": [ + "regular", + "italic", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/trochut/v4/6Y65B0x-2JsnYt16OH5omw.ttf", + "italic": "http://fonts.gstatic.com/s/trochut/v4/pczUwr4ZFvC79TgNO5cZng.ttf", + "700": "http://fonts.gstatic.com/s/trochut/v4/lWqNOv6ISR8ehNzGLFLnJ_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Trykker", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/trykker/v5/YiVrVJpBFN7I1l_CWk6yYQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Tulpen One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/tulpenone/v6/lwcTfVIEVxpZLZlWzR5baPesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ubuntu", + "category": "sans-serif", + "variants": [ + "300", + "300italic", + "regular", + "italic", + "500", + "500italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "300": "http://fonts.gstatic.com/s/ubuntu/v7/7-wH0j2QCTHKgp7vLh9-sQ.ttf", + "300italic": "http://fonts.gstatic.com/s/ubuntu/v7/j-TYDdXcC_eQzhhp386SjaCWcynf_cDxXwCLxiixG1c.ttf", + "regular": "http://fonts.gstatic.com/s/ubuntu/v7/lhhB5ZCwEkBRbHMSnYuKyA.ttf", + "italic": "http://fonts.gstatic.com/s/ubuntu/v7/b9hP8wd30SygxZjGGk4DCQ.ttf", + "500": "http://fonts.gstatic.com/s/ubuntu/v7/bMbHEMwSUmkzcK2x_74QbA.ttf", + "500italic": "http://fonts.gstatic.com/s/ubuntu/v7/NWdMogIO7U6AtEM4dDdf_aCWcynf_cDxXwCLxiixG1c.ttf", + "700": "http://fonts.gstatic.com/s/ubuntu/v7/B7BtHjNYwAp3HgLNagENOQ.ttf", + "700italic": "http://fonts.gstatic.com/s/ubuntu/v7/pqisLQoeO9YTDCNnlQ9bf6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ubuntu Condensed", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ubuntucondensed/v6/DBCt-NXN57MTAFjitYxdrKDbm6fPDOZJsR8PmdG62gY.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ubuntu Mono", + "category": "monospace", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin", + "greek-ext", + "cyrillic-ext", + "latin-ext", + "cyrillic", + "greek" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ubuntumono/v6/EgeuS9OtEmA0y_JRo03MQaCWcynf_cDxXwCLxiixG1c.ttf", + "italic": "http://fonts.gstatic.com/s/ubuntumono/v6/KAKuHXAHZOeECOWAHsRKA0eOrDcLawS7-ssYqLr2Xp4.ttf", + "700": "http://fonts.gstatic.com/s/ubuntumono/v6/ceqTZGKHipo8pJj4molytne1Pd76Vl7zRpE7NLJQ7XU.ttf", + "700italic": "http://fonts.gstatic.com/s/ubuntumono/v6/n_d8tv_JOIiYyMXR4eaV9c_zJjSACmk0BRPxQqhnNLU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Ultra", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/ultra/v8/OW8uXkOstRADuhEmGOFQLA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Uncial Antiqua", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/uncialantiqua/v4/F-leefDiFwQXsyd6eaSllqrFJ4O13IHVxZbM6yoslpo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Underdog", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v5", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/underdog/v5/gBv9yjez_-5PnTprHWq0ig.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Unica One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/unicaone/v4/KbYKlhWMDpatWViqDkNQgA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "UnifrakturCook", + "category": "display", + "variants": [ + "700" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "700": "http://fonts.gstatic.com/s/unifrakturcook/v8/ASwh69ykD8iaoYijVEU6RrWZkcsCTHKV51zmcUsafQ0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "UnifrakturMaguntia", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/unifrakturmaguntia/v7/7KWy3ymCVR_xfAvvcIXm3-kdNg30GQauG_DE-tMYtWk.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Unkempt", + "category": "display", + "variants": [ + "regular", + "700" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/unkempt/v7/NLLBeNSspr0RGs71R5LHWA.ttf", + "700": "http://fonts.gstatic.com/s/unkempt/v7/V7H-GCl9bgwGwqFqTTgDHvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Unlock", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/unlock/v6/rXEQzK7uIAlhoyoAEiMy1w.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Unna", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/unna/v8/UAS0AM7AmbdCNY_80xyAZQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "VT323", + "category": "monospace", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/vt323/v7/ITU2YQfM073o1iYK3nSOmQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Vampiro One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/vampiroone/v6/OVDs4gY4WpS5u3Qd1gXRW6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Varela", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/varela/v7/ON7qs0cKUUixhhDFXlZUjw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Varela Round", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/varelaround/v6/APH4jr0uSos5wiut5cpjri3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Vast Shadow", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/vastshadow/v6/io4hqKX3ibiqQQjYfW0-h6CWcynf_cDxXwCLxiixG1c.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Vesper Libre", + "category": "serif", + "variants": [ + "regular", + "500", + "700", + "900" + ], + "subsets": [ + "latin", + "devanagari", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-05-04", + "files": { + "regular": "http://fonts.gstatic.com/s/vesperlibre/v6/Cg-TeZFsqV8BaOcoVwzu2C3USBnSvpkopQaUR-2r7iU.ttf", + "500": "http://fonts.gstatic.com/s/vesperlibre/v6/0liLgNkygqH6EOtsVjZDsZMQuUSAwdHsY8ov_6tk1oA.ttf", + "700": "http://fonts.gstatic.com/s/vesperlibre/v6/0liLgNkygqH6EOtsVjZDsUD2ttfZwueP-QU272T9-k4.ttf", + "900": "http://fonts.gstatic.com/s/vesperlibre/v6/0liLgNkygqH6EOtsVjZDsaObDOjC3UL77puoeHsE3fw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Vibur", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/vibur/v7/xB9aKsUbJo68XP0bAg2iLw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Vidaloka", + "category": "serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/vidaloka/v8/C6Nul0ogKUWkx356rrt9RA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Viga", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/viga/v5/uD87gDbhS7frHLX4uL6agg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Voces", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/voces/v4/QoBH6g6yKgNIgvL8A2aE2Q.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Volkhov", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v8", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/volkhov/v8/MDIZAofe1T_J3un5Kgo8zg.ttf", + "italic": "http://fonts.gstatic.com/s/volkhov/v8/1rTjmztKEpbkKH06JwF8Yw.ttf", + "700": "http://fonts.gstatic.com/s/volkhov/v8/L8PbKS-kEoLHm7nP--NCzPesZW2xOQ-xsNqO47m55DA.ttf", + "700italic": "http://fonts.gstatic.com/s/volkhov/v8/W6oG0QDDjCgj0gmsHE520C3USBnSvpkopQaUR-2r7iU.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Vollkorn", + "category": "serif", + "variants": [ + "regular", + "italic", + "700", + "700italic" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/vollkorn/v6/IiexqYAeh8uII223thYx3w.ttf", + "italic": "http://fonts.gstatic.com/s/vollkorn/v6/UuIzosgR1ovBhJFdwVp3fvesZW2xOQ-xsNqO47m55DA.ttf", + "700": "http://fonts.gstatic.com/s/vollkorn/v6/gOwQjJVGXlDOONC12hVoBqCWcynf_cDxXwCLxiixG1c.ttf", + "700italic": "http://fonts.gstatic.com/s/vollkorn/v6/KNiAlx6phRqXCwnZZG51JAJKKGfqHaYFsRG-T3ceEVo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Voltaire", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/voltaire/v6/WvqBzaGEBbRV-hrahwO2cA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Waiting for the Sunrise", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/waitingforthesunrise/v7/eNfH7kLpF1PZWpsetF-ha9TChrNgrDiT3Zy6yGf3FnM.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Wallpoet", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/wallpoet/v7/hmum4WuBN4A0Z_7367NDIg.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Walter Turncoat", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/walterturncoat/v6/sG9su5g4GXy1KP73cU3hvQplL2YwNeota48DxFlGDUo.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Warnes", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v6", + "lastModified": "2015-04-03", + "files": { + "regular": "http://fonts.gstatic.com/s/warnes/v6/MXG7_Phj4YpzAXxKGItuBw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Wellfleet", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/wellfleet/v4/J5tOx72iFRPgHYpbK9J4XQ.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Wendy One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v4", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/wendyone/v4/R8CJT2oDXdMk_ZtuHTxoxw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Wire One", + "category": "sans-serif", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/wireone/v6/sRLhaQOQpWnvXwIx0CycQw.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Yanone Kaffeesatz", + "category": "sans-serif", + "variants": [ + "200", + "300", + "regular", + "700" + ], + "subsets": [ + "latin", + "latin-ext" + ], + "version": "v7", + "lastModified": "2015-04-06", + "files": { + "200": "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRbq92v6XxU4pSv06GI0NsGc.ttf", + "300": "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRZlIwXPiNoNT_wxzJ2t3mTE.ttf", + "regular": "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/YDAoLskQQ5MOAgvHUQCcLdXn3cHbFGWU4T2HrSN6JF4.ttf", + "700": "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRf2R4S6PlKaGXWPfWpHpcl0.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Yellowtail", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/yellowtail/v6/HLrU6lhCTjXfLZ7X60LcB_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Yeseva One", + "category": "display", + "variants": [ + "regular" + ], + "subsets": [ + "latin", + "latin-ext", + "cyrillic" + ], + "version": "v9", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/yesevaone/v9/eenQQxvpzSA80JmisGcgX_esZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Yesteryear", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v5", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/yesteryear/v5/dv09hP_ZrdjVOfZQXKXuZvesZW2xOQ-xsNqO47m55DA.ttf" + } + }, + { + "kind": "webfonts#webfont", + "family": "Zeyada", + "category": "handwriting", + "variants": [ + "regular" + ], + "subsets": [ + "latin" + ], + "version": "v6", + "lastModified": "2015-04-06", + "files": { + "regular": "http://fonts.gstatic.com/s/zeyada/v6/hmonmGYYFwqTZQfG2nRswQ.ttf" + } + } + ] +} diff --git a/admin/includes/fonts_face.php b/admin/includes/fonts_face.php new file mode 100755 index 0000000..75a8833 --- /dev/null +++ b/admin/includes/fonts_face.php @@ -0,0 +1,631 @@ + + 'Arial', + 'Verdana, Geneva, sans-serif' => 'Verdana', + 'Trebuchet MS, Tahoma, sans-serif' => 'Trebuchet', + 'Georgia, serif' => 'Georgia', + 'Times New Roman, serif' => 'Times New Roman', + 'Tahoma, Geneva, Verdana, sans-serif' => 'Tahoma', + 'Palatino, Palatino Linotype, serif' => 'Palatino', + 'Helvetica Neue, Helvetica, sans-serif' => 'Helvetica*', + 'Calibri, Candara, Segoe, Optima, sans-serif' => 'Calibri*', + 'Myriad Pro, Myriad, sans-serif' => 'Myriad Pro*', + 'Lucida Grande, Lucida Sans Unicode, Lucida Sans, sans-serif' => 'Lucida', + 'Arial Black, sans-serif' => 'Arial Black', + 'Gill Sans, Gill Sans MT, Calibri, sans-serif' => 'Gill Sans*', + 'Geneva, Tahoma, Verdana, sans-serif' => 'Geneva*', + 'Impact, Charcoal, sans-serif' => 'Impact', + 'Courier, Courier New, monospace' => 'Courier', + 'Century Gothic, sans-serif' => 'Century Gothic', + ); + + /** + * Google API Key use to get dynamic list of fonts from google, you can create new API KEY to use from https://developers.google.com/fonts/docs/developer_api + */ + public $google_api_key = ''; + + /*-----------------------------------------------------------------------------------*/ + /* Google Webfonts Array */ + /* Documentation: + /* + /* name: The name of the Google Font. + /* variant: The Google Font API variants available for the font. + /*-----------------------------------------------------------------------------------*/ + + // Available Google webfont names + public $google_fonts = array( array( 'name' => "Cantarell", 'variant' => ':r,b,i,bi'), + array( 'name' => "Cardo", 'variant' => ''), + array( 'name' => "Crimson Text", 'variant' => ''), + array( 'name' => "Droid Sans", 'variant' => ':r,b'), + array( 'name' => "Droid Sans Mono", 'variant' => ''), + array( 'name' => "Droid Serif", 'variant' => ':r,b,i,bi'), + array( 'name' => "IM Fell DW Pica", 'variant' => ':r,i'), + array( 'name' => "Inconsolata", 'variant' => ''), + array( 'name' => "Josefin Sans", 'variant' => ':400,400italic,700,700italic'), + array( 'name' => "Josefin Slab", 'variant' => ':r,b,i,bi'), + array( 'name' => "Lobster", 'variant' => ''), + array( 'name' => "Molengo", 'variant' => ''), + array( 'name' => "Nobile", 'variant' => ':r,b,i,bi'), + array( 'name' => "OFL Sorts Mill Goudy TT", 'variant' => ':r,i'), + array( 'name' => "Old Standard TT", 'variant' => ':r,b,i'), + array( 'name' => "Reenie Beanie", 'variant' => ''), + array( 'name' => "Tangerine", 'variant' => ':r,b'), + array( 'name' => "Vollkorn", 'variant' => ':r,b'), + array( 'name' => "Yanone Kaffeesatz", 'variant' => ':r,b'), + array( 'name' => "Cuprum", 'variant' => ''), + array( 'name' => "Neucha", 'variant' => ''), + array( 'name' => "Neuton", 'variant' => ''), + array( 'name' => "PT Sans", 'variant' => ':r,b,i,bi'), + array( 'name' => "PT Sans Caption", 'variant' => ':r,b'), + array( 'name' => "PT Sans Narrow", 'variant' => ':r,b'), + array( 'name' => "Philosopher", 'variant' => ''), + array( 'name' => "Allerta", 'variant' => ''), + array( 'name' => "Allerta Stencil", 'variant' => ''), + array( 'name' => "Arimo", 'variant' => ':r,b,i,bi'), + array( 'name' => "Arvo", 'variant' => ':r,b,i,bi'), + array( 'name' => "Bentham", 'variant' => ''), + array( 'name' => "Coda", 'variant' => ':800'), + array( 'name' => "Cousine", 'variant' => ''), + array( 'name' => "Covered By Your Grace", 'variant' => ''), + array( 'name' => "Geo", 'variant' => ''), + array( 'name' => "Just Me Again Down Here", 'variant' => ''), + array( 'name' => "Puritan", 'variant' => ':r,b,i,bi'), + array( 'name' => "Raleway", 'variant' => ':100'), + array( 'name' => "Tinos", 'variant' => ':r,b,i,bi'), + array( 'name' => "UnifrakturCook", 'variant' => ':bold'), + array( 'name' => "UnifrakturMaguntia", 'variant' => ''), + array( 'name' => "Mountains of Christmas", 'variant' => ''), + array( 'name' => "Lato", 'variant' => ':400,700,400italic'), + array( 'name' => "Orbitron", 'variant' => ':r,b,i,bi'), + array( 'name' => "Allan", 'variant' => ':bold'), + array( 'name' => "Anonymous Pro", 'variant' => ':r,b,i,bi'), + array( 'name' => "Copse", 'variant' => ''), + array( 'name' => "Kenia", 'variant' => ''), + array( 'name' => "Ubuntu", 'variant' => ':r,b,i,bi'), + array( 'name' => "Vibur", 'variant' => ''), + array( 'name' => "Sniglet", 'variant' => ':800'), + array( 'name' => "Syncopate", 'variant' => ''), + array( 'name' => "Cabin", 'variant' => ':400,400italic,700,700italic,'), + array( 'name' => "Merriweather", 'variant' => ''), + array( 'name' => "Maiden Orange", 'variant' => ''), + array( 'name' => "Just Another Hand", 'variant' => ''), + array( 'name' => "Kristi", 'variant' => ''), + array( 'name' => "Corben", 'variant' => ':b'), + array( 'name' => "Gruppo", 'variant' => ''), + array( 'name' => "Buda", 'variant' => ':light'), + array( 'name' => "Lekton", 'variant' => ''), + array( 'name' => "Luckiest Guy", 'variant' => ''), + array( 'name' => "Crushed", 'variant' => ''), + array( 'name' => "Chewy", 'variant' => ''), + array( 'name' => "Coming Soon", 'variant' => ''), + array( 'name' => "Crafty Girls", 'variant' => ''), + array( 'name' => "Fontdiner Swanky", 'variant' => ''), + array( 'name' => "Permanent Marker", 'variant' => ''), + array( 'name' => "Rock Salt", 'variant' => ''), + array( 'name' => "Sunshiney", 'variant' => ''), + array( 'name' => "Unkempt", 'variant' => ''), + array( 'name' => "Calligraffitti", 'variant' => ''), + array( 'name' => "Cherry Cream Soda", 'variant' => ''), + array( 'name' => "Homemade Apple", 'variant' => ''), + array( 'name' => "Irish Growler", 'variant' => ''), + array( 'name' => "Kranky", 'variant' => ''), + array( 'name' => "Schoolbell", 'variant' => ''), + array( 'name' => "Slackey", 'variant' => ''), + array( 'name' => "Walter Turncoat", 'variant' => ''), + array( 'name' => "Radley", 'variant' => ''), + array( 'name' => "Meddon", 'variant' => ''), + array( 'name' => "Kreon", 'variant' => ':r,b'), + array( 'name' => "Dancing Script", 'variant' => ''), + array( 'name' => "Goudy Bookletter 1911", 'variant' => ''), + array( 'name' => "PT Serif Caption", 'variant' => ':r,i'), + array( 'name' => "PT Serif", 'variant' => ':r,b,i,bi'), + array( 'name' => "Astloch", 'variant' => ':b'), + array( 'name' => "Bevan", 'variant' => ''), + array( 'name' => "Anton", 'variant' => ''), + array( 'name' => "Expletus Sans", 'variant' => ':b'), + array( 'name' => "VT323", 'variant' => ''), + array( 'name' => "Pacifico", 'variant' => ''), + array( 'name' => "Candal", 'variant' => ''), + array( 'name' => "Architects Daughter", 'variant' => ''), + array( 'name' => "Indie Flower", 'variant' => ''), + array( 'name' => "League Script", 'variant' => ''), + array( 'name' => "Quattrocento", 'variant' => ''), + array( 'name' => "Amaranth", 'variant' => ''), + array( 'name' => "Irish Grover", 'variant' => ''), + array( 'name' => "Oswald", 'variant' => ':400,300,700'), + array( 'name' => "EB Garamond", 'variant' => ''), + array( 'name' => "Nova Round", 'variant' => ''), + array( 'name' => "Nova Slim", 'variant' => ''), + array( 'name' => "Nova Script", 'variant' => ''), + array( 'name' => "Nova Cut", 'variant' => ''), + array( 'name' => "Nova Mono", 'variant' => ''), + array( 'name' => "Nova Oval", 'variant' => ''), + array( 'name' => "Nova Flat", 'variant' => ''), + array( 'name' => "Terminal Dosis Light", 'variant' => ''), + array( 'name' => "Michroma", 'variant' => ''), + array( 'name' => "Miltonian", 'variant' => ''), + array( 'name' => "Miltonian Tattoo", 'variant' => ''), + array( 'name' => "Annie Use Your Telescope", 'variant' => ''), + array( 'name' => "Dawning of a New Day", 'variant' => ''), + array( 'name' => "Sue Ellen Francisco", 'variant' => ''), + array( 'name' => "Waiting for the Sunrise", 'variant' => ''), + array( 'name' => "Special Elite", 'variant' => ''), + array( 'name' => "Quattrocento Sans", 'variant' => ''), + array( 'name' => "Smythe", 'variant' => ''), + array( 'name' => "The Girl Next Door", 'variant' => ''), + array( 'name' => "Aclonica", 'variant' => ''), + array( 'name' => "News Cycle", 'variant' => ''), + array( 'name' => "Damion", 'variant' => ''), + array( 'name' => "Wallpoet", 'variant' => ''), + array( 'name' => "Over the Rainbow", 'variant' => ''), + array( 'name' => "MedievalSharp", 'variant' => ''), + array( 'name' => "Six Caps", 'variant' => ''), + array( 'name' => "Swanky and Moo Moo", 'variant' => ''), + array( 'name' => "Bigshot One", 'variant' => ''), + array( 'name' => "Francois One", 'variant' => ''), + array( 'name' => "Sigmar One", 'variant' => ''), + array( 'name' => "Carter One", 'variant' => ''), + array( 'name' => "Holta3revd One SC", 'variant' => ''), + array( 'name' => "Paytone One", 'variant' => ''), + array( 'name' => "Monofett", 'variant' => ''), + array( 'name' => "Rokkitt", 'variant' => ':400,700'), + array( 'name' => "Megrim", 'variant' => ''), + array( 'name' => "Judson", 'variant' => ':r,ri,b'), + array( 'name' => "Didact Gothic", 'variant' => ''), + array( 'name' => "Play", 'variant' => ':r,b'), + array( 'name' => "Ultra", 'variant' => ''), + array( 'name' => "Metrophobic", 'variant' => ''), + array( 'name' => "Mako", 'variant' => ''), + array( 'name' => "Shanti", 'variant' => ''), + array( 'name' => "Caudex", 'variant' => ':r,b,i,bi'), + array( 'name' => "Jura", 'variant' => ''), + array( 'name' => "Ruslan Display", 'variant' => ''), + array( 'name' => "Brawler", 'variant' => ''), + array( 'name' => "Nunito", 'variant' => ''), + array( 'name' => "Wire One", 'variant' => ''), + array( 'name' => "Podkova", 'variant' => ''), + array( 'name' => "Muli", 'variant' => ''), + array( 'name' => "Maven Pro", 'variant' => ':400,500,700'), + array( 'name' => "Tenor Sans", 'variant' => ''), + array( 'name' => "Limelight", 'variant' => ''), + array( 'name' => "Playfair Display", 'variant' => ''), + array( 'name' => "Artifika", 'variant' => ''), + array( 'name' => "Lora", 'variant' => ''), + array( 'name' => "Kameron", 'variant' => ':r,b'), + array( 'name' => "Cedarville Cursive", 'variant' => ''), + array( 'name' => "Zeyada", 'variant' => ''), + array( 'name' => "La Belle Aurore", 'variant' => ''), + array( 'name' => "Shadows Into Light", 'variant' => ''), + array( 'name' => "Lobster Two", 'variant' => ':r,b,i,bi'), + array( 'name' => "Nixie One", 'variant' => ''), + array( 'name' => "Redressed", 'variant' => ''), + array( 'name' => "Bangers", 'variant' => ''), + array( 'name' => "Open Sans Condensed", 'variant' => ':300italic,400italic,700italic,400,300,700'), + array( 'name' => "Open Sans", 'variant' => ':r,i,b,bi'), + array( 'name' => "Varela", 'variant' => ''), + array( 'name' => "Goblin One", 'variant' => ''), + array( 'name' => "Asset", 'variant' => ''), + array( 'name' => "Gravitas One", 'variant' => ''), + array( 'name' => "Hammersmith One", 'variant' => ''), + array( 'name' => "Stardos Stencil", 'variant' => ''), + array( 'name' => "Love Ya Like A Sister", 'variant' => ''), + array( 'name' => "Loved by the King", 'variant' => ''), + array( 'name' => "Bowlby One SC", 'variant' => ''), + array( 'name' => "Forum", 'variant' => ''), + array( 'name' => "Patrick Hand", 'variant' => ''), + array( 'name' => "Varela Round", 'variant' => ''), + array( 'name' => "Yeseva One", 'variant' => ''), + array( 'name' => "Give You Glory", 'variant' => ''), + array( 'name' => "Modern Antiqua", 'variant' => ''), + array( 'name' => "Bowlby One", 'variant' => ''), + array( 'name' => "Tienne", 'variant' => ''), + array( 'name' => "Istok Web", 'variant' => ':r,b,i,bi'), + array( 'name' => "Yellowtail", 'variant' => ''), + array( 'name' => "Pompiere", 'variant' => ''), + array( 'name' => "Unna", 'variant' => ''), + array( 'name' => "Rosario", 'variant' => ''), + array( 'name' => "Leckerli One", 'variant' => ''), + array( 'name' => "Snippet", 'variant' => ''), + array( 'name' => "Ovo", 'variant' => ''), + array( 'name' => "IM Fell English", 'variant' => ':r,i'), + array( 'name' => "IM Fell English SC", 'variant' => ''), + array( 'name' => "Gloria Hallelujah", 'variant' => ''), + array( 'name' => "Kelly Slab", 'variant' => ''), + array( 'name' => "Black Ops One", 'variant' => ''), + array( 'name' => "Carme", 'variant' => ''), + array( 'name' => "Aubrey", 'variant' => ''), + array( 'name' => "Federo", 'variant' => ''), + array( 'name' => "Delius", 'variant' => ''), + array( 'name' => "Rochester", 'variant' => ''), + array( 'name' => "Rationale", 'variant' => ''), + array( 'name' => "Abel", 'variant' => ''), + array( 'name' => "Marvel", 'variant' => ':r,b,i,bi'), + array( 'name' => "Actor", 'variant' => ''), + array( 'name' => "Delius Swash Caps", 'variant' => ''), + array( 'name' => "Smokum", 'variant' => ''), + array( 'name' => "Tulpen One", 'variant' => ''), + array( 'name' => "Coustard", 'variant' => ':r,b'), + array( 'name' => "Andika", 'variant' => ''), + array( 'name' => "Alice", 'variant' => ''), + array( 'name' => "Questrial", 'variant' => ''), + array( 'name' => "Comfortaa", 'variant' => ':r,b'), + array( 'name' => "Geostar", 'variant' => ''), + array( 'name' => "Geostar Fill", 'variant' => ''), + array( 'name' => "Volkhov", 'variant' => ''), + array( 'name' => "Voltaire", 'variant' => ''), + array( 'name' => "Montez", 'variant' => ''), + array( 'name' => "Short Stack", 'variant' => ''), + array( 'name' => "Vidaloka", 'variant' => ''), + array( 'name' => "Aldrich", 'variant' => ''), + array( 'name' => "Numans", 'variant' => ''), + array( 'name' => "Days One", 'variant' => ''), + array( 'name' => "Gentium Book Basic", 'variant' => ''), + array( 'name' => "Monoton", 'variant' => ''), + array( 'name' => "Alike", 'variant' => ''), + array( 'name' => "Delius Unicase", 'variant' => ''), + array( 'name' => "Abril Fatface", 'variant' => ''), + array( 'name' => "Dorsa", 'variant' => ''), + array( 'name' => "Antic", 'variant' => ''), + array( 'name' => "Passero One", 'variant' => ''), + array( 'name' => "Fana3revd Text", 'variant' => ''), + array( 'name' => "Prociono", 'variant' => ''), + array( 'name' => "Merienda One", 'variant' => ''), + array( 'name' => "Changa One", 'variant' => ''), + array( 'name' => "Julee", 'variant' => ''), + array( 'name' => "Prata", 'variant' => ''), + array( 'name' => "Adamina", 'variant' => ''), + array( 'name' => "Sorts Mill Goudy", 'variant' => ''), + array( 'name' => "Terminal Dosis", 'variant' => ''), + array( 'name' => "Sansita One", 'variant' => ''), + array( 'name' => "Chivo", 'variant' => ''), + array( 'name' => "Spinnaker", 'variant' => ''), + array( 'name' => "Poller One", 'variant' => ''), + array( 'name' => "Alike Angular", 'variant' => ''), + array( 'name' => "Gochi Hand", 'variant' => ''), + array( 'name' => "Poly", 'variant' => ''), + array( 'name' => "Andada", 'variant' => ''), + array( 'name' => "Federant", 'variant' => ''), + array( 'name' => "Ubuntu Condensed", 'variant' => ''), + array( 'name' => "Ubuntu Mono", 'variant' => ''), + array( 'name' => "Sancreek", 'variant' => ''), + array( 'name' => "Coda", 'variant' => ''), + array( 'name' => "Rancho", 'variant' => ''), + array( 'name' => "Satisfy", 'variant' => ''), + array( 'name' => "Pinyon Script", 'variant' => ''), + array( 'name' => "Vast Shadow", 'variant' => ''), + array( 'name' => "Marck Script", 'variant' => ''), + array( 'name' => "Salsa", 'variant' => ''), + array( 'name' => "Amatic SC", 'variant' => ''), + array( 'name' => "Quicksand", 'variant' => ''), + array( 'name' => "Linden Hill", 'variant' => ''), + array( 'name' => "Corben", 'variant' => ''), + array( 'name' => "Creepster Caps", 'variant' => ''), + array( 'name' => "Butcherman Caps", 'variant' => ''), + array( 'name' => "Eater Caps", 'variant' => ''), + array( 'name' => "Nosifer Caps", 'variant' => ''), + array( 'name' => "Atomic Age", 'variant' => ''), + array( 'name' => "Contrail One", 'variant' => ''), + array( 'name' => "Jockey One", 'variant' => ''), + array( 'name' => "Cabin Sketch", 'variant' => ':r,b'), + array( 'name' => "Cabin Condensed", 'variant' => ':r,b'), + array( 'name' => "Fjord One", 'variant' => ''), + array( 'name' => "Rametto One", 'variant' => ''), + array( 'name' => "Mate", 'variant' => ':r,i'), + array( 'name' => "Mate SC", 'variant' => ''), + array( 'name' => "Arapey", 'variant' => ':r,i'), + array( 'name' => "Supermercado One", 'variant' => ''), + array( 'name' => "Petrona", 'variant' => ''), + array( 'name' => "Lancelot", 'variant' => ''), + array( 'name' => "Convergence", 'variant' => ''), + array( 'name' => "Cutive", 'variant' => ''), + array( 'name' => "Karla", 'variant' => ':400,400italic,700,700italic'), + array( 'name' => "Bitter", 'variant' => ':r,i,b'), + array( 'name' => "Asap", 'variant' => ':400,700,400italic,700italic'), + array( 'name' => "Bree Serif", 'variant' => '') + + ); + + /*-----------------------------------------------------------------------------------*/ + /* Fonts Face Constructor */ + /*-----------------------------------------------------------------------------------*/ + public function __construct() { + + // Enable Google Font API Key + if ( isset( $_POST[ $this->google_api_key_option . '_enable' ] ) ) { + $old_google_api_key_enable = get_option( $this->google_api_key_option . '_enable', 0 ); + + update_option( $this->google_api_key_option . '_enable', 1 ); + + $option_value = trim( $_POST[ $this->google_api_key_option ] ); + + $old_google_api_key_option = get_option( $this->google_api_key_option ); + + if ( 1 != $old_google_api_key_enable || $option_value != $old_google_api_key_option ) { + + update_option( $this->google_api_key_option, $option_value ); + + // Clear cached of google api key status + delete_transient( $this->google_api_key_option . '_status' ); + } + + // Disable Google Font API Key + } elseif ( isset( $_POST[ $this->google_api_key_option ] ) ) { + $old_google_api_key_enable = get_option( $this->google_api_key_option . '_enable', 0 ); + + update_option( $this->google_api_key_option . '_enable', 0 ); + + $option_value = trim( $_POST[ $this->google_api_key_option ] ); + update_option( $this->google_api_key_option, $option_value ); + + if ( 0 != $old_google_api_key_enable ) { + // Clear cached of google api key status + delete_transient( $this->google_api_key_option . '_status' ); + } + } + + $this->is_valid_google_api_key(); + + $google_fonts = get_option( $this->plugin_name . '_google_font_list', array() ); + + if ( ! is_array( $google_fonts ) || count( $google_fonts ) < 1 ) { + $google_fonts = apply_filters( $this->plugin_name . '_google_fonts', $this->google_fonts ); + } + + sort( $google_fonts ); + + $new_google_fonts = array(); + foreach ( $google_fonts as $row ) { + $new_google_fonts[$row['name']] = $row; + } + + $this->google_fonts = $new_google_fonts; + + } + + public function is_valid_google_api_key( $cache=true ) { + $is_valid = false; + + $this->google_api_key = get_option( $this->google_api_key_option, '' ); + $google_api_key_enable = get_option( $this->google_api_key_option . '_enable', 0 ); + + if ( '' != trim( $this->google_api_key ) && 1 == $google_api_key_enable ) { + + $google_api_key_status = get_transient( $this->google_api_key_option . '_status' ); + + if ( ! $cache ) { + $google_api_key_status = null; + } + + if ( ! $google_api_key_status ) { + $respone_api = wp_remote_get( "https://www.googleapis.com/webfonts/v1/webfonts?sort=alpha&key=" . trim( $this->google_api_key ), + array( + 'sslverify' => false, + 'timeout' => 45 + ) + ); + + $font_list = array(); + $response_fonts = array(); + + // Check it is a valid request + if ( ! is_wp_error( $respone_api ) ) { + + $json_string = get_magic_quotes_gpc() ? stripslashes( $respone_api['body'] ) : $respone_api['body']; + $response_fonts = json_decode( $json_string, true ); + + // Make sure that the valid response from google is not an error message + if ( ! isset( $response_fonts['error'] ) ) { + $google_api_key_status = 'valid'; + } else { + $google_api_key_status = 'invalid'; + } + + } else { + $google_api_key_status = 'invalid'; + } + + // Get font list from default webfonts.json file of plugin + if ( 'invalid' == $google_api_key_status && file_exists( $this->admin_plugin_dir() . '/assets/webfonts/webfonts.json' ) ) { + $webfonts = wp_remote_fopen( $this->admin_plugin_url() . '/assets/webfonts/webfonts.json' ); + if ( false != $webfonts ) { + $json_string = get_magic_quotes_gpc() ? stripslashes( $webfonts ) : $webfonts; + $response_fonts = json_decode( $json_string, true ); + } + } + + // Saving the font list to database for get later + if ( is_array( $response_fonts ) + && isset( $response_fonts['items'] ) + && is_array( $response_fonts['items'] ) + && count( $response_fonts['items'] ) > 0 ) { + + foreach ( $response_fonts['items'] as $font_item ) { + $variants = ''; + $comma = ''; + foreach ( $font_item['variants'] as $variant ) { + $variants .= $comma . trim( $variant ); + $comma = ','; + } + if ( '' != trim( $variants ) ) { + $variants = ':' . $variants; + } + + $font_list[] = array( 'name' => trim( $font_item['family'] ), 'variant' => $variants ); + } + } + + update_option( $this->plugin_name . '_google_font_list', $font_list ); + + //caching google api status for 24 hours + set_transient( $this->google_api_key_option . '_status', $google_api_key_status, 86400 ); + } + + if ( 'valid' == $google_api_key_status ) { + $is_valid = true; + } + + } else { + + $google_api_key_status = get_transient( $this->google_api_key_option . '_status' ); + + if ( ! $cache ) { + $google_api_key_status = null; + } + + if ( ! $google_api_key_status ) { + + $font_list = array(); + $response_fonts = array(); + + // Get font list from default webfonts.json file of plugin + if ( file_exists( $this->admin_plugin_dir() . '/assets/webfonts/webfonts.json' ) ) { + $webfonts = wp_remote_fopen( $this->admin_plugin_url() . '/assets/webfonts/webfonts.json' ); + if ( false != $webfonts ) { + $json_string = get_magic_quotes_gpc() ? stripslashes( $webfonts ) : $webfonts; + $response_fonts = json_decode( $json_string, true ); + } + } + + // Saving the font list to database for get later + if ( is_array( $response_fonts ) + && isset( $response_fonts['items'] ) + && is_array( $response_fonts['items'] ) + && count( $response_fonts['items'] ) > 0 ) { + + foreach ( $response_fonts['items'] as $font_item ) { + $variants = ''; + $comma = ''; + foreach ( $font_item['variants'] as $variant ) { + $variants .= $comma . trim( $variant ); + $comma = ','; + } + if ( '' != trim( $variants ) ) { + $variants = ':' . $variants; + } + + $font_list[] = array( 'name' => trim( $font_item['family'] ), 'variant' => $variants ); + } + } + + update_option( $this->plugin_name . '_google_font_list', $font_list ); + + //caching google api status for 24 hours + set_transient( $this->google_api_key_option . '_status', 'invalid', 86400 ); + + } + } + + return $is_valid; + } + + /*-----------------------------------------------------------------------------------*/ + /* Get Window Default Fonts */ + /*-----------------------------------------------------------------------------------*/ + public function get_default_fonts() { + $default_fonts = apply_filters( $this->plugin_name . '_default_fonts', $this->default_fonts ); + + asort( $default_fonts ); + + return $default_fonts; + } + + /*-----------------------------------------------------------------------------------*/ + /* Get Google Fonts */ + /*-----------------------------------------------------------------------------------*/ + public function get_google_fonts() { + + return $this->google_fonts; + } + + /*-----------------------------------------------------------------------------------*/ + /* generate_font_css() */ + /* Generate font CSS for frontend */ + /*-----------------------------------------------------------------------------------*/ + public function generate_font_css( $option, $em = '1.2' ) { + $google_fonts = $this->get_google_fonts(); + + if ( array_key_exists( $option['face'], $google_fonts ) ) { + $option['face'] = "'" . $option['face'] . "', arial, sans-serif"; + } + + $line_height = '1.4em'; + if( isset( $option['line_height'] ) ){ + $line_height = $option['line_height']; + } + + if ( !@$option['style'] && !@$option['size'] && !@$option['color'] ) + return 'font-family: '.stripslashes($option["face"]).' !important;'; + else + return 'font:'.$option['style'].' '.$option['size'].'/' . $line_height . ' ' .stripslashes($option['face']).' !important; color:'.$option['color'].' !important;'; + } + + + /*-----------------------------------------------------------------------------------*/ + /* Google Webfonts Stylesheet Generator */ + /*-----------------------------------------------------------------------------------*/ + /* + INSTRUCTIONS: Needs to be loaded for the Google Fonts options to work for font options. + + add_action( 'wp_head', array( $this, 'generate_google_webfonts' ) ); + */ + public function generate_google_webfonts( $my_google_fonts = array(), $echo = true ) { + $google_fonts = $this->get_google_fonts(); + + $fonts = ''; + $output = ''; + + // Go through the options + if ( is_array( $my_google_fonts ) ) { + foreach ( $my_google_fonts as $font_face ) { + // Check if the google font name exists in the current "face" option + if ( array_key_exists( $font_face, $google_fonts ) && !strstr( $fonts, $font_face ) ) { + $fonts .= $google_fonts[$font_face]['name'].$google_fonts[$font_face]['variant']."|"; + } + } // End Foreach Loop + + // Output google font css in header + if ( trim( $fonts ) != '' ) { + $fonts = str_replace( " ","+",$fonts); + $output .= "\n\n"; + $output .= ''."\n"; + $output = str_replace( '|"','"',$output); + } + } + + if ( $echo ) + echo $output; + else + return $output; + + } // End generate_google_webfonts() + +} + +global $wp_pvc_fonts_face; +$wp_pvc_fonts_face = new WP_PVC_Fonts_Face(); diff --git a/admin/includes/uploader/class-uploader.php b/admin/includes/uploader/class-uploader.php new file mode 100755 index 0000000..f37fd05 --- /dev/null +++ b/admin/includes/uploader/class-uploader.php @@ -0,0 +1,137 @@ + +plugin_name . '_init_scripts', array( $this, 'uploader_js' ) ); + + // include styles to Admin UI Interface + add_action( $this->plugin_name . '_init_styles', array( $this, 'uploader_style' ) ); + } + + } + + /*-----------------------------------------------------------------------------------*/ + /* admin_uploader_url */ + /*-----------------------------------------------------------------------------------*/ + public function admin_uploader_url() { + if ( $this->admin_uploader_url ) return $this->admin_uploader_url; + return $this->admin_uploader_url = untrailingslashit( plugins_url( '/', __FILE__ ) ); + } + + /*-----------------------------------------------------------------------------------*/ + /* Include Uploader Script */ + /*-----------------------------------------------------------------------------------*/ + public function uploader_js () { + wp_enqueue_script( 'a3-uploader-script', $this->admin_uploader_url() . '/uploader-script.js', array( 'jquery', 'thickbox' ) ); + if ( function_exists( 'wp_enqueue_media' ) ) { + wp_enqueue_media(); + } else { + wp_enqueue_script('media-upload'); + } + } + + /*-----------------------------------------------------------------------------------*/ + /* Include Uploader Style */ + /*-----------------------------------------------------------------------------------*/ + public function uploader_style () { + wp_enqueue_style( 'thickbox' ); + wp_enqueue_style( 'a3-uploader-style', $this->admin_uploader_url() . '/uploader.css' ); + if ( is_rtl() ) { + wp_enqueue_style( 'a3-uploader-style-rtl', $this->admin_uploader_url() . '/uploader.rtl.css' ); + } + } + + /*-----------------------------------------------------------------------------------*/ + /* Get Upload Input Field */ + /*-----------------------------------------------------------------------------------*/ + public function upload_input ( $name_attribute, $id_attribute = '', $value = '', $attachment_id = 0, $default_value = '', $field_name = '', $class = '', $css = '', $description = '', $strip_methods = true ) { + $output = ''; + + if ( trim( $value ) == '' ) $value = trim( $default_value ); + + if ( strstr( $name_attribute, ']' ) ) { + $attachment_id_name_attribute = substr_replace( $name_attribute, '_attachment_id', -1, 0 ); + } else { + $attachment_id_name_attribute = $name_attribute.'_attachment_id'; + } + + if ( $strip_methods === false ) { + $strip_methods = 0; + } else { + $strip_methods = 1; + } + + $output .= ''; + $output .= ' '; + $output .= ' '.$description; + + $output .= '
          '; + + if ( $value != '' ) { + $remove = ' '; + + $image = preg_match( '/(^.*\.jpg|jpeg|png|gif|ico*)/i', $value ); + + if ( $image ) { + $output .= ''.$remove.''; + } else { + $parts = explode( "/", $value ); + + for( $i = 0; $i < sizeof( $parts ); ++$i ) { + $title = $parts[$i]; + } + + $output .= ''; + + $title = __( 'View File', 'page-views-count' ); + + $output .= '
          '.$title.''.$remove.'
          '; + + } + } + + $output .= '
          '; + + return $output; + } +} + +global $wp_pvc_uploader; +$wp_pvc_uploader = new WP_PVC_Uploader(); + +?> diff --git a/admin/includes/uploader/delete.png b/admin/includes/uploader/delete.png new file mode 100755 index 0000000..575e5a3 Binary files /dev/null and b/admin/includes/uploader/delete.png differ diff --git a/admin/includes/uploader/mixins.less b/admin/includes/uploader/mixins.less new file mode 100644 index 0000000..70e7780 --- /dev/null +++ b/admin/includes/uploader/mixins.less @@ -0,0 +1,205 @@ +@green: green; +@red: red; +@orange: orange; +@blue: blue; +@yellow: yellow; +@white: white; +@black: black; + +.clearfix() { + *zoom:1; + &:before, + &:after { + content: " "; + display: table; + } + &:after { + clear: both; + } +} +.border_radius(@radius:4px) { + -webkit-border-radius:@radius; + border-radius:@radius; +} +.border_radius_corner(@topleft:4px, @topright:4px, @bottomleft:4px, @bottomright:4px) { + -webkit-border-top-left-radius: @topleft; + border-top-left-radius: @topleft; + -webkit-border-top-right-radius: @topright; + border-top-right-radius: @topright; + -webkit-border-bottom-left-radius: @bottomleft; + border-bottom-left-radius: @bottomleft; + -webkit-border-bottom-right-radius: @bottomright; + border-bottom-right-radius: @bottomright; +} + +.border_radius_top_left(@radius:4px) { + -webkit-border-top-left-radius: @radius; + border-top-left-radius: @radius; +} +.border_radius_top_right(@radius:4px) { + -webkit-border-top-right-radius: @radius; + border-top-right-radius: @radius; +} +.border_radius_bottom_left(@radius:4px) { + -webkit-border-bottom-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.border_radius_bottom_right(@radius:4px) { + -webkit-border-bottom-right-radius: @radius; + border-bottom-right-radius: @radius; +} + +.border_radius_right(@radius:4px) { + -webkit-border-top-right-radius: @radius; + -webkit-border-bottom-right-radius: @radius; + border-top-right-radius: @radius; + border-bottom-right-radius: @radius; +} +.border_radius_left(@radius:4px) { + -webkit-border-top-left-radius: @radius; + -webkit-border-bottom-left-radius: @radius; + border-top-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.border_radius_bottom(@radius:4px) { + -webkit-border-bottom-left-radius: @radius; + -webkit-border-bottom-right-radius: @radius; + border-bottom-left-radius: @radius; + border-bottom-right-radius: @radius; +} +.border_radius_top(@radius:4px) { + -webkit-border-top-left-radius: @radius; + -webkit-border-top-right-radius: @radius; + border-top-left-radius: @radius; + border-top-right-radius: @radius; +} +.opacity(@opacity:0.75) { + filter:~"alpha(opacity=@opacity * 100)"; + -moz-opacity:@opacity; + -khtml-opacity: @opacity; + opacity: @opacity; +} +.box_shadow_none() { + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; +} +.box_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_in:3px, @shadow_color:#888) { + box-shadow:@shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; + -webkit-box-shadow:@shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; +} +.inset_box_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_in:3px, @shadow_color:#888) { + box-shadow:inset @shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; + -webkit-box-shadow:inset @shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; +} +.text_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_color:#fff) { + text-shadow:@shadow_x @shadow_y @shadow_rad @shadow_color; +} +.vertical_gradient(@from: #000, @to: #FFF) { + background: @from; + background: -webkit-gradient(linear, left top, left bottom, from(@from), to(@to)); + background: -webkit-linear-gradient(@from, @to); + background: -moz-linear-gradient(center top, @from 0%, @to 100%); + background: -moz-gradient(center top, @from 0%, @to 100%); +} +.transition(@selector:all, @animation:ease-in-out, @duration:.2s) { + -webkit-transition:@selector @animation @duration; + -moz-transition:@selector @animation @duration; + -o-transition:@selector @animation @duration; + transition:@selector @animation @duration; +} + +.scale(@ratio:1.5){ + -webkit-transform:scale(@ratio); + -moz-transform:scale(@ratio); + -ms-transform:scale(@ratio); + -o-transform:scale(@ratio); + transform:scale(@ratio); +} + +.borderbox () { + -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ + -moz-box-sizing: border-box; /* Firefox, other Gecko */ + box-sizing: border-box; /* Opera/IE 8+ */ +} + +.clear { clear: both; } +.nobr { white-space: nowrap; } + +.darkorlighttextshadow ( @a, @opacity: 0.8 ) when (lightness(@a) >= 65%) { .text_shadow( 0, -1px, 0, rgba(0,0,0,@opacity) ); } +.darkorlighttextshadow ( @a, @opacity: 0.8 ) when (lightness(@a) < 65%) { .text_shadow( 0, 1px, 0, rgba(255,255,255,@opacity) ); } + +/** + * Objects + */ +.menu() { + .clearfix; + li { + display: inline-block; + } +} +.mediaright() { + .clearfix; + img { + float:right; + height:auto; + } +} +.medialeft() { + .clearfix; + img { + float:right; + height:auto; + } +} +.ir() { + display: block; + text-indent: -9999px; + position: relative; + height:1em; + width:1em; +} + +.margin( @top:0, @right:0px, @bottom:0px , @left:0 ){ + margin-top: @top; + margin-right: @right; + margin-bottom: @bottom; + margin-left: @left; +} + +.margin_left( @left:0 ){ + margin-left: @left; +} +.margin_right( @right:0 ){ + margin-right: @right; +} +.margin_top( @top:0 ){ + margin-top: @top; +} +.margin_bottom( @bottom:0 ){ + margin-bottom: @bottom; +} + +.padding( @top:0, @right:0px, @bottom:0px , @left:0 ){ + padding-top: @top; + padding-right: @right; + padding-bottom: @bottom; + padding-left: @left; +} + +.padding_left( @left:0 ){ + padding-left: @left; +} +.padding_right( @right:0 ){ + padding-right: @right; +} +.padding_top( @top:0 ){ + padding-top: @top; +} +.padding_bottom( @bottom:0 ){ + padding-bottom: @bottom; +} + +.background( @url, @repeat:no-repeat, @hoz:0, @ver:0, @color ){ + background: url(@url) @repeat @hoz @ver @color; +} \ No newline at end of file diff --git a/admin/includes/uploader/uploader-script.js b/admin/includes/uploader/uploader-script.js new file mode 100755 index 0000000..6508db6 --- /dev/null +++ b/admin/includes/uploader/uploader-script.js @@ -0,0 +1,115 @@ +(function ($) { + +a3Uploader = { + +/*-----------------------------------------------------------------------------------*/ +/* Remove file when the "remove" button is clicked. +/*-----------------------------------------------------------------------------------*/ + + removeFile: function () { + $(document).on( 'click', '.a3_uploader_remove', function(event) { + $(this).hide(); + $(this).parents().parents().children('.a3_upload').val( '' ).trigger('change'); + $(this).parents().parents().children('.a3_upload_attachment_id').val(0); + $(this).parents( '.a3_screenshot').slideUp(); + + return false; + }); + }, + +/*-----------------------------------------------------------------------------------*/ +/* Use a custom function when working with the Media Uploads popup. +/* Requires jQuery, Media Upload and Thickbox JavaScripts. +/*-----------------------------------------------------------------------------------*/ + + mediaUpload: function () { + $.noConflict(); + + var formfield, file_frame, formID, upload_title, insertImage, btnContent = true; + + $(document).on( 'click', 'input.a3_upload_button', function (e) { + e.preventDefault(); + + formfield = $(this).prev( 'input').attr( 'id' ); + formID = $(this).attr( 'rel' ); + upload_title = $(this).prev( 'input').attr( 'rel' ); + + var insertImage = wp.media.controller.Library.extend({ + defaults : _.defaults({ + id: 'a3-insert-image', + title: upload_title, + filterable: 'uploaded', + allowLocalEdits: true, + displaySettings: true, + displayUserSettings: true, + multiple : false, + type : 'image' + }, wp.media.controller.Library.prototype.defaults ) + }); + + /* + if ( file_frame ) { + file_frame.open(); + return; + } + */ + + file_frame = wp.media.frames.file_frame = wp.media({ + title: 'Select Image', + button: { + text: 'Use as ' + upload_title, + }, + state : 'a3-insert-image', + states : [ + new insertImage() + ], + multiple: false + }); + + file_frame.open(); + + file_frame.on( 'select', function() { + var selection = file_frame.state().get('selection'); + var size = $('.attachment-display-settings .size').val(); + var attachment = selection.first().toJSON(); + if ( !size ) { + attachment.url = attachment.url; + } else { + attachment.url = attachment.sizes[size].url; + } + var image = /(^.*\.jpg|jpeg|png|gif|ico*)/gi; + var document = /(^.*\.pdf|doc|docx|ppt|pptx|odt*)/gi; + var audio = /(^.*\.mp3|m4a|ogg|wav*)/gi; + var video = /(^.*\.mp4|m4v|mov|wmv|avi|mpg|ogv|3gp|3g2*)/gi; + + if (attachment.url.match(image)) { + btnContent = ' '; + } else { + html = 'View File'; + btnContent = '
          '+html+' 
          '; + } + var strip_methods = $( '#' + formfield).data('strip-methods'); + if ( strip_methods === 0 ) { + $( '#' + formfield).val(attachment.url).trigger('change'); + } else { + $( '#' + formfield).val(attachment.url.replace(/http:|https:/, '' )).trigger('change'); + } + $( '#' + formfield + '_attachment_id').val(attachment.id); + $( '#' + formfield).siblings( '.a3_screenshot').slideDown().html(btnContent); + $('.media-modal-close').trigger('click'); + }); + + return false; + + }); + } +}; + + $(document).ready(function () { + + a3Uploader.removeFile(); + a3Uploader.mediaUpload(); + + }); + +})(jQuery); diff --git a/admin/includes/uploader/uploader.css b/admin/includes/uploader/uploader.css new file mode 100755 index 0000000..8482d3c --- /dev/null +++ b/admin/includes/uploader/uploader.css @@ -0,0 +1,35 @@ +.a3_screenshot { + float:left; + position:relative; + border-color: #CCCCCC #EEEEEE #EEEEEE #CCCCCC; + border-style: solid; + border-width: 1px; + background:#FAFAFA; + padding:5px; + margin-top:15px; + margin-right:15px; +} +.a3_uploader_remove { + background:#EEEEEE; + border: 1px solid #DDDDDD; + border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + -moz-border-radius: 2px 2px 2px 2px; + cursor: pointer; + height: 10px; + padding: 2px; + position: absolute; + right: -10px; + top: -10px; + width: 10px; + text-decoration:none !important; +} +.a3_uploader_image { + border:none; + background:none; + padding:0; + margin:0; + float:left; + max-width:225px; + width:100%; +} diff --git a/admin/includes/uploader/uploader.rtl.css b/admin/includes/uploader/uploader.rtl.css new file mode 100644 index 0000000..58798ec --- /dev/null +++ b/admin/includes/uploader/uploader.rtl.css @@ -0,0 +1,18 @@ +.clear { + clear: both; +} +.nobr { + white-space: nowrap; +} +.a3rev_panel_container .a3_screenshot { + float: right; + margin-left: 15px; + margin-right: 0px; +} +.a3rev_panel_container .a3_uploader_remove { + left: -10px; + right: auto; +} +.a3rev_panel_container .a3_uploader_image { + float: right; +} diff --git a/admin/includes/uploader/uploader.rtl.less b/admin/includes/uploader/uploader.rtl.less new file mode 100755 index 0000000..0e8038b --- /dev/null +++ b/admin/includes/uploader/uploader.rtl.less @@ -0,0 +1,23 @@ +@import "mixins.less"; + +/*-------------------------------------------------------------------------------------------*/ +/* A3rev Uploader RTL UI */ +/*-------------------------------------------------------------------------------------------*/ + +.a3rev_panel_container { + + .a3_screenshot { + float: right; + margin-left:15px; + margin-right:0px; + } + + .a3_uploader_remove { + left: -10px; + right: auto; + } + + .a3_uploader_image { + float:right; + } +} \ No newline at end of file diff --git a/admin/less/assets/css/mixins.less b/admin/less/assets/css/mixins.less new file mode 100644 index 0000000..1e3f18a --- /dev/null +++ b/admin/less/assets/css/mixins.less @@ -0,0 +1,201 @@ +@green: green; +@red: red; +@orange: orange; +@blue: blue; +@yellow: yellow; +@white: white; +@black: black; + +.clearfix() { + *zoom:1; + &:before, + &:after { + content: " "; + display: table; + } + &:after { + clear: both; + } +} +.border_radius(@radius:4px) { + -webkit-border-radius:@radius; + border-radius:@radius; +} +.border_radius_corner(@topleft:4px, @topright:4px, @bottomleft:4px, @bottomright:4px) { + -webkit-border-top-left-radius: @topleft; + border-top-left-radius: @topleft; + -webkit-border-top-right-radius: @topright; + border-top-right-radius: @topright; + -webkit-border-bottom-left-radius: @bottomleft; + border-bottom-left-radius: @bottomleft; + -webkit-border-bottom-right-radius: @bottomright; + border-bottom-right-radius: @bottomright; + +} + +.border_radius_top_left(@radius:4px) { + -webkit-border-top-left-radius: @radius; + border-top-left-radius: @radius; +} +.border_radius_top_right(@radius:4px) { + -webkit-border-top-right-radius: @radius; + border-top-right-radius: @radius; +} +.border_radius_bottom_left(@radius:4px) { + -webkit-border-bottom-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.border_radius_bottom_right(@radius:4px) { + -webkit-border-bottom-right-radius: @radius; + border-bottom-right-radius: @radius; +} + +.border_radius_right(@radius:4px) { + -webkit-border-top-right-radius: @radius; + -webkit-border-bottom-right-radius: @radius; + border-top-right-radius: @radius; + border-bottom-right-radius: @radius; +} +.border_radius_left(@radius:4px) { + -webkit-border-top-left-radius: @radius; + -webkit-border-bottom-left-radius: @radius; + border-top-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.border_radius_bottom(@radius:4px) { + -webkit-border-bottom-left-radius: @radius; + -webkit-border-bottom-right-radius: @radius; + border-bottom-left-radius: @radius; + border-bottom-right-radius: @radius; +} +.border_radius_top(@radius:4px) { + -webkit-border-top-left-radius: @radius; + -webkit-border-top-right-radius: @radius; + border-top-left-radius: @radius; + border-top-right-radius: @radius; +} +.opacity(@opacity:0.75) { + filter:~"alpha(opacity=@opacity * 100)"; + -moz-opacity:@opacity; + -khtml-opacity: @opacity; + opacity: @opacity; +} +.box_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_in:3px, @shadow_color:#888) { + box-shadow:@shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color @inset; + -webkit-box-shadow:@shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; +} +.inset_box_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_in:3px, @shadow_color:#888) { + box-shadow:inset @shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; + -webkit-box-shadow:inset @shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; +} +.text_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_color:#fff) { + text-shadow:@shadow_x @shadow_y @shadow_rad @shadow_color; +} +.vertical_gradient(@from: #000, @to: #FFF) { + background: @from; + background: -webkit-gradient(linear, left top, left bottom, from(@from), to(@to)); + background: -webkit-linear-gradient(@from, @to); + background: -moz-linear-gradient(center top, @from 0%, @to 100%); + background: -moz-gradient(center top, @from 0%, @to 100%); +} +.transition(@selector:all, @animation:ease-in-out, @duration:.2s) { + -webkit-transition:@selector @animation @duration; + -moz-transition:@selector @animation @duration; + -o-transition:@selector @animation @duration; + transition:@selector @animation @duration; +} + +.scale(@ratio:1.5){ + -webkit-transform:scale(@ratio); + -moz-transform:scale(@ratio); + -ms-transform:scale(@ratio); + -o-transform:scale(@ratio); + transform:scale(@ratio); +} + +.borderbox () { + -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ + -moz-box-sizing: border-box; /* Firefox, other Gecko */ + box-sizing: border-box; /* Opera/IE 8+ */ +} + +.clear { clear: both; } +.nobr { white-space: nowrap; } + +.darkorlighttextshadow ( @a, @opacity: 0.8 ) when (lightness(@a) >= 65%) { .text_shadow( 0, -1px, 0, rgba(0,0,0,@opacity) ); } +.darkorlighttextshadow ( @a, @opacity: 0.8 ) when (lightness(@a) < 65%) { .text_shadow( 0, 1px, 0, rgba(255,255,255,@opacity) ); } + +/** + * Objects + */ +.menu() { + .clearfix; + li { + display: inline-block; + } +} +.mediaright() { + .clearfix; + img { + float:right; + height:auto; + } +} +.medialeft() { + .clearfix; + img { + float:right; + height:auto; + } +} +.ir() { + display: block; + text-indent: -9999px; + position: relative; + height:1em; + width:1em; +} + +.margin( @top:0, @right:0px, @bottom:0px , @left:0 ){ + margin-top: @top; + margin-right: @right; + margin-bottom: @bottom; + margin-left: @left; +} + +.margin_left( @left:0 ){ + margin-left: @left; +} +.margin_right( @right:0 ){ + margin-right: @right; +} +.margin_top( @top:0 ){ + margin-top: @top; +} +.margin_bottom( @bottom:0 ){ + margin-bottom: @bottom; +} + +.padding( @top:0, @right:0px, @bottom:0px , @left:0 ){ + padding-top: @top; + padding-right: @right; + padding-bottom: @bottom; + padding-left: @left; +} + +.padding_left( @left:0 ){ + padding-left: @left; +} +.padding_right( @right:0 ){ + padding-right: @right; +} +.padding_top( @top:0 ){ + padding-top: @top; +} +.padding_bottom( @bottom:0 ){ + padding-bottom: @bottom; +} + +.background( @url, @repeat:no-repeat, @hoz:0, @ver:0, @color ){ + background: url(@url) @repeat @hoz @ver @color; +} \ No newline at end of file diff --git a/admin/less/assets/css/style.css b/admin/less/assets/css/style.css new file mode 100644 index 0000000..e69de29 diff --git a/admin/less/assets/css/style.less b/admin/less/assets/css/style.less new file mode 100644 index 0000000..e69de29 diff --git a/admin/less/assets/css/style.min.css b/admin/less/assets/css/style.min.css new file mode 100644 index 0000000..e69de29 diff --git a/admin/less/compile_less_sass_class.php b/admin/less/compile_less_sass_class.php new file mode 100644 index 0000000..517381c --- /dev/null +++ b/admin/less/compile_less_sass_class.php @@ -0,0 +1,56 @@ +init(); + } + public function init(){ + } + + public function compileLessFile( $less_file = '', $css_file = '', $css_min_file = '' ){ + global $wp_filesystem; + + if( empty( $less_file ) ) + $less_file = dirname( __FILE__ ) . '/assets/css/style.less'; + if( empty( $css_file ) ) + $css_file = dirname( __FILE__ ) . '/assets/css/style.css'; + if( empty( $css_min_file ) ) + $css_min_file = dirname( __FILE__ ) . '/assets/css/style.min.css'; + + // Write less file + if ( is_writable( $css_file ) && is_writable( $css_min_file ) ) { + + if ( ! class_exists( 'a3_lessc' ) ){ + include( dirname( __FILE__ ) . '/lib/lessc.inc.php' ); + } + if ( ! class_exists( 'a3_CSSmin' ) ){ + include( dirname( __FILE__ ) . '/lib/cssmin.inc.php' ); + } + + try { + + $less = new a3_lessc(); + + $compiled_css = $less->compileFile( $less_file ); + + if ( $compiled_css != '' ){ + $wp_filesystem->put_contents( $css_file, $compiled_css ); + + $compressor = new a3_CSSmin(); + $compressor->set_memory_limit( '512M' ); + $compressor->set_max_execution_time( 120 ); + + $compiled_css_min = $compressor->run( $compiled_css ); + if ( $compiled_css_min != '' ) + $wp_filesystem->put_contents( $css_min_file, $compiled_css_min ); + } + + } catch ( exception $ex ) { + + //echo ( __( 'Could not compile .less:', 'sass' ) . ' ' . $ex->getMessage() ); + } + } + + } +} +?> diff --git a/admin/less/index.html b/admin/less/index.html new file mode 100644 index 0000000..2ff65d9 --- /dev/null +++ b/admin/less/index.html @@ -0,0 +1,31 @@ + + + + +SASS JS + + + + + + + +

          3,894 total views, 1 views today

          + + \ No newline at end of file diff --git a/admin/less/lib/cssmin.inc.php b/admin/less/lib/cssmin.inc.php new file mode 100755 index 0000000..6de24cb --- /dev/null +++ b/admin/less/lib/cssmin.inc.php @@ -0,0 +1,777 @@ +memory_limit = 128 * 1048576; // 128MB in bytes + $this->max_execution_time = 60; // 1 min + $this->pcre_backtrack_limit = 1000 * 1000; + $this->pcre_recursion_limit = 500 * 1000; + + $this->raise_php_limits = (bool) $raise_php_limits; + } + + /** + * Minify a string of CSS + * @param string $css + * @param int|bool $linebreak_pos + * @return string + */ + public function run($css = '', $linebreak_pos = FALSE) + { + if (empty($css)) { + return ''; + } + + if ($this->raise_php_limits) { + $this->do_raise_php_limits(); + } + + $this->comments = array(); + $this->preserved_tokens = array(); + + $start_index = 0; + $length = strlen($css); + + $css = $this->extract_data_urls($css); + + // collect all comment blocks... + while (($start_index = $this->index_of($css, '/*', $start_index)) >= 0) { + $end_index = $this->index_of($css, '*/', $start_index + 2); + if ($end_index < 0) { + $end_index = $length; + } + $comment_found = $this->str_slice($css, $start_index + 2, $end_index); + $this->comments[] = $comment_found; + $comment_preserve_string = self::COMMENT . (count($this->comments) - 1) . '___'; + $css = $this->str_slice($css, 0, $start_index + 2) . $comment_preserve_string . $this->str_slice($css, $end_index); + // Set correct start_index: Fixes issue #2528130 + $start_index = $end_index + 2 + strlen($comment_preserve_string) - strlen($comment_found); + } + + // preserve strings so their content doesn't get accidentally minified + $css = preg_replace_callback('/(?:"(?:[^\\\\"]|\\\\.|\\\\)*")|'."(?:'(?:[^\\\\']|\\\\.|\\\\)*')/S", array($this, 'replace_string'), $css); + + // Let's divide css code in chunks of 5.000 chars aprox. + // Reason: PHP's PCRE functions like preg_replace have a "backtrack limit" + // of 100.000 chars by default (php < 5.3.7) so if we're dealing with really + // long strings and a (sub)pattern matches a number of chars greater than + // the backtrack limit number (i.e. /(.*)/s) PCRE functions may fail silently + // returning NULL and $css would be empty. + $charset = ''; + $charset_regexp = '/(@charset)( [^;]+;)/i'; + $css_chunks = array(); + $css_chunk_length = 5000; // aprox size, not exact + $start_index = 0; + $i = $css_chunk_length; // save initial iterations + $l = strlen($css); + + + // if the number of characters is 5000 or less, do not chunk + if ($l <= $css_chunk_length) { + $css_chunks[] = $css; + } else { + // chunk css code securely + while ($i < $l) { + $i += 50; // save iterations + if ($l - $start_index <= $css_chunk_length || $i >= $l) { + $css_chunks[] = $this->str_slice($css, $start_index); + break; + } + if ($css[$i - 1] === '}' && $i - $start_index > $css_chunk_length) { + // If there are two ending curly braces }} separated or not by spaces, + // join them in the same chunk (i.e. @media blocks) + $next_chunk = substr($css, $i); + if (preg_match('/^\s*\}/', $next_chunk)) { + $i = $i + $this->index_of($next_chunk, '}') + 1; + } + + $css_chunks[] = $this->str_slice($css, $start_index, $i); + $start_index = $i; + } + } + } + + // Minify each chunk + for ($i = 0, $n = count($css_chunks); $i < $n; $i++) { + $css_chunks[$i] = $this->minify($css_chunks[$i], $linebreak_pos); + // Keep the first @charset at-rule found + if (empty($charset) && preg_match($charset_regexp, $css_chunks[$i], $matches)) { + $charset = strtolower($matches[1]) . $matches[2]; + } + // Delete all @charset at-rules + $css_chunks[$i] = preg_replace($charset_regexp, '', $css_chunks[$i]); + } + + // Update the first chunk and push the charset to the top of the file. + $css_chunks[0] = $charset . $css_chunks[0]; + + return implode('', $css_chunks); + } + + /** + * Sets the memory limit for this script + * @param int|string $limit + */ + public function set_memory_limit($limit) + { + $this->memory_limit = $this->normalize_int($limit); + } + + /** + * Sets the maximum execution time for this script + * @param int|string $seconds + */ + public function set_max_execution_time($seconds) + { + $this->max_execution_time = (int) $seconds; + } + + /** + * Sets the PCRE backtrack limit for this script + * @param int $limit + */ + public function set_pcre_backtrack_limit($limit) + { + $this->pcre_backtrack_limit = (int) $limit; + } + + /** + * Sets the PCRE recursion limit for this script + * @param int $limit + */ + public function set_pcre_recursion_limit($limit) + { + $this->pcre_recursion_limit = (int) $limit; + } + + /** + * Try to configure PHP to use at least the suggested minimum settings + */ + private function do_raise_php_limits() + { + $php_limits = array( + 'memory_limit' => $this->memory_limit, + 'max_execution_time' => $this->max_execution_time, + 'pcre.backtrack_limit' => $this->pcre_backtrack_limit, + 'pcre.recursion_limit' => $this->pcre_recursion_limit + ); + + // If current settings are higher respect them. + foreach ($php_limits as $name => $suggested) { + $current = $this->normalize_int(ini_get($name)); + // memory_limit exception: allow -1 for "no memory limit". + if ($current > -1 && ($suggested == -1 || $current < $suggested)) { + ini_set($name, $suggested); + } + } + } + + /** + * Does bulk of the minification + * @param string $css + * @param int|bool $linebreak_pos + * @return string + */ + private function minify($css, $linebreak_pos) + { + // strings are safe, now wrestle the comments + for ($i = 0, $max = count($this->comments); $i < $max; $i++) { + + $token = $this->comments[$i]; + $placeholder = '/' . self::COMMENT . $i . '___/'; + + // ! in the first position of the comment means preserve + // so push to the preserved tokens keeping the ! + if (substr($token, 0, 1) === '!') { + $this->preserved_tokens[] = $token; + $token_tring = self::TOKEN . (count($this->preserved_tokens) - 1) . '___'; + $css = preg_replace($placeholder, $token_tring, $css, 1); + // Preserve new lines for /*! important comments + $css = preg_replace('/\s*[\n\r\f]+\s*(\/\*'. $token_tring .')/S', self::NL.'$1', $css); + $css = preg_replace('/('. $token_tring .'\*\/)\s*[\n\r\f]+\s*/', '$1'.self::NL, $css); + continue; + } + + // \ in the last position looks like hack for Mac/IE5 + // shorten that to /*\*/ and the next one to /**/ + if (substr($token, (strlen($token) - 1), 1) === '\\') { + $this->preserved_tokens[] = '\\'; + $css = preg_replace($placeholder, self::TOKEN . (count($this->preserved_tokens) - 1) . '___', $css, 1); + $i = $i + 1; // attn: advancing the loop + $this->preserved_tokens[] = ''; + $css = preg_replace('/' . self::COMMENT . $i . '___/', self::TOKEN . (count($this->preserved_tokens) - 1) . '___', $css, 1); + continue; + } + + // keep empty comments after child selectors (IE7 hack) + // e.g. html >/**/ body + if (strlen($token) === 0) { + $start_index = $this->index_of($css, $this->str_slice($placeholder, 1, -1)); + if ($start_index > 2) { + if (substr($css, $start_index - 3, 1) === '>') { + $this->preserved_tokens[] = ''; + $css = preg_replace($placeholder, self::TOKEN . (count($this->preserved_tokens) - 1) . '___', $css, 1); + } + } + } + + // in all other cases kill the comment + $css = preg_replace('/\/\*' . $this->str_slice($placeholder, 1, -1) . '\*\//', '', $css, 1); + } + + + // Normalize all whitespace strings to single spaces. Easier to work with that way. + $css = preg_replace('/\s+/', ' ', $css); + + // Fix IE7 issue on matrix filters which browser accept whitespaces between Matrix parameters + $css = preg_replace_callback('/\s*filter\:\s*progid:DXImageTransform\.Microsoft\.Matrix\(([^\)]+)\)/', array($this, 'preserve_old_IE_specific_matrix_definition'), $css); + + // Shorten & preserve calculations calc(...) since spaces are important + $css = preg_replace_callback('/calc(\(((?:[^\(\)]+|(?1))*)\))/i', array($this, 'replace_calc'), $css); + + // Replace positive sign from numbers preceded by : or a white-space before the leading space is removed + // +1.2em to 1.2em, +.8px to .8px, +2% to 2% + $css = preg_replace('/((? -9.0 to -9 + $css = preg_replace('/((?\+\(\)\]\~\=,])/', '$1', $css); + + // Restore spaces for !important + $css = preg_replace('/\!important/i', ' !important', $css); + + // bring back the colon + $css = preg_replace('/' . self::CLASSCOLON . '/', ':', $css); + + // retain space for special IE6 cases + $css = preg_replace_callback('/\:first\-(line|letter)(\{|,)/i', array($this, 'lowercase_pseudo_first'), $css); + + // no space after the end of a preserved comment + $css = preg_replace('/\*\/ /', '*/', $css); + + // lowercase some popular @directives + $css = preg_replace_callback('/@(font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframe|media|page|namespace)/i', array($this, 'lowercase_directives'), $css); + + // lowercase some more common pseudo-elements + $css = preg_replace_callback('/:(active|after|before|checked|disabled|empty|enabled|first-(?:child|of-type)|focus|hover|last-(?:child|of-type)|link|only-(?:child|of-type)|root|:selection|target|visited)/i', array($this, 'lowercase_pseudo_elements'), $css); + + // lowercase some more common functions + $css = preg_replace_callback('/:(lang|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|(?:-(?:moz|webkit)-)?any)\(/i', array($this, 'lowercase_common_functions'), $css); + + // lower case some common function that can be values + // NOTE: rgb() isn't useful as we replace with #hex later, as well as and() is already done for us + $css = preg_replace_callback('/([:,\( ]\s*)(attr|color-stop|from|rgba|to|url|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|max|min|(?:repeating-)?(?:linear|radial)-gradient)|-webkit-gradient)/iS', array($this, 'lowercase_common_functions_values'), $css); + + // Put the space back in some cases, to support stuff like + // @media screen and (-webkit-min-device-pixel-ratio:0){ + $css = preg_replace('/\band\(/i', 'and (', $css); + + // Remove the spaces after the things that should not have spaces after them. + $css = preg_replace('/([\!\{\}\:;\>\+\(\[\~\=,])\s+/S', '$1', $css); + + // remove unnecessary semicolons + $css = preg_replace('/;+\}/', '}', $css); + + // Fix for issue: #2528146 + // Restore semicolon if the last property is prefixed with a `*` (lte IE7 hack) + // to avoid issues on Symbian S60 3.x browsers. + $css = preg_replace('/(\*[a-z0-9\-]+\s*\:[^;\}]+)(\})/', '$1;$2', $css); + + // Replace 0 and 0 values with 0. + // data type: https://developer.mozilla.org/en-US/docs/Web/CSS/length + // data type: https://developer.mozilla.org/en-US/docs/Web/CSS/percentage + $css = preg_replace('/([^\\\\]\:|\s)0(?:em|ex|ch|rem|vw|vh|vm|vmin|cm|mm|in|px|pt|pc|%)/iS', '${1}0', $css); + + // 0% step in a keyframe? restore the % unit + $css = preg_replace_callback('/(@[a-z\-]*?keyframes[^\{]+\{)(.*?)(\}\})/iS', array($this, 'replace_keyframe_zero'), $css); + + // Replace 0 0; or 0 0 0; or 0 0 0 0; with 0. + $css = preg_replace('/\:0(?: 0){1,3}(;|\}| \!)/', ':0$1', $css); + + // Fix for issue: #2528142 + // Replace text-shadow:0; with text-shadow:0 0 0; + $css = preg_replace('/(text-shadow\:0)(;|\}| \!)/i', '$1 0 0$2', $css); + + // Replace background-position:0; with background-position:0 0; + // same for transform-origin + // Changing -webkit-mask-position: 0 0 to just a single 0 will result in the second parameter defaulting to 50% (center) + $css = preg_replace('/(background\-position|webkit-mask-position|(?:webkit|moz|o|ms|)\-?transform\-origin)\:0(;|\}| \!)/iS', '$1:0 0$2', $css); + + // Shorten colors from rgb(51,102,153) to #336699, rgb(100%,0%,0%) to #ff0000 (sRGB color space) + // Shorten colors from hsl(0, 100%, 50%) to #ff0000 (sRGB color space) + // This makes it more likely that it'll get further compressed in the next step. + $css = preg_replace_callback('/rgb\s*\(\s*([0-9,\s\-\.\%]+)\s*\)(.{1})/i', array($this, 'rgb_to_hex'), $css); + $css = preg_replace_callback('/hsl\s*\(\s*([0-9,\s\-\.\%]+)\s*\)(.{1})/i', array($this, 'hsl_to_hex'), $css); + + // Shorten colors from #AABBCC to #ABC or short color name. + $css = $this->compress_hex_colors($css); + + // border: none to border:0, outline: none to outline:0 + $css = preg_replace('/(border\-?(?:top|right|bottom|left|)|outline)\:none(;|\}| \!)/iS', '$1:0$2', $css); + + // shorter opacity IE filter + $css = preg_replace('/progid\:DXImageTransform\.Microsoft\.Alpha\(Opacity\=/i', 'alpha(opacity=', $css); + + // Find a fraction that is used for Opera's -o-device-pixel-ratio query + // Add token to add the "\" back in later + $css = preg_replace('/\(([a-z\-]+):([0-9]+)\/([0-9]+)\)/i', '($1:$2'. self::QUERY_FRACTION .'$3)', $css); + + // Remove empty rules. + $css = preg_replace('/[^\};\{\/]+\{\}/S', '', $css); + + // Add "/" back to fix Opera -o-device-pixel-ratio query + $css = preg_replace('/'. self::QUERY_FRACTION .'/', '/', $css); + + // Replace multiple semi-colons in a row by a single one + // See SF bug #1980989 + $css = preg_replace('/;;+/', ';', $css); + + // Restore new lines for /*! important comments + $css = preg_replace('/'. self::NL .'/', "\n", $css); + + // Lowercase all uppercase properties + $css = preg_replace_callback('/(\{|\;)([A-Z\-]+)(\:)/', array($this, 'lowercase_properties'), $css); + + // Some source control tools don't like it when files containing lines longer + // than, say 8000 characters, are checked in. The linebreak option is used in + // that case to split long lines after a specific column. + if ($linebreak_pos !== FALSE && (int) $linebreak_pos >= 0) { + $linebreak_pos = (int) $linebreak_pos; + $start_index = $i = 0; + while ($i < strlen($css)) { + $i++; + if ($css[$i - 1] === '}' && $i - $start_index > $linebreak_pos) { + $css = $this->str_slice($css, 0, $i) . "\n" . $this->str_slice($css, $i); + $start_index = $i; + } + } + } + + // restore preserved comments and strings in reverse order + for ($i = count($this->preserved_tokens) - 1; $i >= 0; $i--) { + $css = preg_replace('/' . self::TOKEN . $i . '___/', $this->preserved_tokens[$i], $css, 1); + } + + // Trim the final string (for any leading or trailing white spaces) + return trim($css); + } + + /** + * Utility method to replace all data urls with tokens before we start + * compressing, to avoid performance issues running some of the subsequent + * regexes against large strings chunks. + * + * @param string $css + * @return string + */ + private function extract_data_urls($css) + { + // Leave data urls alone to increase parse performance. + $max_index = strlen($css) - 1; + $append_index = $index = $last_index = $offset = 0; + $sb = array(); + $pattern = '/url\(\s*(["\']?)data\:/i'; + + // Since we need to account for non-base64 data urls, we need to handle + // ' and ) being part of the data string. Hence switching to indexOf, + // to determine whether or not we have matching string terminators and + // handling sb appends directly, instead of using matcher.append* methods. + + while (preg_match($pattern, $css, $m, 0, $offset)) { + $index = $this->index_of($css, $m[0], $offset); + $last_index = $index + strlen($m[0]); + $start_index = $index + 4; // "url(".length() + $end_index = $last_index - 1; + $terminator = $m[1]; // ', " or empty (not quoted) + $found_terminator = FALSE; + + if (strlen($terminator) === 0) { + $terminator = ')'; + } + + while ($found_terminator === FALSE && $end_index+1 <= $max_index) { + $end_index = $this->index_of($css, $terminator, $end_index + 1); + + // endIndex == 0 doesn't really apply here + if ($end_index > 0 && substr($css, $end_index - 1, 1) !== '\\') { + $found_terminator = TRUE; + if (')' != $terminator) { + $end_index = $this->index_of($css, ')', $end_index); + } + } + } + + // Enough searching, start moving stuff over to the buffer + $sb[] = $this->str_slice($css, $append_index, $index); + + if ($found_terminator) { + $token = $this->str_slice($css, $start_index, $end_index); + $token = preg_replace('/\s+/', '', $token); + $this->preserved_tokens[] = $token; + + $preserver = 'url(' . self::TOKEN . (count($this->preserved_tokens) - 1) . '___)'; + $sb[] = $preserver; + + $append_index = $end_index + 1; + } else { + // No end terminator found, re-add the whole match. Should we throw/warn here? + $sb[] = $this->str_slice($css, $index, $last_index); + $append_index = $last_index; + } + + $offset = $last_index; + } + + $sb[] = $this->str_slice($css, $append_index); + + return implode('', $sb); + } + + /** + * Utility method to compress hex color values of the form #AABBCC to #ABC or short color name. + * + * DOES NOT compress CSS ID selectors which match the above pattern (which would break things). + * e.g. #AddressForm { ... } + * + * DOES NOT compress IE filters, which have hex color values (which would break things). + * e.g. filter: chroma(color="#FFFFFF"); + * + * DOES NOT compress invalid hex values. + * e.g. background-color: #aabbccdd + * + * @param string $css + * @return string + */ + private function compress_hex_colors($css) + { + // Look for hex colors inside { ... } (to avoid IDs) and which don't have a =, or a " in front of them (to avoid filters) + $pattern = '/(\=\s*?["\']?)?#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])(\}|[^0-9a-f{][^{]*?\})/iS'; + $_index = $index = $last_index = $offset = 0; + $sb = array(); + // See: http://ajaxmin.codeplex.com/wikipage?title=CSS%20Colors + $short_safe = array( + '#808080' => 'gray', + '#008000' => 'green', + '#800000' => 'maroon', + '#000080' => 'navy', + '#808000' => 'olive', + '#ffa500' => 'orange', + '#800080' => 'purple', + '#c0c0c0' => 'silver', + '#008080' => 'teal', + '#f00' => 'red' + ); + + while (preg_match($pattern, $css, $m, 0, $offset)) { + $index = $this->index_of($css, $m[0], $offset); + $last_index = $index + strlen($m[0]); + $is_filter = $m[1] !== null && $m[1] !== ''; + + $sb[] = $this->str_slice($css, $_index, $index); + + if ($is_filter) { + // Restore, maintain case, otherwise filter will break + $sb[] = $m[1] . '#' . $m[2] . $m[3] . $m[4] . $m[5] . $m[6] . $m[7]; + } else { + if (strtolower($m[2]) == strtolower($m[3]) && + strtolower($m[4]) == strtolower($m[5]) && + strtolower($m[6]) == strtolower($m[7])) { + // Compress. + $hex = '#' . strtolower($m[3] . $m[5] . $m[7]); + } else { + // Non compressible color, restore but lower case. + $hex = '#' . strtolower($m[2] . $m[3] . $m[4] . $m[5] . $m[6] . $m[7]); + } + // replace Hex colors to short safe color names + $sb[] = array_key_exists($hex, $short_safe) ? $short_safe[$hex] : $hex; + } + + $_index = $offset = $last_index - strlen($m[8]); + } + + $sb[] = $this->str_slice($css, $_index); + + return implode('', $sb); + } + + /* CALLBACKS + * --------------------------------------------------------------------------------------------- + */ + + private function replace_string($matches) + { + $match = $matches[0]; + $quote = substr($match, 0, 1); + // Must use addcslashes in PHP to avoid parsing of backslashes + $match = addcslashes($this->str_slice($match, 1, -1), '\\'); + + // maybe the string contains a comment-like substring? + // one, maybe more? put'em back then + if (($pos = $this->index_of($match, self::COMMENT)) >= 0) { + for ($i = 0, $max = count($this->comments); $i < $max; $i++) { + $match = preg_replace('/' . self::COMMENT . $i . '___/', $this->comments[$i], $match, 1); + } + } + + // minify alpha opacity in filter strings + $match = preg_replace('/progid\:DXImageTransform\.Microsoft\.Alpha\(Opacity\=/i', 'alpha(opacity=', $match); + + $this->preserved_tokens[] = $match; + return $quote . self::TOKEN . (count($this->preserved_tokens) - 1) . '___' . $quote; + } + + private function replace_colon($matches) + { + return preg_replace('/\:/', self::CLASSCOLON, $matches[0]); + } + + private function replace_calc($matches) + { + $this->preserved_tokens[] = trim(preg_replace('/\s*([\*\/\(\),])\s*/', '$1', $matches[2])); + return 'calc('. self::TOKEN . (count($this->preserved_tokens) - 1) . '___' . ')'; + } + + private function preserve_old_IE_specific_matrix_definition($matches) + { + $this->preserved_tokens[] = $matches[1]; + return 'filter:progid:DXImageTransform.Microsoft.Matrix(' . self::TOKEN . (count($this->preserved_tokens) - 1) . '___' . ')'; + } + + private function replace_keyframe_zero($matches) + { + return $matches[1] . preg_replace('/0(\{|,[^\)\{]+\{)/', '0%$1', $matches[2]) . $matches[3]; + } + + private function rgb_to_hex($matches) + { + // Support for percentage values rgb(100%, 0%, 45%); + if ($this->index_of($matches[1], '%') >= 0){ + $rgbcolors = explode(',', str_replace('%', '', $matches[1])); + for ($i = 0; $i < count($rgbcolors); $i++) { + $rgbcolors[$i] = $this->round_number(floatval($rgbcolors[$i]) * 2.55); + } + } else { + $rgbcolors = explode(',', $matches[1]); + } + + // Values outside the sRGB color space should be clipped (0-255) + for ($i = 0; $i < count($rgbcolors); $i++) { + $rgbcolors[$i] = $this->clamp_number(intval($rgbcolors[$i], 10), 0, 255); + $rgbcolors[$i] = sprintf("%02x", $rgbcolors[$i]); + } + + // Fix for issue #2528093 + if (!preg_match('/[\s\,\);\}]/', $matches[2])){ + $matches[2] = ' ' . $matches[2]; + } + + return '#' . implode('', $rgbcolors) . $matches[2]; + } + + private function hsl_to_hex($matches) + { + $values = explode(',', str_replace('%', '', $matches[1])); + $h = floatval($values[0]); + $s = floatval($values[1]); + $l = floatval($values[2]); + + // Wrap and clamp, then fraction! + $h = ((($h % 360) + 360) % 360) / 360; + $s = $this->clamp_number($s, 0, 100) / 100; + $l = $this->clamp_number($l, 0, 100) / 100; + + if ($s == 0) { + $r = $g = $b = $this->round_number(255 * $l); + } else { + $v2 = $l < 0.5 ? $l * (1 + $s) : ($l + $s) - ($s * $l); + $v1 = (2 * $l) - $v2; + $r = $this->round_number(255 * $this->hue_to_rgb($v1, $v2, $h + (1/3))); + $g = $this->round_number(255 * $this->hue_to_rgb($v1, $v2, $h)); + $b = $this->round_number(255 * $this->hue_to_rgb($v1, $v2, $h - (1/3))); + } + + return $this->rgb_to_hex(array('', $r.','.$g.','.$b, $matches[2])); + } + + private function lowercase_pseudo_first($matches) + { + return ':first-'. strtolower($matches[1]) .' '. $matches[2]; + } + + private function lowercase_directives($matches) + { + return '@'. strtolower($matches[1]); + } + + private function lowercase_pseudo_elements($matches) + { + return ':'. strtolower($matches[1]); + } + + private function lowercase_common_functions($matches) + { + return ':'. strtolower($matches[1]) .'('; + } + + private function lowercase_common_functions_values($matches) + { + return $matches[1] . strtolower($matches[2]); + } + + private function lowercase_properties($matches) + { + return $matches[1].strtolower($matches[2]).$matches[3]; + } + + /* HELPERS + * --------------------------------------------------------------------------------------------- + */ + + private function hue_to_rgb($v1, $v2, $vh) + { + $vh = $vh < 0 ? $vh + 1 : ($vh > 1 ? $vh - 1 : $vh); + if ($vh * 6 < 1) return $v1 + ($v2 - $v1) * 6 * $vh; + if ($vh * 2 < 1) return $v2; + if ($vh * 3 < 2) return $v1 + ($v2 - $v1) * ((2/3) - $vh) * 6; + return $v1; + } + + private function round_number($n) + { + return intval(floor(floatval($n) + 0.5), 10); + } + + private function clamp_number($n, $min, $max) + { + return min(max($n, $min), $max); + } + + /** + * PHP port of Javascript's "indexOf" function for strings only + * Author: Tubal Martin http://blog.margenn.com + * + * @param string $haystack + * @param string $needle + * @param int $offset index (optional) + * @return int + */ + private function index_of($haystack, $needle, $offset = 0) + { + $index = strpos($haystack, $needle, $offset); + + return ($index !== FALSE) ? $index : -1; + } + + /** + * PHP port of Javascript's "slice" function for strings only + * Author: Tubal Martin http://blog.margenn.com + * Tests: http://margenn.com/tubal/str_slice/ + * + * @param string $str + * @param int $start index + * @param int|bool $end index (optional) + * @return string + */ + private function str_slice($str, $start = 0, $end = FALSE) + { + if ($end !== FALSE && ($start < 0 || $end <= 0)) { + $max = strlen($str); + + if ($start < 0) { + if (($start = $max + $start) < 0) { + return ''; + } + } + + if ($end < 0) { + if (($end = $max + $end) < 0) { + return ''; + } + } + + if ($end <= $start) { + return ''; + } + } + + $slice = ($end === FALSE) ? substr($str, $start) : substr($str, $start, $end - $start); + return ($slice === FALSE) ? '' : $slice; + } + + /** + * Convert strings like "64M" or "30" to int values + * @param mixed $size + * @return int + */ + private function normalize_int($size) + { + if (is_string($size)) { + switch (substr($size, -1)) { + case 'M': case 'm': return $size * 1048576; + case 'K': case 'k': return $size * 1024; + case 'G': case 'g': return $size * 1073741824; + } + } + + return (int) $size; + } +} \ No newline at end of file diff --git a/admin/less/lib/less.js b/admin/less/lib/less.js new file mode 100644 index 0000000..fcdcbed --- /dev/null +++ b/admin/less/lib/less.js @@ -0,0 +1,7942 @@ +/*! + * Less - Leaner CSS v1.7.3 + * http://lesscss.org + * + * Copyright (c) 2009-2014, Alexis Sellier + * Licensed under the Apache v2 License. + * + */ + + /** * @license Apache v2 + */ + + + +(function (window, undefined) {// +// Stub out `require` in the browser +// +function require(arg) { + return window.less[arg.split('/')[1]]; +}; + + +if (typeof(window.less) === 'undefined' || typeof(window.less.nodeType) !== 'undefined') { window.less = {}; } +less = window.less; +tree = window.less.tree = {}; +less.mode = 'browser'; + +var less, tree; + +// Node.js does not have a header file added which defines less +if (less === undefined) { + less = exports; + tree = require('./tree'); + less.mode = 'node'; +} +// +// less.js - parser +// +// A relatively straight-forward predictive parser. +// There is no tokenization/lexing stage, the input is parsed +// in one sweep. +// +// To make the parser fast enough to run in the browser, several +// optimization had to be made: +// +// - Matching and slicing on a huge input is often cause of slowdowns. +// The solution is to chunkify the input into smaller strings. +// The chunks are stored in the `chunks` var, +// `j` holds the current chunk index, and `currentPos` holds +// the index of the current chunk in relation to `input`. +// This gives us an almost 4x speed-up. +// +// - In many cases, we don't need to match individual tokens; +// for example, if a value doesn't hold any variables, operations +// or dynamic references, the parser can effectively 'skip' it, +// treating it as a literal. +// An example would be '1px solid #000' - which evaluates to itself, +// we don't need to know what the individual components are. +// The drawback, of course is that you don't get the benefits of +// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, +// and a smaller speed-up in the code-gen. +// +// +// Token matching is done with the `$` function, which either takes +// a terminal string or regexp, or a non-terminal function to call. +// It also takes care of moving all the indices forwards. +// +// +less.Parser = function Parser(env) { + var input, // LeSS input string + i, // current index in `input` + j, // current chunk + saveStack = [], // holds state for backtracking + furthest, // furthest index the parser has gone to + chunks, // chunkified input + current, // current chunk + currentPos, // index of current chunk, in `input` + parser, + parsers, + rootFilename = env && env.filename; + + // Top parser on an import tree must be sure there is one "env" + // which will then be passed around by reference. + if (!(env instanceof tree.parseEnv)) { + env = new tree.parseEnv(env); + } + + var imports = this.imports = { + paths: env.paths || [], // Search paths, when importing + queue: [], // Files which haven't been imported yet + files: env.files, // Holds the imported parse trees + contents: env.contents, // Holds the imported file contents + contentsIgnoredChars: env.contentsIgnoredChars, // lines inserted, not in the original less + mime: env.mime, // MIME type of .less files + error: null, // Error in parsing/evaluating an import + push: function (path, currentFileInfo, importOptions, callback) { + var parserImports = this; + this.queue.push(path); + + var fileParsedFunc = function (e, root, fullPath) { + parserImports.queue.splice(parserImports.queue.indexOf(path), 1); // Remove the path from the queue + + var importedPreviously = fullPath === rootFilename; + + parserImports.files[fullPath] = root; // Store the root + + if (e && !parserImports.error) { parserImports.error = e; } + + callback(e, root, importedPreviously, fullPath); + }; + + if (less.Parser.importer) { + less.Parser.importer(path, currentFileInfo, fileParsedFunc, env); + } else { + less.Parser.fileLoader(path, currentFileInfo, function(e, contents, fullPath, newFileInfo) { + if (e) {fileParsedFunc(e); return;} + + var newEnv = new tree.parseEnv(env); + + newEnv.currentFileInfo = newFileInfo; + newEnv.processImports = false; + newEnv.contents[fullPath] = contents; + + if (currentFileInfo.reference || importOptions.reference) { + newFileInfo.reference = true; + } + + if (importOptions.inline) { + fileParsedFunc(null, contents, fullPath); + } else { + new(less.Parser)(newEnv).parse(contents, function (e, root) { + fileParsedFunc(e, root, fullPath); + }); + } + }, env); + } + } + }; + + function save() { currentPos = i; saveStack.push( { current: current, i: i, j: j }); } + function restore() { var state = saveStack.pop(); current = state.current; currentPos = i = state.i; j = state.j; } + function forget() { saveStack.pop(); } + + function sync() { + if (i > currentPos) { + current = current.slice(i - currentPos); + currentPos = i; + } + } + function isWhitespace(str, pos) { + var code = str.charCodeAt(pos | 0); + return (code <= 32) && (code === 32 || code === 10 || code === 9); + } + // + // Parse from a token, regexp or string, and move forward if match + // + function $(tok) { + var tokType = typeof tok, + match, length; + + // Either match a single character in the input, + // or match a regexp in the current chunk (`current`). + // + if (tokType === "string") { + if (input.charAt(i) !== tok) { + return null; + } + skipWhitespace(1); + return tok; + } + + // regexp + sync (); + if (! (match = tok.exec(current))) { + return null; + } + + length = match[0].length; + + // The match is confirmed, add the match length to `i`, + // and consume any extra white-space characters (' ' || '\n') + // which come after that. The reason for this is that LeSS's + // grammar is mostly white-space insensitive. + // + skipWhitespace(length); + + if(typeof(match) === 'string') { + return match; + } else { + return match.length === 1 ? match[0] : match; + } + } + + // Specialization of $(tok) + function $re(tok) { + if (i > currentPos) { + current = current.slice(i - currentPos); + currentPos = i; + } + var m = tok.exec(current); + if (!m) { + return null; + } + + skipWhitespace(m[0].length); + if(typeof m === "string") { + return m; + } + + return m.length === 1 ? m[0] : m; + } + + var _$re = $re; + + // Specialization of $(tok) + function $char(tok) { + if (input.charAt(i) !== tok) { + return null; + } + skipWhitespace(1); + return tok; + } + + function skipWhitespace(length) { + var oldi = i, oldj = j, + curr = i - currentPos, + endIndex = i + current.length - curr, + mem = (i += length), + inp = input, + c; + + for (; i < endIndex; i++) { + c = inp.charCodeAt(i); + if (c > 32) { + break; + } + + if ((c !== 32) && (c !== 10) && (c !== 9) && (c !== 13)) { + break; + } + } + + current = current.slice(length + i - mem + curr); + currentPos = i; + + if (!current.length && (j < chunks.length - 1)) { + current = chunks[++j]; + skipWhitespace(0); // skip space at the beginning of a chunk + return true; // things changed + } + + return oldi !== i || oldj !== j; + } + + function expect(arg, msg) { + // some older browsers return typeof 'function' for RegExp + var result = (Object.prototype.toString.call(arg) === '[object Function]') ? arg.call(parsers) : $(arg); + if (result) { + return result; + } + error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" + : "unexpected token")); + } + + // Specialization of expect() + function expectChar(arg, msg) { + if (input.charAt(i) === arg) { + skipWhitespace(1); + return arg; + } + error(msg || "expected '" + arg + "' got '" + input.charAt(i) + "'"); + } + + function error(msg, type) { + var e = new Error(msg); + e.index = i; + e.type = type || 'Syntax'; + throw e; + } + + // Same as $(), but don't change the state of the parser, + // just return the match. + function peek(tok) { + if (typeof(tok) === 'string') { + return input.charAt(i) === tok; + } else { + return tok.test(current); + } + } + + // Specialization of peek() + function peekChar(tok) { + return input.charAt(i) === tok; + } + + + function getInput(e, env) { + if (e.filename && env.currentFileInfo.filename && (e.filename !== env.currentFileInfo.filename)) { + return parser.imports.contents[e.filename]; + } else { + return input; + } + } + + function getLocation(index, inputStream) { + var n = index + 1, + line = null, + column = -1; + + while (--n >= 0 && inputStream.charAt(n) !== '\n') { + column++; + } + + if (typeof index === 'number') { + line = (inputStream.slice(0, index).match(/\n/g) || "").length; + } + + return { + line: line, + column: column + }; + } + + function getDebugInfo(index, inputStream, env) { + var filename = env.currentFileInfo.filename; + if(less.mode !== 'browser' && less.mode !== 'rhino') { + filename = require('path').resolve(filename); + } + + return { + lineNumber: getLocation(index, inputStream).line + 1, + fileName: filename + }; + } + + function LessError(e, env) { + var input = getInput(e, env), + loc = getLocation(e.index, input), + line = loc.line, + col = loc.column, + callLine = e.call && getLocation(e.call, input).line, + lines = input.split('\n'); + + this.type = e.type || 'Syntax'; + this.message = e.message; + this.filename = e.filename || env.currentFileInfo.filename; + this.index = e.index; + this.line = typeof(line) === 'number' ? line + 1 : null; + this.callLine = callLine + 1; + this.callExtract = lines[callLine]; + this.stack = e.stack; + this.column = col; + this.extract = [ + lines[line - 1], + lines[line], + lines[line + 1] + ]; + } + + LessError.prototype = new Error(); + LessError.prototype.constructor = LessError; + + this.env = env = env || {}; + + // The optimization level dictates the thoroughness of the parser, + // the lower the number, the less nodes it will create in the tree. + // This could matter for debugging, or if you want to access + // the individual nodes in the tree. + this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; + + // + // The Parser + // + parser = { + + imports: imports, + // + // Parse an input string into an abstract syntax tree, + // @param str A string containing 'less' markup + // @param callback call `callback` when done. + // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply + // + parse: function (str, callback, additionalData) { + var root, line, lines, error = null, globalVars, modifyVars, preText = ""; + + i = j = currentPos = furthest = 0; + + globalVars = (additionalData && additionalData.globalVars) ? less.Parser.serializeVars(additionalData.globalVars) + '\n' : ''; + modifyVars = (additionalData && additionalData.modifyVars) ? '\n' + less.Parser.serializeVars(additionalData.modifyVars) : ''; + + if (globalVars || (additionalData && additionalData.banner)) { + preText = ((additionalData && additionalData.banner) ? additionalData.banner : "") + globalVars; + parser.imports.contentsIgnoredChars[env.currentFileInfo.filename] = preText.length; + } + + str = str.replace(/\r\n/g, '\n'); + // Remove potential UTF Byte Order Mark + input = str = preText + str.replace(/^\uFEFF/, '') + modifyVars; + parser.imports.contents[env.currentFileInfo.filename] = str; + + // Split the input into chunks. + chunks = (function (input) { + var len = input.length, level = 0, parenLevel = 0, + lastOpening, lastOpeningParen, lastMultiComment, lastMultiCommentEndBrace, + chunks = [], emitFrom = 0, + parserCurrentIndex, currentChunkStartIndex, cc, cc2, matched; + + function fail(msg, index) { + error = new(LessError)({ + index: index || parserCurrentIndex, + type: 'Parse', + message: msg, + filename: env.currentFileInfo.filename + }, env); + } + + function emitChunk(force) { + var len = parserCurrentIndex - emitFrom; + if (((len < 512) && !force) || !len) { + return; + } + chunks.push(input.slice(emitFrom, parserCurrentIndex + 1)); + emitFrom = parserCurrentIndex + 1; + } + + for (parserCurrentIndex = 0; parserCurrentIndex < len; parserCurrentIndex++) { + cc = input.charCodeAt(parserCurrentIndex); + if (((cc >= 97) && (cc <= 122)) || (cc < 34)) { + // a-z or whitespace + continue; + } + + switch (cc) { + case 40: // ( + parenLevel++; + lastOpeningParen = parserCurrentIndex; + continue; + case 41: // ) + if (--parenLevel < 0) { + return fail("missing opening `(`"); + } + continue; + case 59: // ; + if (!parenLevel) { emitChunk(); } + continue; + case 123: // { + level++; + lastOpening = parserCurrentIndex; + continue; + case 125: // } + if (--level < 0) { + return fail("missing opening `{`"); + } + if (!level && !parenLevel) { emitChunk(); } + continue; + case 92: // \ + if (parserCurrentIndex < len - 1) { parserCurrentIndex++; continue; } + return fail("unescaped `\\`"); + case 34: + case 39: + case 96: // ", ' and ` + matched = 0; + currentChunkStartIndex = parserCurrentIndex; + for (parserCurrentIndex = parserCurrentIndex + 1; parserCurrentIndex < len; parserCurrentIndex++) { + cc2 = input.charCodeAt(parserCurrentIndex); + if (cc2 > 96) { continue; } + if (cc2 == cc) { matched = 1; break; } + if (cc2 == 92) { // \ + if (parserCurrentIndex == len - 1) { + return fail("unescaped `\\`"); + } + parserCurrentIndex++; + } + } + if (matched) { continue; } + return fail("unmatched `" + String.fromCharCode(cc) + "`", currentChunkStartIndex); + case 47: // /, check for comment + if (parenLevel || (parserCurrentIndex == len - 1)) { continue; } + cc2 = input.charCodeAt(parserCurrentIndex + 1); + if (cc2 == 47) { + // //, find lnfeed + for (parserCurrentIndex = parserCurrentIndex + 2; parserCurrentIndex < len; parserCurrentIndex++) { + cc2 = input.charCodeAt(parserCurrentIndex); + if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; } + } + } else if (cc2 == 42) { + // /*, find */ + lastMultiComment = currentChunkStartIndex = parserCurrentIndex; + for (parserCurrentIndex = parserCurrentIndex + 2; parserCurrentIndex < len - 1; parserCurrentIndex++) { + cc2 = input.charCodeAt(parserCurrentIndex); + if (cc2 == 125) { lastMultiCommentEndBrace = parserCurrentIndex; } + if (cc2 != 42) { continue; } + if (input.charCodeAt(parserCurrentIndex + 1) == 47) { break; } + } + if (parserCurrentIndex == len - 1) { + return fail("missing closing `*/`", currentChunkStartIndex); + } + parserCurrentIndex++; + } + continue; + case 42: // *, check for unmatched */ + if ((parserCurrentIndex < len - 1) && (input.charCodeAt(parserCurrentIndex + 1) == 47)) { + return fail("unmatched `/*`"); + } + continue; + } + } + + if (level !== 0) { + if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) { + return fail("missing closing `}` or `*/`", lastOpening); + } else { + return fail("missing closing `}`", lastOpening); + } + } else if (parenLevel !== 0) { + return fail("missing closing `)`", lastOpeningParen); + } + + emitChunk(true); + return chunks; + })(str); + + if (error) { + return callback(new(LessError)(error, env)); + } + + current = chunks[0]; + + // Start with the primary rule. + // The whole syntax tree is held under a Ruleset node, + // with the `root` property set to true, so no `{}` are + // output. The callback is called when the input is parsed. + try { + root = new(tree.Ruleset)(null, this.parsers.primary()); + root.root = true; + root.firstRoot = true; + } catch (e) { + return callback(new(LessError)(e, env)); + } + + root.toCSS = (function (evaluate) { + return function (options, variables) { + options = options || {}; + var evaldRoot, + css, + evalEnv = new tree.evalEnv(options); + + // + // Allows setting variables with a hash, so: + // + // `{ color: new(tree.Color)('#f01') }` will become: + // + // new(tree.Rule)('@color', + // new(tree.Value)([ + // new(tree.Expression)([ + // new(tree.Color)('#f01') + // ]) + // ]) + // ) + // + if (typeof(variables) === 'object' && !Array.isArray(variables)) { + variables = Object.keys(variables).map(function (k) { + var value = variables[k]; + + if (! (value instanceof tree.Value)) { + if (! (value instanceof tree.Expression)) { + value = new(tree.Expression)([value]); + } + value = new(tree.Value)([value]); + } + return new(tree.Rule)('@' + k, value, false, null, 0); + }); + evalEnv.frames = [new(tree.Ruleset)(null, variables)]; + } + + try { + var preEvalVisitors = [], + visitors = [ + new(tree.joinSelectorVisitor)(), + new(tree.processExtendsVisitor)(), + new(tree.toCSSVisitor)({compress: Boolean(options.compress)}) + ], i, root = this; + + if (options.plugins) { + for(i =0; i < options.plugins.length; i++) { + if (options.plugins[i].isPreEvalVisitor) { + preEvalVisitors.push(options.plugins[i]); + } else { + if (options.plugins[i].isPreVisitor) { + visitors.splice(0, 0, options.plugins[i]); + } else { + visitors.push(options.plugins[i]); + } + } + } + } + + for(i = 0; i < preEvalVisitors.length; i++) { + preEvalVisitors[i].run(root); + } + + evaldRoot = evaluate.call(root, evalEnv); + + for(i = 0; i < visitors.length; i++) { + visitors[i].run(evaldRoot); + } + + if (options.sourceMap) { + evaldRoot = new tree.sourceMapOutput( + { + contentsIgnoredCharsMap: parser.imports.contentsIgnoredChars, + writeSourceMap: options.writeSourceMap, + rootNode: evaldRoot, + contentsMap: parser.imports.contents, + sourceMapFilename: options.sourceMapFilename, + sourceMapURL: options.sourceMapURL, + outputFilename: options.sourceMapOutputFilename, + sourceMapBasepath: options.sourceMapBasepath, + sourceMapRootpath: options.sourceMapRootpath, + outputSourceFiles: options.outputSourceFiles, + sourceMapGenerator: options.sourceMapGenerator + }); + } + + css = evaldRoot.toCSS({ + compress: Boolean(options.compress), + dumpLineNumbers: env.dumpLineNumbers, + strictUnits: Boolean(options.strictUnits), + numPrecision: 8}); + } catch (e) { + throw new(LessError)(e, env); + } + + if (options.cleancss && less.mode === 'node') { + var CleanCSS = require('clean-css'), + cleancssOptions = options.cleancssOptions || {}; + + if (cleancssOptions.keepSpecialComments === undefined) { + cleancssOptions.keepSpecialComments = "*"; + } + cleancssOptions.processImport = false; + cleancssOptions.noRebase = true; + if (cleancssOptions.noAdvanced === undefined) { + cleancssOptions.noAdvanced = true; + } + + return new CleanCSS(cleancssOptions).minify(css); + } else if (options.compress) { + return css.replace(/(^(\s)+)|((\s)+$)/g, ""); + } else { + return css; + } + }; + })(root.eval); + + // If `i` is smaller than the `input.length - 1`, + // it means the parser wasn't able to parse the whole + // string, so we've got a parsing error. + // + // We try to extract a \n delimited string, + // showing the line where the parse error occured. + // We split it up into two parts (the part which parsed, + // and the part which didn't), so we can color them differently. + if (i < input.length - 1) { + i = furthest; + var loc = getLocation(i, input); + lines = input.split('\n'); + line = loc.line + 1; + + error = { + type: "Parse", + message: "Unrecognised input", + index: i, + filename: env.currentFileInfo.filename, + line: line, + column: loc.column, + extract: [ + lines[line - 2], + lines[line - 1], + lines[line] + ] + }; + } + + var finish = function (e) { + e = error || e || parser.imports.error; + + if (e) { + if (!(e instanceof LessError)) { + e = new(LessError)(e, env); + } + + return callback(e); + } + else { + return callback(null, root); + } + }; + + if (env.processImports !== false) { + new tree.importVisitor(this.imports, finish) + .run(root); + } else { + return finish(); + } + }, + + // + // Here in, the parsing rules/functions + // + // The basic structure of the syntax tree generated is as follows: + // + // Ruleset -> Rule -> Value -> Expression -> Entity + // + // Here's some Less code: + // + // .class { + // color: #fff; + // border: 1px solid #000; + // width: @w + 4px; + // > .child {...} + // } + // + // And here's what the parse tree might look like: + // + // Ruleset (Selector '.class', [ + // Rule ("color", Value ([Expression [Color #fff]])) + // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) + // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) + // Ruleset (Selector [Element '>', '.child'], [...]) + // ]) + // + // In general, most rules will try to parse a token with the `$()` function, and if the return + // value is truly, will return a new node, of the relevant type. Sometimes, we need to check + // first, before parsing, that's when we use `peek()`. + // + parsers: parsers = { + // + // The `primary` rule is the *entry* and *exit* point of the parser. + // The rules here can appear at any level of the parse tree. + // + // The recursive nature of the grammar is an interplay between the `block` + // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, + // as represented by this simplified grammar: + // + // primary → (ruleset | rule)+ + // ruleset → selector+ block + // block → '{' primary '}' + // + // Only at one point is the primary rule not called from the + // block rule: at the root level. + // + primary: function () { + var mixin = this.mixin, $re = _$re, root = [], node; + + while (current) + { + node = this.extendRule() || mixin.definition() || this.rule() || this.ruleset() || + mixin.call() || this.comment() || this.rulesetCall() || this.directive(); + if (node) { + root.push(node); + } else { + if (!($re(/^[\s\n]+/) || $re(/^;+/))) { + break; + } + } + if (peekChar('}')) { + break; + } + } + + return root; + }, + + // We create a Comment node for CSS comments `/* */`, + // but keep the LeSS comments `//` silent, by just skipping + // over them. + comment: function () { + var comment; + + if (input.charAt(i) !== '/') { return; } + + if (input.charAt(i + 1) === '/') { + return new(tree.Comment)($re(/^\/\/.*/), true, i, env.currentFileInfo); + } + comment = $re(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/); + if (comment) { + return new(tree.Comment)(comment, false, i, env.currentFileInfo); + } + }, + + comments: function () { + var comment, comments = []; + + while(true) { + comment = this.comment(); + if (!comment) { + break; + } + comments.push(comment); + } + + return comments; + }, + + // + // Entities are tokens which can be found inside an Expression + // + entities: { + // + // A string, which supports escaping " and ' + // + // "milky way" 'he\'s the one!' + // + quoted: function () { + var str, j = i, e, index = i; + + if (input.charAt(j) === '~') { j++; e = true; } // Escaped strings + if (input.charAt(j) !== '"' && input.charAt(j) !== "'") { return; } + + if (e) { $char('~'); } + + str = $re(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/); + if (str) { + return new(tree.Quoted)(str[0], str[1] || str[2], e, index, env.currentFileInfo); + } + }, + + // + // A catch-all word, such as: + // + // black border-collapse + // + keyword: function () { + var k; + + k = $re(/^%|^[_A-Za-z-][_A-Za-z0-9-]*/); + if (k) { + var color = tree.Color.fromKeyword(k); + if (color) { + return color; + } + return new(tree.Keyword)(k); + } + }, + + // + // A function call + // + // rgb(255, 0, 255) + // + // We also try to catch IE's `alpha()`, but let the `alpha` parser + // deal with the details. + // + // The arguments are parsed with the `entities.arguments` parser. + // + call: function () { + var name, nameLC, args, alpha_ret, index = i; + + name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(current); + if (!name) { return; } + + name = name[1]; + nameLC = name.toLowerCase(); + if (nameLC === 'url') { + return null; + } + + i += name.length; + + if (nameLC === 'alpha') { + alpha_ret = parsers.alpha(); + if(typeof alpha_ret !== 'undefined') { + return alpha_ret; + } + } + + $char('('); // Parse the '(' and consume whitespace. + + args = this.arguments(); + + if (! $char(')')) { + return; + } + + if (name) { return new(tree.Call)(name, args, index, env.currentFileInfo); } + }, + arguments: function () { + var args = [], arg; + + while (true) { + arg = this.assignment() || parsers.expression(); + if (!arg) { + break; + } + args.push(arg); + if (! $char(',')) { + break; + } + } + return args; + }, + literal: function () { + return this.dimension() || + this.color() || + this.quoted() || + this.unicodeDescriptor(); + }, + + // Assignments are argument entities for calls. + // They are present in ie filter properties as shown below. + // + // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) + // + + assignment: function () { + var key, value; + key = $re(/^\w+(?=\s?=)/i); + if (!key) { + return; + } + if (!$char('=')) { + return; + } + value = parsers.entity(); + if (value) { + return new(tree.Assignment)(key, value); + } + }, + + // + // Parse url() tokens + // + // We use a specific rule for urls, because they don't really behave like + // standard function calls. The difference is that the argument doesn't have + // to be enclosed within a string, so it can't be parsed as an Expression. + // + url: function () { + var value; + + if (input.charAt(i) !== 'u' || !$re(/^url\(/)) { + return; + } + + value = this.quoted() || this.variable() || + $re(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ""; + + expectChar(')'); + + return new(tree.URL)((value.value != null || value instanceof tree.Variable) + ? value : new(tree.Anonymous)(value), env.currentFileInfo); + }, + + // + // A Variable entity, such as `@fink`, in + // + // width: @fink + 2px + // + // We use a different parser for variable definitions, + // see `parsers.variable`. + // + variable: function () { + var name, index = i; + + if (input.charAt(i) === '@' && (name = $re(/^@@?[\w-]+/))) { + return new(tree.Variable)(name, index, env.currentFileInfo); + } + }, + + // A variable entity useing the protective {} e.g. @{var} + variableCurly: function () { + var curly, index = i; + + if (input.charAt(i) === '@' && (curly = $re(/^@\{([\w-]+)\}/))) { + return new(tree.Variable)("@" + curly[1], index, env.currentFileInfo); + } + }, + + // + // A Hexadecimal color + // + // #4F3C2F + // + // `rgb` and `hsl` colors are parsed through the `entities.call` parser. + // + color: function () { + var rgb; + + if (input.charAt(i) === '#' && (rgb = $re(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))) { + var colorCandidateString = rgb.input.match(/^#([\w]+).*/); // strip colons, brackets, whitespaces and other characters that should not definitely be part of color string + colorCandidateString = colorCandidateString[1]; + if (!colorCandidateString.match(/^[A-Fa-f0-9]+$/)) { // verify if candidate consists only of allowed HEX characters + error("Invalid HEX color code"); + } + return new(tree.Color)(rgb[1]); + } + }, + + // + // A Dimension, that is, a number and a unit + // + // 0.5em 95% + // + dimension: function () { + var value, c = input.charCodeAt(i); + //Is the first char of the dimension 0-9, '.', '+' or '-' + if ((c > 57 || c < 43) || c === 47 || c == 44) { + return; + } + + value = $re(/^([+-]?\d*\.?\d+)(%|[a-z]+)?/); + if (value) { + return new(tree.Dimension)(value[1], value[2]); + } + }, + + // + // A unicode descriptor, as is used in unicode-range + // + // U+0?? or U+00A1-00A9 + // + unicodeDescriptor: function () { + var ud; + + ud = $re(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/); + if (ud) { + return new(tree.UnicodeDescriptor)(ud[0]); + } + }, + + // + // JavaScript code to be evaluated + // + // `window.location.href` + // + javascript: function () { + var str, j = i, e; + + if (input.charAt(j) === '~') { j++; e = true; } // Escaped strings + if (input.charAt(j) !== '`') { return; } + if (env.javascriptEnabled !== undefined && !env.javascriptEnabled) { + error("You are using JavaScript, which has been disabled."); + } + + if (e) { $char('~'); } + + str = $re(/^`([^`]*)`/); + if (str) { + return new(tree.JavaScript)(str[1], i, e); + } + } + }, + + // + // The variable part of a variable definition. Used in the `rule` parser + // + // @fink: + // + variable: function () { + var name; + + if (input.charAt(i) === '@' && (name = $re(/^(@[\w-]+)\s*:/))) { return name[1]; } + }, + + // + // The variable part of a variable definition. Used in the `rule` parser + // + // @fink(); + // + rulesetCall: function () { + var name; + + if (input.charAt(i) === '@' && (name = $re(/^(@[\w-]+)\s*\(\s*\)\s*;/))) { + return new tree.RulesetCall(name[1]); + } + }, + + // + // extend syntax - used to extend selectors + // + extend: function(isRule) { + var elements, e, index = i, option, extendList, extend; + + if (!(isRule ? $re(/^&:extend\(/) : $re(/^:extend\(/))) { return; } + + do { + option = null; + elements = null; + while (! (option = $re(/^(all)(?=\s*(\)|,))/))) { + e = this.element(); + if (!e) { break; } + if (elements) { elements.push(e); } else { elements = [ e ]; } + } + + option = option && option[1]; + + extend = new(tree.Extend)(new(tree.Selector)(elements), option, index); + if (extendList) { extendList.push(extend); } else { extendList = [ extend ]; } + + } while($char(",")); + + expect(/^\)/); + + if (isRule) { + expect(/^;/); + } + + return extendList; + }, + + // + // extendRule - used in a rule to extend all the parent selectors + // + extendRule: function() { + return this.extend(true); + }, + + // + // Mixins + // + mixin: { + // + // A Mixin call, with an optional argument list + // + // #mixins > .square(#fff); + // .rounded(4px, black); + // .button; + // + // The `while` loop is there because mixins can be + // namespaced, but we only support the child and descendant + // selector for now. + // + call: function () { + var s = input.charAt(i), important = false, index = i, elemIndex, + elements, elem, e, c, args; + + if (s !== '.' && s !== '#') { return; } + + save(); // stop us absorbing part of an invalid selector + + while (true) { + elemIndex = i; + e = $re(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/); + if (!e) { + break; + } + elem = new(tree.Element)(c, e, elemIndex, env.currentFileInfo); + if (elements) { elements.push(elem); } else { elements = [ elem ]; } + c = $char('>'); + } + + if (elements) { + if ($char('(')) { + args = this.args(true).args; + expectChar(')'); + } + + if (parsers.important()) { + important = true; + } + + if (parsers.end()) { + forget(); + return new(tree.mixin.Call)(elements, args, index, env.currentFileInfo, important); + } + } + + restore(); + }, + args: function (isCall) { + var parsers = parser.parsers, entities = parsers.entities, + returner = { args:null, variadic: false }, + expressions = [], argsSemiColon = [], argsComma = [], + isSemiColonSeperated, expressionContainsNamed, name, nameLoop, value, arg; + + save(); + + while (true) { + if (isCall) { + arg = parsers.detachedRuleset() || parsers.expression(); + } else { + parsers.comments(); + if (input.charAt(i) === '.' && $re(/^\.{3}/)) { + returner.variadic = true; + if ($char(";") && !isSemiColonSeperated) { + isSemiColonSeperated = true; + } + (isSemiColonSeperated ? argsSemiColon : argsComma) + .push({ variadic: true }); + break; + } + arg = entities.variable() || entities.literal() || entities.keyword(); + } + + if (!arg) { + break; + } + + nameLoop = null; + if (arg.throwAwayComments) { + arg.throwAwayComments(); + } + value = arg; + var val = null; + + if (isCall) { + // Variable + if (arg.value && arg.value.length == 1) { + val = arg.value[0]; + } + } else { + val = arg; + } + + if (val && val instanceof tree.Variable) { + if ($char(':')) { + if (expressions.length > 0) { + if (isSemiColonSeperated) { + error("Cannot mix ; and , as delimiter types"); + } + expressionContainsNamed = true; + } + + // we do not support setting a ruleset as a default variable - it doesn't make sense + // However if we do want to add it, there is nothing blocking it, just don't error + // and remove isCall dependency below + value = (isCall && parsers.detachedRuleset()) || parsers.expression(); + + if (!value) { + if (isCall) { + error("could not understand value for named argument"); + } else { + restore(); + returner.args = []; + return returner; + } + } + nameLoop = (name = val.name); + } else if (!isCall && $re(/^\.{3}/)) { + returner.variadic = true; + if ($char(";") && !isSemiColonSeperated) { + isSemiColonSeperated = true; + } + (isSemiColonSeperated ? argsSemiColon : argsComma) + .push({ name: arg.name, variadic: true }); + break; + } else if (!isCall) { + name = nameLoop = val.name; + value = null; + } + } + + if (value) { + expressions.push(value); + } + + argsComma.push({ name:nameLoop, value:value }); + + if ($char(',')) { + continue; + } + + if ($char(';') || isSemiColonSeperated) { + + if (expressionContainsNamed) { + error("Cannot mix ; and , as delimiter types"); + } + + isSemiColonSeperated = true; + + if (expressions.length > 1) { + value = new(tree.Value)(expressions); + } + argsSemiColon.push({ name:name, value:value }); + + name = null; + expressions = []; + expressionContainsNamed = false; + } + } + + forget(); + returner.args = isSemiColonSeperated ? argsSemiColon : argsComma; + return returner; + }, + // + // A Mixin definition, with a list of parameters + // + // .rounded (@radius: 2px, @color) { + // ... + // } + // + // Until we have a finer grained state-machine, we have to + // do a look-ahead, to make sure we don't have a mixin call. + // See the `rule` function for more information. + // + // We start by matching `.rounded (`, and then proceed on to + // the argument list, which has optional default values. + // We store the parameters in `params`, with a `value` key, + // if there is a value, such as in the case of `@radius`. + // + // Once we've got our params list, and a closing `)`, we parse + // the `{...}` block. + // + definition: function () { + var name, params = [], match, ruleset, cond, variadic = false; + if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || + peek(/^[^{]*\}/)) { + return; + } + + save(); + + match = $re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/); + if (match) { + name = match[1]; + + var argInfo = this.args(false); + params = argInfo.args; + variadic = argInfo.variadic; + + // .mixincall("@{a}"); + // looks a bit like a mixin definition.. + // also + // .mixincall(@a: {rule: set;}); + // so we have to be nice and restore + if (!$char(')')) { + furthest = i; + restore(); + return; + } + + parsers.comments(); + + if ($re(/^when/)) { // Guard + cond = expect(parsers.conditions, 'expected condition'); + } + + ruleset = parsers.block(); + + if (ruleset) { + forget(); + return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic); + } else { + restore(); + } + } else { + forget(); + } + } + }, + + // + // Entities are the smallest recognized token, + // and can be found inside a rule's value. + // + entity: function () { + var entities = this.entities; + + return entities.literal() || entities.variable() || entities.url() || + entities.call() || entities.keyword() || entities.javascript() || + this.comment(); + }, + + // + // A Rule terminator. Note that we use `peek()` to check for '}', + // because the `block` rule will be expecting it, but we still need to make sure + // it's there, if ';' was ommitted. + // + end: function () { + return $char(';') || peekChar('}'); + }, + + // + // IE's alpha function + // + // alpha(opacity=88) + // + alpha: function () { + var value; + + if (! $re(/^\(opacity=/i)) { return; } + value = $re(/^\d+/) || this.entities.variable(); + if (value) { + expectChar(')'); + return new(tree.Alpha)(value); + } + }, + + // + // A Selector Element + // + // div + // + h1 + // #socks + // input[type="text"] + // + // Elements are the building blocks for Selectors, + // they are made out of a `Combinator` (see combinator rule), + // and an element name, such as a tag a class, or `*`. + // + element: function () { + var e, c, v, index = i; + + c = this.combinator(); + + e = $re(/^(?:\d+\.\d+|\d+)%/) || $re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || + $char('*') || $char('&') || this.attribute() || $re(/^\([^()@]+\)/) || $re(/^[\.#](?=@)/) || + this.entities.variableCurly(); + + if (! e) { + save(); + if ($char('(')) { + if ((v = this.selector()) && $char(')')) { + e = new(tree.Paren)(v); + forget(); + } else { + restore(); + } + } else { + forget(); + } + } + + if (e) { return new(tree.Element)(c, e, index, env.currentFileInfo); } + }, + + // + // Combinators combine elements together, in a Selector. + // + // Because our parser isn't white-space sensitive, special care + // has to be taken, when parsing the descendant combinator, ` `, + // as it's an empty space. We have to check the previous character + // in the input, to see if it's a ` ` character. More info on how + // we deal with this in *combinator.js*. + // + combinator: function () { + var c = input.charAt(i); + + if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') { + i++; + if (input.charAt(i) === '^') { + c = '^^'; + i++; + } + while (isWhitespace(input, i)) { i++; } + return new(tree.Combinator)(c); + } else if (isWhitespace(input, i - 1)) { + return new(tree.Combinator)(" "); + } else { + return new(tree.Combinator)(null); + } + }, + // + // A CSS selector (see selector below) + // with less extensions e.g. the ability to extend and guard + // + lessSelector: function () { + return this.selector(true); + }, + // + // A CSS Selector + // + // .class > div + h1 + // li a:hover + // + // Selectors are made out of one or more Elements, see above. + // + selector: function (isLess) { + var index = i, $re = _$re, elements, extendList, c, e, extend, when, condition; + + while ((isLess && (extend = this.extend())) || (isLess && (when = $re(/^when/))) || (e = this.element())) { + if (when) { + condition = expect(this.conditions, 'expected condition'); + } else if (condition) { + error("CSS guard can only be used at the end of selector"); + } else if (extend) { + if (extendList) { extendList.push(extend); } else { extendList = [ extend ]; } + } else { + if (extendList) { error("Extend can only be used at the end of selector"); } + c = input.charAt(i); + if (elements) { elements.push(e); } else { elements = [ e ]; } + e = null; + } + if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') { + break; + } + } + + if (elements) { return new(tree.Selector)(elements, extendList, condition, index, env.currentFileInfo); } + if (extendList) { error("Extend must be used to extend a selector, it cannot be used on its own"); } + }, + attribute: function () { + if (! $char('[')) { return; } + + var entities = this.entities, + key, val, op; + + if (!(key = entities.variableCurly())) { + key = expect(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/); + } + + op = $re(/^[|~*$^]?=/); + if (op) { + val = entities.quoted() || $re(/^[0-9]+%/) || $re(/^[\w-]+/) || entities.variableCurly(); + } + + expectChar(']'); + + return new(tree.Attribute)(key, op, val); + }, + + // + // The `block` rule is used by `ruleset` and `mixin.definition`. + // It's a wrapper around the `primary` rule, with added `{}`. + // + block: function () { + var content; + if ($char('{') && (content = this.primary()) && $char('}')) { + return content; + } + }, + + blockRuleset: function() { + var block = this.block(); + + if (block) { + block = new tree.Ruleset(null, block); + } + return block; + }, + + detachedRuleset: function() { + var blockRuleset = this.blockRuleset(); + if (blockRuleset) { + return new tree.DetachedRuleset(blockRuleset); + } + }, + + // + // div, .class, body > p {...} + // + ruleset: function () { + var selectors, s, rules, debugInfo; + + save(); + + if (env.dumpLineNumbers) { + debugInfo = getDebugInfo(i, input, env); + } + + while (true) { + s = this.lessSelector(); + if (!s) { + break; + } + if (selectors) { selectors.push(s); } else { selectors = [ s ]; } + this.comments(); + if (s.condition && selectors.length > 1) { + error("Guards are only currently allowed on a single selector."); + } + if (! $char(',')) { break; } + if (s.condition) { + error("Guards are only currently allowed on a single selector."); + } + this.comments(); + } + + if (selectors && (rules = this.block())) { + forget(); + var ruleset = new(tree.Ruleset)(selectors, rules, env.strictImports); + if (env.dumpLineNumbers) { + ruleset.debugInfo = debugInfo; + } + return ruleset; + } else { + // Backtrack + furthest = i; + restore(); + } + }, + rule: function (tryAnonymous) { + var name, value, startOfRule = i, c = input.charAt(startOfRule), important, merge, isVariable; + + if (c === '.' || c === '#' || c === '&') { return; } + + save(); + + name = this.variable() || this.ruleProperty(); + if (name) { + isVariable = typeof name === "string"; + + if (isVariable) { + value = this.detachedRuleset(); + } + + if (!value) { + // prefer to try to parse first if its a variable or we are compressing + // but always fallback on the other one + value = !tryAnonymous && (env.compress || isVariable) ? + (this.value() || this.anonymousValue()) : + (this.anonymousValue() || this.value()); + + important = this.important(); + + // a name returned by this.ruleProperty() is always an array of the form: + // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"] + // where each item is a tree.Keyword or tree.Variable + merge = !isVariable && name.pop().value; + } + + if (value && this.end()) { + forget(); + return new (tree.Rule)(name, value, important, merge, startOfRule, env.currentFileInfo); + } else { + furthest = i; + restore(); + if (value && !tryAnonymous) { + return this.rule(true); + } + } + } else { + forget(); + } + }, + anonymousValue: function () { + var match; + match = /^([^@+\/'"*`(;{}-]*);/.exec(current); + if (match) { + i += match[0].length - 1; + return new(tree.Anonymous)(match[1]); + } + }, + + // + // An @import directive + // + // @import "lib"; + // + // Depending on our environemnt, importing is done differently: + // In the browser, it's an XHR request, in Node, it would be a + // file-system operation. The function used for importing is + // stored in `import`, which we pass to the Import constructor. + // + "import": function () { + var path, features, index = i; + + save(); + + var dir = $re(/^@import?\s+/); + + var options = (dir ? this.importOptions() : null) || {}; + + if (dir && (path = this.entities.quoted() || this.entities.url())) { + features = this.mediaFeatures(); + if ($char(';')) { + forget(); + features = features && new(tree.Value)(features); + return new(tree.Import)(path, features, options, index, env.currentFileInfo); + } + } + + restore(); + }, + + importOptions: function() { + var o, options = {}, optionName, value; + + // list of options, surrounded by parens + if (! $char('(')) { return null; } + do { + o = this.importOption(); + if (o) { + optionName = o; + value = true; + switch(optionName) { + case "css": + optionName = "less"; + value = false; + break; + case "once": + optionName = "multiple"; + value = false; + break; + } + options[optionName] = value; + if (! $char(',')) { break; } + } + } while (o); + expectChar(')'); + return options; + }, + + importOption: function() { + var opt = $re(/^(less|css|multiple|once|inline|reference)/); + if (opt) { + return opt[1]; + } + }, + + mediaFeature: function () { + var entities = this.entities, nodes = [], e, p; + do { + e = entities.keyword() || entities.variable(); + if (e) { + nodes.push(e); + } else if ($char('(')) { + p = this.property(); + e = this.value(); + if ($char(')')) { + if (p && e) { + nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, null, i, env.currentFileInfo, true))); + } else if (e) { + nodes.push(new(tree.Paren)(e)); + } else { + return null; + } + } else { return null; } + } + } while (e); + + if (nodes.length > 0) { + return new(tree.Expression)(nodes); + } + }, + + mediaFeatures: function () { + var entities = this.entities, features = [], e; + do { + e = this.mediaFeature(); + if (e) { + features.push(e); + if (! $char(',')) { break; } + } else { + e = entities.variable(); + if (e) { + features.push(e); + if (! $char(',')) { break; } + } + } + } while (e); + + return features.length > 0 ? features : null; + }, + + media: function () { + var features, rules, media, debugInfo; + + if (env.dumpLineNumbers) { + debugInfo = getDebugInfo(i, input, env); + } + + if ($re(/^@media/)) { + features = this.mediaFeatures(); + + rules = this.block(); + if (rules) { + media = new(tree.Media)(rules, features, i, env.currentFileInfo); + if (env.dumpLineNumbers) { + media.debugInfo = debugInfo; + } + return media; + } + } + }, + + // + // A CSS Directive + // + // @charset "utf-8"; + // + directive: function () { + var index = i, name, value, rules, nonVendorSpecificName, + hasIdentifier, hasExpression, hasUnknown, hasBlock = true; + + if (input.charAt(i) !== '@') { return; } + + value = this['import']() || this.media(); + if (value) { + return value; + } + + save(); + + name = $re(/^@[a-z-]+/); + + if (!name) { return; } + + nonVendorSpecificName = name; + if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { + nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); + } + + switch(nonVendorSpecificName) { + /* + case "@font-face": + case "@viewport": + case "@top-left": + case "@top-left-corner": + case "@top-center": + case "@top-right": + case "@top-right-corner": + case "@bottom-left": + case "@bottom-left-corner": + case "@bottom-center": + case "@bottom-right": + case "@bottom-right-corner": + case "@left-top": + case "@left-middle": + case "@left-bottom": + case "@right-top": + case "@right-middle": + case "@right-bottom": + hasBlock = true; + break; + */ + case "@charset": + hasIdentifier = true; + hasBlock = false; + break; + case "@namespace": + hasExpression = true; + hasBlock = false; + break; + case "@keyframes": + hasIdentifier = true; + break; + case "@host": + case "@page": + case "@document": + case "@supports": + hasUnknown = true; + break; + } + + if (hasIdentifier) { + value = this.entity(); + if (!value) { + error("expected " + name + " identifier"); + } + } else if (hasExpression) { + value = this.expression(); + if (!value) { + error("expected " + name + " expression"); + } + } else if (hasUnknown) { + value = ($re(/^[^{;]+/) || '').trim(); + if (value) { + value = new(tree.Anonymous)(value); + } + } + + if (hasBlock) { + rules = this.blockRuleset(); + } + + if (rules || (!hasBlock && value && $char(';'))) { + forget(); + return new(tree.Directive)(name, value, rules, index, env.currentFileInfo, + env.dumpLineNumbers ? getDebugInfo(index, input, env) : null); + } + + restore(); + }, + + // + // A Value is a comma-delimited list of Expressions + // + // font-family: Baskerville, Georgia, serif; + // + // In a Rule, a Value represents everything after the `:`, + // and before the `;`. + // + value: function () { + var e, expressions = []; + + do { + e = this.expression(); + if (e) { + expressions.push(e); + if (! $char(',')) { break; } + } + } while(e); + + if (expressions.length > 0) { + return new(tree.Value)(expressions); + } + }, + important: function () { + if (input.charAt(i) === '!') { + return $re(/^! *important/); + } + }, + sub: function () { + var a, e; + + if ($char('(')) { + a = this.addition(); + if (a) { + e = new(tree.Expression)([a]); + expectChar(')'); + e.parens = true; + return e; + } + } + }, + multiplication: function () { + var m, a, op, operation, isSpaced; + m = this.operand(); + if (m) { + isSpaced = isWhitespace(input, i - 1); + while (true) { + if (peek(/^\/[*\/]/)) { + break; + } + + save(); + + op = $char('/') || $char('*'); + + if (!op) { forget(); break; } + + a = this.operand(); + + if (!a) { restore(); break; } + forget(); + + m.parensInOp = true; + a.parensInOp = true; + operation = new(tree.Operation)(op, [operation || m, a], isSpaced); + isSpaced = isWhitespace(input, i - 1); + } + return operation || m; + } + }, + addition: function () { + var m, a, op, operation, isSpaced; + m = this.multiplication(); + if (m) { + isSpaced = isWhitespace(input, i - 1); + while (true) { + op = $re(/^[-+]\s+/) || (!isSpaced && ($char('+') || $char('-'))); + if (!op) { + break; + } + a = this.multiplication(); + if (!a) { + break; + } + + m.parensInOp = true; + a.parensInOp = true; + operation = new(tree.Operation)(op, [operation || m, a], isSpaced); + isSpaced = isWhitespace(input, i - 1); + } + return operation || m; + } + }, + conditions: function () { + var a, b, index = i, condition; + + a = this.condition(); + if (a) { + while (true) { + if (!peek(/^,\s*(not\s*)?\(/) || !$char(',')) { + break; + } + b = this.condition(); + if (!b) { + break; + } + condition = new(tree.Condition)('or', condition || a, b, index); + } + return condition || a; + } + }, + condition: function () { + var entities = this.entities, index = i, negate = false, + a, b, c, op; + + if ($re(/^not/)) { negate = true; } + expectChar('('); + a = this.addition() || entities.keyword() || entities.quoted(); + if (a) { + op = $re(/^(?:>=|<=|=<|[<=>])/); + if (op) { + b = this.addition() || entities.keyword() || entities.quoted(); + if (b) { + c = new(tree.Condition)(op, a, b, index, negate); + } else { + error('expected expression'); + } + } else { + c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate); + } + expectChar(')'); + return $re(/^and/) ? new(tree.Condition)('and', c, this.condition()) : c; + } + }, + + // + // An operand is anything that can be part of an operation, + // such as a Color, or a Variable + // + operand: function () { + var entities = this.entities, + p = input.charAt(i + 1), negate; + + if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $char('-'); } + var o = this.sub() || entities.dimension() || + entities.color() || entities.variable() || + entities.call(); + + if (negate) { + o.parensInOp = true; + o = new(tree.Negative)(o); + } + + return o; + }, + + // + // Expressions either represent mathematical operations, + // or white-space delimited Entities. + // + // 1px solid black + // @var * 2 + // + expression: function () { + var entities = [], e, delim; + + do { + e = this.addition() || this.entity(); + if (e) { + entities.push(e); + // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here + if (!peek(/^\/[\/*]/)) { + delim = $char('/'); + if (delim) { + entities.push(new(tree.Anonymous)(delim)); + } + } + } + } while (e); + if (entities.length > 0) { + return new(tree.Expression)(entities); + } + }, + property: function () { + var name = $re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/); + if (name) { + return name[1]; + } + }, + ruleProperty: function () { + var c = current, name = [], index = [], length = 0, s, k; + + function match(re) { + var a = re.exec(c); + if (a) { + index.push(i + length); + length += a[0].length; + c = c.slice(a[1].length); + return name.push(a[1]); + } + } + + match(/^(\*?)/); + while (match(/^((?:[\w-]+)|(?:@\{[\w-]+\}))/)); // ! + if ((name.length > 1) && match(/^\s*((?:\+_|\+)?)\s*:/)) { + // at last, we have the complete match now. move forward, + // convert name particles to tree objects and return: + skipWhitespace(length); + if (name[0] === '') { + name.shift(); + index.shift(); + } + for (k = 0; k < name.length; k++) { + s = name[k]; + name[k] = (s.charAt(0) !== '@') + ? new(tree.Keyword)(s) + : new(tree.Variable)('@' + s.slice(2, -1), + index[k], env.currentFileInfo); + } + return name; + } + } + } + }; + return parser; +}; +less.Parser.serializeVars = function(vars) { + var s = ''; + + for (var name in vars) { + if (Object.hasOwnProperty.call(vars, name)) { + var value = vars[name]; + s += ((name[0] === '@') ? '' : '@') + name +': '+ value + + ((('' + value).slice(-1) === ';') ? '' : ';'); + } + } + + return s; +}; + +(function (tree) { + +tree.functions = { + rgb: function (r, g, b) { + return this.rgba(r, g, b, 1.0); + }, + rgba: function (r, g, b, a) { + var rgb = [r, g, b].map(function (c) { return scaled(c, 255); }); + a = number(a); + return new(tree.Color)(rgb, a); + }, + hsl: function (h, s, l) { + return this.hsla(h, s, l, 1.0); + }, + hsla: function (h, s, l, a) { + function hue(h) { + h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); + if (h * 6 < 1) { return m1 + (m2 - m1) * h * 6; } + else if (h * 2 < 1) { return m2; } + else if (h * 3 < 2) { return m1 + (m2 - m1) * (2/3 - h) * 6; } + else { return m1; } + } + + h = (number(h) % 360) / 360; + s = clamp(number(s)); l = clamp(number(l)); a = clamp(number(a)); + + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + + return this.rgba(hue(h + 1/3) * 255, + hue(h) * 255, + hue(h - 1/3) * 255, + a); + }, + + hsv: function(h, s, v) { + return this.hsva(h, s, v, 1.0); + }, + + hsva: function(h, s, v, a) { + h = ((number(h) % 360) / 360) * 360; + s = number(s); v = number(v); a = number(a); + + var i, f; + i = Math.floor((h / 60) % 6); + f = (h / 60) - i; + + var vs = [v, + v * (1 - s), + v * (1 - f * s), + v * (1 - (1 - f) * s)]; + var perm = [[0, 3, 1], + [2, 0, 1], + [1, 0, 3], + [1, 2, 0], + [3, 1, 0], + [0, 1, 2]]; + + return this.rgba(vs[perm[i][0]] * 255, + vs[perm[i][1]] * 255, + vs[perm[i][2]] * 255, + a); + }, + + hue: function (color) { + return new(tree.Dimension)(color.toHSL().h); + }, + saturation: function (color) { + return new(tree.Dimension)(color.toHSL().s * 100, '%'); + }, + lightness: function (color) { + return new(tree.Dimension)(color.toHSL().l * 100, '%'); + }, + hsvhue: function(color) { + return new(tree.Dimension)(color.toHSV().h); + }, + hsvsaturation: function (color) { + return new(tree.Dimension)(color.toHSV().s * 100, '%'); + }, + hsvvalue: function (color) { + return new(tree.Dimension)(color.toHSV().v * 100, '%'); + }, + red: function (color) { + return new(tree.Dimension)(color.rgb[0]); + }, + green: function (color) { + return new(tree.Dimension)(color.rgb[1]); + }, + blue: function (color) { + return new(tree.Dimension)(color.rgb[2]); + }, + alpha: function (color) { + return new(tree.Dimension)(color.toHSL().a); + }, + luma: function (color) { + return new(tree.Dimension)(color.luma() * color.alpha * 100, '%'); + }, + luminance: function (color) { + var luminance = + (0.2126 * color.rgb[0] / 255) + + (0.7152 * color.rgb[1] / 255) + + (0.0722 * color.rgb[2] / 255); + + return new(tree.Dimension)(luminance * color.alpha * 100, '%'); + }, + saturate: function (color, amount) { + // filter: saturate(3.2); + // should be kept as is, so check for color + if (!color.rgb) { + return null; + } + var hsl = color.toHSL(); + + hsl.s += amount.value / 100; + hsl.s = clamp(hsl.s); + return hsla(hsl); + }, + desaturate: function (color, amount) { + var hsl = color.toHSL(); + + hsl.s -= amount.value / 100; + hsl.s = clamp(hsl.s); + return hsla(hsl); + }, + lighten: function (color, amount) { + var hsl = color.toHSL(); + + hsl.l += amount.value / 100; + hsl.l = clamp(hsl.l); + return hsla(hsl); + }, + darken: function (color, amount) { + var hsl = color.toHSL(); + + hsl.l -= amount.value / 100; + hsl.l = clamp(hsl.l); + return hsla(hsl); + }, + fadein: function (color, amount) { + var hsl = color.toHSL(); + + hsl.a += amount.value / 100; + hsl.a = clamp(hsl.a); + return hsla(hsl); + }, + fadeout: function (color, amount) { + var hsl = color.toHSL(); + + hsl.a -= amount.value / 100; + hsl.a = clamp(hsl.a); + return hsla(hsl); + }, + fade: function (color, amount) { + var hsl = color.toHSL(); + + hsl.a = amount.value / 100; + hsl.a = clamp(hsl.a); + return hsla(hsl); + }, + spin: function (color, amount) { + var hsl = color.toHSL(); + var hue = (hsl.h + amount.value) % 360; + + hsl.h = hue < 0 ? 360 + hue : hue; + + return hsla(hsl); + }, + // + // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein + // http://sass-lang.com + // + mix: function (color1, color2, weight) { + if (!weight) { + weight = new(tree.Dimension)(50); + } + var p = weight.value / 100.0; + var w = p * 2 - 1; + var a = color1.toHSL().a - color2.toHSL().a; + + var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, + color1.rgb[1] * w1 + color2.rgb[1] * w2, + color1.rgb[2] * w1 + color2.rgb[2] * w2]; + + var alpha = color1.alpha * p + color2.alpha * (1 - p); + + return new(tree.Color)(rgb, alpha); + }, + greyscale: function (color) { + return this.desaturate(color, new(tree.Dimension)(100)); + }, + contrast: function (color, dark, light, threshold) { + // filter: contrast(3.2); + // should be kept as is, so check for color + if (!color.rgb) { + return null; + } + if (typeof light === 'undefined') { + light = this.rgba(255, 255, 255, 1.0); + } + if (typeof dark === 'undefined') { + dark = this.rgba(0, 0, 0, 1.0); + } + //Figure out which is actually light and dark! + if (dark.luma() > light.luma()) { + var t = light; + light = dark; + dark = t; + } + if (typeof threshold === 'undefined') { + threshold = 0.43; + } else { + threshold = number(threshold); + } + if (color.luma() < threshold) { + return light; + } else { + return dark; + } + }, + e: function (str) { + return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str.value); + }, + escape: function (str) { + return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); + }, + replace: function (string, pattern, replacement, flags) { + var result = string.value; + + result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement.value); + return new(tree.Quoted)(string.quote || '', result, string.escaped); + }, + '%': function (string /* arg, arg, ...*/) { + var args = Array.prototype.slice.call(arguments, 1), + result = string.value; + + for (var i = 0; i < args.length; i++) { + /*jshint loopfunc:true */ + result = result.replace(/%[sda]/i, function(token) { + var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); + return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; + }); + } + result = result.replace(/%%/g, '%'); + return new(tree.Quoted)(string.quote || '', result, string.escaped); + }, + unit: function (val, unit) { + if(!(val instanceof tree.Dimension)) { + throw { type: "Argument", message: "the first argument to unit must be a number" + (val instanceof tree.Operation ? ". Have you forgotten parenthesis?" : "") }; + } + if (unit) { + if (unit instanceof tree.Keyword) { + unit = unit.value; + } else { + unit = unit.toCSS(); + } + } else { + unit = ""; + } + return new(tree.Dimension)(val.value, unit); + }, + convert: function (val, unit) { + return val.convertTo(unit.value); + }, + round: function (n, f) { + var fraction = typeof(f) === "undefined" ? 0 : f.value; + return _math(function(num) { return num.toFixed(fraction); }, null, n); + }, + pi: function () { + return new(tree.Dimension)(Math.PI); + }, + mod: function(a, b) { + return new(tree.Dimension)(a.value % b.value, a.unit); + }, + pow: function(x, y) { + if (typeof x === "number" && typeof y === "number") { + x = new(tree.Dimension)(x); + y = new(tree.Dimension)(y); + } else if (!(x instanceof tree.Dimension) || !(y instanceof tree.Dimension)) { + throw { type: "Argument", message: "arguments must be numbers" }; + } + + return new(tree.Dimension)(Math.pow(x.value, y.value), x.unit); + }, + _minmax: function (isMin, args) { + args = Array.prototype.slice.call(args); + switch(args.length) { + case 0: throw { type: "Argument", message: "one or more arguments required" }; + } + var i, j, current, currentUnified, referenceUnified, unit, unitStatic, unitClone, + order = [], // elems only contains original argument values. + values = {}; // key is the unit.toString() for unified tree.Dimension values, + // value is the index into the order array. + for (i = 0; i < args.length; i++) { + current = args[i]; + if (!(current instanceof tree.Dimension)) { + if(Array.isArray(args[i].value)) { + Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value)); + } + continue; + } + currentUnified = current.unit.toString() === "" && unitClone !== undefined ? new(tree.Dimension)(current.value, unitClone).unify() : current.unify(); + unit = currentUnified.unit.toString() === "" && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString(); + unitStatic = unit !== "" && unitStatic === undefined || unit !== "" && order[0].unify().unit.toString() === "" ? unit : unitStatic; + unitClone = unit !== "" && unitClone === undefined ? current.unit.toString() : unitClone; + j = values[""] !== undefined && unit !== "" && unit === unitStatic ? values[""] : values[unit]; + if (j === undefined) { + if(unitStatic !== undefined && unit !== unitStatic) { + throw{ type: "Argument", message: "incompatible types" }; + } + values[unit] = order.length; + order.push(current); + continue; + } + referenceUnified = order[j].unit.toString() === "" && unitClone !== undefined ? new(tree.Dimension)(order[j].value, unitClone).unify() : order[j].unify(); + if ( isMin && currentUnified.value < referenceUnified.value || + !isMin && currentUnified.value > referenceUnified.value) { + order[j] = current; + } + } + if (order.length == 1) { + return order[0]; + } + args = order.map(function (a) { return a.toCSS(this.env); }).join(this.env.compress ? "," : ", "); + return new(tree.Anonymous)((isMin ? "min" : "max") + "(" + args + ")"); + }, + min: function () { + return this._minmax(true, arguments); + }, + max: function () { + return this._minmax(false, arguments); + }, + "get-unit": function (n) { + return new(tree.Anonymous)(n.unit); + }, + argb: function (color) { + return new(tree.Anonymous)(color.toARGB()); + }, + percentage: function (n) { + return new(tree.Dimension)(n.value * 100, '%'); + }, + color: function (n) { + if (n instanceof tree.Quoted) { + var colorCandidate = n.value, + returnColor; + returnColor = tree.Color.fromKeyword(colorCandidate); + if (returnColor) { + return returnColor; + } + if (/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/.test(colorCandidate)) { + return new(tree.Color)(colorCandidate.slice(1)); + } + throw { type: "Argument", message: "argument must be a color keyword or 3/6 digit hex e.g. #FFF" }; + } else { + throw { type: "Argument", message: "argument must be a string" }; + } + }, + iscolor: function (n) { + return this._isa(n, tree.Color); + }, + isnumber: function (n) { + return this._isa(n, tree.Dimension); + }, + isstring: function (n) { + return this._isa(n, tree.Quoted); + }, + iskeyword: function (n) { + return this._isa(n, tree.Keyword); + }, + isurl: function (n) { + return this._isa(n, tree.URL); + }, + ispixel: function (n) { + return this.isunit(n, 'px'); + }, + ispercentage: function (n) { + return this.isunit(n, '%'); + }, + isem: function (n) { + return this.isunit(n, 'em'); + }, + isunit: function (n, unit) { + return (n instanceof tree.Dimension) && n.unit.is(unit.value || unit) ? tree.True : tree.False; + }, + _isa: function (n, Type) { + return (n instanceof Type) ? tree.True : tree.False; + }, + tint: function(color, amount) { + return this.mix(this.rgb(255,255,255), color, amount); + }, + shade: function(color, amount) { + return this.mix(this.rgb(0, 0, 0), color, amount); + }, + extract: function(values, index) { + index = index.value - 1; // (1-based index) + // handle non-array values as an array of length 1 + // return 'undefined' if index is invalid + return Array.isArray(values.value) + ? values.value[index] : Array(values)[index]; + }, + length: function(values) { + var n = Array.isArray(values.value) ? values.value.length : 1; + return new tree.Dimension(n); + }, + + "data-uri": function(mimetypeNode, filePathNode) { + + if (typeof window !== 'undefined') { + return new tree.URL(filePathNode || mimetypeNode, this.currentFileInfo).eval(this.env); + } + + var mimetype = mimetypeNode.value; + var filePath = (filePathNode && filePathNode.value); + + var fs = require('./fs'), + path = require('path'), + useBase64 = false; + + if (arguments.length < 2) { + filePath = mimetype; + } + + if (this.env.isPathRelative(filePath)) { + if (this.currentFileInfo.relativeUrls) { + filePath = path.join(this.currentFileInfo.currentDirectory, filePath); + } else { + filePath = path.join(this.currentFileInfo.entryPath, filePath); + } + } + + // detect the mimetype if not given + if (arguments.length < 2) { + var mime; + try { + mime = require('mime'); + } catch (ex) { + mime = tree._mime; + } + + mimetype = mime.lookup(filePath); + + // use base 64 unless it's an ASCII or UTF-8 format + var charset = mime.charsets.lookup(mimetype); + useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0; + if (useBase64) { mimetype += ';base64'; } + } + else { + useBase64 = /;base64$/.test(mimetype); + } + + var buf = fs.readFileSync(filePath); + + // IE8 cannot handle a data-uri larger than 32KB. If this is exceeded + // and the --ieCompat flag is enabled, return a normal url() instead. + var DATA_URI_MAX_KB = 32, + fileSizeInKB = parseInt((buf.length / 1024), 10); + if (fileSizeInKB >= DATA_URI_MAX_KB) { + + if (this.env.ieCompat !== false) { + if (!this.env.silent) { + console.warn("Skipped data-uri embedding of %s because its size (%dKB) exceeds IE8-safe %dKB!", filePath, fileSizeInKB, DATA_URI_MAX_KB); + } + + return new tree.URL(filePathNode || mimetypeNode, this.currentFileInfo).eval(this.env); + } + } + + buf = useBase64 ? buf.toString('base64') + : encodeURIComponent(buf); + + var uri = "\"data:" + mimetype + ',' + buf + "\""; + return new(tree.URL)(new(tree.Anonymous)(uri)); + }, + + "svg-gradient": function(direction) { + + function throwArgumentDescriptor() { + throw { type: "Argument", message: "svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position]" }; + } + + if (arguments.length < 3) { + throwArgumentDescriptor(); + } + var stops = Array.prototype.slice.call(arguments, 1), + gradientDirectionSvg, + gradientType = "linear", + rectangleDimension = 'x="0" y="0" width="1" height="1"', + useBase64 = true, + renderEnv = {compress: false}, + returner, + directionValue = direction.toCSS(renderEnv), + i, color, position, positionValue, alpha; + + switch (directionValue) { + case "to bottom": + gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"'; + break; + case "to right": + gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"'; + break; + case "to bottom right": + gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"'; + break; + case "to top right": + gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"'; + break; + case "ellipse": + case "ellipse at center": + gradientType = "radial"; + gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"'; + rectangleDimension = 'x="-50" y="-50" width="101" height="101"'; + break; + default: + throw { type: "Argument", message: "svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center'" }; + } + returner = '' + + '' + + '<' + gradientType + 'Gradient id="gradient" gradientUnits="userSpaceOnUse" ' + gradientDirectionSvg + '>'; + + for (i = 0; i < stops.length; i+= 1) { + if (stops[i].value) { + color = stops[i].value[0]; + position = stops[i].value[1]; + } else { + color = stops[i]; + position = undefined; + } + + if (!(color instanceof tree.Color) || (!((i === 0 || i+1 === stops.length) && position === undefined) && !(position instanceof tree.Dimension))) { + throwArgumentDescriptor(); + } + positionValue = position ? position.toCSS(renderEnv) : i === 0 ? "0%" : "100%"; + alpha = color.alpha; + returner += ''; + } + returner += '' + + ''; + + if (useBase64) { + try { + returner = require('./encoder').encodeBase64(returner); // TODO browser implementation + } catch(e) { + useBase64 = false; + } + } + + returner = "'data:image/svg+xml" + (useBase64 ? ";base64" : "") + "," + returner + "'"; + return new(tree.URL)(new(tree.Anonymous)(returner)); + } +}; + +// these static methods are used as a fallback when the optional 'mime' dependency is missing +tree._mime = { + // this map is intentionally incomplete + // if you want more, install 'mime' dep + _types: { + '.htm' : 'text/html', + '.html': 'text/html', + '.gif' : 'image/gif', + '.jpg' : 'image/jpeg', + '.jpeg': 'image/jpeg', + '.png' : 'image/png' + }, + lookup: function (filepath) { + var ext = require('path').extname(filepath), + type = tree._mime._types[ext]; + if (type === undefined) { + throw new Error('Optional dependency "mime" is required for ' + ext); + } + return type; + }, + charsets: { + lookup: function (type) { + // assumes all text types are UTF-8 + return type && (/^text\//).test(type) ? 'UTF-8' : ''; + } + } +}; + +// Math + +var mathFunctions = { + // name, unit + ceil: null, + floor: null, + sqrt: null, + abs: null, + tan: "", + sin: "", + cos: "", + atan: "rad", + asin: "rad", + acos: "rad" +}; + +function _math(fn, unit, n) { + if (!(n instanceof tree.Dimension)) { + throw { type: "Argument", message: "argument must be a number" }; + } + if (unit == null) { + unit = n.unit; + } else { + n = n.unify(); + } + return new(tree.Dimension)(fn(parseFloat(n.value)), unit); +} + +// ~ End of Math + +// Color Blending +// ref: http://www.w3.org/TR/compositing-1 + +function colorBlend(mode, color1, color2) { + var ab = color1.alpha, cb, // backdrop + as = color2.alpha, cs, // source + ar, cr, r = []; // result + + ar = as + ab * (1 - as); + for (var i = 0; i < 3; i++) { + cb = color1.rgb[i] / 255; + cs = color2.rgb[i] / 255; + cr = mode(cb, cs); + if (ar) { + cr = (as * cs + ab * (cb + - as * (cb + cs - cr))) / ar; + } + r[i] = cr * 255; + } + + return new(tree.Color)(r, ar); +} + +var colorBlendMode = { + multiply: function(cb, cs) { + return cb * cs; + }, + screen: function(cb, cs) { + return cb + cs - cb * cs; + }, + overlay: function(cb, cs) { + cb *= 2; + return (cb <= 1) + ? colorBlendMode.multiply(cb, cs) + : colorBlendMode.screen(cb - 1, cs); + }, + softlight: function(cb, cs) { + var d = 1, e = cb; + if (cs > 0.5) { + e = 1; + d = (cb > 0.25) ? Math.sqrt(cb) + : ((16 * cb - 12) * cb + 4) * cb; + } + return cb - (1 - 2 * cs) * e * (d - cb); + }, + hardlight: function(cb, cs) { + return colorBlendMode.overlay(cs, cb); + }, + difference: function(cb, cs) { + return Math.abs(cb - cs); + }, + exclusion: function(cb, cs) { + return cb + cs - 2 * cb * cs; + }, + + // non-w3c functions: + average: function(cb, cs) { + return (cb + cs) / 2; + }, + negation: function(cb, cs) { + return 1 - Math.abs(cb + cs - 1); + } +}; + +// ~ End of Color Blending + +tree.defaultFunc = { + eval: function () { + var v = this.value_, e = this.error_; + if (e) { + throw e; + } + if (v != null) { + return v ? tree.True : tree.False; + } + }, + value: function (v) { + this.value_ = v; + }, + error: function (e) { + this.error_ = e; + }, + reset: function () { + this.value_ = this.error_ = null; + } +}; + +function initFunctions() { + var f, tf = tree.functions; + + // math + for (f in mathFunctions) { + if (mathFunctions.hasOwnProperty(f)) { + tf[f] = _math.bind(null, Math[f], mathFunctions[f]); + } + } + + // color blending + for (f in colorBlendMode) { + if (colorBlendMode.hasOwnProperty(f)) { + tf[f] = colorBlend.bind(null, colorBlendMode[f]); + } + } + + // default + f = tree.defaultFunc; + tf["default"] = f.eval.bind(f); + +} initFunctions(); + +function hsla(color) { + return tree.functions.hsla(color.h, color.s, color.l, color.a); +} + +function scaled(n, size) { + if (n instanceof tree.Dimension && n.unit.is('%')) { + return parseFloat(n.value * size / 100); + } else { + return number(n); + } +} + +function number(n) { + if (n instanceof tree.Dimension) { + return parseFloat(n.unit.is('%') ? n.value / 100 : n.value); + } else if (typeof(n) === 'number') { + return n; + } else { + throw { + error: "RuntimeError", + message: "color functions take numbers as parameters" + }; + } +} + +function clamp(val) { + return Math.min(1, Math.max(0, val)); +} + +tree.fround = function(env, value) { + var p = env && env.numPrecision; + //add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999....) are properly rounded... + return (p == null) ? value : Number((value + 2e-16).toFixed(p)); +}; + +tree.functionCall = function(env, currentFileInfo) { + this.env = env; + this.currentFileInfo = currentFileInfo; +}; + +tree.functionCall.prototype = tree.functions; + +})(require('./tree')); + +(function (tree) { + tree.colors = { + 'aliceblue':'#f0f8ff', + 'antiquewhite':'#faebd7', + 'aqua':'#00ffff', + 'aquamarine':'#7fffd4', + 'azure':'#f0ffff', + 'beige':'#f5f5dc', + 'bisque':'#ffe4c4', + 'black':'#000000', + 'blanchedalmond':'#ffebcd', + 'blue':'#0000ff', + 'blueviolet':'#8a2be2', + 'brown':'#a52a2a', + 'burlywood':'#deb887', + 'cadetblue':'#5f9ea0', + 'chartreuse':'#7fff00', + 'chocolate':'#d2691e', + 'coral':'#ff7f50', + 'cornflowerblue':'#6495ed', + 'cornsilk':'#fff8dc', + 'crimson':'#dc143c', + 'cyan':'#00ffff', + 'darkblue':'#00008b', + 'darkcyan':'#008b8b', + 'darkgoldenrod':'#b8860b', + 'darkgray':'#a9a9a9', + 'darkgrey':'#a9a9a9', + 'darkgreen':'#006400', + 'darkkhaki':'#bdb76b', + 'darkmagenta':'#8b008b', + 'darkolivegreen':'#556b2f', + 'darkorange':'#ff8c00', + 'darkorchid':'#9932cc', + 'darkred':'#8b0000', + 'darksalmon':'#e9967a', + 'darkseagreen':'#8fbc8f', + 'darkslateblue':'#483d8b', + 'darkslategray':'#2f4f4f', + 'darkslategrey':'#2f4f4f', + 'darkturquoise':'#00ced1', + 'darkviolet':'#9400d3', + 'deeppink':'#ff1493', + 'deepskyblue':'#00bfff', + 'dimgray':'#696969', + 'dimgrey':'#696969', + 'dodgerblue':'#1e90ff', + 'firebrick':'#b22222', + 'floralwhite':'#fffaf0', + 'forestgreen':'#228b22', + 'fuchsia':'#ff00ff', + 'gainsboro':'#dcdcdc', + 'ghostwhite':'#f8f8ff', + 'gold':'#ffd700', + 'goldenrod':'#daa520', + 'gray':'#808080', + 'grey':'#808080', + 'green':'#008000', + 'greenyellow':'#adff2f', + 'honeydew':'#f0fff0', + 'hotpink':'#ff69b4', + 'indianred':'#cd5c5c', + 'indigo':'#4b0082', + 'ivory':'#fffff0', + 'khaki':'#f0e68c', + 'lavender':'#e6e6fa', + 'lavenderblush':'#fff0f5', + 'lawngreen':'#7cfc00', + 'lemonchiffon':'#fffacd', + 'lightblue':'#add8e6', + 'lightcoral':'#f08080', + 'lightcyan':'#e0ffff', + 'lightgoldenrodyellow':'#fafad2', + 'lightgray':'#d3d3d3', + 'lightgrey':'#d3d3d3', + 'lightgreen':'#90ee90', + 'lightpink':'#ffb6c1', + 'lightsalmon':'#ffa07a', + 'lightseagreen':'#20b2aa', + 'lightskyblue':'#87cefa', + 'lightslategray':'#778899', + 'lightslategrey':'#778899', + 'lightsteelblue':'#b0c4de', + 'lightyellow':'#ffffe0', + 'lime':'#00ff00', + 'limegreen':'#32cd32', + 'linen':'#faf0e6', + 'magenta':'#ff00ff', + 'maroon':'#800000', + 'mediumaquamarine':'#66cdaa', + 'mediumblue':'#0000cd', + 'mediumorchid':'#ba55d3', + 'mediumpurple':'#9370d8', + 'mediumseagreen':'#3cb371', + 'mediumslateblue':'#7b68ee', + 'mediumspringgreen':'#00fa9a', + 'mediumturquoise':'#48d1cc', + 'mediumvioletred':'#c71585', + 'midnightblue':'#191970', + 'mintcream':'#f5fffa', + 'mistyrose':'#ffe4e1', + 'moccasin':'#ffe4b5', + 'navajowhite':'#ffdead', + 'navy':'#000080', + 'oldlace':'#fdf5e6', + 'olive':'#808000', + 'olivedrab':'#6b8e23', + 'orange':'#ffa500', + 'orangered':'#ff4500', + 'orchid':'#da70d6', + 'palegoldenrod':'#eee8aa', + 'palegreen':'#98fb98', + 'paleturquoise':'#afeeee', + 'palevioletred':'#d87093', + 'papayawhip':'#ffefd5', + 'peachpuff':'#ffdab9', + 'peru':'#cd853f', + 'pink':'#ffc0cb', + 'plum':'#dda0dd', + 'powderblue':'#b0e0e6', + 'purple':'#800080', + 'red':'#ff0000', + 'rosybrown':'#bc8f8f', + 'royalblue':'#4169e1', + 'saddlebrown':'#8b4513', + 'salmon':'#fa8072', + 'sandybrown':'#f4a460', + 'seagreen':'#2e8b57', + 'seashell':'#fff5ee', + 'sienna':'#a0522d', + 'silver':'#c0c0c0', + 'skyblue':'#87ceeb', + 'slateblue':'#6a5acd', + 'slategray':'#708090', + 'slategrey':'#708090', + 'snow':'#fffafa', + 'springgreen':'#00ff7f', + 'steelblue':'#4682b4', + 'tan':'#d2b48c', + 'teal':'#008080', + 'thistle':'#d8bfd8', + 'tomato':'#ff6347', + 'turquoise':'#40e0d0', + 'violet':'#ee82ee', + 'wheat':'#f5deb3', + 'white':'#ffffff', + 'whitesmoke':'#f5f5f5', + 'yellow':'#ffff00', + 'yellowgreen':'#9acd32' + }; +})(require('./tree')); + +(function (tree) { + +tree.debugInfo = function(env, ctx, lineSeperator) { + var result=""; + if (env.dumpLineNumbers && !env.compress) { + switch(env.dumpLineNumbers) { + case 'comments': + result = tree.debugInfo.asComment(ctx); + break; + case 'mediaquery': + result = tree.debugInfo.asMediaQuery(ctx); + break; + case 'all': + result = tree.debugInfo.asComment(ctx) + (lineSeperator || "") + tree.debugInfo.asMediaQuery(ctx); + break; + } + } + return result; +}; + +tree.debugInfo.asComment = function(ctx) { + return '/* line ' + ctx.debugInfo.lineNumber + ', ' + ctx.debugInfo.fileName + ' */\n'; +}; + +tree.debugInfo.asMediaQuery = function(ctx) { + return '@media -sass-debug-info{filename{font-family:' + + ('file://' + ctx.debugInfo.fileName).replace(/([.:\/\\])/g, function (a) { + if (a == '\\') { + a = '\/'; + } + return '\\' + a; + }) + + '}line{font-family:\\00003' + ctx.debugInfo.lineNumber + '}}\n'; +}; + +tree.find = function (obj, fun) { + for (var i = 0, r; i < obj.length; i++) { + r = fun.call(obj, obj[i]); + if (r) { return r; } + } + return null; +}; + +tree.jsify = function (obj) { + if (Array.isArray(obj.value) && (obj.value.length > 1)) { + return '[' + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + ']'; + } else { + return obj.toCSS(); + } +}; + +tree.toCSS = function (env) { + var strs = []; + this.genCSS(env, { + add: function(chunk, fileInfo, index) { + strs.push(chunk); + }, + isEmpty: function () { + return strs.length === 0; + } + }); + return strs.join(''); +}; + +tree.outputRuleset = function (env, output, rules) { + var ruleCnt = rules.length, i; + env.tabLevel = (env.tabLevel | 0) + 1; + + // Compressed + if (env.compress) { + output.add('{'); + for (i = 0; i < ruleCnt; i++) { + rules[i].genCSS(env, output); + } + output.add('}'); + env.tabLevel--; + return; + } + + // Non-compressed + var tabSetStr = '\n' + Array(env.tabLevel).join(" "), tabRuleStr = tabSetStr + " "; + if (!ruleCnt) { + output.add(" {" + tabSetStr + '}'); + } else { + output.add(" {" + tabRuleStr); + rules[0].genCSS(env, output); + for (i = 1; i < ruleCnt; i++) { + output.add(tabRuleStr); + rules[i].genCSS(env, output); + } + output.add(tabSetStr + '}'); + } + + env.tabLevel--; +}; + +})(require('./tree')); + +(function (tree) { + +tree.Alpha = function (val) { + this.value = val; +}; +tree.Alpha.prototype = { + type: "Alpha", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + eval: function (env) { + if (this.value.eval) { return new tree.Alpha(this.value.eval(env)); } + return this; + }, + genCSS: function (env, output) { + output.add("alpha(opacity="); + + if (this.value.genCSS) { + this.value.genCSS(env, output); + } else { + output.add(this.value); + } + + output.add(")"); + }, + toCSS: tree.toCSS +}; + +})(require('../tree')); + +(function (tree) { + +tree.Anonymous = function (value, index, currentFileInfo, mapLines) { + this.value = value; + this.index = index; + this.mapLines = mapLines; + this.currentFileInfo = currentFileInfo; +}; +tree.Anonymous.prototype = { + type: "Anonymous", + eval: function () { + return new tree.Anonymous(this.value, this.index, this.currentFileInfo, this.mapLines); + }, + compare: function (x) { + if (!x.toCSS) { + return -1; + } + + var left = this.toCSS(), + right = x.toCSS(); + + if (left === right) { + return 0; + } + + return left < right ? -1 : 1; + }, + genCSS: function (env, output) { + output.add(this.value, this.currentFileInfo, this.index, this.mapLines); + }, + toCSS: tree.toCSS +}; + +})(require('../tree')); + +(function (tree) { + +tree.Assignment = function (key, val) { + this.key = key; + this.value = val; +}; +tree.Assignment.prototype = { + type: "Assignment", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + eval: function (env) { + if (this.value.eval) { + return new(tree.Assignment)(this.key, this.value.eval(env)); + } + return this; + }, + genCSS: function (env, output) { + output.add(this.key + '='); + if (this.value.genCSS) { + this.value.genCSS(env, output); + } else { + output.add(this.value); + } + }, + toCSS: tree.toCSS +}; + +})(require('../tree')); + +(function (tree) { + +// +// A function call node. +// +tree.Call = function (name, args, index, currentFileInfo) { + this.name = name; + this.args = args; + this.index = index; + this.currentFileInfo = currentFileInfo; +}; +tree.Call.prototype = { + type: "Call", + accept: function (visitor) { + if (this.args) { + this.args = visitor.visitArray(this.args); + } + }, + // + // When evaluating a function call, + // we either find the function in `tree.functions` [1], + // in which case we call it, passing the evaluated arguments, + // if this returns null or we cannot find the function, we + // simply print it out as it appeared originally [2]. + // + // The *functions.js* file contains the built-in functions. + // + // The reason why we evaluate the arguments, is in the case where + // we try to pass a variable to a function, like: `saturate(@color)`. + // The function should receive the value, not the variable. + // + eval: function (env) { + var args = this.args.map(function (a) { return a.eval(env); }), + nameLC = this.name.toLowerCase(), + result, func; + + if (nameLC in tree.functions) { // 1. + try { + func = new tree.functionCall(env, this.currentFileInfo); + result = func[nameLC].apply(func, args); + if (result != null) { + return result; + } + } catch (e) { + throw { type: e.type || "Runtime", + message: "error evaluating function `" + this.name + "`" + + (e.message ? ': ' + e.message : ''), + index: this.index, filename: this.currentFileInfo.filename }; + } + } + + return new tree.Call(this.name, args, this.index, this.currentFileInfo); + }, + + genCSS: function (env, output) { + output.add(this.name + "(", this.currentFileInfo, this.index); + + for(var i = 0; i < this.args.length; i++) { + this.args[i].genCSS(env, output); + if (i + 1 < this.args.length) { + output.add(", "); + } + } + + output.add(")"); + }, + + toCSS: tree.toCSS +}; + +})(require('../tree')); + +(function (tree) { +// +// RGB Colors - #ff0014, #eee +// +tree.Color = function (rgb, a) { + // + // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + // + if (Array.isArray(rgb)) { + this.rgb = rgb; + } else if (rgb.length == 6) { + this.rgb = rgb.match(/.{2}/g).map(function (c) { + return parseInt(c, 16); + }); + } else { + this.rgb = rgb.split('').map(function (c) { + return parseInt(c + c, 16); + }); + } + this.alpha = typeof(a) === 'number' ? a : 1; +}; + +var transparentKeyword = "transparent"; + +tree.Color.prototype = { + type: "Color", + eval: function () { return this; }, + luma: function () { + var r = this.rgb[0] / 255, + g = this.rgb[1] / 255, + b = this.rgb[2] / 255; + + r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); + g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); + b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); + + return 0.2126 * r + 0.7152 * g + 0.0722 * b; + }, + + genCSS: function (env, output) { + output.add(this.toCSS(env)); + }, + toCSS: function (env, doNotCompress) { + var compress = env && env.compress && !doNotCompress, + alpha = tree.fround(env, this.alpha); + + // If we have some transparency, the only way to represent it + // is via `rgba`. Otherwise, we use the hex representation, + // which has better compatibility with older browsers. + // Values are capped between `0` and `255`, rounded and zero-padded. + if (alpha < 1) { + if (alpha === 0 && this.isTransparentKeyword) { + return transparentKeyword; + } + return "rgba(" + this.rgb.map(function (c) { + return clamp(Math.round(c), 255); + }).concat(clamp(alpha, 1)) + .join(',' + (compress ? '' : ' ')) + ")"; + } else { + var color = this.toRGB(); + + if (compress) { + var splitcolor = color.split(''); + + // Convert color to short format + if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) { + color = '#' + splitcolor[1] + splitcolor[3] + splitcolor[5]; + } + } + + return color; + } + }, + + // + // Operations have to be done per-channel, if not, + // channels will spill onto each other. Once we have + // our result, in the form of an integer triplet, + // we create a new Color node to hold the result. + // + operate: function (env, op, other) { + var rgb = []; + var alpha = this.alpha * (1 - other.alpha) + other.alpha; + for (var c = 0; c < 3; c++) { + rgb[c] = tree.operate(env, op, this.rgb[c], other.rgb[c]); + } + return new(tree.Color)(rgb, alpha); + }, + + toRGB: function () { + return toHex(this.rgb); + }, + + toHSL: function () { + var r = this.rgb[0] / 255, + g = this.rgb[1] / 255, + b = this.rgb[2] / 255, + a = this.alpha; + + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, l = (max + min) / 2, d = max - min; + + if (max === min) { + h = s = 0; + } else { + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + + switch (max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h * 360, s: s, l: l, a: a }; + }, + //Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + toHSV: function () { + var r = this.rgb[0] / 255, + g = this.rgb[1] / 255, + b = this.rgb[2] / 255, + a = this.alpha; + + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, v = max; + + var d = max - min; + if (max === 0) { + s = 0; + } else { + s = d / max; + } + + if (max === min) { + h = 0; + } else { + switch(max){ + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h * 360, s: s, v: v, a: a }; + }, + toARGB: function () { + return toHex([this.alpha * 255].concat(this.rgb)); + }, + compare: function (x) { + if (!x.rgb) { + return -1; + } + + return (x.rgb[0] === this.rgb[0] && + x.rgb[1] === this.rgb[1] && + x.rgb[2] === this.rgb[2] && + x.alpha === this.alpha) ? 0 : -1; + } +}; + +tree.Color.fromKeyword = function(keyword) { + keyword = keyword.toLowerCase(); + + if (tree.colors.hasOwnProperty(keyword)) { + // detect named color + return new(tree.Color)(tree.colors[keyword].slice(1)); + } + if (keyword === transparentKeyword) { + var transparent = new(tree.Color)([0, 0, 0], 0); + transparent.isTransparentKeyword = true; + return transparent; + } +}; + +function toHex(v) { + return '#' + v.map(function (c) { + c = clamp(Math.round(c), 255); + return (c < 16 ? '0' : '') + c.toString(16); + }).join(''); +} + +function clamp(v, max) { + return Math.min(Math.max(v, 0), max); +} + +})(require('../tree')); + +(function (tree) { + +tree.Comment = function (value, silent, index, currentFileInfo) { + this.value = value; + this.silent = !!silent; + this.currentFileInfo = currentFileInfo; +}; +tree.Comment.prototype = { + type: "Comment", + genCSS: function (env, output) { + if (this.debugInfo) { + output.add(tree.debugInfo(env, this), this.currentFileInfo, this.index); + } + output.add(this.value.trim()); //TODO shouldn't need to trim, we shouldn't grab the \n + }, + toCSS: tree.toCSS, + isSilent: function(env) { + var isReference = (this.currentFileInfo && this.currentFileInfo.reference && !this.isReferenced), + isCompressed = env.compress && !this.value.match(/^\/\*!/); + return this.silent || isReference || isCompressed; + }, + eval: function () { return this; }, + markReferenced: function () { + this.isReferenced = true; + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Condition = function (op, l, r, i, negate) { + this.op = op.trim(); + this.lvalue = l; + this.rvalue = r; + this.index = i; + this.negate = negate; +}; +tree.Condition.prototype = { + type: "Condition", + accept: function (visitor) { + this.lvalue = visitor.visit(this.lvalue); + this.rvalue = visitor.visit(this.rvalue); + }, + eval: function (env) { + var a = this.lvalue.eval(env), + b = this.rvalue.eval(env); + + var i = this.index, result; + + result = (function (op) { + switch (op) { + case 'and': + return a && b; + case 'or': + return a || b; + default: + if (a.compare) { + result = a.compare(b); + } else if (b.compare) { + result = b.compare(a); + } else { + throw { type: "Type", + message: "Unable to perform comparison", + index: i }; + } + switch (result) { + case -1: return op === '<' || op === '=<' || op === '<='; + case 0: return op === '=' || op === '>=' || op === '=<' || op === '<='; + case 1: return op === '>' || op === '>='; + } + } + })(this.op); + return this.negate ? !result : result; + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.DetachedRuleset = function (ruleset, frames) { + this.ruleset = ruleset; + this.frames = frames; +}; +tree.DetachedRuleset.prototype = { + type: "DetachedRuleset", + accept: function (visitor) { + this.ruleset = visitor.visit(this.ruleset); + }, + eval: function (env) { + var frames = this.frames || env.frames.slice(0); + return new tree.DetachedRuleset(this.ruleset, frames); + }, + callEval: function (env) { + return this.ruleset.eval(this.frames ? new(tree.evalEnv)(env, this.frames.concat(env.frames)) : env); + } +}; +})(require('../tree')); + +(function (tree) { + +// +// A number with a unit +// +tree.Dimension = function (value, unit) { + this.value = parseFloat(value); + this.unit = (unit && unit instanceof tree.Unit) ? unit : + new(tree.Unit)(unit ? [unit] : undefined); +}; + +tree.Dimension.prototype = { + type: "Dimension", + accept: function (visitor) { + this.unit = visitor.visit(this.unit); + }, + eval: function (env) { + return this; + }, + toColor: function () { + return new(tree.Color)([this.value, this.value, this.value]); + }, + genCSS: function (env, output) { + if ((env && env.strictUnits) && !this.unit.isSingular()) { + throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: "+this.unit.toString()); + } + + var value = tree.fround(env, this.value), + strValue = String(value); + + if (value !== 0 && value < 0.000001 && value > -0.000001) { + // would be output 1e-6 etc. + strValue = value.toFixed(20).replace(/0+$/, ""); + } + + if (env && env.compress) { + // Zero values doesn't need a unit + if (value === 0 && this.unit.isLength()) { + output.add(strValue); + return; + } + + // Float values doesn't need a leading zero + if (value > 0 && value < 1) { + strValue = (strValue).substr(1); + } + } + + output.add(strValue); + this.unit.genCSS(env, output); + }, + toCSS: tree.toCSS, + + // In an operation between two Dimensions, + // we default to the first Dimension's unit, + // so `1px + 2` will yield `3px`. + operate: function (env, op, other) { + /*jshint noempty:false */ + var value = tree.operate(env, op, this.value, other.value), + unit = this.unit.clone(); + + if (op === '+' || op === '-') { + if (unit.numerator.length === 0 && unit.denominator.length === 0) { + unit.numerator = other.unit.numerator.slice(0); + unit.denominator = other.unit.denominator.slice(0); + } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) { + // do nothing + } else { + other = other.convertTo(this.unit.usedUnits()); + + if(env.strictUnits && other.unit.toString() !== unit.toString()) { + throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '" + unit.toString() + + "' and '" + other.unit.toString() + "'."); + } + + value = tree.operate(env, op, this.value, other.value); + } + } else if (op === '*') { + unit.numerator = unit.numerator.concat(other.unit.numerator).sort(); + unit.denominator = unit.denominator.concat(other.unit.denominator).sort(); + unit.cancel(); + } else if (op === '/') { + unit.numerator = unit.numerator.concat(other.unit.denominator).sort(); + unit.denominator = unit.denominator.concat(other.unit.numerator).sort(); + unit.cancel(); + } + return new(tree.Dimension)(value, unit); + }, + + compare: function (other) { + if (other instanceof tree.Dimension) { + var a, b, + aValue, bValue; + + if (this.unit.isEmpty() || other.unit.isEmpty()) { + a = this; + b = other; + } else { + a = this.unify(); + b = other.unify(); + if (a.unit.compare(b.unit) !== 0) { + return -1; + } + } + aValue = a.value; + bValue = b.value; + + if (bValue > aValue) { + return -1; + } else if (bValue < aValue) { + return 1; + } else { + return 0; + } + } else { + return -1; + } + }, + + unify: function () { + return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); + }, + + convertTo: function (conversions) { + var value = this.value, unit = this.unit.clone(), + i, groupName, group, targetUnit, derivedConversions = {}, applyUnit; + + if (typeof conversions === 'string') { + for(i in tree.UnitConversions) { + if (tree.UnitConversions[i].hasOwnProperty(conversions)) { + derivedConversions = {}; + derivedConversions[i] = conversions; + } + } + conversions = derivedConversions; + } + applyUnit = function (atomicUnit, denominator) { + /*jshint loopfunc:true */ + if (group.hasOwnProperty(atomicUnit)) { + if (denominator) { + value = value / (group[atomicUnit] / group[targetUnit]); + } else { + value = value * (group[atomicUnit] / group[targetUnit]); + } + + return targetUnit; + } + + return atomicUnit; + }; + + for (groupName in conversions) { + if (conversions.hasOwnProperty(groupName)) { + targetUnit = conversions[groupName]; + group = tree.UnitConversions[groupName]; + + unit.map(applyUnit); + } + } + + unit.cancel(); + + return new(tree.Dimension)(value, unit); + } +}; + +// http://www.w3.org/TR/css3-values/#absolute-lengths +tree.UnitConversions = { + length: { + 'm': 1, + 'cm': 0.01, + 'mm': 0.001, + 'in': 0.0254, + 'px': 0.0254 / 96, + 'pt': 0.0254 / 72, + 'pc': 0.0254 / 72 * 12 + }, + duration: { + 's': 1, + 'ms': 0.001 + }, + angle: { + 'rad': 1/(2*Math.PI), + 'deg': 1/360, + 'grad': 1/400, + 'turn': 1 + } +}; + +tree.Unit = function (numerator, denominator, backupUnit) { + this.numerator = numerator ? numerator.slice(0).sort() : []; + this.denominator = denominator ? denominator.slice(0).sort() : []; + this.backupUnit = backupUnit; +}; + +tree.Unit.prototype = { + type: "Unit", + clone: function () { + return new tree.Unit(this.numerator.slice(0), this.denominator.slice(0), this.backupUnit); + }, + genCSS: function (env, output) { + if (this.numerator.length >= 1) { + output.add(this.numerator[0]); + } else + if (this.denominator.length >= 1) { + output.add(this.denominator[0]); + } else + if ((!env || !env.strictUnits) && this.backupUnit) { + output.add(this.backupUnit); + } + }, + toCSS: tree.toCSS, + + toString: function () { + var i, returnStr = this.numerator.join("*"); + for (i = 0; i < this.denominator.length; i++) { + returnStr += "/" + this.denominator[i]; + } + return returnStr; + }, + + compare: function (other) { + return this.is(other.toString()) ? 0 : -1; + }, + + is: function (unitString) { + return this.toString() === unitString; + }, + + isLength: function () { + return Boolean(this.toCSS().match(/px|em|%|in|cm|mm|pc|pt|ex/)); + }, + + isEmpty: function () { + return this.numerator.length === 0 && this.denominator.length === 0; + }, + + isSingular: function() { + return this.numerator.length <= 1 && this.denominator.length === 0; + }, + + map: function(callback) { + var i; + + for (i = 0; i < this.numerator.length; i++) { + this.numerator[i] = callback(this.numerator[i], false); + } + + for (i = 0; i < this.denominator.length; i++) { + this.denominator[i] = callback(this.denominator[i], true); + } + }, + + usedUnits: function() { + var group, result = {}, mapUnit; + + mapUnit = function (atomicUnit) { + /*jshint loopfunc:true */ + if (group.hasOwnProperty(atomicUnit) && !result[groupName]) { + result[groupName] = atomicUnit; + } + + return atomicUnit; + }; + + for (var groupName in tree.UnitConversions) { + if (tree.UnitConversions.hasOwnProperty(groupName)) { + group = tree.UnitConversions[groupName]; + + this.map(mapUnit); + } + } + + return result; + }, + + cancel: function () { + var counter = {}, atomicUnit, i, backup; + + for (i = 0; i < this.numerator.length; i++) { + atomicUnit = this.numerator[i]; + if (!backup) { + backup = atomicUnit; + } + counter[atomicUnit] = (counter[atomicUnit] || 0) + 1; + } + + for (i = 0; i < this.denominator.length; i++) { + atomicUnit = this.denominator[i]; + if (!backup) { + backup = atomicUnit; + } + counter[atomicUnit] = (counter[atomicUnit] || 0) - 1; + } + + this.numerator = []; + this.denominator = []; + + for (atomicUnit in counter) { + if (counter.hasOwnProperty(atomicUnit)) { + var count = counter[atomicUnit]; + + if (count > 0) { + for (i = 0; i < count; i++) { + this.numerator.push(atomicUnit); + } + } else if (count < 0) { + for (i = 0; i < -count; i++) { + this.denominator.push(atomicUnit); + } + } + } + } + + if (this.numerator.length === 0 && this.denominator.length === 0 && backup) { + this.backupUnit = backup; + } + + this.numerator.sort(); + this.denominator.sort(); + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Directive = function (name, value, rules, index, currentFileInfo, debugInfo) { + this.name = name; + this.value = value; + if (rules) { + this.rules = rules; + this.rules.allowImports = true; + } + this.index = index; + this.currentFileInfo = currentFileInfo; + this.debugInfo = debugInfo; +}; + +tree.Directive.prototype = { + type: "Directive", + accept: function (visitor) { + var value = this.value, rules = this.rules; + if (rules) { + rules = visitor.visit(rules); + } + if (value) { + value = visitor.visit(value); + } + }, + genCSS: function (env, output) { + var value = this.value, rules = this.rules; + output.add(this.name, this.currentFileInfo, this.index); + if (value) { + output.add(' '); + value.genCSS(env, output); + } + if (rules) { + tree.outputRuleset(env, output, [rules]); + } else { + output.add(';'); + } + }, + toCSS: tree.toCSS, + eval: function (env) { + var value = this.value, rules = this.rules; + if (value) { + value = value.eval(env); + } + if (rules) { + rules = rules.eval(env); + rules.root = true; + } + return new(tree.Directive)(this.name, value, rules, + this.index, this.currentFileInfo, this.debugInfo); + }, + variable: function (name) { if (this.rules) return tree.Ruleset.prototype.variable.call(this.rules, name); }, + find: function () { if (this.rules) return tree.Ruleset.prototype.find.apply(this.rules, arguments); }, + rulesets: function () { if (this.rules) return tree.Ruleset.prototype.rulesets.apply(this.rules); }, + markReferenced: function () { + var i, rules; + this.isReferenced = true; + if (this.rules) { + rules = this.rules.rules; + for (i = 0; i < rules.length; i++) { + if (rules[i].markReferenced) { + rules[i].markReferenced(); + } + } + } + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Element = function (combinator, value, index, currentFileInfo) { + this.combinator = combinator instanceof tree.Combinator ? + combinator : new(tree.Combinator)(combinator); + + if (typeof(value) === 'string') { + this.value = value.trim(); + } else if (value) { + this.value = value; + } else { + this.value = ""; + } + this.index = index; + this.currentFileInfo = currentFileInfo; +}; +tree.Element.prototype = { + type: "Element", + accept: function (visitor) { + var value = this.value; + this.combinator = visitor.visit(this.combinator); + if (typeof value === "object") { + this.value = visitor.visit(value); + } + }, + eval: function (env) { + return new(tree.Element)(this.combinator, + this.value.eval ? this.value.eval(env) : this.value, + this.index, + this.currentFileInfo); + }, + genCSS: function (env, output) { + output.add(this.toCSS(env), this.currentFileInfo, this.index); + }, + toCSS: function (env) { + var value = (this.value.toCSS ? this.value.toCSS(env) : this.value); + if (value === '' && this.combinator.value.charAt(0) === '&') { + return ''; + } else { + return this.combinator.toCSS(env || {}) + value; + } + } +}; + +tree.Attribute = function (key, op, value) { + this.key = key; + this.op = op; + this.value = value; +}; +tree.Attribute.prototype = { + type: "Attribute", + eval: function (env) { + return new(tree.Attribute)(this.key.eval ? this.key.eval(env) : this.key, + this.op, (this.value && this.value.eval) ? this.value.eval(env) : this.value); + }, + genCSS: function (env, output) { + output.add(this.toCSS(env)); + }, + toCSS: function (env) { + var value = this.key.toCSS ? this.key.toCSS(env) : this.key; + + if (this.op) { + value += this.op; + value += (this.value.toCSS ? this.value.toCSS(env) : this.value); + } + + return '[' + value + ']'; + } +}; + +tree.Combinator = function (value) { + if (value === ' ') { + this.value = ' '; + } else { + this.value = value ? value.trim() : ""; + } +}; +tree.Combinator.prototype = { + type: "Combinator", + _outputMap: { + '' : '', + ' ' : ' ', + ':' : ' :', + '+' : ' + ', + '~' : ' ~ ', + '>' : ' > ', + '|' : '|', + '^' : ' ^ ', + '^^' : ' ^^ ' + }, + _outputMapCompressed: { + '' : '', + ' ' : ' ', + ':' : ' :', + '+' : '+', + '~' : '~', + '>' : '>', + '|' : '|', + '^' : '^', + '^^' : '^^' + }, + genCSS: function (env, output) { + output.add((env.compress ? this._outputMapCompressed : this._outputMap)[this.value]); + }, + toCSS: tree.toCSS +}; + +})(require('../tree')); + +(function (tree) { + +tree.Expression = function (value) { this.value = value; }; +tree.Expression.prototype = { + type: "Expression", + accept: function (visitor) { + if (this.value) { + this.value = visitor.visitArray(this.value); + } + }, + eval: function (env) { + var returnValue, + inParenthesis = this.parens && !this.parensInOp, + doubleParen = false; + if (inParenthesis) { + env.inParenthesis(); + } + if (this.value.length > 1) { + returnValue = new(tree.Expression)(this.value.map(function (e) { + return e.eval(env); + })); + } else if (this.value.length === 1) { + if (this.value[0].parens && !this.value[0].parensInOp) { + doubleParen = true; + } + returnValue = this.value[0].eval(env); + } else { + returnValue = this; + } + if (inParenthesis) { + env.outOfParenthesis(); + } + if (this.parens && this.parensInOp && !(env.isMathOn()) && !doubleParen) { + returnValue = new(tree.Paren)(returnValue); + } + return returnValue; + }, + genCSS: function (env, output) { + for(var i = 0; i < this.value.length; i++) { + this.value[i].genCSS(env, output); + if (i + 1 < this.value.length) { + output.add(" "); + } + } + }, + toCSS: tree.toCSS, + throwAwayComments: function () { + this.value = this.value.filter(function(v) { + return !(v instanceof tree.Comment); + }); + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Extend = function Extend(selector, option, index) { + this.selector = selector; + this.option = option; + this.index = index; + this.object_id = tree.Extend.next_id++; + this.parent_ids = [this.object_id]; + + switch(option) { + case "all": + this.allowBefore = true; + this.allowAfter = true; + break; + default: + this.allowBefore = false; + this.allowAfter = false; + break; + } +}; +tree.Extend.next_id = 0; + +tree.Extend.prototype = { + type: "Extend", + accept: function (visitor) { + this.selector = visitor.visit(this.selector); + }, + eval: function (env) { + return new(tree.Extend)(this.selector.eval(env), this.option, this.index); + }, + clone: function (env) { + return new(tree.Extend)(this.selector, this.option, this.index); + }, + findSelfSelectors: function (selectors) { + var selfElements = [], + i, + selectorElements; + + for(i = 0; i < selectors.length; i++) { + selectorElements = selectors[i].elements; + // duplicate the logic in genCSS function inside the selector node. + // future TODO - move both logics into the selector joiner visitor + if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === "") { + selectorElements[0].combinator.value = ' '; + } + selfElements = selfElements.concat(selectors[i].elements); + } + + this.selfSelectors = [{ elements: selfElements }]; + } +}; + +})(require('../tree')); + +(function (tree) { +// +// CSS @import node +// +// The general strategy here is that we don't want to wait +// for the parsing to be completed, before we start importing +// the file. That's because in the context of a browser, +// most of the time will be spent waiting for the server to respond. +// +// On creation, we push the import path to our import queue, though +// `import,push`, we also pass it a callback, which it'll call once +// the file has been fetched, and parsed. +// +tree.Import = function (path, features, options, index, currentFileInfo) { + this.options = options; + this.index = index; + this.path = path; + this.features = features; + this.currentFileInfo = currentFileInfo; + + if (this.options.less !== undefined || this.options.inline) { + this.css = !this.options.less || this.options.inline; + } else { + var pathValue = this.getPath(); + if (pathValue && /css([\?;].*)?$/.test(pathValue)) { + this.css = true; + } + } +}; + +// +// The actual import node doesn't return anything, when converted to CSS. +// The reason is that it's used at the evaluation stage, so that the rules +// it imports can be treated like any other rules. +// +// In `eval`, we make sure all Import nodes get evaluated, recursively, so +// we end up with a flat structure, which can easily be imported in the parent +// ruleset. +// +tree.Import.prototype = { + type: "Import", + accept: function (visitor) { + if (this.features) { + this.features = visitor.visit(this.features); + } + this.path = visitor.visit(this.path); + if (!this.options.inline && this.root) { + this.root = visitor.visit(this.root); + } + }, + genCSS: function (env, output) { + if (this.css) { + output.add("@import ", this.currentFileInfo, this.index); + this.path.genCSS(env, output); + if (this.features) { + output.add(" "); + this.features.genCSS(env, output); + } + output.add(';'); + } + }, + toCSS: tree.toCSS, + getPath: function () { + if (this.path instanceof tree.Quoted) { + var path = this.path.value; + return (this.css !== undefined || /(\.[a-z]*$)|([\?;].*)$/.test(path)) ? path : path + '.less'; + } else if (this.path instanceof tree.URL) { + return this.path.value.value; + } + return null; + }, + evalForImport: function (env) { + return new(tree.Import)(this.path.eval(env), this.features, this.options, this.index, this.currentFileInfo); + }, + evalPath: function (env) { + var path = this.path.eval(env); + var rootpath = this.currentFileInfo && this.currentFileInfo.rootpath; + + if (!(path instanceof tree.URL)) { + if (rootpath) { + var pathValue = path.value; + // Add the base path if the import is relative + if (pathValue && env.isPathRelative(pathValue)) { + path.value = rootpath +pathValue; + } + } + path.value = env.normalizePath(path.value); + } + + return path; + }, + eval: function (env) { + var ruleset, features = this.features && this.features.eval(env); + + if (this.skip) { + if (typeof this.skip === "function") { + this.skip = this.skip(); + } + if (this.skip) { + return []; + } + } + + if (this.options.inline) { + //todo needs to reference css file not import + var contents = new(tree.Anonymous)(this.root, 0, {filename: this.importedFilename}, true); + return this.features ? new(tree.Media)([contents], this.features.value) : [contents]; + } else if (this.css) { + var newImport = new(tree.Import)(this.evalPath(env), features, this.options, this.index); + if (!newImport.css && this.error) { + throw this.error; + } + return newImport; + } else { + ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); + + ruleset.evalImports(env); + + return this.features ? new(tree.Media)(ruleset.rules, this.features.value) : ruleset.rules; + } + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.JavaScript = function (string, index, escaped) { + this.escaped = escaped; + this.expression = string; + this.index = index; +}; +tree.JavaScript.prototype = { + type: "JavaScript", + eval: function (env) { + var result, + that = this, + context = {}; + + var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { + return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); + }); + + try { + expression = new(Function)('return (' + expression + ')'); + } catch (e) { + throw { message: "JavaScript evaluation error: " + e.message + " from `" + expression + "`" , + index: this.index }; + } + + var variables = env.frames[0].variables(); + for (var k in variables) { + if (variables.hasOwnProperty(k)) { + /*jshint loopfunc:true */ + context[k.slice(1)] = { + value: variables[k].value, + toJS: function () { + return this.value.eval(env).toCSS(); + } + }; + } + } + + try { + result = expression.call(context); + } catch (e) { + throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message.replace(/["]/g, "'") + "'" , + index: this.index }; + } + if (typeof(result) === 'number') { + return new(tree.Dimension)(result); + } else if (typeof(result) === 'string') { + return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); + } else if (Array.isArray(result)) { + return new(tree.Anonymous)(result.join(', ')); + } else { + return new(tree.Anonymous)(result); + } + } +}; + +})(require('../tree')); + + +(function (tree) { + +tree.Keyword = function (value) { this.value = value; }; +tree.Keyword.prototype = { + type: "Keyword", + eval: function () { return this; }, + genCSS: function (env, output) { + if (this.value === '%') { throw { type: "Syntax", message: "Invalid % without number" }; } + output.add(this.value); + }, + toCSS: tree.toCSS, + compare: function (other) { + if (other instanceof tree.Keyword) { + return other.value === this.value ? 0 : 1; + } else { + return -1; + } + } +}; + +tree.True = new(tree.Keyword)('true'); +tree.False = new(tree.Keyword)('false'); + +})(require('../tree')); + +(function (tree) { + +tree.Media = function (value, features, index, currentFileInfo) { + this.index = index; + this.currentFileInfo = currentFileInfo; + + var selectors = this.emptySelectors(); + + this.features = new(tree.Value)(features); + this.rules = [new(tree.Ruleset)(selectors, value)]; + this.rules[0].allowImports = true; +}; +tree.Media.prototype = { + type: "Media", + accept: function (visitor) { + if (this.features) { + this.features = visitor.visit(this.features); + } + if (this.rules) { + this.rules = visitor.visitArray(this.rules); + } + }, + genCSS: function (env, output) { + output.add('@media ', this.currentFileInfo, this.index); + this.features.genCSS(env, output); + tree.outputRuleset(env, output, this.rules); + }, + toCSS: tree.toCSS, + eval: function (env) { + if (!env.mediaBlocks) { + env.mediaBlocks = []; + env.mediaPath = []; + } + + var media = new(tree.Media)(null, [], this.index, this.currentFileInfo); + if(this.debugInfo) { + this.rules[0].debugInfo = this.debugInfo; + media.debugInfo = this.debugInfo; + } + var strictMathBypass = false; + if (!env.strictMath) { + strictMathBypass = true; + env.strictMath = true; + } + try { + media.features = this.features.eval(env); + } + finally { + if (strictMathBypass) { + env.strictMath = false; + } + } + + env.mediaPath.push(media); + env.mediaBlocks.push(media); + + env.frames.unshift(this.rules[0]); + media.rules = [this.rules[0].eval(env)]; + env.frames.shift(); + + env.mediaPath.pop(); + + return env.mediaPath.length === 0 ? media.evalTop(env) : + media.evalNested(env); + }, + variable: function (name) { return tree.Ruleset.prototype.variable.call(this.rules[0], name); }, + find: function () { return tree.Ruleset.prototype.find.apply(this.rules[0], arguments); }, + rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.rules[0]); }, + emptySelectors: function() { + var el = new(tree.Element)('', '&', this.index, this.currentFileInfo), + sels = [new(tree.Selector)([el], null, null, this.index, this.currentFileInfo)]; + sels[0].mediaEmpty = true; + return sels; + }, + markReferenced: function () { + var i, rules = this.rules[0].rules; + this.rules[0].markReferenced(); + this.isReferenced = true; + for (i = 0; i < rules.length; i++) { + if (rules[i].markReferenced) { + rules[i].markReferenced(); + } + } + }, + + evalTop: function (env) { + var result = this; + + // Render all dependent Media blocks. + if (env.mediaBlocks.length > 1) { + var selectors = this.emptySelectors(); + result = new(tree.Ruleset)(selectors, env.mediaBlocks); + result.multiMedia = true; + } + + delete env.mediaBlocks; + delete env.mediaPath; + + return result; + }, + evalNested: function (env) { + var i, value, + path = env.mediaPath.concat([this]); + + // Extract the media-query conditions separated with `,` (OR). + for (i = 0; i < path.length; i++) { + value = path[i].features instanceof tree.Value ? + path[i].features.value : path[i].features; + path[i] = Array.isArray(value) ? value : [value]; + } + + // Trace all permutations to generate the resulting media-query. + // + // (a, b and c) with nested (d, e) -> + // a and d + // a and e + // b and c and d + // b and c and e + this.features = new(tree.Value)(this.permute(path).map(function (path) { + path = path.map(function (fragment) { + return fragment.toCSS ? fragment : new(tree.Anonymous)(fragment); + }); + + for(i = path.length - 1; i > 0; i--) { + path.splice(i, 0, new(tree.Anonymous)("and")); + } + + return new(tree.Expression)(path); + })); + + // Fake a tree-node that doesn't output anything. + return new(tree.Ruleset)([], []); + }, + permute: function (arr) { + if (arr.length === 0) { + return []; + } else if (arr.length === 1) { + return arr[0]; + } else { + var result = []; + var rest = this.permute(arr.slice(1)); + for (var i = 0; i < rest.length; i++) { + for (var j = 0; j < arr[0].length; j++) { + result.push([arr[0][j]].concat(rest[i])); + } + } + return result; + } + }, + bubbleSelectors: function (selectors) { + if (!selectors) + return; + this.rules = [new(tree.Ruleset)(selectors.slice(0), [this.rules[0]])]; + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.mixin = {}; +tree.mixin.Call = function (elements, args, index, currentFileInfo, important) { + this.selector = new(tree.Selector)(elements); + this.arguments = (args && args.length) ? args : null; + this.index = index; + this.currentFileInfo = currentFileInfo; + this.important = important; +}; +tree.mixin.Call.prototype = { + type: "MixinCall", + accept: function (visitor) { + if (this.selector) { + this.selector = visitor.visit(this.selector); + } + if (this.arguments) { + this.arguments = visitor.visitArray(this.arguments); + } + }, + eval: function (env) { + var mixins, mixin, args, rules = [], match = false, i, m, f, isRecursive, isOneFound, rule, + candidates = [], candidate, conditionResult = [], defaultFunc = tree.defaultFunc, + defaultResult, defNone = 0, defTrue = 1, defFalse = 2, count, originalRuleset; + + args = this.arguments && this.arguments.map(function (a) { + return { name: a.name, value: a.value.eval(env) }; + }); + + for (i = 0; i < env.frames.length; i++) { + if ((mixins = env.frames[i].find(this.selector)).length > 0) { + isOneFound = true; + + // To make `default()` function independent of definition order we have two "subpasses" here. + // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`), + // and build candidate list with corresponding flags. Then, when we know all possible matches, + // we make a final decision. + + for (m = 0; m < mixins.length; m++) { + mixin = mixins[m]; + isRecursive = false; + for(f = 0; f < env.frames.length; f++) { + if ((!(mixin instanceof tree.mixin.Definition)) && mixin === (env.frames[f].originalRuleset || env.frames[f])) { + isRecursive = true; + break; + } + } + if (isRecursive) { + continue; + } + + if (mixin.matchArgs(args, env)) { + candidate = {mixin: mixin, group: defNone}; + + if (mixin.matchCondition) { + for (f = 0; f < 2; f++) { + defaultFunc.value(f); + conditionResult[f] = mixin.matchCondition(args, env); + } + if (conditionResult[0] || conditionResult[1]) { + if (conditionResult[0] != conditionResult[1]) { + candidate.group = conditionResult[1] ? + defTrue : defFalse; + } + + candidates.push(candidate); + } + } + else { + candidates.push(candidate); + } + + match = true; + } + } + + defaultFunc.reset(); + + count = [0, 0, 0]; + for (m = 0; m < candidates.length; m++) { + count[candidates[m].group]++; + } + + if (count[defNone] > 0) { + defaultResult = defFalse; + } else { + defaultResult = defTrue; + if ((count[defTrue] + count[defFalse]) > 1) { + throw { type: 'Runtime', + message: 'Ambiguous use of `default()` found when matching for `' + + this.format(args) + '`', + index: this.index, filename: this.currentFileInfo.filename }; + } + } + + for (m = 0; m < candidates.length; m++) { + candidate = candidates[m].group; + if ((candidate === defNone) || (candidate === defaultResult)) { + try { + mixin = candidates[m].mixin; + if (!(mixin instanceof tree.mixin.Definition)) { + originalRuleset = mixin.originalRuleset || mixin; + mixin = new tree.mixin.Definition("", [], mixin.rules, null, false); + mixin.originalRuleset = originalRuleset; + } + Array.prototype.push.apply( + rules, mixin.evalCall(env, args, this.important).rules); + } catch (e) { + throw { message: e.message, index: this.index, filename: this.currentFileInfo.filename, stack: e.stack }; + } + } + } + + if (match) { + if (!this.currentFileInfo || !this.currentFileInfo.reference) { + for (i = 0; i < rules.length; i++) { + rule = rules[i]; + if (rule.markReferenced) { + rule.markReferenced(); + } + } + } + return rules; + } + } + } + if (isOneFound) { + throw { type: 'Runtime', + message: 'No matching definition was found for `' + this.format(args) + '`', + index: this.index, filename: this.currentFileInfo.filename }; + } else { + throw { type: 'Name', + message: this.selector.toCSS().trim() + " is undefined", + index: this.index, filename: this.currentFileInfo.filename }; + } + }, + format: function (args) { + return this.selector.toCSS().trim() + '(' + + (args ? args.map(function (a) { + var argValue = ""; + if (a.name) { + argValue += a.name + ":"; + } + if (a.value.toCSS) { + argValue += a.value.toCSS(); + } else { + argValue += "???"; + } + return argValue; + }).join(', ') : "") + ")"; + } +}; + +tree.mixin.Definition = function (name, params, rules, condition, variadic, frames) { + this.name = name; + this.selectors = [new(tree.Selector)([new(tree.Element)(null, name, this.index, this.currentFileInfo)])]; + this.params = params; + this.condition = condition; + this.variadic = variadic; + this.arity = params.length; + this.rules = rules; + this._lookups = {}; + this.required = params.reduce(function (count, p) { + if (!p.name || (p.name && !p.value)) { return count + 1; } + else { return count; } + }, 0); + this.parent = tree.Ruleset.prototype; + this.frames = frames; +}; +tree.mixin.Definition.prototype = { + type: "MixinDefinition", + accept: function (visitor) { + if (this.params && this.params.length) { + this.params = visitor.visitArray(this.params); + } + this.rules = visitor.visitArray(this.rules); + if (this.condition) { + this.condition = visitor.visit(this.condition); + } + }, + variable: function (name) { return this.parent.variable.call(this, name); }, + variables: function () { return this.parent.variables.call(this); }, + find: function () { return this.parent.find.apply(this, arguments); }, + rulesets: function () { return this.parent.rulesets.apply(this); }, + + evalParams: function (env, mixinEnv, args, evaldArguments) { + /*jshint boss:true */ + var frame = new(tree.Ruleset)(null, null), + varargs, arg, + params = this.params.slice(0), + i, j, val, name, isNamedFound, argIndex, argsLength = 0; + + mixinEnv = new tree.evalEnv(mixinEnv, [frame].concat(mixinEnv.frames)); + + if (args) { + args = args.slice(0); + argsLength = args.length; + + for(i = 0; i < argsLength; i++) { + arg = args[i]; + if (name = (arg && arg.name)) { + isNamedFound = false; + for(j = 0; j < params.length; j++) { + if (!evaldArguments[j] && name === params[j].name) { + evaldArguments[j] = arg.value.eval(env); + frame.prependRule(new(tree.Rule)(name, arg.value.eval(env))); + isNamedFound = true; + break; + } + } + if (isNamedFound) { + args.splice(i, 1); + i--; + continue; + } else { + throw { type: 'Runtime', message: "Named argument for " + this.name + + ' ' + args[i].name + ' not found' }; + } + } + } + } + argIndex = 0; + for (i = 0; i < params.length; i++) { + if (evaldArguments[i]) { continue; } + + arg = args && args[argIndex]; + + if (name = params[i].name) { + if (params[i].variadic) { + varargs = []; + for (j = argIndex; j < argsLength; j++) { + varargs.push(args[j].value.eval(env)); + } + frame.prependRule(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env))); + } else { + val = arg && arg.value; + if (val) { + val = val.eval(env); + } else if (params[i].value) { + val = params[i].value.eval(mixinEnv); + frame.resetCache(); + } else { + throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + + ' (' + argsLength + ' for ' + this.arity + ')' }; + } + + frame.prependRule(new(tree.Rule)(name, val)); + evaldArguments[i] = val; + } + } + + if (params[i].variadic && args) { + for (j = argIndex; j < argsLength; j++) { + evaldArguments[j] = args[j].value.eval(env); + } + } + argIndex++; + } + + return frame; + }, + eval: function (env) { + return new tree.mixin.Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || env.frames.slice(0)); + }, + evalCall: function (env, args, important) { + var _arguments = [], + mixinFrames = this.frames ? this.frames.concat(env.frames) : env.frames, + frame = this.evalParams(env, new(tree.evalEnv)(env, mixinFrames), args, _arguments), + rules, ruleset; + + frame.prependRule(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); + + rules = this.rules.slice(0); + + ruleset = new(tree.Ruleset)(null, rules); + ruleset.originalRuleset = this; + ruleset = ruleset.eval(new(tree.evalEnv)(env, [this, frame].concat(mixinFrames))); + if (important) { + ruleset = this.parent.makeImportant.apply(ruleset); + } + return ruleset; + }, + matchCondition: function (args, env) { + if (this.condition && !this.condition.eval( + new(tree.evalEnv)(env, + [this.evalParams(env, new(tree.evalEnv)(env, this.frames ? this.frames.concat(env.frames) : env.frames), args, [])] // the parameter variables + .concat(this.frames) // the parent namespace/mixin frames + .concat(env.frames)))) { // the current environment frames + return false; + } + return true; + }, + matchArgs: function (args, env) { + var argsLength = (args && args.length) || 0, len; + + if (! this.variadic) { + if (argsLength < this.required) { return false; } + if (argsLength > this.params.length) { return false; } + } else { + if (argsLength < (this.required - 1)) { return false; } + } + + len = Math.min(argsLength, this.arity); + + for (var i = 0; i < len; i++) { + if (!this.params[i].name && !this.params[i].variadic) { + if (args[i].value.eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { + return false; + } + } + } + return true; + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Negative = function (node) { + this.value = node; +}; +tree.Negative.prototype = { + type: "Negative", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + genCSS: function (env, output) { + output.add('-'); + this.value.genCSS(env, output); + }, + toCSS: tree.toCSS, + eval: function (env) { + if (env.isMathOn()) { + return (new(tree.Operation)('*', [new(tree.Dimension)(-1), this.value])).eval(env); + } + return new(tree.Negative)(this.value.eval(env)); + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Operation = function (op, operands, isSpaced) { + this.op = op.trim(); + this.operands = operands; + this.isSpaced = isSpaced; +}; +tree.Operation.prototype = { + type: "Operation", + accept: function (visitor) { + this.operands = visitor.visit(this.operands); + }, + eval: function (env) { + var a = this.operands[0].eval(env), + b = this.operands[1].eval(env); + + if (env.isMathOn()) { + if (a instanceof tree.Dimension && b instanceof tree.Color) { + a = a.toColor(); + } + if (b instanceof tree.Dimension && a instanceof tree.Color) { + b = b.toColor(); + } + if (!a.operate) { + throw { type: "Operation", + message: "Operation on an invalid type" }; + } + + return a.operate(env, this.op, b); + } else { + return new(tree.Operation)(this.op, [a, b], this.isSpaced); + } + }, + genCSS: function (env, output) { + this.operands[0].genCSS(env, output); + if (this.isSpaced) { + output.add(" "); + } + output.add(this.op); + if (this.isSpaced) { + output.add(" "); + } + this.operands[1].genCSS(env, output); + }, + toCSS: tree.toCSS +}; + +tree.operate = function (env, op, a, b) { + switch (op) { + case '+': return a + b; + case '-': return a - b; + case '*': return a * b; + case '/': return a / b; + } +}; + +})(require('../tree')); + + +(function (tree) { + +tree.Paren = function (node) { + this.value = node; +}; +tree.Paren.prototype = { + type: "Paren", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + genCSS: function (env, output) { + output.add('('); + this.value.genCSS(env, output); + output.add(')'); + }, + toCSS: tree.toCSS, + eval: function (env) { + return new(tree.Paren)(this.value.eval(env)); + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Quoted = function (str, content, escaped, index, currentFileInfo) { + this.escaped = escaped; + this.value = content || ''; + this.quote = str.charAt(0); + this.index = index; + this.currentFileInfo = currentFileInfo; +}; +tree.Quoted.prototype = { + type: "Quoted", + genCSS: function (env, output) { + if (!this.escaped) { + output.add(this.quote, this.currentFileInfo, this.index); + } + output.add(this.value); + if (!this.escaped) { + output.add(this.quote); + } + }, + toCSS: tree.toCSS, + eval: function (env) { + var that = this; + var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { + return new(tree.JavaScript)(exp, that.index, true).eval(env).value; + }).replace(/@\{([\w-]+)\}/g, function (_, name) { + var v = new(tree.Variable)('@' + name, that.index, that.currentFileInfo).eval(env, true); + return (v instanceof tree.Quoted) ? v.value : v.toCSS(); + }); + return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index, this.currentFileInfo); + }, + compare: function (x) { + if (!x.toCSS) { + return -1; + } + + var left, right; + + // when comparing quoted strings allow the quote to differ + if (x.type === "Quoted" && !this.escaped && !x.escaped) { + left = x.value; + right = this.value; + } else { + left = this.toCSS(); + right = x.toCSS(); + } + + if (left === right) { + return 0; + } + + return left < right ? -1 : 1; + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Rule = function (name, value, important, merge, index, currentFileInfo, inline) { + this.name = name; + this.value = (value instanceof tree.Value || value instanceof tree.Ruleset) ? value : new(tree.Value)([value]); + this.important = important ? ' ' + important.trim() : ''; + this.merge = merge; + this.index = index; + this.currentFileInfo = currentFileInfo; + this.inline = inline || false; + this.variable = name.charAt && (name.charAt(0) === '@'); +}; + +tree.Rule.prototype = { + type: "Rule", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + genCSS: function (env, output) { + output.add(this.name + (env.compress ? ':' : ': '), this.currentFileInfo, this.index); + try { + this.value.genCSS(env, output); + } + catch(e) { + e.index = this.index; + e.filename = this.currentFileInfo.filename; + throw e; + } + output.add(this.important + ((this.inline || (env.lastRule && env.compress)) ? "" : ";"), this.currentFileInfo, this.index); + }, + toCSS: tree.toCSS, + eval: function (env) { + var strictMathBypass = false, name = this.name, evaldValue; + if (typeof name !== "string") { + // expand 'primitive' name directly to get + // things faster (~10% for benchmark.less): + name = (name.length === 1) + && (name[0] instanceof tree.Keyword) + ? name[0].value : evalName(env, name); + } + if (name === "font" && !env.strictMath) { + strictMathBypass = true; + env.strictMath = true; + } + try { + evaldValue = this.value.eval(env); + + if (!this.variable && evaldValue.type === "DetachedRuleset") { + throw { message: "Rulesets cannot be evaluated on a property.", + index: this.index, filename: this.currentFileInfo.filename }; + } + + return new(tree.Rule)(name, + evaldValue, + this.important, + this.merge, + this.index, this.currentFileInfo, this.inline); + } + catch(e) { + if (typeof e.index !== 'number') { + e.index = this.index; + e.filename = this.currentFileInfo.filename; + } + throw e; + } + finally { + if (strictMathBypass) { + env.strictMath = false; + } + } + }, + makeImportant: function () { + return new(tree.Rule)(this.name, + this.value, + "!important", + this.merge, + this.index, this.currentFileInfo, this.inline); + } +}; + +function evalName(env, name) { + var value = "", i, n = name.length, + output = {add: function (s) {value += s;}}; + for (i = 0; i < n; i++) { + name[i].eval(env).genCSS(env, output); + } + return value; +} + +})(require('../tree')); + +(function (tree) { + +tree.RulesetCall = function (variable) { + this.variable = variable; +}; +tree.RulesetCall.prototype = { + type: "RulesetCall", + accept: function (visitor) { + }, + eval: function (env) { + var detachedRuleset = new(tree.Variable)(this.variable).eval(env); + return detachedRuleset.callEval(env); + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Ruleset = function (selectors, rules, strictImports) { + this.selectors = selectors; + this.rules = rules; + this._lookups = {}; + this.strictImports = strictImports; +}; +tree.Ruleset.prototype = { + type: "Ruleset", + accept: function (visitor) { + if (this.paths) { + visitor.visitArray(this.paths, true); + } else if (this.selectors) { + this.selectors = visitor.visitArray(this.selectors); + } + if (this.rules && this.rules.length) { + this.rules = visitor.visitArray(this.rules); + } + }, + eval: function (env) { + var thisSelectors = this.selectors, selectors, + selCnt, selector, i, defaultFunc = tree.defaultFunc, hasOnePassingSelector = false; + + if (thisSelectors && (selCnt = thisSelectors.length)) { + selectors = []; + defaultFunc.error({ + type: "Syntax", + message: "it is currently only allowed in parametric mixin guards," + }); + for (i = 0; i < selCnt; i++) { + selector = thisSelectors[i].eval(env); + selectors.push(selector); + if (selector.evaldCondition) { + hasOnePassingSelector = true; + } + } + defaultFunc.reset(); + } else { + hasOnePassingSelector = true; + } + + var rules = this.rules ? this.rules.slice(0) : null, + ruleset = new(tree.Ruleset)(selectors, rules, this.strictImports), + rule, subRule; + + ruleset.originalRuleset = this; + ruleset.root = this.root; + ruleset.firstRoot = this.firstRoot; + ruleset.allowImports = this.allowImports; + + if(this.debugInfo) { + ruleset.debugInfo = this.debugInfo; + } + + if (!hasOnePassingSelector) { + rules.length = 0; + } + + // push the current ruleset to the frames stack + var envFrames = env.frames; + envFrames.unshift(ruleset); + + // currrent selectors + var envSelectors = env.selectors; + if (!envSelectors) { + env.selectors = envSelectors = []; + } + envSelectors.unshift(this.selectors); + + // Evaluate imports + if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { + ruleset.evalImports(env); + } + + // Store the frames around mixin definitions, + // so they can be evaluated like closures when the time comes. + var rsRules = ruleset.rules, rsRuleCnt = rsRules ? rsRules.length : 0; + for (i = 0; i < rsRuleCnt; i++) { + if (rsRules[i] instanceof tree.mixin.Definition || rsRules[i] instanceof tree.DetachedRuleset) { + rsRules[i] = rsRules[i].eval(env); + } + } + + var mediaBlockCount = (env.mediaBlocks && env.mediaBlocks.length) || 0; + + // Evaluate mixin calls. + for (i = 0; i < rsRuleCnt; i++) { + if (rsRules[i] instanceof tree.mixin.Call) { + /*jshint loopfunc:true */ + rules = rsRules[i].eval(env).filter(function(r) { + if ((r instanceof tree.Rule) && r.variable) { + // do not pollute the scope if the variable is + // already there. consider returning false here + // but we need a way to "return" variable from mixins + return !(ruleset.variable(r.name)); + } + return true; + }); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); + rsRuleCnt += rules.length - 1; + i += rules.length-1; + ruleset.resetCache(); + } else if (rsRules[i] instanceof tree.RulesetCall) { + /*jshint loopfunc:true */ + rules = rsRules[i].eval(env).rules.filter(function(r) { + if ((r instanceof tree.Rule) && r.variable) { + // do not pollute the scope at all + return false; + } + return true; + }); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); + rsRuleCnt += rules.length - 1; + i += rules.length-1; + ruleset.resetCache(); + } + } + + // Evaluate everything else + for (i = 0; i < rsRules.length; i++) { + rule = rsRules[i]; + if (! (rule instanceof tree.mixin.Definition || rule instanceof tree.DetachedRuleset)) { + rsRules[i] = rule = rule.eval ? rule.eval(env) : rule; + } + } + + // Evaluate everything else + for (i = 0; i < rsRules.length; i++) { + rule = rsRules[i]; + // for rulesets, check if it is a css guard and can be removed + if (rule instanceof tree.Ruleset && rule.selectors && rule.selectors.length === 1) { + // check if it can be folded in (e.g. & where) + if (rule.selectors[0].isJustParentSelector()) { + rsRules.splice(i--, 1); + + for(var j = 0; j < rule.rules.length; j++) { + subRule = rule.rules[j]; + if (!(subRule instanceof tree.Rule) || !subRule.variable) { + rsRules.splice(++i, 0, subRule); + } + } + } + } + } + + // Pop the stack + envFrames.shift(); + envSelectors.shift(); + + if (env.mediaBlocks) { + for (i = mediaBlockCount; i < env.mediaBlocks.length; i++) { + env.mediaBlocks[i].bubbleSelectors(selectors); + } + } + + return ruleset; + }, + evalImports: function(env) { + var rules = this.rules, i, importRules; + if (!rules) { return; } + + for (i = 0; i < rules.length; i++) { + if (rules[i] instanceof tree.Import) { + importRules = rules[i].eval(env); + if (importRules && importRules.length) { + rules.splice.apply(rules, [i, 1].concat(importRules)); + i+= importRules.length-1; + } else { + rules.splice(i, 1, importRules); + } + this.resetCache(); + } + } + }, + makeImportant: function() { + return new tree.Ruleset(this.selectors, this.rules.map(function (r) { + if (r.makeImportant) { + return r.makeImportant(); + } else { + return r; + } + }), this.strictImports); + }, + matchArgs: function (args) { + return !args || args.length === 0; + }, + // lets you call a css selector with a guard + matchCondition: function (args, env) { + var lastSelector = this.selectors[this.selectors.length-1]; + if (!lastSelector.evaldCondition) { + return false; + } + if (lastSelector.condition && + !lastSelector.condition.eval( + new(tree.evalEnv)(env, + env.frames))) { + return false; + } + return true; + }, + resetCache: function () { + this._rulesets = null; + this._variables = null; + this._lookups = {}; + }, + variables: function () { + if (!this._variables) { + this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { + if (r instanceof tree.Rule && r.variable === true) { + hash[r.name] = r; + } + return hash; + }, {}); + } + return this._variables; + }, + variable: function (name) { + return this.variables()[name]; + }, + rulesets: function () { + if (!this.rules) { return null; } + + var _Ruleset = tree.Ruleset, _MixinDefinition = tree.mixin.Definition, + filtRules = [], rules = this.rules, cnt = rules.length, + i, rule; + + for (i = 0; i < cnt; i++) { + rule = rules[i]; + if ((rule instanceof _Ruleset) || (rule instanceof _MixinDefinition)) { + filtRules.push(rule); + } + } + + return filtRules; + }, + prependRule: function (rule) { + var rules = this.rules; + if (rules) { rules.unshift(rule); } else { this.rules = [ rule ]; } + }, + find: function (selector, self) { + self = self || this; + var rules = [], match, + key = selector.toCSS(); + + if (key in this._lookups) { return this._lookups[key]; } + + this.rulesets().forEach(function (rule) { + if (rule !== self) { + for (var j = 0; j < rule.selectors.length; j++) { + match = selector.match(rule.selectors[j]); + if (match) { + if (selector.elements.length > match) { + Array.prototype.push.apply(rules, rule.find( + new(tree.Selector)(selector.elements.slice(match)), self)); + } else { + rules.push(rule); + } + break; + } + } + } + }); + this._lookups[key] = rules; + return rules; + }, + genCSS: function (env, output) { + var i, j, + ruleNodes = [], + rulesetNodes = [], + rulesetNodeCnt, + debugInfo, // Line number debugging + rule, + path; + + env.tabLevel = (env.tabLevel || 0); + + if (!this.root) { + env.tabLevel++; + } + + var tabRuleStr = env.compress ? '' : Array(env.tabLevel + 1).join(" "), + tabSetStr = env.compress ? '' : Array(env.tabLevel).join(" "), + sep; + + for (i = 0; i < this.rules.length; i++) { + rule = this.rules[i]; + if (rule.rules || (rule instanceof tree.Media) || rule instanceof tree.Directive || (this.root && rule instanceof tree.Comment)) { + rulesetNodes.push(rule); + } else { + ruleNodes.push(rule); + } + } + + // If this is the root node, we don't render + // a selector, or {}. + if (!this.root) { + debugInfo = tree.debugInfo(env, this, tabSetStr); + + if (debugInfo) { + output.add(debugInfo); + output.add(tabSetStr); + } + + var paths = this.paths, pathCnt = paths.length, + pathSubCnt; + + sep = env.compress ? ',' : (',\n' + tabSetStr); + + for (i = 0; i < pathCnt; i++) { + path = paths[i]; + if (!(pathSubCnt = path.length)) { continue; } + if (i > 0) { output.add(sep); } + + env.firstSelector = true; + path[0].genCSS(env, output); + + env.firstSelector = false; + for (j = 1; j < pathSubCnt; j++) { + path[j].genCSS(env, output); + } + } + + output.add((env.compress ? '{' : ' {\n') + tabRuleStr); + } + + // Compile rules and rulesets + for (i = 0; i < ruleNodes.length; i++) { + rule = ruleNodes[i]; + + // @page{ directive ends up with root elements inside it, a mix of rules and rulesets + // In this instance we do not know whether it is the last property + if (i + 1 === ruleNodes.length && (!this.root || rulesetNodes.length === 0 || this.firstRoot)) { + env.lastRule = true; + } + + if (rule.genCSS) { + rule.genCSS(env, output); + } else if (rule.value) { + output.add(rule.value.toString()); + } + + if (!env.lastRule) { + output.add(env.compress ? '' : ('\n' + tabRuleStr)); + } else { + env.lastRule = false; + } + } + + if (!this.root) { + output.add((env.compress ? '}' : '\n' + tabSetStr + '}')); + env.tabLevel--; + } + + sep = (env.compress ? "" : "\n") + (this.root ? tabRuleStr : tabSetStr); + rulesetNodeCnt = rulesetNodes.length; + if (rulesetNodeCnt) { + if (ruleNodes.length && sep) { output.add(sep); } + rulesetNodes[0].genCSS(env, output); + for (i = 1; i < rulesetNodeCnt; i++) { + if (sep) { output.add(sep); } + rulesetNodes[i].genCSS(env, output); + } + } + + if (!output.isEmpty() && !env.compress && this.firstRoot) { + output.add('\n'); + } + }, + + toCSS: tree.toCSS, + + markReferenced: function () { + if (!this.selectors) { + return; + } + for (var s = 0; s < this.selectors.length; s++) { + this.selectors[s].markReferenced(); + } + }, + + joinSelectors: function (paths, context, selectors) { + for (var s = 0; s < selectors.length; s++) { + this.joinSelector(paths, context, selectors[s]); + } + }, + + joinSelector: function (paths, context, selector) { + + var i, j, k, + hasParentSelector, newSelectors, el, sel, parentSel, + newSelectorPath, afterParentJoin, newJoinedSelector, + newJoinedSelectorEmpty, lastSelector, currentElements, + selectorsMultiplied; + + for (i = 0; i < selector.elements.length; i++) { + el = selector.elements[i]; + if (el.value === '&') { + hasParentSelector = true; + } + } + + if (!hasParentSelector) { + if (context.length > 0) { + for (i = 0; i < context.length; i++) { + paths.push(context[i].concat(selector)); + } + } + else { + paths.push([selector]); + } + return; + } + + // The paths are [[Selector]] + // The first list is a list of comma seperated selectors + // The inner list is a list of inheritance seperated selectors + // e.g. + // .a, .b { + // .c { + // } + // } + // == [[.a] [.c]] [[.b] [.c]] + // + + // the elements from the current selector so far + currentElements = []; + // the current list of new selectors to add to the path. + // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors + // by the parents + newSelectors = [[]]; + + for (i = 0; i < selector.elements.length; i++) { + el = selector.elements[i]; + // non parent reference elements just get added + if (el.value !== "&") { + currentElements.push(el); + } else { + // the new list of selectors to add + selectorsMultiplied = []; + + // merge the current list of non parent selector elements + // on to the current list of selectors to add + if (currentElements.length > 0) { + this.mergeElementsOnToSelectors(currentElements, newSelectors); + } + + // loop through our current selectors + for (j = 0; j < newSelectors.length; j++) { + sel = newSelectors[j]; + // if we don't have any parent paths, the & might be in a mixin so that it can be used + // whether there are parents or not + if (context.length === 0) { + // the combinator used on el should now be applied to the next element instead so that + // it is not lost + if (sel.length > 0) { + sel[0].elements = sel[0].elements.slice(0); + sel[0].elements.push(new(tree.Element)(el.combinator, '', el.index, el.currentFileInfo)); + } + selectorsMultiplied.push(sel); + } + else { + // and the parent selectors + for (k = 0; k < context.length; k++) { + parentSel = context[k]; + // We need to put the current selectors + // then join the last selector's elements on to the parents selectors + + // our new selector path + newSelectorPath = []; + // selectors from the parent after the join + afterParentJoin = []; + newJoinedSelectorEmpty = true; + + //construct the joined selector - if & is the first thing this will be empty, + // if not newJoinedSelector will be the last set of elements in the selector + if (sel.length > 0) { + newSelectorPath = sel.slice(0); + lastSelector = newSelectorPath.pop(); + newJoinedSelector = selector.createDerived(lastSelector.elements.slice(0)); + newJoinedSelectorEmpty = false; + } + else { + newJoinedSelector = selector.createDerived([]); + } + + //put together the parent selectors after the join + if (parentSel.length > 1) { + afterParentJoin = afterParentJoin.concat(parentSel.slice(1)); + } + + if (parentSel.length > 0) { + newJoinedSelectorEmpty = false; + + // join the elements so far with the first part of the parent + newJoinedSelector.elements.push(new(tree.Element)(el.combinator, parentSel[0].elements[0].value, el.index, el.currentFileInfo)); + newJoinedSelector.elements = newJoinedSelector.elements.concat(parentSel[0].elements.slice(1)); + } + + if (!newJoinedSelectorEmpty) { + // now add the joined selector + newSelectorPath.push(newJoinedSelector); + } + + // and the rest of the parent + newSelectorPath = newSelectorPath.concat(afterParentJoin); + + // add that to our new set of selectors + selectorsMultiplied.push(newSelectorPath); + } + } + } + + // our new selectors has been multiplied, so reset the state + newSelectors = selectorsMultiplied; + currentElements = []; + } + } + + // if we have any elements left over (e.g. .a& .b == .b) + // add them on to all the current selectors + if (currentElements.length > 0) { + this.mergeElementsOnToSelectors(currentElements, newSelectors); + } + + for (i = 0; i < newSelectors.length; i++) { + if (newSelectors[i].length > 0) { + paths.push(newSelectors[i]); + } + } + }, + + mergeElementsOnToSelectors: function(elements, selectors) { + var i, sel; + + if (selectors.length === 0) { + selectors.push([ new(tree.Selector)(elements) ]); + return; + } + + for (i = 0; i < selectors.length; i++) { + sel = selectors[i]; + + // if the previous thing in sel is a parent this needs to join on to it + if (sel.length > 0) { + sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements)); + } + else { + sel.push(new(tree.Selector)(elements)); + } + } + } +}; +})(require('../tree')); + +(function (tree) { + +tree.Selector = function (elements, extendList, condition, index, currentFileInfo, isReferenced) { + this.elements = elements; + this.extendList = extendList; + this.condition = condition; + this.currentFileInfo = currentFileInfo || {}; + this.isReferenced = isReferenced; + if (!condition) { + this.evaldCondition = true; + } +}; +tree.Selector.prototype = { + type: "Selector", + accept: function (visitor) { + if (this.elements) { + this.elements = visitor.visitArray(this.elements); + } + if (this.extendList) { + this.extendList = visitor.visitArray(this.extendList); + } + if (this.condition) { + this.condition = visitor.visit(this.condition); + } + }, + createDerived: function(elements, extendList, evaldCondition) { + evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; + var newSelector = new(tree.Selector)(elements, extendList || this.extendList, null, this.index, this.currentFileInfo, this.isReferenced); + newSelector.evaldCondition = evaldCondition; + newSelector.mediaEmpty = this.mediaEmpty; + return newSelector; + }, + match: function (other) { + var elements = this.elements, + len = elements.length, + olen, i; + + other.CacheElements(); + + olen = other._elements.length; + if (olen === 0 || len < olen) { + return 0; + } else { + for (i = 0; i < olen; i++) { + if (elements[i].value !== other._elements[i]) { + return 0; + } + } + } + + return olen; // return number of matched elements + }, + CacheElements: function(){ + var css = '', len, v, i; + + if( !this._elements ){ + + len = this.elements.length; + for(i = 0; i < len; i++){ + + v = this.elements[i]; + css += v.combinator.value; + + if( !v.value.value ){ + css += v.value; + continue; + } + + if( typeof v.value.value !== "string" ){ + css = ''; + break; + } + css += v.value.value; + } + + this._elements = css.match(/[,&#\.\w-]([\w-]|(\\.))*/g); + + if (this._elements) { + if (this._elements[0] === "&") { + this._elements.shift(); + } + + } else { + this._elements = []; + } + + } + }, + isJustParentSelector: function() { + return !this.mediaEmpty && + this.elements.length === 1 && + this.elements[0].value === '&' && + (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); + }, + eval: function (env) { + var evaldCondition = this.condition && this.condition.eval(env), + elements = this.elements, extendList = this.extendList; + + elements = elements && elements.map(function (e) { return e.eval(env); }); + extendList = extendList && extendList.map(function(extend) { return extend.eval(env); }); + + return this.createDerived(elements, extendList, evaldCondition); + }, + genCSS: function (env, output) { + var i, element; + if ((!env || !env.firstSelector) && this.elements[0].combinator.value === "") { + output.add(' ', this.currentFileInfo, this.index); + } + if (!this._css) { + //TODO caching? speed comparison? + for(i = 0; i < this.elements.length; i++) { + element = this.elements[i]; + element.genCSS(env, output); + } + } + }, + toCSS: tree.toCSS, + markReferenced: function () { + this.isReferenced = true; + }, + getIsReferenced: function() { + return !this.currentFileInfo.reference || this.isReferenced; + }, + getIsOutput: function() { + return this.evaldCondition; + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.UnicodeDescriptor = function (value) { + this.value = value; +}; +tree.UnicodeDescriptor.prototype = { + type: "UnicodeDescriptor", + genCSS: function (env, output) { + output.add(this.value); + }, + toCSS: tree.toCSS, + eval: function () { return this; } +}; + +})(require('../tree')); + +(function (tree) { + +tree.URL = function (val, currentFileInfo, isEvald) { + this.value = val; + this.currentFileInfo = currentFileInfo; + this.isEvald = isEvald; +}; +tree.URL.prototype = { + type: "Url", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + genCSS: function (env, output) { + output.add("url("); + this.value.genCSS(env, output); + output.add(")"); + }, + toCSS: tree.toCSS, + eval: function (ctx) { + var val = this.value.eval(ctx), + rootpath; + + if (!this.isEvald) { + // Add the base path if the URL is relative + rootpath = this.currentFileInfo && this.currentFileInfo.rootpath; + if (rootpath && typeof val.value === "string" && ctx.isPathRelative(val.value)) { + if (!val.quote) { + rootpath = rootpath.replace(/[\(\)'"\s]/g, function(match) { return "\\"+match; }); + } + val.value = rootpath + val.value; + } + + val.value = ctx.normalizePath(val.value); + + // Add url args if enabled + if (ctx.urlArgs) { + if (!val.value.match(/^\s*data:/)) { + var delimiter = val.value.indexOf('?') === -1 ? '?' : '&'; + var urlArgs = delimiter + ctx.urlArgs; + if (val.value.indexOf('#') !== -1) { + val.value = val.value.replace('#', urlArgs + '#'); + } else { + val.value += urlArgs; + } + } + } + } + + return new(tree.URL)(val, this.currentFileInfo, true); + } +}; + +})(require('../tree')); + +(function (tree) { + +tree.Value = function (value) { + this.value = value; +}; +tree.Value.prototype = { + type: "Value", + accept: function (visitor) { + if (this.value) { + this.value = visitor.visitArray(this.value); + } + }, + eval: function (env) { + if (this.value.length === 1) { + return this.value[0].eval(env); + } else { + return new(tree.Value)(this.value.map(function (v) { + return v.eval(env); + })); + } + }, + genCSS: function (env, output) { + var i; + for(i = 0; i < this.value.length; i++) { + this.value[i].genCSS(env, output); + if (i+1 < this.value.length) { + output.add((env && env.compress) ? ',' : ', '); + } + } + }, + toCSS: tree.toCSS +}; + +})(require('../tree')); + +(function (tree) { + +tree.Variable = function (name, index, currentFileInfo) { + this.name = name; + this.index = index; + this.currentFileInfo = currentFileInfo || {}; +}; +tree.Variable.prototype = { + type: "Variable", + eval: function (env) { + var variable, name = this.name; + + if (name.indexOf('@@') === 0) { + name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; + } + + if (this.evaluating) { + throw { type: 'Name', + message: "Recursive variable definition for " + name, + filename: this.currentFileInfo.file, + index: this.index }; + } + + this.evaluating = true; + + variable = tree.find(env.frames, function (frame) { + var v = frame.variable(name); + if (v) { + return v.value.eval(env); + } + }); + if (variable) { + this.evaluating = false; + return variable; + } else { + throw { type: 'Name', + message: "variable " + name + " is undefined", + filename: this.currentFileInfo.filename, + index: this.index }; + } + } +}; + +})(require('../tree')); + +(function (tree) { + + var parseCopyProperties = [ + 'paths', // option - unmodified - paths to search for imports on + 'optimization', // option - optimization level (for the chunker) + 'files', // list of files that have been imported, used for import-once + 'contents', // map - filename to contents of all the files + 'contentsIgnoredChars', // map - filename to lines at the begining of each file to ignore + 'relativeUrls', // option - whether to adjust URL's to be relative + 'rootpath', // option - rootpath to append to URL's + 'strictImports', // option - + 'insecure', // option - whether to allow imports from insecure ssl hosts + 'dumpLineNumbers', // option - whether to dump line numbers + 'compress', // option - whether to compress + 'processImports', // option - whether to process imports. if false then imports will not be imported + 'syncImport', // option - whether to import synchronously + 'javascriptEnabled',// option - whether JavaScript is enabled. if undefined, defaults to true + 'mime', // browser only - mime type for sheet import + 'useFileCache', // browser only - whether to use the per file session cache + 'currentFileInfo' // information about the current file - for error reporting and importing and making urls relative etc. + ]; + + //currentFileInfo = { + // 'relativeUrls' - option - whether to adjust URL's to be relative + // 'filename' - full resolved filename of current file + // 'rootpath' - path to append to normal URLs for this node + // 'currentDirectory' - path to the current file, absolute + // 'rootFilename' - filename of the base file + // 'entryPath' - absolute path to the entry file + // 'reference' - whether the file should not be output and only output parts that are referenced + + tree.parseEnv = function(options) { + copyFromOriginal(options, this, parseCopyProperties); + + if (!this.contents) { this.contents = {}; } + if (!this.contentsIgnoredChars) { this.contentsIgnoredChars = {}; } + if (!this.files) { this.files = {}; } + + if (typeof this.paths === "string") { this.paths = [this.paths]; } + + if (!this.currentFileInfo) { + var filename = (options && options.filename) || "input"; + var entryPath = filename.replace(/[^\/\\]*$/, ""); + if (options) { + options.filename = null; + } + this.currentFileInfo = { + filename: filename, + relativeUrls: this.relativeUrls, + rootpath: (options && options.rootpath) || "", + currentDirectory: entryPath, + entryPath: entryPath, + rootFilename: filename + }; + } + }; + + var evalCopyProperties = [ + 'silent', // whether to swallow errors and warnings + 'verbose', // whether to log more activity + 'compress', // whether to compress + 'yuicompress', // whether to compress with the outside tool yui compressor + 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri) + 'strictMath', // whether math has to be within parenthesis + 'strictUnits', // whether units need to evaluate correctly + 'cleancss', // whether to compress with clean-css + 'sourceMap', // whether to output a source map + 'importMultiple', // whether we are currently importing multiple copies + 'urlArgs' // whether to add args into url tokens + ]; + + tree.evalEnv = function(options, frames) { + copyFromOriginal(options, this, evalCopyProperties); + + this.frames = frames || []; + }; + + tree.evalEnv.prototype.inParenthesis = function () { + if (!this.parensStack) { + this.parensStack = []; + } + this.parensStack.push(true); + }; + + tree.evalEnv.prototype.outOfParenthesis = function () { + this.parensStack.pop(); + }; + + tree.evalEnv.prototype.isMathOn = function () { + return this.strictMath ? (this.parensStack && this.parensStack.length) : true; + }; + + tree.evalEnv.prototype.isPathRelative = function (path) { + return !/^(?:[a-z-]+:|\/)/.test(path); + }; + + tree.evalEnv.prototype.normalizePath = function( path ) { + var + segments = path.split("/").reverse(), + segment; + + path = []; + while (segments.length !== 0 ) { + segment = segments.pop(); + switch( segment ) { + case ".": + break; + case "..": + if ((path.length === 0) || (path[path.length - 1] === "..")) { + path.push( segment ); + } else { + path.pop(); + } + break; + default: + path.push( segment ); + break; + } + } + + return path.join("/"); + }; + + //todo - do the same for the toCSS env + //tree.toCSSEnv = function (options) { + //}; + + var copyFromOriginal = function(original, destination, propertiesToCopy) { + if (!original) { return; } + + for(var i = 0; i < propertiesToCopy.length; i++) { + if (original.hasOwnProperty(propertiesToCopy[i])) { + destination[propertiesToCopy[i]] = original[propertiesToCopy[i]]; + } + } + }; + +})(require('./tree')); + +(function (tree) { + + var _visitArgs = { visitDeeper: true }, + _hasIndexed = false; + + function _noop(node) { + return node; + } + + function indexNodeTypes(parent, ticker) { + // add .typeIndex to tree node types for lookup table + var key, child; + for (key in parent) { + if (parent.hasOwnProperty(key)) { + child = parent[key]; + switch (typeof child) { + case "function": + // ignore bound functions directly on tree which do not have a prototype + // or aren't nodes + if (child.prototype && child.prototype.type) { + child.prototype.typeIndex = ticker++; + } + break; + case "object": + ticker = indexNodeTypes(child, ticker); + break; + } + } + } + return ticker; + } + + tree.visitor = function(implementation) { + this._implementation = implementation; + this._visitFnCache = []; + + if (!_hasIndexed) { + indexNodeTypes(tree, 1); + _hasIndexed = true; + } + }; + + tree.visitor.prototype = { + visit: function(node) { + if (!node) { + return node; + } + + var nodeTypeIndex = node.typeIndex; + if (!nodeTypeIndex) { + return node; + } + + var visitFnCache = this._visitFnCache, + impl = this._implementation, + aryIndx = nodeTypeIndex << 1, + outAryIndex = aryIndx | 1, + func = visitFnCache[aryIndx], + funcOut = visitFnCache[outAryIndex], + visitArgs = _visitArgs, + fnName; + + visitArgs.visitDeeper = true; + + if (!func) { + fnName = "visit" + node.type; + func = impl[fnName] || _noop; + funcOut = impl[fnName + "Out"] || _noop; + visitFnCache[aryIndx] = func; + visitFnCache[outAryIndex] = funcOut; + } + + if (func !== _noop) { + var newNode = func.call(impl, node, visitArgs); + if (impl.isReplacing) { + node = newNode; + } + } + + if (visitArgs.visitDeeper && node && node.accept) { + node.accept(this); + } + + if (funcOut != _noop) { + funcOut.call(impl, node); + } + + return node; + }, + visitArray: function(nodes, nonReplacing) { + if (!nodes) { + return nodes; + } + + var cnt = nodes.length, i; + + // Non-replacing + if (nonReplacing || !this._implementation.isReplacing) { + for (i = 0; i < cnt; i++) { + this.visit(nodes[i]); + } + return nodes; + } + + // Replacing + var out = []; + for (i = 0; i < cnt; i++) { + var evald = this.visit(nodes[i]); + if (!evald.splice) { + out.push(evald); + } else if (evald.length) { + this.flatten(evald, out); + } + } + return out; + }, + flatten: function(arr, out) { + if (!out) { + out = []; + } + + var cnt, i, item, + nestedCnt, j, nestedItem; + + for (i = 0, cnt = arr.length; i < cnt; i++) { + item = arr[i]; + if (!item.splice) { + out.push(item); + continue; + } + + for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) { + nestedItem = item[j]; + if (!nestedItem.splice) { + out.push(nestedItem); + } else if (nestedItem.length) { + this.flatten(nestedItem, out); + } + } + } + + return out; + } + }; + +})(require('./tree')); +(function (tree) { + tree.importVisitor = function(importer, finish, evalEnv, onceFileDetectionMap, recursionDetector) { + this._visitor = new tree.visitor(this); + this._importer = importer; + this._finish = finish; + this.env = evalEnv || new tree.evalEnv(); + this.importCount = 0; + this.onceFileDetectionMap = onceFileDetectionMap || {}; + this.recursionDetector = {}; + if (recursionDetector) { + for(var fullFilename in recursionDetector) { + if (recursionDetector.hasOwnProperty(fullFilename)) { + this.recursionDetector[fullFilename] = true; + } + } + } + }; + + tree.importVisitor.prototype = { + isReplacing: true, + run: function (root) { + var error; + try { + // process the contents + this._visitor.visit(root); + } + catch(e) { + error = e; + } + + this.isFinished = true; + + if (this.importCount === 0) { + this._finish(error); + } + }, + visitImport: function (importNode, visitArgs) { + var importVisitor = this, + evaldImportNode, + inlineCSS = importNode.options.inline; + + if (!importNode.css || inlineCSS) { + + try { + evaldImportNode = importNode.evalForImport(this.env); + } catch(e){ + if (!e.filename) { e.index = importNode.index; e.filename = importNode.currentFileInfo.filename; } + // attempt to eval properly and treat as css + importNode.css = true; + // if that fails, this error will be thrown + importNode.error = e; + } + + if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) { + importNode = evaldImportNode; + this.importCount++; + var env = new tree.evalEnv(this.env, this.env.frames.slice(0)); + + if (importNode.options.multiple) { + env.importMultiple = true; + } + + this._importer.push(importNode.getPath(), importNode.currentFileInfo, importNode.options, function (e, root, importedAtRoot, fullPath) { + if (e && !e.filename) { e.index = importNode.index; e.filename = importNode.currentFileInfo.filename; } + + if (!env.importMultiple) { + if (importedAtRoot) { + importNode.skip = true; + } else { + importNode.skip = function() { + if (fullPath in importVisitor.onceFileDetectionMap) { + return true; + } + importVisitor.onceFileDetectionMap[fullPath] = true; + return false; + }; + } + } + + var subFinish = function(e) { + importVisitor.importCount--; + + if (importVisitor.importCount === 0 && importVisitor.isFinished) { + importVisitor._finish(e); + } + }; + + if (root) { + importNode.root = root; + importNode.importedFilename = fullPath; + var duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; + + if (!inlineCSS && (env.importMultiple || !duplicateImport)) { + importVisitor.recursionDetector[fullPath] = true; + new(tree.importVisitor)(importVisitor._importer, subFinish, env, importVisitor.onceFileDetectionMap, importVisitor.recursionDetector) + .run(root); + return; + } + } + + subFinish(); + }); + } + } + visitArgs.visitDeeper = false; + return importNode; + }, + visitRule: function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + return ruleNode; + }, + visitDirective: function (directiveNode, visitArgs) { + this.env.frames.unshift(directiveNode); + return directiveNode; + }, + visitDirectiveOut: function (directiveNode) { + this.env.frames.shift(); + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + this.env.frames.unshift(mixinDefinitionNode); + return mixinDefinitionNode; + }, + visitMixinDefinitionOut: function (mixinDefinitionNode) { + this.env.frames.shift(); + }, + visitRuleset: function (rulesetNode, visitArgs) { + this.env.frames.unshift(rulesetNode); + return rulesetNode; + }, + visitRulesetOut: function (rulesetNode) { + this.env.frames.shift(); + }, + visitMedia: function (mediaNode, visitArgs) { + this.env.frames.unshift(mediaNode.ruleset); + return mediaNode; + }, + visitMediaOut: function (mediaNode) { + this.env.frames.shift(); + } + }; + +})(require('./tree')); +(function (tree) { + tree.joinSelectorVisitor = function() { + this.contexts = [[]]; + this._visitor = new tree.visitor(this); + }; + + tree.joinSelectorVisitor.prototype = { + run: function (root) { + return this._visitor.visit(root); + }, + visitRule: function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + + visitRuleset: function (rulesetNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1], + paths = [], selectors; + + this.contexts.push(paths); + + if (! rulesetNode.root) { + selectors = rulesetNode.selectors; + if (selectors) { + selectors = selectors.filter(function(selector) { return selector.getIsOutput(); }); + rulesetNode.selectors = selectors.length ? selectors : (selectors = null); + if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); } + } + if (!selectors) { rulesetNode.rules = null; } + rulesetNode.paths = paths; + } + }, + visitRulesetOut: function (rulesetNode) { + this.contexts.length = this.contexts.length - 1; + }, + visitMedia: function (mediaNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1]; + mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia); + } + }; + +})(require('./tree')); +(function (tree) { + tree.toCSSVisitor = function(env) { + this._visitor = new tree.visitor(this); + this._env = env; + }; + + tree.toCSSVisitor.prototype = { + isReplacing: true, + run: function (root) { + return this._visitor.visit(root); + }, + + visitRule: function (ruleNode, visitArgs) { + if (ruleNode.variable) { + return []; + } + return ruleNode; + }, + + visitMixinDefinition: function (mixinNode, visitArgs) { + // mixin definitions do not get eval'd - this means they keep state + // so we have to clear that state here so it isn't used if toCSS is called twice + mixinNode.frames = []; + return []; + }, + + visitExtend: function (extendNode, visitArgs) { + return []; + }, + + visitComment: function (commentNode, visitArgs) { + if (commentNode.isSilent(this._env)) { + return []; + } + return commentNode; + }, + + visitMedia: function(mediaNode, visitArgs) { + mediaNode.accept(this._visitor); + visitArgs.visitDeeper = false; + + if (!mediaNode.rules.length) { + return []; + } + return mediaNode; + }, + + visitDirective: function(directiveNode, visitArgs) { + if (directiveNode.currentFileInfo.reference && !directiveNode.isReferenced) { + return []; + } + if (directiveNode.name === "@charset") { + // Only output the debug info together with subsequent @charset definitions + // a comment (or @media statement) before the actual @charset directive would + // be considered illegal css as it has to be on the first line + if (this.charset) { + if (directiveNode.debugInfo) { + var comment = new tree.Comment("/* " + directiveNode.toCSS(this._env).replace(/\n/g, "")+" */\n"); + comment.debugInfo = directiveNode.debugInfo; + return this._visitor.visit(comment); + } + return []; + } + this.charset = true; + } + return directiveNode; + }, + + checkPropertiesInRoot: function(rules) { + var ruleNode; + for(var i = 0; i < rules.length; i++) { + ruleNode = rules[i]; + if (ruleNode instanceof tree.Rule && !ruleNode.variable) { + throw { message: "properties must be inside selector blocks, they cannot be in the root.", + index: ruleNode.index, filename: ruleNode.currentFileInfo ? ruleNode.currentFileInfo.filename : null}; + } + } + }, + + visitRuleset: function (rulesetNode, visitArgs) { + var rule, rulesets = []; + if (rulesetNode.firstRoot) { + this.checkPropertiesInRoot(rulesetNode.rules); + } + if (! rulesetNode.root) { + if (rulesetNode.paths) { + rulesetNode.paths = rulesetNode.paths + .filter(function(p) { + var i; + if (p[0].elements[0].combinator.value === ' ') { + p[0].elements[0].combinator = new(tree.Combinator)(''); + } + for(i = 0; i < p.length; i++) { + if (p[i].getIsReferenced() && p[i].getIsOutput()) { + return true; + } + } + return false; + }); + } + + // Compile rules and rulesets + var nodeRules = rulesetNode.rules, nodeRuleCnt = nodeRules ? nodeRules.length : 0; + for (var i = 0; i < nodeRuleCnt; ) { + rule = nodeRules[i]; + if (rule && rule.rules) { + // visit because we are moving them out from being a child + rulesets.push(this._visitor.visit(rule)); + nodeRules.splice(i, 1); + nodeRuleCnt--; + continue; + } + i++; + } + // accept the visitor to remove rules and refactor itself + // then we can decide now whether we want it or not + if (nodeRuleCnt > 0) { + rulesetNode.accept(this._visitor); + } else { + rulesetNode.rules = null; + } + visitArgs.visitDeeper = false; + + nodeRules = rulesetNode.rules; + if (nodeRules) { + this._mergeRules(nodeRules); + nodeRules = rulesetNode.rules; + } + if (nodeRules) { + this._removeDuplicateRules(nodeRules); + nodeRules = rulesetNode.rules; + } + + // now decide whether we keep the ruleset + if (nodeRules && nodeRules.length > 0 && rulesetNode.paths.length > 0) { + rulesets.splice(0, 0, rulesetNode); + } + } else { + rulesetNode.accept(this._visitor); + visitArgs.visitDeeper = false; + if (rulesetNode.firstRoot || (rulesetNode.rules && rulesetNode.rules.length > 0)) { + rulesets.splice(0, 0, rulesetNode); + } + } + if (rulesets.length === 1) { + return rulesets[0]; + } + return rulesets; + }, + + _removeDuplicateRules: function(rules) { + if (!rules) { return; } + + // remove duplicates + var ruleCache = {}, + ruleList, rule, i; + + for(i = rules.length - 1; i >= 0 ; i--) { + rule = rules[i]; + if (rule instanceof tree.Rule) { + if (!ruleCache[rule.name]) { + ruleCache[rule.name] = rule; + } else { + ruleList = ruleCache[rule.name]; + if (ruleList instanceof tree.Rule) { + ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._env)]; + } + var ruleCSS = rule.toCSS(this._env); + if (ruleList.indexOf(ruleCSS) !== -1) { + rules.splice(i, 1); + } else { + ruleList.push(ruleCSS); + } + } + } + } + }, + + _mergeRules: function (rules) { + if (!rules) { return; } + + var groups = {}, + parts, + rule, + key; + + for (var i = 0; i < rules.length; i++) { + rule = rules[i]; + + if ((rule instanceof tree.Rule) && rule.merge) { + key = [rule.name, + rule.important ? "!" : ""].join(","); + + if (!groups[key]) { + groups[key] = []; + } else { + rules.splice(i--, 1); + } + + groups[key].push(rule); + } + } + + Object.keys(groups).map(function (k) { + + function toExpression(values) { + return new (tree.Expression)(values.map(function (p) { + return p.value; + })); + } + + function toValue(values) { + return new (tree.Value)(values.map(function (p) { + return p; + })); + } + + parts = groups[k]; + + if (parts.length > 1) { + rule = parts[0]; + var spacedGroups = []; + var lastSpacedGroup = []; + parts.map(function (p) { + if (p.merge==="+") { + if (lastSpacedGroup.length > 0) { + spacedGroups.push(toExpression(lastSpacedGroup)); + } + lastSpacedGroup = []; + } + lastSpacedGroup.push(p); + }); + spacedGroups.push(toExpression(lastSpacedGroup)); + rule.value = toValue(spacedGroups); + } + }); + } + }; + +})(require('./tree')); +(function (tree) { + /*jshint loopfunc:true */ + + tree.extendFinderVisitor = function() { + this._visitor = new tree.visitor(this); + this.contexts = []; + this.allExtendsStack = [[]]; + }; + + tree.extendFinderVisitor.prototype = { + run: function (root) { + root = this._visitor.visit(root); + root.allExtends = this.allExtendsStack[0]; + return root; + }, + visitRule: function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitRuleset: function (rulesetNode, visitArgs) { + if (rulesetNode.root) { + return; + } + + var i, j, extend, allSelectorsExtendList = [], extendList; + + // get &:extend(.a); rules which apply to all selectors in this ruleset + var rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0; + for(i = 0; i < ruleCnt; i++) { + if (rulesetNode.rules[i] instanceof tree.Extend) { + allSelectorsExtendList.push(rules[i]); + rulesetNode.extendOnEveryPath = true; + } + } + + // now find every selector and apply the extends that apply to all extends + // and the ones which apply to an individual extend + var paths = rulesetNode.paths; + for(i = 0; i < paths.length; i++) { + var selectorPath = paths[i], + selector = selectorPath[selectorPath.length - 1], + selExtendList = selector.extendList; + + extendList = selExtendList ? selExtendList.slice(0).concat(allSelectorsExtendList) + : allSelectorsExtendList; + + if (extendList) { + extendList = extendList.map(function(allSelectorsExtend) { + return allSelectorsExtend.clone(); + }); + } + + for(j = 0; j < extendList.length; j++) { + this.foundExtends = true; + extend = extendList[j]; + extend.findSelfSelectors(selectorPath); + extend.ruleset = rulesetNode; + if (j === 0) { extend.firstExtendOnThisSelectorPath = true; } + this.allExtendsStack[this.allExtendsStack.length-1].push(extend); + } + } + + this.contexts.push(rulesetNode.selectors); + }, + visitRulesetOut: function (rulesetNode) { + if (!rulesetNode.root) { + this.contexts.length = this.contexts.length - 1; + } + }, + visitMedia: function (mediaNode, visitArgs) { + mediaNode.allExtends = []; + this.allExtendsStack.push(mediaNode.allExtends); + }, + visitMediaOut: function (mediaNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + }, + visitDirective: function (directiveNode, visitArgs) { + directiveNode.allExtends = []; + this.allExtendsStack.push(directiveNode.allExtends); + }, + visitDirectiveOut: function (directiveNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + } + }; + + tree.processExtendsVisitor = function() { + this._visitor = new tree.visitor(this); + }; + + tree.processExtendsVisitor.prototype = { + run: function(root) { + var extendFinder = new tree.extendFinderVisitor(); + extendFinder.run(root); + if (!extendFinder.foundExtends) { return root; } + root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends)); + this.allExtendsStack = [root.allExtends]; + return this._visitor.visit(root); + }, + doExtendChaining: function (extendsList, extendsListTarget, iterationCount) { + // + // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering and pasting + // the selector we would do normally, but we are also adding an extend with the same target selector + // this means this new extend can then go and alter other extends + // + // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors + // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already processed if + // we look at each selector at a time, as is done in visitRuleset + + var extendIndex, targetExtendIndex, matches, extendsToAdd = [], newSelector, extendVisitor = this, selectorPath, extend, targetExtend, newExtend; + + iterationCount = iterationCount || 0; + + //loop through comparing every extend with every target extend. + // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place + // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one + // and the second is the target. + // the seperation into two lists allows us to process a subset of chains with a bigger set, as is the + // case when processing media queries + for(extendIndex = 0; extendIndex < extendsList.length; extendIndex++){ + for(targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++){ + + extend = extendsList[extendIndex]; + targetExtend = extendsListTarget[targetExtendIndex]; + + // look for circular references + if( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ){ continue; } + + // find a match in the target extends self selector (the bit before :extend) + selectorPath = [targetExtend.selfSelectors[0]]; + matches = extendVisitor.findMatch(extend, selectorPath); + + if (matches.length) { + + // we found a match, so for each self selector.. + extend.selfSelectors.forEach(function(selfSelector) { + + // process the extend as usual + newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector); + + // but now we create a new extend from it + newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0); + newExtend.selfSelectors = newSelector; + + // add the extend onto the list of extends for that selector + newSelector[newSelector.length-1].extendList = [newExtend]; + + // record that we need to add it. + extendsToAdd.push(newExtend); + newExtend.ruleset = targetExtend.ruleset; + + //remember its parents for circular references + newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids); + + // only process the selector once.. if we have :extend(.a,.b) then multiple + // extends will look at the same selector path, so when extending + // we know that any others will be duplicates in terms of what is added to the css + if (targetExtend.firstExtendOnThisSelectorPath) { + newExtend.firstExtendOnThisSelectorPath = true; + targetExtend.ruleset.paths.push(newSelector); + } + }); + } + } + } + + if (extendsToAdd.length) { + // try to detect circular references to stop a stack overflow. + // may no longer be needed. + this.extendChainCount++; + if (iterationCount > 100) { + var selectorOne = "{unable to calculate}"; + var selectorTwo = "{unable to calculate}"; + try + { + selectorOne = extendsToAdd[0].selfSelectors[0].toCSS(); + selectorTwo = extendsToAdd[0].selector.toCSS(); + } + catch(e) {} + throw {message: "extend circular reference detected. One of the circular extends is currently:"+selectorOne+":extend(" + selectorTwo+")"}; + } + + // now process the new extends on the existing rules so that we can handle a extending b extending c ectending d extending e... + return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount+1)); + } else { + return extendsToAdd; + } + }, + visitRule: function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitSelector: function (selectorNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitRuleset: function (rulesetNode, visitArgs) { + if (rulesetNode.root) { + return; + } + var matches, pathIndex, extendIndex, allExtends = this.allExtendsStack[this.allExtendsStack.length-1], selectorsToAdd = [], extendVisitor = this, selectorPath; + + // look at each selector path in the ruleset, find any extend matches and then copy, find and replace + + for(extendIndex = 0; extendIndex < allExtends.length; extendIndex++) { + for(pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) { + selectorPath = rulesetNode.paths[pathIndex]; + + // extending extends happens initially, before the main pass + if (rulesetNode.extendOnEveryPath) { continue; } + var extendList = selectorPath[selectorPath.length-1].extendList; + if (extendList && extendList.length) { continue; } + + matches = this.findMatch(allExtends[extendIndex], selectorPath); + + if (matches.length) { + + allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) { + selectorsToAdd.push(extendVisitor.extendSelector(matches, selectorPath, selfSelector)); + }); + } + } + } + rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd); + }, + findMatch: function (extend, haystackSelectorPath) { + // + // look through the haystack selector path to try and find the needle - extend.selector + // returns an array of selector matches that can then be replaced + // + var haystackSelectorIndex, hackstackSelector, hackstackElementIndex, haystackElement, + targetCombinator, i, + extendVisitor = this, + needleElements = extend.selector.elements, + potentialMatches = [], potentialMatch, matches = []; + + // loop through the haystack elements + for(haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) { + hackstackSelector = haystackSelectorPath[haystackSelectorIndex]; + + for(hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) { + + haystackElement = hackstackSelector.elements[hackstackElementIndex]; + + // if we allow elements before our match we can add a potential match every time. otherwise only at the first element. + if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) { + potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0, initialCombinator: haystackElement.combinator}); + } + + for(i = 0; i < potentialMatches.length; i++) { + potentialMatch = potentialMatches[i]; + + // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't + // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to work out + // what the resulting combinator will be + targetCombinator = haystackElement.combinator.value; + if (targetCombinator === '' && hackstackElementIndex === 0) { + targetCombinator = ' '; + } + + // if we don't match, null our match to indicate failure + if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) || + (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) { + potentialMatch = null; + } else { + potentialMatch.matched++; + } + + // if we are still valid and have finished, test whether we have elements after and whether these are allowed + if (potentialMatch) { + potentialMatch.finished = potentialMatch.matched === needleElements.length; + if (potentialMatch.finished && + (!extend.allowAfter && (hackstackElementIndex+1 < hackstackSelector.elements.length || haystackSelectorIndex+1 < haystackSelectorPath.length))) { + potentialMatch = null; + } + } + // if null we remove, if not, we are still valid, so either push as a valid match or continue + if (potentialMatch) { + if (potentialMatch.finished) { + potentialMatch.length = needleElements.length; + potentialMatch.endPathIndex = haystackSelectorIndex; + potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match + potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again + matches.push(potentialMatch); + } + } else { + potentialMatches.splice(i, 1); + i--; + } + } + } + } + return matches; + }, + isElementValuesEqual: function(elementValue1, elementValue2) { + if (typeof elementValue1 === "string" || typeof elementValue2 === "string") { + return elementValue1 === elementValue2; + } + if (elementValue1 instanceof tree.Attribute) { + if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) { + return false; + } + if (!elementValue1.value || !elementValue2.value) { + if (elementValue1.value || elementValue2.value) { + return false; + } + return true; + } + elementValue1 = elementValue1.value.value || elementValue1.value; + elementValue2 = elementValue2.value.value || elementValue2.value; + return elementValue1 === elementValue2; + } + elementValue1 = elementValue1.value; + elementValue2 = elementValue2.value; + if (elementValue1 instanceof tree.Selector) { + if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) { + return false; + } + for(var i = 0; i currentSelectorPathIndex && currentSelectorPathElementIndex > 0) { + path[path.length - 1].elements = path[path.length - 1].elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); + currentSelectorPathElementIndex = 0; + currentSelectorPathIndex++; + } + + newElements = selector.elements + .slice(currentSelectorPathElementIndex, match.index) + .concat([firstElement]) + .concat(replacementSelector.elements.slice(1)); + + if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) { + path[path.length - 1].elements = + path[path.length - 1].elements.concat(newElements); + } else { + path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex)); + + path.push(new tree.Selector( + newElements + )); + } + currentSelectorPathIndex = match.endPathIndex; + currentSelectorPathElementIndex = match.endPathElementIndex; + if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) { + currentSelectorPathElementIndex = 0; + currentSelectorPathIndex++; + } + } + + if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) { + path[path.length - 1].elements = path[path.length - 1].elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); + currentSelectorPathIndex++; + } + + path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length)); + + return path; + }, + visitRulesetOut: function (rulesetNode) { + }, + visitMedia: function (mediaNode, visitArgs) { + var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]); + newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends)); + this.allExtendsStack.push(newAllExtends); + }, + visitMediaOut: function (mediaNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + }, + visitDirective: function (directiveNode, visitArgs) { + var newAllExtends = directiveNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]); + newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, directiveNode.allExtends)); + this.allExtendsStack.push(newAllExtends); + }, + visitDirectiveOut: function (directiveNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + } + }; + +})(require('./tree')); + +(function (tree) { + + tree.sourceMapOutput = function (options) { + this._css = []; + this._rootNode = options.rootNode; + this._writeSourceMap = options.writeSourceMap; + this._contentsMap = options.contentsMap; + this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap; + this._sourceMapFilename = options.sourceMapFilename; + this._outputFilename = options.outputFilename; + this._sourceMapURL = options.sourceMapURL; + if (options.sourceMapBasepath) { + this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/'); + } + this._sourceMapRootpath = options.sourceMapRootpath; + this._outputSourceFiles = options.outputSourceFiles; + this._sourceMapGeneratorConstructor = options.sourceMapGenerator || require("source-map").SourceMapGenerator; + + if (this._sourceMapRootpath && this._sourceMapRootpath.charAt(this._sourceMapRootpath.length-1) !== '/') { + this._sourceMapRootpath += '/'; + } + + this._lineNumber = 0; + this._column = 0; + }; + + tree.sourceMapOutput.prototype.normalizeFilename = function(filename) { + filename = filename.replace(/\\/g, '/'); + + if (this._sourceMapBasepath && filename.indexOf(this._sourceMapBasepath) === 0) { + filename = filename.substring(this._sourceMapBasepath.length); + if (filename.charAt(0) === '\\' || filename.charAt(0) === '/') { + filename = filename.substring(1); + } + } + return (this._sourceMapRootpath || "") + filename; + }; + + tree.sourceMapOutput.prototype.add = function(chunk, fileInfo, index, mapLines) { + + //ignore adding empty strings + if (!chunk) { + return; + } + + var lines, + sourceLines, + columns, + sourceColumns, + i; + + if (fileInfo) { + var inputSource = this._contentsMap[fileInfo.filename]; + + // remove vars/banner added to the top of the file + if (this._contentsIgnoredCharsMap[fileInfo.filename]) { + // adjust the index + index -= this._contentsIgnoredCharsMap[fileInfo.filename]; + if (index < 0) { index = 0; } + // adjust the source + inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]); + } + inputSource = inputSource.substring(0, index); + sourceLines = inputSource.split("\n"); + sourceColumns = sourceLines[sourceLines.length-1]; + } + + lines = chunk.split("\n"); + columns = lines[lines.length-1]; + + if (fileInfo) { + if (!mapLines) { + this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column}, + original: { line: sourceLines.length, column: sourceColumns.length}, + source: this.normalizeFilename(fileInfo.filename)}); + } else { + for(i = 0; i < lines.length; i++) { + this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0}, + original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0}, + source: this.normalizeFilename(fileInfo.filename)}); + } + } + } + + if (lines.length === 1) { + this._column += columns.length; + } else { + this._lineNumber += lines.length - 1; + this._column = columns.length; + } + + this._css.push(chunk); + }; + + tree.sourceMapOutput.prototype.isEmpty = function() { + return this._css.length === 0; + }; + + tree.sourceMapOutput.prototype.toCSS = function(env) { + this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null }); + + if (this._outputSourceFiles) { + for(var filename in this._contentsMap) { + if (this._contentsMap.hasOwnProperty(filename)) + { + var source = this._contentsMap[filename]; + if (this._contentsIgnoredCharsMap[filename]) { + source = source.slice(this._contentsIgnoredCharsMap[filename]); + } + this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source); + } + } + } + + this._rootNode.genCSS(env, this); + + if (this._css.length > 0) { + var sourceMapURL, + sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON()); + + if (this._sourceMapURL) { + sourceMapURL = this._sourceMapURL; + } else if (this._sourceMapFilename) { + sourceMapURL = this.normalizeFilename(this._sourceMapFilename); + } + + if (this._writeSourceMap) { + this._writeSourceMap(sourceMapContent); + } else { + sourceMapURL = "data:application/json;base64," + require('./encoder.js').encodeBase64(sourceMapContent); + } + + if (sourceMapURL) { + this._css.push("/*# sourceMappingURL=" + sourceMapURL + " */"); + } + } + + return this._css.join(''); + }; + +})(require('./tree')); + +// +// browser.js - client-side engine +// +/*global less, window, document, XMLHttpRequest, location */ + +var isFileProtocol = /^(file|chrome(-extension)?|resource|qrc|app):/.test(location.protocol); + +less.env = less.env || (location.hostname == '127.0.0.1' || + location.hostname == '0.0.0.0' || + location.hostname == 'localhost' || + (location.port && + location.port.length > 0) || + isFileProtocol ? 'development' + : 'production'); + +var logLevel = { + debug: 3, + info: 2, + errors: 1, + none: 0 +}; + +// The amount of logging in the javascript console. +// 3 - Debug, information and errors +// 2 - Information and errors +// 1 - Errors +// 0 - None +// Defaults to 2 +less.logLevel = typeof(less.logLevel) != 'undefined' ? less.logLevel : (less.env === 'development' ? logLevel.debug : logLevel.errors); + +// Load styles asynchronously (default: false) +// +// This is set to `false` by default, so that the body +// doesn't start loading before the stylesheets are parsed. +// Setting this to `true` can result in flickering. +// +less.async = less.async || false; +less.fileAsync = less.fileAsync || false; + +// Interval between watch polls +less.poll = less.poll || (isFileProtocol ? 1000 : 1500); + +//Setup user functions +if (less.functions) { + for(var func in less.functions) { + if (less.functions.hasOwnProperty(func)) { + less.tree.functions[func] = less.functions[func]; + } + } +} + +var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(location.hash); +if (dumpLineNumbers) { + less.dumpLineNumbers = dumpLineNumbers[1]; +} + +var typePattern = /^text\/(x-)?less$/; +var cache = null; +var fileCache = {}; + +function log(str, level) { + if (typeof(console) !== 'undefined' && less.logLevel >= level) { + console.log('less: ' + str); + } +} + +function extractId(href) { + return href.replace(/^[a-z-]+:\/+?[^\/]+/, '' ) // Remove protocol & domain + .replace(/^\//, '' ) // Remove root / + .replace(/\.[a-zA-Z]+$/, '' ) // Remove simple extension + .replace(/[^\.\w-]+/g, '-') // Replace illegal characters + .replace(/\./g, ':'); // Replace dots with colons(for valid id) +} + +function errorConsole(e, rootHref) { + var template = '{line} {content}'; + var filename = e.filename || rootHref; + var errors = []; + var content = (e.type || "Syntax") + "Error: " + (e.message || 'There is an error in your .less file') + + " in " + filename + " "; + + var errorline = function (e, i, classname) { + if (e.extract[i] !== undefined) { + errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) + .replace(/\{class\}/, classname) + .replace(/\{content\}/, e.extract[i])); + } + }; + + if (e.extract) { + errorline(e, 0, ''); + errorline(e, 1, 'line'); + errorline(e, 2, ''); + content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':\n' + + errors.join('\n'); + } else if (e.stack) { + content += e.stack; + } + log(content, logLevel.errors); +} + +function createCSS(styles, sheet, lastModified) { + // Strip the query-string + var href = sheet.href || ''; + + // If there is no title set, use the filename, minus the extension + var id = 'less:' + (sheet.title || extractId(href)); + + // If this has already been inserted into the DOM, we may need to replace it + var oldCss = document.getElementById(id); + var keepOldCss = false; + + // Create a new stylesheet node for insertion or (if necessary) replacement + var css = document.createElement('style'); + css.setAttribute('type', 'text/css'); + if (sheet.media) { + css.setAttribute('media', sheet.media); + } + css.id = id; + + if (!css.styleSheet) { + css.appendChild(document.createTextNode(styles)); + + // If new contents match contents of oldCss, don't replace oldCss + keepOldCss = (oldCss !== null && oldCss.childNodes.length > 0 && css.childNodes.length > 0 && + oldCss.firstChild.nodeValue === css.firstChild.nodeValue); + } + + var head = document.getElementsByTagName('head')[0]; + + // If there is no oldCss, just append; otherwise, only append if we need + // to replace oldCss with an updated stylesheet + if (oldCss === null || keepOldCss === false) { + var nextEl = sheet && sheet.nextSibling || null; + if (nextEl) { + nextEl.parentNode.insertBefore(css, nextEl); + } else { + head.appendChild(css); + } + } + if (oldCss && keepOldCss === false) { + oldCss.parentNode.removeChild(oldCss); + } + + // For IE. + // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash. + // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head + if (css.styleSheet) { + try { + css.styleSheet.cssText = styles; + } catch (e) { + throw new(Error)("Couldn't reassign styleSheet.cssText."); + } + } + + // Don't update the local store if the file wasn't modified + if (lastModified && cache) { + log('saving ' + href + ' to cache.', logLevel.info); + try { + cache.setItem(href, styles); + cache.setItem(href + ':timestamp', lastModified); + } catch(e) { + //TODO - could do with adding more robust error handling + log('failed to save', logLevel.errors); + } + } +} + +function postProcessCSS(styles) { + if (less.postProcessor && typeof less.postProcessor === 'function') { + styles = less.postProcessor.call(styles, styles) || styles; + } + return styles; +} + +function errorHTML(e, rootHref) { + var id = 'less-error-message:' + extractId(rootHref || ""); + var template = '
        • {content}
        • '; + var elem = document.createElement('div'), timer, content, errors = []; + var filename = e.filename || rootHref; + var filenameNoPath = filename.match(/([^\/]+(\?.*)?)$/)[1]; + + elem.id = id; + elem.className = "less-error-message"; + + content = '

          ' + (e.type || "Syntax") + "Error: " + (e.message || 'There is an error in your .less file') + + '

          ' + '

          in ' + filenameNoPath + " "; + + var errorline = function (e, i, classname) { + if (e.extract[i] !== undefined) { + errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) + .replace(/\{class\}/, classname) + .replace(/\{content\}/, e.extract[i])); + } + }; + + if (e.extract) { + errorline(e, 0, ''); + errorline(e, 1, 'line'); + errorline(e, 2, ''); + content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':

          ' + + '
            ' + errors.join('') + '
          '; + } else if (e.stack) { + content += '
          ' + e.stack.split('\n').slice(1).join('
          '); + } + elem.innerHTML = content; + + // CSS for error messages + createCSS([ + '.less-error-message ul, .less-error-message li {', + 'list-style-type: none;', + 'margin-right: 15px;', + 'padding: 4px 0;', + 'margin: 0;', + '}', + '.less-error-message label {', + 'font-size: 12px;', + 'margin-right: 15px;', + 'padding: 4px 0;', + 'color: #cc7777;', + '}', + '.less-error-message pre {', + 'color: #dd6666;', + 'padding: 4px 0;', + 'margin: 0;', + 'display: inline-block;', + '}', + '.less-error-message pre.line {', + 'color: #ff0000;', + '}', + '.less-error-message h3 {', + 'font-size: 20px;', + 'font-weight: bold;', + 'padding: 15px 0 5px 0;', + 'margin: 0;', + '}', + '.less-error-message a {', + 'color: #10a', + '}', + '.less-error-message .error {', + 'color: red;', + 'font-weight: bold;', + 'padding-bottom: 2px;', + 'border-bottom: 1px dashed red;', + '}' + ].join('\n'), { title: 'error-message' }); + + elem.style.cssText = [ + "font-family: Arial, sans-serif", + "border: 1px solid #e00", + "background-color: #eee", + "border-radius: 5px", + "-webkit-border-radius: 5px", + "-moz-border-radius: 5px", + "color: #e00", + "padding: 15px", + "margin-bottom: 15px" + ].join(';'); + + if (less.env == 'development') { + timer = setInterval(function () { + if (document.body) { + if (document.getElementById(id)) { + document.body.replaceChild(elem, document.getElementById(id)); + } else { + document.body.insertBefore(elem, document.body.firstChild); + } + clearInterval(timer); + } + }, 10); + } +} + +function error(e, rootHref) { + if (!less.errorReporting || less.errorReporting === "html") { + errorHTML(e, rootHref); + } else if (less.errorReporting === "console") { + errorConsole(e, rootHref); + } else if (typeof less.errorReporting === 'function') { + less.errorReporting("add", e, rootHref); + } +} + +function removeErrorHTML(path) { + var node = document.getElementById('less-error-message:' + extractId(path)); + if (node) { + node.parentNode.removeChild(node); + } +} + +function removeErrorConsole(path) { + //no action +} + +function removeError(path) { + if (!less.errorReporting || less.errorReporting === "html") { + removeErrorHTML(path); + } else if (less.errorReporting === "console") { + removeErrorConsole(path); + } else if (typeof less.errorReporting === 'function') { + less.errorReporting("remove", path); + } +} + +function loadStyles(modifyVars) { + var styles = document.getElementsByTagName('style'), + style; + for (var i = 0; i < styles.length; i++) { + style = styles[i]; + if (style.type.match(typePattern)) { + var env = new less.tree.parseEnv(less), + lessText = style.innerHTML || ''; + env.filename = document.location.href.replace(/#.*$/, ''); + + if (modifyVars || less.globalVars) { + env.useFileCache = true; + } + + /*jshint loopfunc:true */ + // use closure to store current value of i + var callback = (function(style) { + return function (e, cssAST) { + if (e) { + return error(e, "inline"); + } + var css = cssAST.toCSS(less); + style.type = 'text/css'; + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.innerHTML = css; + } + }; + })(style); + new(less.Parser)(env).parse(lessText, callback, {globalVars: less.globalVars, modifyVars: modifyVars}); + } + } +} + +function extractUrlParts(url, baseUrl) { + // urlParts[1] = protocol&hostname || / + // urlParts[2] = / if path relative to host base + // urlParts[3] = directories + // urlParts[4] = filename + // urlParts[5] = parameters + + var urlPartsRegex = /^((?:[a-z-]+:)?\/+?(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i, + urlParts = url.match(urlPartsRegex), + returner = {}, directories = [], i, baseUrlParts; + + if (!urlParts) { + throw new Error("Could not parse sheet href - '"+url+"'"); + } + + // Stylesheets in IE don't always return the full path + if (!urlParts[1] || urlParts[2]) { + baseUrlParts = baseUrl.match(urlPartsRegex); + if (!baseUrlParts) { + throw new Error("Could not parse page url - '"+baseUrl+"'"); + } + urlParts[1] = urlParts[1] || baseUrlParts[1] || ""; + if (!urlParts[2]) { + urlParts[3] = baseUrlParts[3] + urlParts[3]; + } + } + + if (urlParts[3]) { + directories = urlParts[3].replace(/\\/g, "/").split("/"); + + // extract out . before .. so .. doesn't absorb a non-directory + for(i = 0; i < directories.length; i++) { + if (directories[i] === ".") { + directories.splice(i, 1); + i -= 1; + } + } + + for(i = 0; i < directories.length; i++) { + if (directories[i] === ".." && i > 0) { + directories.splice(i-1, 2); + i -= 2; + } + } + } + + returner.hostPart = urlParts[1]; + returner.directories = directories; + returner.path = urlParts[1] + directories.join("/"); + returner.fileUrl = returner.path + (urlParts[4] || ""); + returner.url = returner.fileUrl + (urlParts[5] || ""); + return returner; +} + +function pathDiff(url, baseUrl) { + // diff between two paths to create a relative path + + var urlParts = extractUrlParts(url), + baseUrlParts = extractUrlParts(baseUrl), + i, max, urlDirectories, baseUrlDirectories, diff = ""; + if (urlParts.hostPart !== baseUrlParts.hostPart) { + return ""; + } + max = Math.max(baseUrlParts.directories.length, urlParts.directories.length); + for(i = 0; i < max; i++) { + if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; } + } + baseUrlDirectories = baseUrlParts.directories.slice(i); + urlDirectories = urlParts.directories.slice(i); + for(i = 0; i < baseUrlDirectories.length-1; i++) { + diff += "../"; + } + for(i = 0; i < urlDirectories.length-1; i++) { + diff += urlDirectories[i] + "/"; + } + return diff; +} + +function getXMLHttpRequest() { + if (window.XMLHttpRequest && (window.location.protocol !== "file:" || !("ActiveXObject" in window))) { + return new XMLHttpRequest(); + } else { + try { + /*global ActiveXObject */ + return new ActiveXObject("Microsoft.XMLHTTP"); + } catch (e) { + log("browser doesn't support AJAX.", logLevel.errors); + return null; + } + } +} + +function doXHR(url, type, callback, errback) { + var xhr = getXMLHttpRequest(); + var async = isFileProtocol ? less.fileAsync : less.async; + + if (typeof(xhr.overrideMimeType) === 'function') { + xhr.overrideMimeType('text/css'); + } + log("XHR: Getting '" + url + "'", logLevel.debug); + xhr.open('GET', url, async); + xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); + xhr.send(null); + + function handleResponse(xhr, callback, errback) { + if (xhr.status >= 200 && xhr.status < 300) { + callback(xhr.responseText, + xhr.getResponseHeader("Last-Modified")); + } else if (typeof(errback) === 'function') { + errback(xhr.status, url); + } + } + + if (isFileProtocol && !less.fileAsync) { + if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { + callback(xhr.responseText); + } else { + errback(xhr.status, url); + } + } else if (async) { + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + handleResponse(xhr, callback, errback); + } + }; + } else { + handleResponse(xhr, callback, errback); + } +} + +function loadFile(originalHref, currentFileInfo, callback, env, modifyVars) { + + if (currentFileInfo && currentFileInfo.currentDirectory && !/^([a-z-]+:)?\//.test(originalHref)) { + originalHref = currentFileInfo.currentDirectory + originalHref; + } + + // sheet may be set to the stylesheet for the initial load or a collection of properties including + // some env variables for imports + var hrefParts = extractUrlParts(originalHref, window.location.href); + var href = hrefParts.url; + var newFileInfo = { + currentDirectory: hrefParts.path, + filename: href + }; + + if (currentFileInfo) { + newFileInfo.entryPath = currentFileInfo.entryPath; + newFileInfo.rootpath = currentFileInfo.rootpath; + newFileInfo.rootFilename = currentFileInfo.rootFilename; + newFileInfo.relativeUrls = currentFileInfo.relativeUrls; + } else { + newFileInfo.entryPath = hrefParts.path; + newFileInfo.rootpath = less.rootpath || hrefParts.path; + newFileInfo.rootFilename = href; + newFileInfo.relativeUrls = env.relativeUrls; + } + + if (newFileInfo.relativeUrls) { + if (env.rootpath) { + newFileInfo.rootpath = extractUrlParts(env.rootpath + pathDiff(hrefParts.path, newFileInfo.entryPath)).path; + } else { + newFileInfo.rootpath = hrefParts.path; + } + } + + if (env.useFileCache && fileCache[href]) { + try { + var lessText = fileCache[href]; + callback(null, lessText, href, newFileInfo, { lastModified: new Date() }); + } catch (e) { + callback(e, null, href); + } + return; + } + + doXHR(href, env.mime, function (data, lastModified) { + // per file cache + fileCache[href] = data; + + // Use remote copy (re-parse) + try { + callback(null, data, href, newFileInfo, { lastModified: lastModified }); + } catch (e) { + callback(e, null, href); + } + }, function (status, url) { + callback({ type: 'File', message: "'" + url + "' wasn't found (" + status + ")" }, null, href); + }); +} + +function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) { + + var env = new less.tree.parseEnv(less); + env.mime = sheet.type; + + if (modifyVars || less.globalVars) { + env.useFileCache = true; + } + + loadFile(sheet.href, null, function(e, data, path, newFileInfo, webInfo) { + + if (webInfo) { + webInfo.remaining = remaining; + + var css = cache && cache.getItem(path), + timestamp = cache && cache.getItem(path + ':timestamp'); + + if (!reload && timestamp && webInfo.lastModified && + (new(Date)(webInfo.lastModified).valueOf() === + new(Date)(timestamp).valueOf())) { + // Use local copy + createCSS(css, sheet); + webInfo.local = true; + callback(null, null, data, sheet, webInfo, path); + return; + } + } + + //TODO add tests around how this behaves when reloading + removeError(path); + + if (data) { + env.currentFileInfo = newFileInfo; + new(less.Parser)(env).parse(data, function (e, root) { + if (e) { return callback(e, null, null, sheet); } + try { + callback(e, root, data, sheet, webInfo, path); + } catch (e) { + callback(e, null, null, sheet); + } + }, {modifyVars: modifyVars, globalVars: less.globalVars}); + } else { + callback(e, null, null, sheet, webInfo, path); + } + }, env, modifyVars); +} + +function loadStyleSheets(callback, reload, modifyVars) { + for (var i = 0; i < less.sheets.length; i++) { + loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars); + } +} + +function initRunningMode(){ + if (less.env === 'development') { + less.optimization = 0; + less.watchTimer = setInterval(function () { + if (less.watchMode) { + loadStyleSheets(function (e, root, _, sheet, env) { + if (e) { + error(e, sheet.href); + } else if (root) { + var styles = root.toCSS(less); + styles = postProcessCSS(styles); + createCSS(styles, sheet, env.lastModified); + } + }); + } + }, less.poll); + } else { + less.optimization = 3; + } +} + + + +// +// Watch mode +// +less.watch = function () { + if (!less.watchMode ){ + less.env = 'development'; + initRunningMode(); + } + this.watchMode = true; + return true; +}; + +less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; }; + +if (/!watch/.test(location.hash)) { + less.watch(); +} + +if (less.env != 'development') { + try { + cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; + } catch (_) {} +} + +// +// Get all tags with the 'rel' attribute set to "stylesheet/less" +// +var links = document.getElementsByTagName('link'); + +less.sheets = []; + +for (var i = 0; i < links.length; i++) { + if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && + (links[i].type.match(typePattern)))) { + less.sheets.push(links[i]); + } +} + +// +// With this function, it's possible to alter variables and re-render +// CSS without reloading less-files +// +less.modifyVars = function(record) { + less.refresh(false, record); +}; + +less.refresh = function (reload, modifyVars) { + var startTime, endTime; + startTime = endTime = new Date(); + + loadStyleSheets(function (e, root, _, sheet, env) { + if (e) { + return error(e, sheet.href); + } + if (env.local) { + log("loading " + sheet.href + " from cache.", logLevel.info); + } else { + log("parsed " + sheet.href + " successfully.", logLevel.debug); + var styles = root.toCSS(less); + styles = postProcessCSS(styles); + createCSS(styles, sheet, env.lastModified); + } + log("css for " + sheet.href + " generated in " + (new Date() - endTime) + 'ms', logLevel.info); + if (env.remaining === 0) { + log("less has finished. css generated in " + (new Date() - startTime) + 'ms', logLevel.info); + } + endTime = new Date(); + }, reload, modifyVars); + + loadStyles(modifyVars); +}; + +less.refreshStyles = loadStyles; + +less.Parser.fileLoader = loadFile; + +less.refresh(less.env === 'development'); + +// amd.js +// +// Define Less as an AMD module. +if (typeof define === "function" && define.amd) { + define(function () { return less; } ); +} + +})(window); \ No newline at end of file diff --git a/admin/less/lib/lessc.inc.php b/admin/less/lib/lessc.inc.php new file mode 100644 index 0000000..0e6cd56 --- /dev/null +++ b/admin/less/lib/lessc.inc.php @@ -0,0 +1,3676 @@ + + * Licensed under MIT or GPLv3, see LICENSE + */ + + +/** + * The less compiler and parser. + * + * Converting LESS to CSS is a three stage process. The incoming file is parsed + * by `a3_lessc_parser` into a syntax tree, then it is compiled into another tree + * representing the CSS structure by `lessc`. The CSS tree is fed into a + * formatter, like `lessc_formatter` which then outputs CSS as a string. + * + * During the first compile, all values are *reduced*, which means that their + * types are brought to the lowest form before being dump as strings. This + * handles math equations, variable dereferences, and the like. + * + * The `parse` function of `lessc` is the entry point. + * + * In summary: + * + * The `lessc` class creates an intstance of the parser, feeds it LESS code, + * then transforms the resulting tree to a CSS tree. This class also holds the + * evaluation context, such as all available mixins and variables at any given + * time. + * + * The `a3_lessc_parser` class is only concerned with parsing its input. + * + * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string, + * handling things like indentation. + */ +class a3_lessc { + static public $VERSION = "v0.4.0"; + static protected $TRUE = array("keyword", "true"); + static protected $FALSE = array("keyword", "false"); + + protected $libFunctions = array(); + protected $registeredVars = array(); + protected $preserveComments = false; + + public $vPrefix = '@'; // prefix of abstract properties + public $mPrefix = '$'; // prefix of abstract blocks + public $parentSelector = '&'; + + public $importDisabled = false; + public $importDir = ''; + + protected $numberPrecision = null; + + protected $allParsedFiles = array(); + + // set to the parser that generated the current line when compiling + // so we know how to create error messages + protected $sourceParser = null; + protected $sourceLoc = null; + + static public $defaultValue = array("keyword", ""); + + static protected $nextImportId = 0; // uniquely identify imports + + // attempts to find the path of an import url, returns null for css files + protected function findImport($url) { + foreach ((array)$this->importDir as $dir) { + $full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url; + if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) { + return $file; + } + } + + return null; + } + + protected function fileExists($name) { + return is_file($name); + } + + static public function compressList($items, $delim) { + if (!isset($items[1]) && isset($items[0])) return $items[0]; + else return array('list', $delim, $items); + } + + static public function preg_quote($what) { + return preg_quote($what, '/'); + } + + protected function tryImport($importPath, $parentBlock, $out) { + if ($importPath[0] == "function" && $importPath[1] == "url") { + $importPath = $this->flattenList($importPath[2]); + } + + $str = $this->coerceString($importPath); + if ($str === null) return false; + + $url = $this->compileValue($this->lib_e($str)); + + // don't import if it ends in css + if (substr_compare($url, '.css', -4, 4) === 0) return false; + + $realPath = $this->findImport($url); + + if ($realPath === null) return false; + + if ($this->importDisabled) { + return array(false, "/* import disabled */"); + } + + if (isset($this->allParsedFiles[realpath($realPath)])) { + return array(false, null); + } + + $this->addParsedFile($realPath); + $parser = $this->makeParser($realPath); + $root = $parser->parse(file_get_contents($realPath)); + + // set the parents of all the block props + foreach ($root->props as $prop) { + if ($prop[0] == "block") { + $prop[1]->parent = $parentBlock; + } + } + + // copy mixins into scope, set their parents + // bring blocks from import into current block + // TODO: need to mark the source parser these came from this file + foreach ($root->children as $childName => $child) { + if (isset($parentBlock->children[$childName])) { + $parentBlock->children[$childName] = array_merge( + $parentBlock->children[$childName], + $child); + } else { + $parentBlock->children[$childName] = $child; + } + } + + $pi = pathinfo($realPath); + $dir = $pi["dirname"]; + + list($top, $bottom) = $this->sortProps($root->props, true); + $this->compileImportedProps($top, $parentBlock, $out, $parser, $dir); + + return array(true, $bottom, $parser, $dir); + } + + protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) { + $oldSourceParser = $this->sourceParser; + + $oldImport = $this->importDir; + + // TODO: this is because the importDir api is stupid + $this->importDir = (array)$this->importDir; + array_unshift($this->importDir, $importDir); + + foreach ($props as $prop) { + $this->compileProp($prop, $block, $out); + } + + $this->importDir = $oldImport; + $this->sourceParser = $oldSourceParser; + } + + /** + * Recursively compiles a block. + * + * A block is analogous to a CSS block in most cases. A single LESS document + * is encapsulated in a block when parsed, but it does not have parent tags + * so all of it's children appear on the root level when compiled. + * + * Blocks are made up of props and children. + * + * Props are property instructions, array tuples which describe an action + * to be taken, eg. write a property, set a variable, mixin a block. + * + * The children of a block are just all the blocks that are defined within. + * This is used to look up mixins when performing a mixin. + * + * Compiling the block involves pushing a fresh environment on the stack, + * and iterating through the props, compiling each one. + * + * See a3_lessc::compileProp() + * + */ + protected function compileBlock($block) { + switch ($block->type) { + case "root": + $this->compileRoot($block); + break; + case null: + $this->compileCSSBlock($block); + break; + case "media": + $this->compileMedia($block); + break; + case "directive": + $name = "@" . $block->name; + if (!empty($block->value)) { + $name .= " " . $this->compileValue($this->reduce($block->value)); + } + + $this->compileNestedBlock($block, array($name)); + break; + default: + $this->throwError("unknown block type: $block->type\n"); + } + } + + protected function compileCSSBlock($block) { + $env = $this->pushEnv(); + + $selectors = $this->compileSelectors($block->tags); + $env->selectors = $this->multiplySelectors($selectors); + $out = $this->makeOutputBlock(null, $env->selectors); + + $this->scope->children[] = $out; + $this->compileProps($block, $out); + + $block->scope = $env; // mixins carry scope with them! + $this->popEnv(); + } + + protected function compileMedia($media) { + $env = $this->pushEnv($media); + $parentScope = $this->mediaParent($this->scope); + + $query = $this->compileMediaQuery($this->multiplyMedia($env)); + + $this->scope = $this->makeOutputBlock($media->type, array($query)); + $parentScope->children[] = $this->scope; + + $this->compileProps($media, $this->scope); + + if (count($this->scope->lines) > 0) { + $orphanSelelectors = $this->findClosestSelectors(); + if (!is_null($orphanSelelectors)) { + $orphan = $this->makeOutputBlock(null, $orphanSelelectors); + $orphan->lines = $this->scope->lines; + array_unshift($this->scope->children, $orphan); + $this->scope->lines = array(); + } + } + + $this->scope = $this->scope->parent; + $this->popEnv(); + } + + protected function mediaParent($scope) { + while (!empty($scope->parent)) { + if (!empty($scope->type) && $scope->type != "media") { + break; + } + $scope = $scope->parent; + } + + return $scope; + } + + protected function compileNestedBlock($block, $selectors) { + $this->pushEnv($block); + $this->scope = $this->makeOutputBlock($block->type, $selectors); + $this->scope->parent->children[] = $this->scope; + + $this->compileProps($block, $this->scope); + + $this->scope = $this->scope->parent; + $this->popEnv(); + } + + protected function compileRoot($root) { + $this->pushEnv(); + $this->scope = $this->makeOutputBlock($root->type); + $this->compileProps($root, $this->scope); + $this->popEnv(); + } + + protected function compileProps($block, $out) { + foreach ($this->sortProps($block->props) as $prop) { + $this->compileProp($prop, $block, $out); + } + + $out->lines = array_values(array_unique($out->lines)); + } + + protected function sortProps($props, $split = false) { + $vars = array(); + $imports = array(); + $other = array(); + + foreach ($props as $prop) { + switch ($prop[0]) { + case "assign": + if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) { + $vars[] = $prop; + } else { + $other[] = $prop; + } + break; + case "import": + $id = self::$nextImportId++; + $prop[] = $id; + $imports[] = $prop; + $other[] = array("import_mixin", $id); + break; + default: + $other[] = $prop; + } + } + + if ($split) { + return array(array_merge($vars, $imports), $other); + } else { + return array_merge($vars, $imports, $other); + } + } + + protected function compileMediaQuery($queries) { + $compiledQueries = array(); + foreach ($queries as $query) { + $parts = array(); + foreach ($query as $q) { + switch ($q[0]) { + case "mediaType": + $parts[] = implode(" ", array_slice($q, 1)); + break; + case "mediaExp": + if (isset($q[2])) { + $parts[] = "($q[1]: " . + $this->compileValue($this->reduce($q[2])) . ")"; + } else { + $parts[] = "($q[1])"; + } + break; + case "variable": + $parts[] = $this->compileValue($this->reduce($q)); + break; + } + } + + if (count($parts) > 0) { + $compiledQueries[] = implode(" and ", $parts); + } + } + + $out = "@media"; + if (!empty($parts)) { + $out .= " " . + implode($this->formatter->selectorSeparator, $compiledQueries); + } + return $out; + } + + protected function multiplyMedia($env, $childQueries = null) { + if (is_null($env) || + !empty($env->block->type) && $env->block->type != "media") + { + return $childQueries; + } + + // plain old block, skip + if (empty($env->block->type)) { + return $this->multiplyMedia($env->parent, $childQueries); + } + + $out = array(); + $queries = $env->block->queries; + if (is_null($childQueries)) { + $out = $queries; + } else { + foreach ($queries as $parent) { + foreach ($childQueries as $child) { + $out[] = array_merge($parent, $child); + } + } + } + + return $this->multiplyMedia($env->parent, $out); + } + + protected function expandParentSelectors(&$tag, $replace) { + $parts = explode("$&$", $tag); + $count = 0; + foreach ($parts as &$part) { + $part = str_replace($this->parentSelector, $replace, $part, $c); + $count += $c; + } + $tag = implode($this->parentSelector, $parts); + return $count; + } + + protected function findClosestSelectors() { + $env = $this->env; + $selectors = null; + while ($env !== null) { + if (isset($env->selectors)) { + $selectors = $env->selectors; + break; + } + $env = $env->parent; + } + + return $selectors; + } + + + // multiply $selectors against the nearest selectors in env + protected function multiplySelectors($selectors) { + // find parent selectors + + $parentSelectors = $this->findClosestSelectors(); + if (is_null($parentSelectors)) { + // kill parent reference in top level selector + foreach ($selectors as &$s) { + $this->expandParentSelectors($s, ""); + } + + return $selectors; + } + + $out = array(); + foreach ($parentSelectors as $parent) { + foreach ($selectors as $child) { + $count = $this->expandParentSelectors($child, $parent); + + // don't prepend the parent tag if & was used + if ($count > 0) { + $out[] = trim($child); + } else { + $out[] = trim($parent . ' ' . $child); + } + } + } + + return $out; + } + + // reduces selector expressions + protected function compileSelectors($selectors) { + $out = array(); + + foreach ($selectors as $s) { + if (is_array($s)) { + list(, $value) = $s; + $out[] = trim($this->compileValue($this->reduce($value))); + } else { + $out[] = $s; + } + } + + return $out; + } + + protected function eq($left, $right) { + return $left == $right; + } + + protected function patternMatch($block, $orderedArgs, $keywordArgs) { + // match the guards if it has them + // any one of the groups must have all its guards pass for a match + if (!empty($block->guards)) { + $groupPassed = false; + foreach ($block->guards as $guardGroup) { + foreach ($guardGroup as $guard) { + $this->pushEnv(); + $this->zipSetArgs($block->args, $orderedArgs, $keywordArgs); + + $negate = false; + if ($guard[0] == "negate") { + $guard = $guard[1]; + $negate = true; + } + + $passed = $this->reduce($guard) == self::$TRUE; + if ($negate) $passed = !$passed; + + $this->popEnv(); + + if ($passed) { + $groupPassed = true; + } else { + $groupPassed = false; + break; + } + } + + if ($groupPassed) break; + } + + if (!$groupPassed) { + return false; + } + } + + if (empty($block->args)) { + return $block->isVararg || empty($orderedArgs) && empty($keywordArgs); + } + + $remainingArgs = $block->args; + if ($keywordArgs) { + $remainingArgs = array(); + foreach ($block->args as $arg) { + if ($arg[0] == "arg" && isset($keywordArgs[$arg[1]])) { + continue; + } + + $remainingArgs[] = $arg; + } + } + + $i = -1; // no args + // try to match by arity or by argument literal + foreach ($remainingArgs as $i => $arg) { + switch ($arg[0]) { + case "lit": + if (empty($orderedArgs[$i]) || !$this->eq($arg[1], $orderedArgs[$i])) { + return false; + } + break; + case "arg": + // no arg and no default value + if (!isset($orderedArgs[$i]) && !isset($arg[2])) { + return false; + } + break; + case "rest": + $i--; // rest can be empty + break 2; + } + } + + if ($block->isVararg) { + return true; // not having enough is handled above + } else { + $numMatched = $i + 1; + // greater than becuase default values always match + return $numMatched >= count($orderedArgs); + } + } + + protected function patternMatchAll($blocks, $orderedArgs, $keywordArgs, $skip=array()) { + $matches = null; + foreach ($blocks as $block) { + // skip seen blocks that don't have arguments + if (isset($skip[$block->id]) && !isset($block->args)) { + continue; + } + + if ($this->patternMatch($block, $orderedArgs, $keywordArgs)) { + $matches[] = $block; + } + } + + return $matches; + } + + // attempt to find blocks matched by path and args + protected function findBlocks($searchIn, $path, $orderedArgs, $keywordArgs, $seen=array()) { + if ($searchIn == null) return null; + if (isset($seen[$searchIn->id])) return null; + $seen[$searchIn->id] = true; + + $name = $path[0]; + + if (isset($searchIn->children[$name])) { + $blocks = $searchIn->children[$name]; + if (count($path) == 1) { + $matches = $this->patternMatchAll($blocks, $orderedArgs, $keywordArgs, $seen); + if (!empty($matches)) { + // This will return all blocks that match in the closest + // scope that has any matching block, like lessjs + return $matches; + } + } else { + $matches = array(); + foreach ($blocks as $subBlock) { + $subMatches = $this->findBlocks($subBlock, + array_slice($path, 1), $orderedArgs, $keywordArgs, $seen); + + if (!is_null($subMatches)) { + foreach ($subMatches as $sm) { + $matches[] = $sm; + } + } + } + + return count($matches) > 0 ? $matches : null; + } + } + if ($searchIn->parent === $searchIn) return null; + return $this->findBlocks($searchIn->parent, $path, $orderedArgs, $keywordArgs, $seen); + } + + // sets all argument names in $args to either the default value + // or the one passed in through $values + protected function zipSetArgs($args, $orderedValues, $keywordValues) { + $assignedValues = array(); + + $i = 0; + foreach ($args as $a) { + if ($a[0] == "arg") { + if (isset($keywordValues[$a[1]])) { + // has keyword arg + $value = $keywordValues[$a[1]]; + } elseif (isset($orderedValues[$i])) { + // has ordered arg + $value = $orderedValues[$i]; + $i++; + } elseif (isset($a[2])) { + // has default value + $value = $a[2]; + } else { + $this->throwError("Failed to assign arg " . $a[1]); + $value = null; // :( + } + + $value = $this->reduce($value); + $this->set($a[1], $value); + $assignedValues[] = $value; + } else { + // a lit + $i++; + } + } + + // check for a rest + $last = end($args); + if ($last[0] == "rest") { + $rest = array_slice($orderedValues, count($args) - 1); + $this->set($last[1], $this->reduce(array("list", " ", $rest))); + } + + // wow is this the only true use of PHP's + operator for arrays? + $this->env->arguments = $assignedValues + $orderedValues; + } + + // compile a prop and update $lines or $blocks appropriately + protected function compileProp($prop, $block, $out) { + // set error position context + $this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1; + + switch ($prop[0]) { + case 'assign': + list(, $name, $value) = $prop; + if ($name[0] == $this->vPrefix) { + $this->set($name, $value); + } else { + $out->lines[] = $this->formatter->property($name, + $this->compileValue($this->reduce($value))); + } + break; + case 'block': + list(, $child) = $prop; + $this->compileBlock($child); + break; + case 'mixin': + list(, $path, $args, $suffix) = $prop; + + $orderedArgs = array(); + $keywordArgs = array(); + foreach ((array)$args as $arg) { + $argval = null; + switch ($arg[0]) { + case "arg": + if (!isset($arg[2])) { + $orderedArgs[] = $this->reduce(array("variable", $arg[1])); + } else { + $keywordArgs[$arg[1]] = $this->reduce($arg[2]); + } + break; + + case "lit": + $orderedArgs[] = $this->reduce($arg[1]); + break; + default: + $this->throwError("Unknown arg type: " . $arg[0]); + } + } + + $mixins = $this->findBlocks($block, $path, $orderedArgs, $keywordArgs); + + if ($mixins === null) { + // fwrite(STDERR,"failed to find block: ".implode(" > ", $path)."\n"); + break; // throw error here?? + } + + foreach ($mixins as $mixin) { + if ($mixin === $block && !$orderedArgs) { + continue; + } + + $haveScope = false; + if (isset($mixin->parent->scope)) { + $haveScope = true; + $mixinParentEnv = $this->pushEnv(); + $mixinParentEnv->storeParent = $mixin->parent->scope; + } + + $haveArgs = false; + if (isset($mixin->args)) { + $haveArgs = true; + $this->pushEnv(); + $this->zipSetArgs($mixin->args, $orderedArgs, $keywordArgs); + } + + $oldParent = $mixin->parent; + if ($mixin != $block) $mixin->parent = $block; + + foreach ($this->sortProps($mixin->props) as $subProp) { + if ($suffix !== null && + $subProp[0] == "assign" && + is_string($subProp[1]) && + $subProp[1]{0} != $this->vPrefix) + { + $subProp[2] = array( + 'list', ' ', + array($subProp[2], array('keyword', $suffix)) + ); + } + + $this->compileProp($subProp, $mixin, $out); + } + + $mixin->parent = $oldParent; + + if ($haveArgs) $this->popEnv(); + if ($haveScope) $this->popEnv(); + } + + break; + case 'raw': + $out->lines[] = $prop[1]; + break; + case "directive": + list(, $name, $value) = $prop; + $out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';'; + break; + case "comment": + $out->lines[] = $prop[1]; + break; + case "import"; + list(, $importPath, $importId) = $prop; + $importPath = $this->reduce($importPath); + + if (!isset($this->env->imports)) { + $this->env->imports = array(); + } + + $result = $this->tryImport($importPath, $block, $out); + + $this->env->imports[$importId] = $result === false ? + array(false, "@import " . $this->compileValue($importPath).";") : + $result; + + break; + case "import_mixin": + list(,$importId) = $prop; + $import = $this->env->imports[$importId]; + if ($import[0] === false) { + if (isset($import[1])) { + $out->lines[] = $import[1]; + } + } else { + list(, $bottom, $parser, $importDir) = $import; + $this->compileImportedProps($bottom, $block, $out, $parser, $importDir); + } + + break; + default: + $this->throwError("unknown op: {$prop[0]}\n"); + } + } + + + /** + * Compiles a primitive value into a CSS property value. + * + * Values in lessphp are typed by being wrapped in arrays, their format is + * typically: + * + * array(type, contents [, additional_contents]*) + * + * The input is expected to be reduced. This function will not work on + * things like expressions and variables. + */ + protected function compileValue($value) { + switch ($value[0]) { + case 'list': + // [1] - delimiter + // [2] - array of values + return implode($value[1], array_map(array($this, 'compileValue'), $value[2])); + case 'raw_color': + if (!empty($this->formatter->compressColors)) { + return $this->compileValue($this->coerceColor($value)); + } + return $value[1]; + case 'keyword': + // [1] - the keyword + return $value[1]; + case 'number': + list(, $num, $unit) = $value; + // [1] - the number + // [2] - the unit + if ($this->numberPrecision !== null) { + $num = round($num, $this->numberPrecision); + } + return $num . $unit; + case 'string': + // [1] - contents of string (includes quotes) + list(, $delim, $content) = $value; + foreach ($content as &$part) { + if (is_array($part)) { + $part = $this->compileValue($part); + } + } + return $delim . implode($content) . $delim; + case 'color': + // [1] - red component (either number or a %) + // [2] - green component + // [3] - blue component + // [4] - optional alpha component + list(, $r, $g, $b) = $value; + $r = round($r); + $g = round($g); + $b = round($b); + + if (count($value) == 5 && $value[4] != 1) { // rgba + return 'rgba('.$r.','.$g.','.$b.','.$value[4].')'; + } + + $h = sprintf("#%02x%02x%02x", $r, $g, $b); + + if (!empty($this->formatter->compressColors)) { + // Converting hex color to short notation (e.g. #003399 to #039) + if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { + $h = '#' . $h[1] . $h[3] . $h[5]; + } + } + + return $h; + + case 'function': + list(, $name, $args) = $value; + return $name.'('.$this->compileValue($args).')'; + default: // assumed to be unit + $this->throwError("unknown value type: $value[0]"); + } + } + + protected function lib_pow($args) { + list($base, $exp) = $this->assertArgs($args, 2, "pow"); + return pow($this->assertNumber($base), $this->assertNumber($exp)); + } + + protected function lib_pi() { + return pi(); + } + + protected function lib_mod($args) { + list($a, $b) = $this->assertArgs($args, 2, "mod"); + return $this->assertNumber($a) % $this->assertNumber($b); + } + + protected function lib_tan($num) { + return tan($this->assertNumber($num)); + } + + protected function lib_sin($num) { + return sin($this->assertNumber($num)); + } + + protected function lib_cos($num) { + return cos($this->assertNumber($num)); + } + + protected function lib_atan($num) { + $num = atan($this->assertNumber($num)); + return array("number", $num, "rad"); + } + + protected function lib_asin($num) { + $num = asin($this->assertNumber($num)); + return array("number", $num, "rad"); + } + + protected function lib_acos($num) { + $num = acos($this->assertNumber($num)); + return array("number", $num, "rad"); + } + + protected function lib_sqrt($num) { + return sqrt($this->assertNumber($num)); + } + + protected function lib_extract($value) { + list($list, $idx) = $this->assertArgs($value, 2, "extract"); + $idx = $this->assertNumber($idx); + // 1 indexed + if ($list[0] == "list" && isset($list[2][$idx - 1])) { + return $list[2][$idx - 1]; + } + } + + protected function lib_isnumber($value) { + return $this->toBool($value[0] == "number"); + } + + protected function lib_isstring($value) { + return $this->toBool($value[0] == "string"); + } + + protected function lib_iscolor($value) { + return $this->toBool($this->coerceColor($value)); + } + + protected function lib_iskeyword($value) { + return $this->toBool($value[0] == "keyword"); + } + + protected function lib_ispixel($value) { + return $this->toBool($value[0] == "number" && $value[2] == "px"); + } + + protected function lib_ispercentage($value) { + return $this->toBool($value[0] == "number" && $value[2] == "%"); + } + + protected function lib_isem($value) { + return $this->toBool($value[0] == "number" && $value[2] == "em"); + } + + protected function lib_isrem($value) { + return $this->toBool($value[0] == "number" && $value[2] == "rem"); + } + + protected function lib_rgbahex($color) { + $color = $this->coerceColor($color); + if (is_null($color)) + $this->throwError("color expected for rgbahex"); + + return sprintf("#%02x%02x%02x%02x", + isset($color[4]) ? $color[4]*255 : 255, + $color[1],$color[2], $color[3]); + } + + protected function lib_argb($color){ + return $this->lib_rgbahex($color); + } + + // utility func to unquote a string + protected function lib_e($arg) { + switch ($arg[0]) { + case "list": + $items = $arg[2]; + if (isset($items[0])) { + return $this->lib_e($items[0]); + } + return self::$defaultValue; + case "string": + $arg[1] = ""; + return $arg; + case "keyword": + return $arg; + default: + return array("keyword", $this->compileValue($arg)); + } + } + + protected function lib__sprintf($args) { + if ($args[0] != "list") return $args; + $values = $args[2]; + $string = array_shift($values); + $template = $this->compileValue($this->lib_e($string)); + + $i = 0; + if (preg_match_all('/%[dsa]/', $template, $m)) { + foreach ($m[0] as $match) { + $val = isset($values[$i]) ? + $this->reduce($values[$i]) : array('keyword', ''); + + // lessjs compat, renders fully expanded color, not raw color + if ($color = $this->coerceColor($val)) { + $val = $color; + } + + $i++; + $rep = $this->compileValue($this->lib_e($val)); + $template = preg_replace('/'.self::preg_quote($match).'/', + $rep, $template, 1); + } + } + + $d = $string[0] == "string" ? $string[1] : '"'; + return array("string", $d, array($template)); + } + + protected function lib_floor($arg) { + $value = $this->assertNumber($arg); + return array("number", floor($value), $arg[2]); + } + + protected function lib_ceil($arg) { + $value = $this->assertNumber($arg); + return array("number", ceil($value), $arg[2]); + } + + protected function lib_round($arg) { + $value = $this->assertNumber($arg); + return array("number", round($value), $arg[2]); + } + + protected function lib_unit($arg) { + if ($arg[0] == "list") { + list($number, $newUnit) = $arg[2]; + return array("number", $this->assertNumber($number), + $this->compileValue($this->lib_e($newUnit))); + } else { + return array("number", $this->assertNumber($arg), ""); + } + } + + /** + * Helper function to get arguments for color manipulation functions. + * takes a list that contains a color like thing and a percentage + */ + protected function colorArgs($args) { + if ($args[0] != 'list' || count($args[2]) < 2) { + return array(array('color', 0, 0, 0), 0); + } + list($color, $delta) = $args[2]; + $color = $this->assertColor($color); + $delta = floatval($delta[1]); + + return array($color, $delta); + } + + protected function lib_darken($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + $hsl[3] = $this->clamp($hsl[3] - $delta, 100); + return $this->toRGB($hsl); + } + + protected function lib_lighten($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + $hsl[3] = $this->clamp($hsl[3] + $delta, 100); + return $this->toRGB($hsl); + } + + protected function lib_saturate($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + $hsl[2] = $this->clamp($hsl[2] + $delta, 100); + return $this->toRGB($hsl); + } + + protected function lib_desaturate($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + $hsl[2] = $this->clamp($hsl[2] - $delta, 100); + return $this->toRGB($hsl); + } + + protected function lib_spin($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + + $hsl[1] = $hsl[1] + $delta % 360; + if ($hsl[1] < 0) $hsl[1] += 360; + + return $this->toRGB($hsl); + } + + protected function lib_fadeout($args) { + list($color, $delta) = $this->colorArgs($args); + $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100); + return $color; + } + + protected function lib_fadein($args) { + list($color, $delta) = $this->colorArgs($args); + $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100); + return $color; + } + + protected function lib_hue($color) { + $hsl = $this->toHSL($this->assertColor($color)); + return round($hsl[1]); + } + + protected function lib_saturation($color) { + $hsl = $this->toHSL($this->assertColor($color)); + return round($hsl[2]); + } + + protected function lib_lightness($color) { + $hsl = $this->toHSL($this->assertColor($color)); + return round($hsl[3]); + } + + // get the alpha of a color + // defaults to 1 for non-colors or colors without an alpha + protected function lib_alpha($value) { + if (!is_null($color = $this->coerceColor($value))) { + return isset($color[4]) ? $color[4] : 1; + } + } + + // set the alpha of the color + protected function lib_fade($args) { + list($color, $alpha) = $this->colorArgs($args); + $color[4] = $this->clamp($alpha / 100.0); + return $color; + } + + protected function lib_percentage($arg) { + $num = $this->assertNumber($arg); + return array("number", $num*100, "%"); + } + + // mixes two colors by weight + // mix(@color1, @color2, [@weight: 50%]); + // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method + protected function lib_mix($args) { + if ($args[0] != "list" || count($args[2]) < 2) + $this->throwError("mix expects (color1, color2, weight)"); + + list($first, $second) = $args[2]; + $first = $this->assertColor($first); + $second = $this->assertColor($second); + + $first_a = $this->lib_alpha($first); + $second_a = $this->lib_alpha($second); + + if (isset($args[2][2])) { + $weight = $args[2][2][1] / 100.0; + } else { + $weight = 0.5; + } + + $w = $weight * 2 - 1; + $a = $first_a - $second_a; + + $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0; + $w2 = 1.0 - $w1; + + $new = array('color', + $w1 * $first[1] + $w2 * $second[1], + $w1 * $first[2] + $w2 * $second[2], + $w1 * $first[3] + $w2 * $second[3], + ); + + if ($first_a != 1.0 || $second_a != 1.0) { + $new[] = $first_a * $weight + $second_a * ($weight - 1); + } + + return $this->fixColor($new); + } + + protected function lib_contrast($args) { + if ($args[0] != 'list' || count($args[2]) < 3) { + return array(array('color', 0, 0, 0), 0); + } + + list($inputColor, $darkColor, $lightColor) = $args[2]; + + $inputColor = $this->assertColor($inputColor); + $darkColor = $this->assertColor($darkColor); + $lightColor = $this->assertColor($lightColor); + $hsl = $this->toHSL($inputColor); + + if ($hsl[3] > 50) { + return $darkColor; + } + + return $lightColor; + } + + protected function assertColor($value, $error = "expected color value") { + $color = $this->coerceColor($value); + if (is_null($color)) $this->throwError($error); + return $color; + } + + protected function assertNumber($value, $error = "expecting number") { + if ($value[0] == "number") return $value[1]; + $this->throwError($error); + } + + protected function assertArgs($value, $expectedArgs, $name="") { + if ($expectedArgs == 1) { + return $value; + } else { + if ($value[0] !== "list" || $value[1] != ",") $this->throwError("expecting list"); + $values = $value[2]; + $numValues = count($values); + if ($expectedArgs != $numValues) { + if ($name) { + $name = $name . ": "; + } + + $this->throwError("${name}expecting $expectedArgs arguments, got $numValues"); + } + + return $values; + } + } + + protected function toHSL($color) { + if ($color[0] == 'hsl') return $color; + + $r = $color[1] / 255; + $g = $color[2] / 255; + $b = $color[3] / 255; + + $min = min($r, $g, $b); + $max = max($r, $g, $b); + + $L = ($min + $max) / 2; + if ($min == $max) { + $S = $H = 0; + } else { + if ($L < 0.5) + $S = ($max - $min)/($max + $min); + else + $S = ($max - $min)/(2.0 - $max - $min); + + if ($r == $max) $H = ($g - $b)/($max - $min); + elseif ($g == $max) $H = 2.0 + ($b - $r)/($max - $min); + elseif ($b == $max) $H = 4.0 + ($r - $g)/($max - $min); + + } + + $out = array('hsl', + ($H < 0 ? $H + 6 : $H)*60, + $S*100, + $L*100, + ); + + if (count($color) > 4) $out[] = $color[4]; // copy alpha + return $out; + } + + protected function toRGB_helper($comp, $temp1, $temp2) { + if ($comp < 0) $comp += 1.0; + elseif ($comp > 1) $comp -= 1.0; + + if (6 * $comp < 1) return $temp1 + ($temp2 - $temp1) * 6 * $comp; + if (2 * $comp < 1) return $temp2; + if (3 * $comp < 2) return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6; + + return $temp1; + } + + /** + * Converts a hsl array into a color value in rgb. + * Expects H to be in range of 0 to 360, S and L in 0 to 100 + */ + protected function toRGB($color) { + if ($color[0] == 'color') return $color; + + $H = $color[1] / 360; + $S = $color[2] / 100; + $L = $color[3] / 100; + + if ($S == 0) { + $r = $g = $b = $L; + } else { + $temp2 = $L < 0.5 ? + $L*(1.0 + $S) : + $L + $S - $L * $S; + + $temp1 = 2.0 * $L - $temp2; + + $r = $this->toRGB_helper($H + 1/3, $temp1, $temp2); + $g = $this->toRGB_helper($H, $temp1, $temp2); + $b = $this->toRGB_helper($H - 1/3, $temp1, $temp2); + } + + // $out = array('color', round($r*255), round($g*255), round($b*255)); + $out = array('color', $r*255, $g*255, $b*255); + if (count($color) > 4) $out[] = $color[4]; // copy alpha + return $out; + } + + protected function clamp($v, $max = 1, $min = 0) { + return min($max, max($min, $v)); + } + + /** + * Convert the rgb, rgba, hsl color literals of function type + * as returned by the parser into values of color type. + */ + protected function funcToColor($func) { + $fname = $func[1]; + if ($func[2][0] != 'list') return false; // need a list of arguments + $rawComponents = $func[2][2]; + + if ($fname == 'hsl' || $fname == 'hsla') { + $hsl = array('hsl'); + $i = 0; + foreach ($rawComponents as $c) { + $val = $this->reduce($c); + $val = isset($val[1]) ? floatval($val[1]) : 0; + + if ($i == 0) $clamp = 360; + elseif ($i < 3) $clamp = 100; + else $clamp = 1; + + $hsl[] = $this->clamp($val, $clamp); + $i++; + } + + while (count($hsl) < 4) $hsl[] = 0; + return $this->toRGB($hsl); + + } elseif ($fname == 'rgb' || $fname == 'rgba') { + $components = array(); + $i = 1; + foreach ($rawComponents as $c) { + $c = $this->reduce($c); + if ($i < 4) { + if ($c[0] == "number" && $c[2] == "%") { + $components[] = 255 * ($c[1] / 100); + } else { + $components[] = floatval($c[1]); + } + } elseif ($i == 4) { + if ($c[0] == "number" && $c[2] == "%") { + $components[] = 1.0 * ($c[1] / 100); + } else { + $components[] = floatval($c[1]); + } + } else break; + + $i++; + } + while (count($components) < 3) $components[] = 0; + array_unshift($components, 'color'); + return $this->fixColor($components); + } + + return false; + } + + protected function reduce($value, $forExpression = false) { + switch ($value[0]) { + case "interpolate": + $reduced = $this->reduce($value[1]); + $var = $this->compileValue($reduced); + $res = $this->reduce(array("variable", $this->vPrefix . $var)); + + if ($res[0] == "raw_color") { + $res = $this->coerceColor($res); + } + + if (empty($value[2])) $res = $this->lib_e($res); + + return $res; + case "variable": + $key = $value[1]; + if (is_array($key)) { + $key = $this->reduce($key); + $key = $this->vPrefix . $this->compileValue($this->lib_e($key)); + } + + $seen =& $this->env->seenNames; + + if (!empty($seen[$key])) { + $this->throwError("infinite loop detected: $key"); + } + + $seen[$key] = true; + $out = $this->reduce($this->get($key, self::$defaultValue)); + $seen[$key] = false; + return $out; + case "list": + foreach ($value[2] as &$item) { + $item = $this->reduce($item, $forExpression); + } + return $value; + case "expression": + return $this->evaluate($value); + case "string": + foreach ($value[2] as &$part) { + if (is_array($part)) { + $strip = $part[0] == "variable"; + $part = $this->reduce($part); + if ($strip) $part = $this->lib_e($part); + } + } + return $value; + case "escape": + list(,$inner) = $value; + return $this->lib_e($this->reduce($inner)); + case "function": + $color = $this->funcToColor($value); + if ($color) return $color; + + list(, $name, $args) = $value; + if ($name == "%") $name = "_sprintf"; + $f = isset($this->libFunctions[$name]) ? + $this->libFunctions[$name] : array($this, 'lib_'.$name); + + if (is_callable($f)) { + if ($args[0] == 'list') + $args = self::compressList($args[2], $args[1]); + + $ret = call_user_func($f, $this->reduce($args, true), $this); + + if (is_null($ret)) { + return array("string", "", array( + $name, "(", $args, ")" + )); + } + + // convert to a typed value if the result is a php primitive + if (is_numeric($ret)) $ret = array('number', $ret, ""); + elseif (!is_array($ret)) $ret = array('keyword', $ret); + + return $ret; + } + + // plain function, reduce args + $value[2] = $this->reduce($value[2]); + return $value; + case "unary": + list(, $op, $exp) = $value; + $exp = $this->reduce($exp); + + if ($exp[0] == "number") { + switch ($op) { + case "+": + return $exp; + case "-": + $exp[1] *= -1; + return $exp; + } + } + return array("string", "", array($op, $exp)); + } + + if ($forExpression) { + switch ($value[0]) { + case "keyword": + if ($color = $this->coerceColor($value)) { + return $color; + } + break; + case "raw_color": + return $this->coerceColor($value); + } + } + + return $value; + } + + + // coerce a value for use in color operation + protected function coerceColor($value) { + switch($value[0]) { + case 'color': return $value; + case 'raw_color': + $c = array("color", 0, 0, 0); + $colorStr = substr($value[1], 1); + $num = hexdec($colorStr); + $width = strlen($colorStr) == 3 ? 16 : 256; + + for ($i = 3; $i > 0; $i--) { // 3 2 1 + $t = $num % $width; + $num /= $width; + + $c[$i] = $t * (256/$width) + $t * floor(16/$width); + } + + return $c; + case 'keyword': + $name = $value[1]; + if (isset(self::$cssColors[$name])) { + $rgba = explode(',', self::$cssColors[$name]); + + if(isset($rgba[3])) + return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]); + + return array('color', $rgba[0], $rgba[1], $rgba[2]); + } + return null; + } + } + + // make something string like into a string + protected function coerceString($value) { + switch ($value[0]) { + case "string": + return $value; + case "keyword": + return array("string", "", array($value[1])); + } + return null; + } + + // turn list of length 1 into value type + protected function flattenList($value) { + if ($value[0] == "list" && count($value[2]) == 1) { + return $this->flattenList($value[2][0]); + } + return $value; + } + + protected function toBool($a) { + if ($a) return self::$TRUE; + else return self::$FALSE; + } + + // evaluate an expression + protected function evaluate($exp) { + list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp; + + $left = $this->reduce($left, true); + $right = $this->reduce($right, true); + + if ($leftColor = $this->coerceColor($left)) { + $left = $leftColor; + } + + if ($rightColor = $this->coerceColor($right)) { + $right = $rightColor; + } + + $ltype = $left[0]; + $rtype = $right[0]; + + // operators that work on all types + if ($op == "and") { + return $this->toBool($left == self::$TRUE && $right == self::$TRUE); + } + + if ($op == "=") { + return $this->toBool($this->eq($left, $right) ); + } + + if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) { + return $str; + } + + // type based operators + $fname = "op_${ltype}_${rtype}"; + if (is_callable(array($this, $fname))) { + $out = $this->$fname($op, $left, $right); + if (!is_null($out)) return $out; + } + + // make the expression look it did before being parsed + $paddedOp = $op; + if ($whiteBefore) $paddedOp = " " . $paddedOp; + if ($whiteAfter) $paddedOp .= " "; + + return array("string", "", array($left, $paddedOp, $right)); + } + + protected function stringConcatenate($left, $right) { + if ($strLeft = $this->coerceString($left)) { + if ($right[0] == "string") { + $right[1] = ""; + } + $strLeft[2][] = $right; + return $strLeft; + } + + if ($strRight = $this->coerceString($right)) { + array_unshift($strRight[2], $left); + return $strRight; + } + } + + + // make sure a color's components don't go out of bounds + protected function fixColor($c) { + foreach (range(1, 3) as $i) { + if ($c[$i] < 0) $c[$i] = 0; + if ($c[$i] > 255) $c[$i] = 255; + } + + return $c; + } + + protected function op_number_color($op, $lft, $rgt) { + if ($op == '+' || $op == '*') { + return $this->op_color_number($op, $rgt, $lft); + } + } + + protected function op_color_number($op, $lft, $rgt) { + if ($rgt[0] == '%') $rgt[1] /= 100; + + return $this->op_color_color($op, $lft, + array_fill(1, count($lft) - 1, $rgt[1])); + } + + protected function op_color_color($op, $left, $right) { + $out = array('color'); + $max = count($left) > count($right) ? count($left) : count($right); + foreach (range(1, $max - 1) as $i) { + $lval = isset($left[$i]) ? $left[$i] : 0; + $rval = isset($right[$i]) ? $right[$i] : 0; + switch ($op) { + case '+': + $out[] = $lval + $rval; + break; + case '-': + $out[] = $lval - $rval; + break; + case '*': + $out[] = $lval * $rval; + break; + case '%': + $out[] = $lval % $rval; + break; + case '/': + if ($rval == 0) $this->throwError("evaluate error: can't divide by zero"); + $out[] = $lval / $rval; + break; + default: + $this->throwError('evaluate error: color op number failed on op '.$op); + } + } + return $this->fixColor($out); + } + + function lib_red($color){ + $color = $this->coerceColor($color); + if (is_null($color)) { + $this->throwError('color expected for red()'); + } + + return $color[1]; + } + + function lib_green($color){ + $color = $this->coerceColor($color); + if (is_null($color)) { + $this->throwError('color expected for green()'); + } + + return $color[2]; + } + + function lib_blue($color){ + $color = $this->coerceColor($color); + if (is_null($color)) { + $this->throwError('color expected for blue()'); + } + + return $color[3]; + } + + + // operator on two numbers + protected function op_number_number($op, $left, $right) { + $unit = empty($left[2]) ? $right[2] : $left[2]; + + $value = 0; + switch ($op) { + case '+': + $value = $left[1] + $right[1]; + break; + case '*': + $value = $left[1] * $right[1]; + break; + case '-': + $value = $left[1] - $right[1]; + break; + case '%': + $value = $left[1] % $right[1]; + break; + case '/': + if ($right[1] == 0) $this->throwError('parse error: divide by zero'); + $value = $left[1] / $right[1]; + break; + case '<': + return $this->toBool($left[1] < $right[1]); + case '>': + return $this->toBool($left[1] > $right[1]); + case '>=': + return $this->toBool($left[1] >= $right[1]); + case '=<': + return $this->toBool($left[1] <= $right[1]); + default: + $this->throwError('parse error: unknown number operator: '.$op); + } + + return array("number", $value, $unit); + } + + + /* environment functions */ + + protected function makeOutputBlock($type, $selectors = null) { + $b = new stdclass; + $b->lines = array(); + $b->children = array(); + $b->selectors = $selectors; + $b->type = $type; + $b->parent = $this->scope; + return $b; + } + + // the state of execution + protected function pushEnv($block = null) { + $e = new stdclass; + $e->parent = $this->env; + $e->store = array(); + $e->block = $block; + + $this->env = $e; + return $e; + } + + // pop something off the stack + protected function popEnv() { + $old = $this->env; + $this->env = $this->env->parent; + return $old; + } + + // set something in the current env + protected function set($name, $value) { + $this->env->store[$name] = $value; + } + + + // get the highest occurrence entry for a name + protected function get($name, $default=null) { + $current = $this->env; + + $isArguments = $name == $this->vPrefix . 'arguments'; + while ($current) { + if ($isArguments && isset($current->arguments)) { + return array('list', ' ', $current->arguments); + } + + if (isset($current->store[$name])) + return $current->store[$name]; + else { + $current = isset($current->storeParent) ? + $current->storeParent : $current->parent; + } + } + + return $default; + } + + // inject array of unparsed strings into environment as variables + protected function injectVariables($args) { + $this->pushEnv(); + $parser = new a3_lessc_parser($this, __METHOD__); + foreach ($args as $name => $strValue) { + if ($name{0} != '@') $name = '@'.$name; + $parser->count = 0; + $parser->buffer = (string)$strValue; + if (!$parser->propertyValue($value)) { + throw new Exception("failed to parse passed in variable $name: $strValue"); + } + + $this->set($name, $value); + } + } + + /** + * Initialize any static state, can initialize parser for a file + * $opts isn't used yet + */ + public function __construct($fname = null) { + if ($fname !== null) { + // used for deprecated parse method + $this->_parseFile = $fname; + } + } + + public function compile($string, $name = null) { + $locale = setlocale(LC_NUMERIC, 0); + setlocale(LC_NUMERIC, "C"); + + $this->parser = $this->makeParser($name); + $root = $this->parser->parse($string); + + $this->env = null; + $this->scope = null; + + $this->formatter = $this->newFormatter(); + + if (!empty($this->registeredVars)) { + $this->injectVariables($this->registeredVars); + } + + $this->sourceParser = $this->parser; // used for error messages + $this->compileBlock($root); + + ob_start(); + $this->formatter->block($this->scope); + $out = ob_get_clean(); + setlocale(LC_NUMERIC, $locale); + return $out; + } + + public function compileFile($fname, $outFname = null) { + global $wp_filesystem; + if (!is_readable($fname)) { + throw new Exception('load error: failed to find '.$fname); + } + + $pi = pathinfo($fname); + + $oldImport = $this->importDir; + + $this->importDir = (array)$this->importDir; + $this->importDir[] = $pi['dirname'].'/'; + + $this->addParsedFile($fname); + + $out = $this->compile(file_get_contents($fname), $fname); + + $this->importDir = $oldImport; + + if ($outFname !== null) { + return $wp_filesystem->put_contents($outFname, $out); + } + + return $out; + } + + // compile only if changed input has changed or output doesn't exist + public function checkedCompile($in, $out) { + if (!is_file($out) || filemtime($in) > filemtime($out)) { + $this->compileFile($in, $out); + return true; + } + return false; + } + + /** + * Execute lessphp on a .less file or a lessphp cache structure + * + * The lessphp cache structure contains information about a specific + * less file having been parsed. It can be used as a hint for future + * calls to determine whether or not a rebuild is required. + * + * The cache structure contains two important keys that may be used + * externally: + * + * compiled: The final compiled CSS + * updated: The time (in seconds) the CSS was last compiled + * + * The cache structure is a plain-ol' PHP associative array and can + * be serialized and unserialized without a hitch. + * + * @param mixed $in Input + * @param bool $force Force rebuild? + * @return array lessphp cache structure + */ + public function cachedCompile($in, $force = false) { + // assume no root + $root = null; + + if (is_string($in)) { + $root = $in; + } elseif (is_array($in) and isset($in['root'])) { + if ($force or ! isset($in['files'])) { + // If we are forcing a recompile or if for some reason the + // structure does not contain any file information we should + // specify the root to trigger a rebuild. + $root = $in['root']; + } elseif (isset($in['files']) and is_array($in['files'])) { + foreach ($in['files'] as $fname => $ftime ) { + if (!file_exists($fname) or filemtime($fname) > $ftime) { + // One of the files we knew about previously has changed + // so we should look at our incoming root again. + $root = $in['root']; + break; + } + } + } + } else { + // TODO: Throw an exception? We got neither a string nor something + // that looks like a compatible lessphp cache structure. + return null; + } + + if ($root !== null) { + // If we have a root value which means we should rebuild. + $out = array(); + $out['root'] = $root; + $out['compiled'] = $this->compileFile($root); + $out['files'] = $this->allParsedFiles(); + $out['updated'] = time(); + return $out; + } else { + // No changes, pass back the structure + // we were given initially. + return $in; + } + + } + + // parse and compile buffer + // This is deprecated + public function parse($str = null, $initialVariables = null) { + if (is_array($str)) { + $initialVariables = $str; + $str = null; + } + + $oldVars = $this->registeredVars; + if ($initialVariables !== null) { + $this->setVariables($initialVariables); + } + + if ($str == null) { + if (empty($this->_parseFile)) { + throw new exception("nothing to parse"); + } + + $out = $this->compileFile($this->_parseFile); + } else { + $out = $this->compile($str); + } + + $this->registeredVars = $oldVars; + return $out; + } + + protected function makeParser($name) { + $parser = new a3_lessc_parser($this, $name); + $parser->writeComments = $this->preserveComments; + + return $parser; + } + + public function setFormatter($name) { + $this->formatterName = $name; + } + + protected function newFormatter() { + $className = "a3_lessc_formatter_lessjs"; + if (!empty($this->formatterName)) { + if (!is_string($this->formatterName)) + return $this->formatterName; + $className = "a3_lessc_formatter_$this->formatterName"; + } + + return new $className; + } + + public function setPreserveComments($preserve) { + $this->preserveComments = $preserve; + } + + public function registerFunction($name, $func) { + $this->libFunctions[$name] = $func; + } + + public function unregisterFunction($name) { + unset($this->libFunctions[$name]); + } + + public function setVariables($variables) { + $this->registeredVars = array_merge($this->registeredVars, $variables); + } + + public function unsetVariable($name) { + unset($this->registeredVars[$name]); + } + + public function setImportDir($dirs) { + $this->importDir = (array)$dirs; + } + + public function addImportDir($dir) { + $this->importDir = (array)$this->importDir; + $this->importDir[] = $dir; + } + + public function allParsedFiles() { + return $this->allParsedFiles; + } + + protected function addParsedFile($file) { + $this->allParsedFiles[realpath($file)] = filemtime($file); + } + + /** + * Uses the current value of $this->count to show line and line number + */ + protected function throwError($msg = null) { + if ($this->sourceLoc >= 0) { + $this->sourceParser->throwError($msg, $this->sourceLoc); + } + throw new exception($msg); + } + + // compile file $in to file $out if $in is newer than $out + // returns true when it compiles, false otherwise + public static function ccompile($in, $out, $less = null) { + if ($less === null) { + $less = new self; + } + return $less->checkedCompile($in, $out); + } + + public static function cexecute($in, $force = false, $less = null) { + if ($less === null) { + $less = new self; + } + return $less->cachedCompile($in, $force); + } + + static protected $cssColors = array( + 'aliceblue' => '240,248,255', + 'antiquewhite' => '250,235,215', + 'aqua' => '0,255,255', + 'aquamarine' => '127,255,212', + 'azure' => '240,255,255', + 'beige' => '245,245,220', + 'bisque' => '255,228,196', + 'black' => '0,0,0', + 'blanchedalmond' => '255,235,205', + 'blue' => '0,0,255', + 'blueviolet' => '138,43,226', + 'brown' => '165,42,42', + 'burlywood' => '222,184,135', + 'cadetblue' => '95,158,160', + 'chartreuse' => '127,255,0', + 'chocolate' => '210,105,30', + 'coral' => '255,127,80', + 'cornflowerblue' => '100,149,237', + 'cornsilk' => '255,248,220', + 'crimson' => '220,20,60', + 'cyan' => '0,255,255', + 'darkblue' => '0,0,139', + 'darkcyan' => '0,139,139', + 'darkgoldenrod' => '184,134,11', + 'darkgray' => '169,169,169', + 'darkgreen' => '0,100,0', + 'darkgrey' => '169,169,169', + 'darkkhaki' => '189,183,107', + 'darkmagenta' => '139,0,139', + 'darkolivegreen' => '85,107,47', + 'darkorange' => '255,140,0', + 'darkorchid' => '153,50,204', + 'darkred' => '139,0,0', + 'darksalmon' => '233,150,122', + 'darkseagreen' => '143,188,143', + 'darkslateblue' => '72,61,139', + 'darkslategray' => '47,79,79', + 'darkslategrey' => '47,79,79', + 'darkturquoise' => '0,206,209', + 'darkviolet' => '148,0,211', + 'deeppink' => '255,20,147', + 'deepskyblue' => '0,191,255', + 'dimgray' => '105,105,105', + 'dimgrey' => '105,105,105', + 'dodgerblue' => '30,144,255', + 'firebrick' => '178,34,34', + 'floralwhite' => '255,250,240', + 'forestgreen' => '34,139,34', + 'fuchsia' => '255,0,255', + 'gainsboro' => '220,220,220', + 'ghostwhite' => '248,248,255', + 'gold' => '255,215,0', + 'goldenrod' => '218,165,32', + 'gray' => '128,128,128', + 'green' => '0,128,0', + 'greenyellow' => '173,255,47', + 'grey' => '128,128,128', + 'honeydew' => '240,255,240', + 'hotpink' => '255,105,180', + 'indianred' => '205,92,92', + 'indigo' => '75,0,130', + 'ivory' => '255,255,240', + 'khaki' => '240,230,140', + 'lavender' => '230,230,250', + 'lavenderblush' => '255,240,245', + 'lawngreen' => '124,252,0', + 'lemonchiffon' => '255,250,205', + 'lightblue' => '173,216,230', + 'lightcoral' => '240,128,128', + 'lightcyan' => '224,255,255', + 'lightgoldenrodyellow' => '250,250,210', + 'lightgray' => '211,211,211', + 'lightgreen' => '144,238,144', + 'lightgrey' => '211,211,211', + 'lightpink' => '255,182,193', + 'lightsalmon' => '255,160,122', + 'lightseagreen' => '32,178,170', + 'lightskyblue' => '135,206,250', + 'lightslategray' => '119,136,153', + 'lightslategrey' => '119,136,153', + 'lightsteelblue' => '176,196,222', + 'lightyellow' => '255,255,224', + 'lime' => '0,255,0', + 'limegreen' => '50,205,50', + 'linen' => '250,240,230', + 'magenta' => '255,0,255', + 'maroon' => '128,0,0', + 'mediumaquamarine' => '102,205,170', + 'mediumblue' => '0,0,205', + 'mediumorchid' => '186,85,211', + 'mediumpurple' => '147,112,219', + 'mediumseagreen' => '60,179,113', + 'mediumslateblue' => '123,104,238', + 'mediumspringgreen' => '0,250,154', + 'mediumturquoise' => '72,209,204', + 'mediumvioletred' => '199,21,133', + 'midnightblue' => '25,25,112', + 'mintcream' => '245,255,250', + 'mistyrose' => '255,228,225', + 'moccasin' => '255,228,181', + 'navajowhite' => '255,222,173', + 'navy' => '0,0,128', + 'oldlace' => '253,245,230', + 'olive' => '128,128,0', + 'olivedrab' => '107,142,35', + 'orange' => '255,165,0', + 'orangered' => '255,69,0', + 'orchid' => '218,112,214', + 'palegoldenrod' => '238,232,170', + 'palegreen' => '152,251,152', + 'paleturquoise' => '175,238,238', + 'palevioletred' => '219,112,147', + 'papayawhip' => '255,239,213', + 'peachpuff' => '255,218,185', + 'peru' => '205,133,63', + 'pink' => '255,192,203', + 'plum' => '221,160,221', + 'powderblue' => '176,224,230', + 'purple' => '128,0,128', + 'red' => '255,0,0', + 'rosybrown' => '188,143,143', + 'royalblue' => '65,105,225', + 'saddlebrown' => '139,69,19', + 'salmon' => '250,128,114', + 'sandybrown' => '244,164,96', + 'seagreen' => '46,139,87', + 'seashell' => '255,245,238', + 'sienna' => '160,82,45', + 'silver' => '192,192,192', + 'skyblue' => '135,206,235', + 'slateblue' => '106,90,205', + 'slategray' => '112,128,144', + 'slategrey' => '112,128,144', + 'snow' => '255,250,250', + 'springgreen' => '0,255,127', + 'steelblue' => '70,130,180', + 'tan' => '210,180,140', + 'teal' => '0,128,128', + 'thistle' => '216,191,216', + 'tomato' => '255,99,71', + 'transparent' => '0,0,0,0', + 'turquoise' => '64,224,208', + 'violet' => '238,130,238', + 'wheat' => '245,222,179', + 'white' => '255,255,255', + 'whitesmoke' => '245,245,245', + 'yellow' => '255,255,0', + 'yellowgreen' => '154,205,50' + ); +} + +// responsible for taking a string of LESS code and converting it into a +// syntax tree +class a3_lessc_parser { + static protected $nextBlockId = 0; // used to uniquely identify blocks + + static protected $precedence = array( + '=<' => 0, + '>=' => 0, + '=' => 0, + '<' => 0, + '>' => 0, + + '+' => 1, + '-' => 1, + '*' => 2, + '/' => 2, + '%' => 2, + ); + + static protected $whitePattern; + static protected $commentMulti; + + static protected $commentSingle = "//"; + static protected $commentMultiLeft = "/*"; + static protected $commentMultiRight = "*/"; + + // regex string to match any of the operators + static protected $operatorString; + + // these properties will supress division unless it's inside parenthases + static protected $supressDivisionProps = + array('/border-radius$/i', '/^font$/i'); + + protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document", "viewport", "-moz-viewport", "-o-viewport", "-ms-viewport"); + protected $lineDirectives = array("charset"); + + /** + * if we are in parens we can be more liberal with whitespace around + * operators because it must evaluate to a single value and thus is less + * ambiguous. + * + * Consider: + * property1: 10 -5; // is two numbers, 10 and -5 + * property2: (10 -5); // should evaluate to 5 + */ + protected $inParens = false; + + // caches preg escaped literals + static protected $literalCache = array(); + + public function __construct($lessc, $sourceName = null) { + $this->eatWhiteDefault = true; + // reference to less needed for vPrefix, mPrefix, and parentSelector + $this->lessc = $lessc; + + $this->sourceName = $sourceName; // name used for error messages + + $this->writeComments = false; + + if (!self::$operatorString) { + self::$operatorString = + '('.implode('|', array_map(array('a3_lessc', 'preg_quote'), + array_keys(self::$precedence))).')'; + + $commentSingle = a3_lessc::preg_quote(self::$commentSingle); + $commentMultiLeft = a3_lessc::preg_quote(self::$commentMultiLeft); + $commentMultiRight = a3_lessc::preg_quote(self::$commentMultiRight); + + self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight; + self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais'; + } + } + + public function parse($buffer) { + $this->count = 0; + $this->line = 1; + + $this->env = null; // block stack + $this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer); + $this->pushSpecialBlock("root"); + $this->eatWhiteDefault = true; + $this->seenComments = array(); + + // trim whitespace on head + // if (preg_match('/^\s+/', $this->buffer, $m)) { + // $this->line += substr_count($m[0], "\n"); + // $this->buffer = ltrim($this->buffer); + // } + $this->whitespace(); + + // parse the entire file + $lastCount = $this->count; + while (false !== $this->parseChunk()); + + if ($this->count != strlen($this->buffer)) + $this->throwError(); + + // TODO report where the block was opened + if (!is_null($this->env->parent)) + throw new exception('parse error: unclosed block'); + + return $this->env; + } + + /** + * Parse a single chunk off the head of the buffer and append it to the + * current parse environment. + * Returns false when the buffer is empty, or when there is an error. + * + * This function is called repeatedly until the entire document is + * parsed. + * + * This parser is most similar to a recursive descent parser. Single + * functions represent discrete grammatical rules for the language, and + * they are able to capture the text that represents those rules. + * + * Consider the function a3_lessc::keyword(). (all parse functions are + * structured the same) + * + * The function takes a single reference argument. When calling the + * function it will attempt to match a keyword on the head of the buffer. + * If it is successful, it will place the keyword in the referenced + * argument, advance the position in the buffer, and return true. If it + * fails then it won't advance the buffer and it will return false. + * + * All of these parse functions are powered by a3_lessc::match(), which behaves + * the same way, but takes a literal regular expression. Sometimes it is + * more convenient to use match instead of creating a new function. + * + * Because of the format of the functions, to parse an entire string of + * grammatical rules, you can chain them together using &&. + * + * But, if some of the rules in the chain succeed before one fails, then + * the buffer position will be left at an invalid state. In order to + * avoid this, a3_lessc::seek() is used to remember and set buffer positions. + * + * Before parsing a chain, use $s = $this->seek() to remember the current + * position into $s. Then if a chain fails, use $this->seek($s) to + * go back where we started. + */ + protected function parseChunk() { + if (empty($this->buffer)) return false; + $s = $this->seek(); + + // setting a property + if ($this->keyword($key) && $this->assign() && + $this->propertyValue($value, $key) && $this->end()) + { + $this->append(array('assign', $key, $value), $s); + return true; + } else { + $this->seek($s); + } + + + // look for special css blocks + if ($this->literal('@', false)) { + $this->count--; + + // media + if ($this->literal('@media')) { + if (($this->mediaQueryList($mediaQueries) || true) + && $this->literal('{')) + { + $media = $this->pushSpecialBlock("media"); + $media->queries = is_null($mediaQueries) ? array() : $mediaQueries; + return true; + } else { + $this->seek($s); + return false; + } + } + + if ($this->literal("@", false) && $this->keyword($dirName)) { + if ($this->isDirective($dirName, $this->blockDirectives)) { + if (($this->openString("{", $dirValue, null, array(";")) || true) && + $this->literal("{")) + { + $dir = $this->pushSpecialBlock("directive"); + $dir->name = $dirName; + if (isset($dirValue)) $dir->value = $dirValue; + return true; + } + } elseif ($this->isDirective($dirName, $this->lineDirectives)) { + if ($this->propertyValue($dirValue) && $this->end()) { + $this->append(array("directive", $dirName, $dirValue)); + return true; + } + } + } + + $this->seek($s); + } + + // setting a variable + if ($this->variable($var) && $this->assign() && + $this->propertyValue($value) && $this->end()) + { + $this->append(array('assign', $var, $value), $s); + return true; + } else { + $this->seek($s); + } + + if ($this->import($importValue)) { + $this->append($importValue, $s); + return true; + } + + // opening parametric mixin + if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) && + ($this->guards($guards) || true) && + $this->literal('{')) + { + $block = $this->pushBlock($this->fixTags(array($tag))); + $block->args = $args; + $block->isVararg = $isVararg; + if (!empty($guards)) $block->guards = $guards; + return true; + } else { + $this->seek($s); + } + + // opening a simple block + if ($this->tags($tags) && $this->literal('{')) { + $tags = $this->fixTags($tags); + $this->pushBlock($tags); + return true; + } else { + $this->seek($s); + } + + // closing a block + if ($this->literal('}', false)) { + try { + $block = $this->pop(); + } catch (exception $e) { + $this->seek($s); + $this->throwError($e->getMessage()); + } + + $hidden = false; + if (is_null($block->type)) { + $hidden = true; + if (!isset($block->args)) { + foreach ($block->tags as $tag) { + if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) { + $hidden = false; + break; + } + } + } + + foreach ($block->tags as $tag) { + if (is_string($tag)) { + $this->env->children[$tag][] = $block; + } + } + } + + if (!$hidden) { + $this->append(array('block', $block), $s); + } + + // this is done here so comments aren't bundled into he block that + // was just closed + $this->whitespace(); + return true; + } + + // mixin + if ($this->mixinTags($tags) && + ($this->argumentDef($argv, $isVararg) || true) && + ($this->keyword($suffix) || true) && $this->end()) + { + $tags = $this->fixTags($tags); + $this->append(array('mixin', $tags, $argv, $suffix), $s); + return true; + } else { + $this->seek($s); + } + + // spare ; + if ($this->literal(';')) return true; + + return false; // got nothing, throw error + } + + protected function isDirective($dirname, $directives) { + // TODO: cache pattern in parser + $pattern = implode("|", + array_map(array('a3_lessc', "preg_quote"), $directives)); + $pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i'; + + return preg_match($pattern, $dirname); + } + + protected function fixTags($tags) { + // move @ tags out of variable namespace + foreach ($tags as &$tag) { + if ($tag{0} == $this->lessc->vPrefix) + $tag[0] = $this->lessc->mPrefix; + } + return $tags; + } + + // a list of expressions + protected function expressionList(&$exps) { + $values = array(); + + while ($this->expression($exp)) { + $values[] = $exp; + } + + if (count($values) == 0) return false; + + $exps = a3_lessc::compressList($values, ' '); + return true; + } + + /** + * Attempt to consume an expression. + * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code + */ + protected function expression(&$out) { + if ($this->value($lhs)) { + $out = $this->expHelper($lhs, 0); + + // look for / shorthand + if (!empty($this->env->supressedDivision)) { + unset($this->env->supressedDivision); + $s = $this->seek(); + if ($this->literal("/") && $this->value($rhs)) { + $out = array("list", "", + array($out, array("keyword", "/"), $rhs)); + } else { + $this->seek($s); + } + } + + return true; + } + return false; + } + + /** + * recursively parse infix equation with $lhs at precedence $minP + */ + protected function expHelper($lhs, $minP) { + $this->inExp = true; + $ss = $this->seek(); + + while (true) { + $whiteBefore = isset($this->buffer[$this->count - 1]) && + ctype_space($this->buffer[$this->count - 1]); + + // If there is whitespace before the operator, then we require + // whitespace after the operator for it to be an expression + $needWhite = $whiteBefore && !$this->inParens; + + if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) { + if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) { + foreach (self::$supressDivisionProps as $pattern) { + if (preg_match($pattern, $this->env->currentProperty)) { + $this->env->supressedDivision = true; + break 2; + } + } + } + + + $whiteAfter = isset($this->buffer[$this->count - 1]) && + ctype_space($this->buffer[$this->count - 1]); + + if (!$this->value($rhs)) break; + + // peek for next operator to see what to do with rhs + if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) { + $rhs = $this->expHelper($rhs, self::$precedence[$next[1]]); + } + + $lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter); + $ss = $this->seek(); + + continue; + } + + break; + } + + $this->seek($ss); + + return $lhs; + } + + // consume a list of values for a property + public function propertyValue(&$value, $keyName = null) { + $values = array(); + + if ($keyName !== null) $this->env->currentProperty = $keyName; + + $s = null; + while ($this->expressionList($v)) { + $values[] = $v; + $s = $this->seek(); + if (!$this->literal(',')) break; + } + + if ($s) $this->seek($s); + + if ($keyName !== null) unset($this->env->currentProperty); + + if (count($values) == 0) return false; + + $value = a3_lessc::compressList($values, ', '); + return true; + } + + protected function parenValue(&$out) { + $s = $this->seek(); + + // speed shortcut + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") { + return false; + } + + $inParens = $this->inParens; + if ($this->literal("(") && + ($this->inParens = true) && $this->expression($exp) && + $this->literal(")")) + { + $out = $exp; + $this->inParens = $inParens; + return true; + } else { + $this->inParens = $inParens; + $this->seek($s); + } + + return false; + } + + // a single value + protected function value(&$value) { + $s = $this->seek(); + + // speed shortcut + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") { + // negation + if ($this->literal("-", false) && + (($this->variable($inner) && $inner = array("variable", $inner)) || + $this->unit($inner) || + $this->parenValue($inner))) + { + $value = array("unary", "-", $inner); + return true; + } else { + $this->seek($s); + } + } + + if ($this->parenValue($value)) return true; + if ($this->unit($value)) return true; + if ($this->color($value)) return true; + if ($this->func($value)) return true; + if ($this->string($value)) return true; + + if ($this->keyword($word)) { + $value = array('keyword', $word); + return true; + } + + // try a variable + if ($this->variable($var)) { + $value = array('variable', $var); + return true; + } + + // unquote string (should this work on any type? + if ($this->literal("~") && $this->string($str)) { + $value = array("escape", $str); + return true; + } else { + $this->seek($s); + } + + // css hack: \0 + if ($this->literal('\\') && $this->match('([0-9]+)', $m)) { + $value = array('keyword', '\\'.$m[1]); + return true; + } else { + $this->seek($s); + } + + return false; + } + + // an import statement + protected function import(&$out) { + $s = $this->seek(); + if (!$this->literal('@import')) return false; + + // @import "something.css" media; + // @import url("something.css") media; + // @import url(something.css) media; + + if ($this->propertyValue($value)) { + $out = array("import", $value); + return true; + } + } + + protected function mediaQueryList(&$out) { + if ($this->genericList($list, "mediaQuery", ",", false)) { + $out = $list[2]; + return true; + } + return false; + } + + protected function mediaQuery(&$out) { + $s = $this->seek(); + + $expressions = null; + $parts = array(); + + if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) { + $prop = array("mediaType"); + if (isset($only)) $prop[] = "only"; + if (isset($not)) $prop[] = "not"; + $prop[] = $mediaType; + $parts[] = $prop; + } else { + $this->seek($s); + } + + + if (!empty($mediaType) && !$this->literal("and")) { + // ~ + } else { + $this->genericList($expressions, "mediaExpression", "and", false); + if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]); + } + + if (count($parts) == 0) { + $this->seek($s); + return false; + } + + $out = $parts; + return true; + } + + protected function mediaExpression(&$out) { + $s = $this->seek(); + $value = null; + if ($this->literal("(") && + $this->keyword($feature) && + ($this->literal(":") && $this->expression($value) || true) && + $this->literal(")")) + { + $out = array("mediaExp", $feature); + if ($value) $out[] = $value; + return true; + } elseif ($this->variable($variable)) { + $out = array('variable', $variable); + return true; + } + + $this->seek($s); + return false; + } + + // an unbounded string stopped by $end + protected function openString($end, &$out, $nestingOpen=null, $rejectStrs = null) { + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + $stop = array("'", '"', "@{", $end); + $stop = array_map(array('a3_lessc', "preg_quote"), $stop); + // $stop[] = self::$commentMulti; + + if (!is_null($rejectStrs)) { + $stop = array_merge($stop, $rejectStrs); + } + + $patt = '(.*?)('.implode("|", $stop).')'; + + $nestingLevel = 0; + + $content = array(); + while ($this->match($patt, $m, false)) { + if (!empty($m[1])) { + $content[] = $m[1]; + if ($nestingOpen) { + $nestingLevel += substr_count($m[1], $nestingOpen); + } + } + + $tok = $m[2]; + + $this->count-= strlen($tok); + if ($tok == $end) { + if ($nestingLevel == 0) { + break; + } else { + $nestingLevel--; + } + } + + if (($tok == "'" || $tok == '"') && $this->string($str)) { + $content[] = $str; + continue; + } + + if ($tok == "@{" && $this->interpolation($inter)) { + $content[] = $inter; + continue; + } + + if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) { + break; + } + + $content[] = $tok; + $this->count+= strlen($tok); + } + + $this->eatWhiteDefault = $oldWhite; + + if (count($content) == 0) return false; + + // trim the end + if (is_string(end($content))) { + $content[count($content) - 1] = rtrim(end($content)); + } + + $out = array("string", "", $content); + return true; + } + + protected function string(&$out) { + $s = $this->seek(); + if ($this->literal('"', false)) { + $delim = '"'; + } elseif ($this->literal("'", false)) { + $delim = "'"; + } else { + return false; + } + + $content = array(); + + // look for either ending delim , escape, or string interpolation + $patt = '([^\n]*?)(@\{|\\\\|' . + a3_lessc::preg_quote($delim).')'; + + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + while ($this->match($patt, $m, false)) { + $content[] = $m[1]; + if ($m[2] == "@{") { + $this->count -= strlen($m[2]); + if ($this->interpolation($inter, false)) { + $content[] = $inter; + } else { + $this->count += strlen($m[2]); + $content[] = "@{"; // ignore it + } + } elseif ($m[2] == '\\') { + $content[] = $m[2]; + if ($this->literal($delim, false)) { + $content[] = $delim; + } + } else { + $this->count -= strlen($delim); + break; // delim + } + } + + $this->eatWhiteDefault = $oldWhite; + + if ($this->literal($delim)) { + $out = array("string", $delim, $content); + return true; + } + + $this->seek($s); + return false; + } + + protected function interpolation(&$out) { + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = true; + + $s = $this->seek(); + if ($this->literal("@{") && + $this->openString("}", $interp, null, array("'", '"', ";")) && + $this->literal("}", false)) + { + $out = array("interpolate", $interp); + $this->eatWhiteDefault = $oldWhite; + if ($this->eatWhiteDefault) $this->whitespace(); + return true; + } + + $this->eatWhiteDefault = $oldWhite; + $this->seek($s); + return false; + } + + protected function unit(&$unit) { + // speed shortcut + if (isset($this->buffer[$this->count])) { + $char = $this->buffer[$this->count]; + if (!ctype_digit($char) && $char != ".") return false; + } + + if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) { + $unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]); + return true; + } + return false; + } + + // a # color + protected function color(&$out) { + if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) { + if (strlen($m[1]) > 7) { + $out = array("string", "", array($m[1])); + } else { + $out = array("raw_color", $m[1]); + } + return true; + } + + return false; + } + + // consume an argument definition list surrounded by () + // each argument is a variable name with optional value + // or at the end a ... or a variable named followed by ... + // arguments are separated by , unless a ; is in the list, then ; is the + // delimiter. + protected function argumentDef(&$args, &$isVararg) { + $s = $this->seek(); + if (!$this->literal('(')) return false; + + $values = array(); + $delim = ","; + $method = "expressionList"; + + $isVararg = false; + while (true) { + if ($this->literal("...")) { + $isVararg = true; + break; + } + + if ($this->$method($value)) { + if ($value[0] == "variable") { + $arg = array("arg", $value[1]); + $ss = $this->seek(); + + if ($this->assign() && $this->$method($rhs)) { + $arg[] = $rhs; + } else { + $this->seek($ss); + if ($this->literal("...")) { + $arg[0] = "rest"; + $isVararg = true; + } + } + + $values[] = $arg; + if ($isVararg) break; + continue; + } else { + $values[] = array("lit", $value); + } + } + + + if (!$this->literal($delim)) { + if ($delim == "," && $this->literal(";")) { + // found new delim, convert existing args + $delim = ";"; + $method = "propertyValue"; + + // transform arg list + if (isset($values[1])) { // 2 items + $newList = array(); + foreach ($values as $i => $arg) { + switch($arg[0]) { + case "arg": + if ($i) { + $this->throwError("Cannot mix ; and , as delimiter types"); + } + $newList[] = $arg[2]; + break; + case "lit": + $newList[] = $arg[1]; + break; + case "rest": + $this->throwError("Unexpected rest before semicolon"); + } + } + + $newList = array("list", ", ", $newList); + + switch ($values[0][0]) { + case "arg": + $newArg = array("arg", $values[0][1], $newList); + break; + case "lit": + $newArg = array("lit", $newList); + break; + } + + } elseif ($values) { // 1 item + $newArg = $values[0]; + } + + if ($newArg) { + $values = array($newArg); + } + } else { + break; + } + } + } + + if (!$this->literal(')')) { + $this->seek($s); + return false; + } + + $args = $values; + + return true; + } + + // consume a list of tags + // this accepts a hanging delimiter + protected function tags(&$tags, $simple = false, $delim = ',') { + $tags = array(); + while ($this->tag($tt, $simple)) { + $tags[] = $tt; + if (!$this->literal($delim)) break; + } + if (count($tags) == 0) return false; + + return true; + } + + // list of tags of specifying mixin path + // optionally separated by > (lazy, accepts extra >) + protected function mixinTags(&$tags) { + $s = $this->seek(); + $tags = array(); + while ($this->tag($tt, true)) { + $tags[] = $tt; + $this->literal(">"); + } + + if (count($tags) == 0) return false; + + return true; + } + + // a bracketed value (contained within in a tag definition) + protected function tagBracket(&$parts, &$hasExpression) { + // speed shortcut + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") { + return false; + } + + $s = $this->seek(); + + $hasInterpolation = false; + + if ($this->literal("[", false)) { + $attrParts = array("["); + // keyword, string, operator + while (true) { + if ($this->literal("]", false)) { + $this->count--; + break; // get out early + } + + if ($this->match('\s+', $m)) { + $attrParts[] = " "; + continue; + } + if ($this->string($str)) { + // escape parent selector, (yuck) + foreach ($str[2] as &$chunk) { + $chunk = str_replace($this->lessc->parentSelector, "$&$", $chunk); + } + + $attrParts[] = $str; + $hasInterpolation = true; + continue; + } + + if ($this->keyword($word)) { + $attrParts[] = $word; + continue; + } + + if ($this->interpolation($inter, false)) { + $attrParts[] = $inter; + $hasInterpolation = true; + continue; + } + + // operator, handles attr namespace too + if ($this->match('[|-~\$\*\^=]+', $m)) { + $attrParts[] = $m[0]; + continue; + } + + break; + } + + if ($this->literal("]", false)) { + $attrParts[] = "]"; + foreach ($attrParts as $part) { + $parts[] = $part; + } + $hasExpression = $hasExpression || $hasInterpolation; + return true; + } + $this->seek($s); + } + + $this->seek($s); + return false; + } + + // a space separated list of selectors + protected function tag(&$tag, $simple = false) { + if ($simple) + $chars = '^@,:;{}\][>\(\) "\''; + else + $chars = '^@,;{}["\''; + + $s = $this->seek(); + + $hasExpression = false; + $parts = array(); + while ($this->tagBracket($parts, $hasExpression)); + + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + while (true) { + if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) { + $parts[] = $m[1]; + if ($simple) break; + + while ($this->tagBracket($parts, $hasExpression)); + continue; + } + + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") { + if ($this->interpolation($interp)) { + $hasExpression = true; + $interp[2] = true; // don't unescape + $parts[] = $interp; + continue; + } + + if ($this->literal("@")) { + $parts[] = "@"; + continue; + } + } + + if ($this->unit($unit)) { // for keyframes + $parts[] = $unit[1]; + $parts[] = $unit[2]; + continue; + } + + break; + } + + $this->eatWhiteDefault = $oldWhite; + if (!$parts) { + $this->seek($s); + return false; + } + + if ($hasExpression) { + $tag = array("exp", array("string", "", $parts)); + } else { + $tag = trim(implode($parts)); + } + + $this->whitespace(); + return true; + } + + // a css function + protected function func(&$func) { + $s = $this->seek(); + + if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) { + $fname = $m[1]; + + $sPreArgs = $this->seek(); + + $args = array(); + while (true) { + $ss = $this->seek(); + // this ugly nonsense is for ie filter properties + if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) { + $args[] = array("string", "", array($name, "=", $value)); + } else { + $this->seek($ss); + if ($this->expressionList($value)) { + $args[] = $value; + } + } + + if (!$this->literal(',')) break; + } + $args = array('list', ',', $args); + + if ($this->literal(')')) { + $func = array('function', $fname, $args); + return true; + } elseif ($fname == 'url') { + // couldn't parse and in url? treat as string + $this->seek($sPreArgs); + if ($this->openString(")", $string) && $this->literal(")")) { + $func = array('function', $fname, $string); + return true; + } + } + } + + $this->seek($s); + return false; + } + + // consume a less variable + protected function variable(&$name) { + $s = $this->seek(); + if ($this->literal($this->lessc->vPrefix, false) && + ($this->variable($sub) || $this->keyword($name))) + { + if (!empty($sub)) { + $name = array('variable', $sub); + } else { + $name = $this->lessc->vPrefix.$name; + } + return true; + } + + $name = null; + $this->seek($s); + return false; + } + + /** + * Consume an assignment operator + * Can optionally take a name that will be set to the current property name + */ + protected function assign($name = null) { + if ($name) $this->currentProperty = $name; + return $this->literal(':') || $this->literal('='); + } + + // consume a keyword + protected function keyword(&$word) { + if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) { + $word = $m[1]; + return true; + } + return false; + } + + // consume an end of statement delimiter + protected function end() { + if ($this->literal(';')) { + return true; + } elseif ($this->count == strlen($this->buffer) || $this->buffer[$this->count] == '}') { + // if there is end of file or a closing block next then we don't need a ; + return true; + } + return false; + } + + protected function guards(&$guards) { + $s = $this->seek(); + + if (!$this->literal("when")) { + $this->seek($s); + return false; + } + + $guards = array(); + + while ($this->guardGroup($g)) { + $guards[] = $g; + if (!$this->literal(",")) break; + } + + if (count($guards) == 0) { + $guards = null; + $this->seek($s); + return false; + } + + return true; + } + + // a bunch of guards that are and'd together + // TODO rename to guardGroup + protected function guardGroup(&$guardGroup) { + $s = $this->seek(); + $guardGroup = array(); + while ($this->guard($guard)) { + $guardGroup[] = $guard; + if (!$this->literal("and")) break; + } + + if (count($guardGroup) == 0) { + $guardGroup = null; + $this->seek($s); + return false; + } + + return true; + } + + protected function guard(&$guard) { + $s = $this->seek(); + $negate = $this->literal("not"); + + if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { + $guard = $exp; + if ($negate) $guard = array("negate", $guard); + return true; + } + + $this->seek($s); + return false; + } + + /* raw parsing functions */ + + protected function literal($what, $eatWhitespace = null) { + if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; + + // shortcut on single letter + if (!isset($what[1]) && isset($this->buffer[$this->count])) { + if ($this->buffer[$this->count] == $what) { + if (!$eatWhitespace) { + $this->count++; + return true; + } + // goes below... + } else { + return false; + } + } + + if (!isset(self::$literalCache[$what])) { + self::$literalCache[$what] = a3_lessc::preg_quote($what); + } + + return $this->match(self::$literalCache[$what], $m, $eatWhitespace); + } + + protected function genericList(&$out, $parseItem, $delim="", $flatten=true) { + $s = $this->seek(); + $items = array(); + while ($this->$parseItem($value)) { + $items[] = $value; + if ($delim) { + if (!$this->literal($delim)) break; + } + } + + if (count($items) == 0) { + $this->seek($s); + return false; + } + + if ($flatten && count($items) == 1) { + $out = $items[0]; + } else { + $out = array("list", $delim, $items); + } + + return true; + } + + + // advance counter to next occurrence of $what + // $until - don't include $what in advance + // $allowNewline, if string, will be used as valid char set + protected function to($what, &$out, $until = false, $allowNewline = false) { + if (is_string($allowNewline)) { + $validChars = $allowNewline; + } else { + $validChars = $allowNewline ? "." : "[^\n]"; + } + if (!$this->match('('.$validChars.'*?)'.a3_lessc::preg_quote($what), $m, !$until)) return false; + if ($until) $this->count -= strlen($what); // give back $what + $out = $m[1]; + return true; + } + + // try to match something on head of buffer + protected function match($regex, &$out, $eatWhitespace = null) { + if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; + + $r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais'; + if (preg_match($r, $this->buffer, $out, null, $this->count)) { + $this->count += strlen($out[0]); + if ($eatWhitespace && $this->writeComments) $this->whitespace(); + return true; + } + return false; + } + + // match some whitespace + protected function whitespace() { + if ($this->writeComments) { + $gotWhite = false; + while (preg_match(self::$whitePattern, $this->buffer, $m, null, $this->count)) { + if (isset($m[1]) && empty($this->commentsSeen[$this->count])) { + $this->append(array("comment", $m[1])); + $this->commentsSeen[$this->count] = true; + } + $this->count += strlen($m[0]); + $gotWhite = true; + } + return $gotWhite; + } else { + $this->match("", $m); + return strlen($m[0]) > 0; + } + } + + // match something without consuming it + protected function peek($regex, &$out = null, $from=null) { + if (is_null($from)) $from = $this->count; + $r = '/'.$regex.'/Ais'; + $result = preg_match($r, $this->buffer, $out, null, $from); + + return $result; + } + + // seek to a spot in the buffer or return where we are on no argument + protected function seek($where = null) { + if ($where === null) return $this->count; + else $this->count = $where; + return true; + } + + /* misc functions */ + + public function throwError($msg = "parse error", $count = null) { + $count = is_null($count) ? $this->count : $count; + + $line = $this->line + + substr_count(substr($this->buffer, 0, $count), "\n"); + + if (!empty($this->sourceName)) { + $loc = "$this->sourceName on line $line"; + } else { + $loc = "line: $line"; + } + + // TODO this depends on $this->count + if ($this->peek("(.*?)(\n|$)", $m, $count)) { + throw new exception("$msg: failed at `$m[1]` $loc"); + } else { + throw new exception("$msg: $loc"); + } + } + + protected function pushBlock($selectors=null, $type=null) { + $b = new stdclass; + $b->parent = $this->env; + + $b->type = $type; + $b->id = self::$nextBlockId++; + + $b->isVararg = false; // TODO: kill me from here + $b->tags = $selectors; + + $b->props = array(); + $b->children = array(); + + $this->env = $b; + return $b; + } + + // push a block that doesn't multiply tags + protected function pushSpecialBlock($type) { + return $this->pushBlock(null, $type); + } + + // append a property to the current block + protected function append($prop, $pos = null) { + if ($pos !== null) $prop[-1] = $pos; + $this->env->props[] = $prop; + } + + // pop something off the stack + protected function pop() { + $old = $this->env; + $this->env = $this->env->parent; + return $old; + } + + // remove comments from $text + // todo: make it work for all functions, not just url + protected function removeComments($text) { + $look = array( + 'url(', '//', '/*', '"', "'" + ); + + $out = ''; + $min = null; + while (true) { + // find the next item + foreach ($look as $token) { + $pos = strpos($text, $token); + if ($pos !== false) { + if (!isset($min) || $pos < $min[1]) $min = array($token, $pos); + } + } + + if (is_null($min)) break; + + $count = $min[1]; + $skip = 0; + $newlines = 0; + switch ($min[0]) { + case 'url(': + if (preg_match('/url\(.*?\)/', $text, $m, 0, $count)) + $count += strlen($m[0]) - strlen($min[0]); + break; + case '"': + case "'": + if (preg_match('/'.$min[0].'.*?(?indentLevel = 0; + } + + public function indentStr($n = 0) { + return str_repeat($this->indentChar, max($this->indentLevel + $n, 0)); + } + + public function property($name, $value) { + return $name . $this->assignSeparator . $value . ";"; + } + + protected function isEmpty($block) { + if (empty($block->lines)) { + foreach ($block->children as $child) { + if (!$this->isEmpty($child)) return false; + } + + return true; + } + return false; + } + + public function block($block) { + if ($this->isEmpty($block)) return; + + $inner = $pre = $this->indentStr(); + + $isSingle = !$this->disableSingle && + is_null($block->type) && count($block->lines) == 1; + + if (!empty($block->selectors)) { + $this->indentLevel++; + + if ($this->breakSelectors) { + $selectorSeparator = $this->selectorSeparator . $this->break . $pre; + } else { + $selectorSeparator = $this->selectorSeparator; + } + + echo $pre . + implode($selectorSeparator, $block->selectors); + if ($isSingle) { + echo $this->openSingle; + $inner = ""; + } else { + echo $this->open . $this->break; + $inner = $this->indentStr(); + } + + } + + if (!empty($block->lines)) { + $glue = $this->break.$inner; + echo $inner . implode($glue, $block->lines); + if (!$isSingle && !empty($block->children)) { + echo $this->break; + } + } + + foreach ($block->children as $child) { + $this->block($child); + } + + if (!empty($block->selectors)) { + if (!$isSingle && empty($block->children)) echo $this->break; + + if ($isSingle) { + echo $this->closeSingle . $this->break; + } else { + echo $pre . $this->close . $this->break; + } + + $this->indentLevel--; + } + } +} + +class a3_lessc_formatter_compressed extends a3_lessc_formatter_classic { + public $disableSingle = true; + public $open = "{"; + public $selectorSeparator = ","; + public $assignSeparator = ":"; + public $break = ""; + public $compressColors = true; + + public function indentStr($n = 0) { + return ""; + } +} + +class a3_lessc_formatter_lessjs extends a3_lessc_formatter_classic { + public $disableSingle = true; + public $breakSelectors = true; + public $assignSeparator = ": "; + public $selectorSeparator = ","; +} + + diff --git a/admin/less/sass.php b/admin/less/sass.php new file mode 100644 index 0000000..822b0db --- /dev/null +++ b/admin/less/sass.php @@ -0,0 +1,182 @@ +plugin_name.'_after_settings_save_reset', array ($this, 'plugin_build_sass') ); + add_action( 'wp_enqueue_scripts', array ($this, 'apply_style_css_fontend') , 12 ); + } + + public function apply_style_css_fontend() + { + $_upload_dir = wp_upload_dir(); + if ( file_exists( $_upload_dir['basedir'] . '/sass/' . $this->css_file_name . '.min.css' ) ) { + wp_enqueue_style( 'a3' . $this->css_file_name, str_replace( array('http:','https:'), '', $_upload_dir['baseurl'] ) . '/sass/' . $this->css_file_name . '.min.css', array(), $this->get_css_file_version() ); + } + } + + public function plugin_build_sass() + { + $sass = $this->sass_content_data(); + $this->plugin_compile_less_mincss( $sass ); + $this->set_css_file_version(); + } + public function custom_filesystem_method( $method = '') { + return 'direct'; + } + + public function plugin_compile_less_mincss( $sass, $css_file_name = '' ) + { + // just filter when compile less file + add_filter( 'filesystem_method', array( $this, 'custom_filesystem_method' ) ); + + $form_url = wp_nonce_url( esc_url( add_query_arg( 'compile-sass', 'true' ) ), 'compile-sass' ); + + if ( ! function_exists( 'request_filesystem_credentials' ) ) { + require_once( ABSPATH . 'wp-admin/includes/file.php' ); + } + + if ( false === ( $creds = request_filesystem_credentials( $form_url, '', false, false, null ) ) ) { + return true; + } + + if ( ! WP_Filesystem( $creds ) ) { + // our credentials were no good, ask the user for them again + request_filesystem_credentials( $form_url, '', true ); + return true; + } + + global $wp_filesystem; + + @ini_set( 'display_errors', false ); + $_upload_dir = wp_upload_dir(); + $wp_filesystem->chmod($_upload_dir['basedir'], 0755); + if (! $wp_filesystem->is_dir($_upload_dir['basedir'] . '/sass')) { + $wp_filesystem->mkdir($_upload_dir['basedir'] . '/sass', 0755); + } else { + $wp_filesystem->chmod($_upload_dir['basedir'] . '/sass', 0755); + } + + if ( trim( $css_file_name ) == '' ) $css_file_name = $this->css_file_name; + + if ( $css_file_name == '' ) + return; + + if ( $this->plugin_folder == '' ) + return; + + $filename = $css_file_name; + + if (!file_exists($_upload_dir['basedir'] . '/sass/' . $filename . '.less')) { + $wp_filesystem->put_contents($_upload_dir['basedir'] . '/sass/' . $filename . '.less', '', 0644 ); + $wp_filesystem->put_contents($_upload_dir['basedir'] . '/sass/' . $filename . '.css', '', 0644); + $wp_filesystem->put_contents($_upload_dir['basedir'] . '/sass/' . $filename . '.min.css', '', 0644); + } + + $mixins = $this->css_file_name . '_mixins'; + if( !file_exists( $_upload_dir['basedir'].'/sass/'.$mixins.'.less' ) ){ + $mixinsless = $this->plugin_dir.'/admin/less/assets/css/mixins.less'; + $a3rev_mixins_less = $_upload_dir['basedir'].'/sass/'.$mixins.'.less'; + $wp_filesystem->copy($mixinsless, $a3rev_mixins_less, true ); + } + + $files = array_diff(scandir($_upload_dir['basedir'] . '/sass'), array( + '.', + '..' + )); + if ($files) { + foreach ($files as $file) { + $wp_filesystem->chmod($_upload_dir['basedir'] . '/sass/' . $file, 0644); + } + } + + $sass_data = ''; + + if ($sass != '') { + + $sass_data = '@import "'.$mixins.'.less";' . "\n"; + + $sass_data .= $sass; + + $sass_data = str_replace(':;', ': transparent;', $sass_data); + $sass_data = str_replace(': ;', ': transparent;', $sass_data); + $sass_data = str_replace(': !important', ': transparent !important', $sass_data); + $sass_data = str_replace(':px', ':0px', $sass_data); + $sass_data = str_replace(': px', ': 0px', $sass_data); + + $less_file = $_upload_dir['basedir'] . '/sass/' . $filename . '.less'; + if (is_writable($less_file)) { + + if (!class_exists('Compile_Less_Sass')) + include( dirname( __FILE__ ) . '/compile_less_sass_class.php'); + $wp_filesystem->put_contents($less_file, $sass_data, 0644); + $css_file = $_upload_dir['basedir'] . '/sass/' . $filename . '.css'; + $css_min_file = $_upload_dir['basedir'] . '/sass/' . $filename . '.min.css'; + $compile = new Compile_Less_Sass; + $compile->compileLessFile($less_file, $css_file, $css_min_file); + } + } + } + + public function sass_content_data() + { + do_action($this->plugin_name . '_get_all_settings'); + + ob_start(); + include( $this->plugin_dir. '/includes/customized_style.php' ); + $sass = ob_get_clean(); + $sass = str_replace( '', '', $sass ) ); + $sass = str_replace( '', '', $sass ) ); + + // Start Less + $sass_ext = ''; + + $sass_ext = apply_filters( $this->plugin_name.'_build_sass', $sass_ext ); + + if ($sass_ext != '') + $sass .= "\n" . $sass_ext; + + return $sass; + } + + public function set_css_file_version( $css_file_name = '' ) { + if ( trim( $css_file_name ) == '' ) { + $css_file_name = $this->css_file_name; + } + + if ( $css_file_name == '' ) { + return false; + } + + update_option( $css_file_name . '_style_version', time() ); + } + + public function get_css_file_version( $css_file_name = '' ) { + if ( trim( $css_file_name ) == '' ) { + $css_file_name = $this->css_file_name; + } + + if ( $css_file_name == '' ) { + return false; + } + + $version_number = get_option( $css_file_name . '_style_version', time() ); + + return $version_number; + } +} +global $a3_pvc_less; +$a3_pvc_less = new A3_PVC_Less(); +?> diff --git a/admin/plugin-init.php b/admin/plugin-init.php new file mode 100755 index 0000000..0cd99fd --- /dev/null +++ b/admin/plugin-init.php @@ -0,0 +1,150 @@ +set_default_settings(); + + delete_metadata( 'user', 0, $wp_pvc_admin_init->plugin_name . '-' . 'plugin_framework_global_box' . '-' . 'opened', '', true ); + + update_option('pvc_just_installed', true); +} + +/** + * Process when plugin is deactivated + */ +function pvc_deactivation() { + wp_clear_scheduled_hook( 'pvc_empty_daily_table_daily_event_hook' ); +} + +update_option('a3rev_pvc_plugin', 'a3_page_view_count'); +update_option('a3rev_auth_pvc', ''); + + +/** + * Load Localisation files. + * + * Note: the first-loaded translation file overrides any following ones if the same translation is present. + * + * Locales found in: + * - WP_LANG_DIR/page-views-count/page-views-count-LOCALE.mo + * - /wp-content/plugins/page-views-count/languages/page-views-count-LOCALE.mo (which if not found falls back to) + * - WP_LANG_DIR/plugins/page-views-count-LOCALE.mo + */ +function a3_pvc_load_plugin_textdomain() { + $locale = apply_filters( 'plugin_locale', get_locale(), 'page-views-count' ); + + load_textdomain( 'page-views-count', WP_LANG_DIR . '/page-views-count/page-views-count-' . $locale . '.mo' ); + load_plugin_textdomain( 'page-views-count', false, A3_PVC_FOLDER . '/languages/' ); +} + +function a3_pvc_plugin_init() { + if ( get_option('pvc_just_installed') ) { + delete_option('pvc_just_installed'); + wp_redirect( admin_url( 'options-general.php?page=a3-pvc', 'relative' ) ); + exit; + } + // Set up localisation + a3_pvc_load_plugin_textdomain(); +} +add_action( 'init', 'a3_pvc_plugin_init' ); + +// Add custom style to dashboard +add_action( 'admin_enqueue_scripts', array( 'A3_PVC', 'a3_wp_admin' ) ); + +// Add extra link on left of Deactivate link on Plugin manager page +add_action('plugin_action_links_'.A3_PVC_PLUGIN_NAME, array('A3_PVC', 'settings_plugin_links') ); + +// Add text on right of Visit the plugin on Plugin manager page +add_filter( 'plugin_row_meta', array('A3_PVC', 'plugin_extra_links'), 10, 2 ); + + +// Need to call Admin Init to show Admin UI +global $wp_pvc_admin_init; +$wp_pvc_admin_init->init(); + +// Add upgrade notice to Dashboard pages +add_filter( $wp_pvc_admin_init->plugin_name . '_plugin_extension_boxes', array( 'A3_PVC', 'plugin_extension_box' ) ); + +/** + * On the scheduled action hook, run the function. + */ +add_action( 'pvc_empty_daily_table_daily_event_hook', 'pvc_empty_daily_table_do_daily' ); +function pvc_empty_daily_table_do_daily() { + global $wpdb; + $wpdb->query("DELETE FROM " . $wpdb->prefix . "pvc_daily WHERE time <= '".date('Y-m-d', strtotime('-2 days'))."'"); +} + +add_action('genesis_after_post_content', array('A3_PVC', 'genesis_pvc_stats_echo')); +//add_action('loop_end', array('A3_PVC', 'pvc_stats_echo'), 9); +add_filter('the_content', array('A3_PVC','pvc_stats_show'), 8); +add_filter('the_excerpt', array('A3_PVC','excerpt_pvc_stats_show'), 8); +//add_filter('get_the_excerpt', array('A3_PVC','excerpt_pvc_stats_show'), 8); + +// Fixed for Wordpress SEO plugin +add_filter( 'wpseo_opengraph_desc', array( 'A3_PVC', 'fixed_wordpress_seo_plugin' ) ); + +// Backbone load page view count stats +add_action( 'wp_ajax_pvc_backbone_load_stats', array( 'A3_PVC', 'pvc_backbone_load_stats' ) ); +add_action( 'wp_ajax_nopriv_pvc_backbone_load_stats', array( 'A3_PVC', 'pvc_backbone_load_stats' ) ); + +// Add ajax script to load page view count stats into footer +add_action( 'wp_enqueue_scripts', array( 'A3_PVC', 'register_plugin_scripts' ) ); + +// Check upgrade functions +add_action('plugins_loaded', 'pvc_lite_upgrade_plugin'); +function pvc_lite_upgrade_plugin () { + + if(version_compare(get_option('a3_pvc_version'), '1.2') === -1){ + update_option('a3_pvc_version', '1.2'); + A3_PVC::upgrade_version_1_2(); + } + + if(version_compare(get_option('a3_pvc_version'), '1.3.5') === -1){ + update_option('a3_pvc_version', '1.3.5'); + + wp_schedule_event( strtotime( date('Y-m-d'). ' 00:00:00' ), 'daily', 'pvc_empty_daily_table_daily_event_hook' ); + global $wpdb; + $sql = "ALTER TABLE ". $wpdb->prefix . "pvc_daily CHANGE `id` `id` BIGINT NOT NULL AUTO_INCREMENT"; + $wpdb->query($sql); + $sql = "ALTER TABLE ". $wpdb->prefix . "pvc_total CHANGE `id` `id` BIGINT NOT NULL AUTO_INCREMENT"; + $wpdb->query($sql); + } + if(version_compare(get_option('a3_pvc_version'), '1.3.6') === -1){ + update_option('a3_pvc_version', '1.3.6'); + + $pvc_settings = get_option( 'pvc_settings' ); + if ( isset( $pvc_settings['post_types'] ) && is_array( $pvc_settings['post_types'] ) && count( $pvc_settings['post_types'] ) > 0 ) { + $post_types_new = array(); + foreach ( $pvc_settings['post_types'] as $post_type ) { + $post_types_new[$post_type] = $post_type; + } + $pvc_settings['post_types'] = $post_types_new; + update_option( 'pvc_settings', $pvc_settings ); + } + } + + if ( version_compare( get_option('a3_pvc_version'), '1.4.0' ) === -1 ) { + update_option('a3_pvc_version', '1.4.0'); + + // Set Settings Default from Admin Init + $pvc_settings = get_option( 'pvc_settings' ); + $pvc_settings['show_on_excerpt_content'] = 'yes'; + + update_option( 'pvc_settings', $pvc_settings ); + } + + update_option('a3_pvc_version', '1.4.0'); + +} + +?> \ No newline at end of file diff --git a/admin/settings/general-settings.php b/admin/settings/general-settings.php new file mode 100755 index 0000000..5ccb2ec --- /dev/null +++ b/admin/settings/general-settings.php @@ -0,0 +1,394 @@ + +init_form_fields(); + //$this->subtab_init(); + + $this->form_messages = array( + 'success_message' => __( 'Page View Count Settings successfully saved.', 'page-views-count' ), + 'error_message' => __( 'Error: Page View Count Settings can not save.', 'page-views-count' ), + 'reset_message' => __( 'Page View Count Settings successfully reseted.', 'page-views-count' ), + ); + + add_action( $this->plugin_name . '_set_default_settings' , array( $this, 'set_default_settings' ) ); + + add_action( $this->plugin_name . '-' . $this->form_key . '_settings_init' , array( $this, 'clean_on_deletion' ) ); + + add_action( $this->plugin_name . '_get_all_settings' , array( $this, 'get_settings' ) ); + + add_action( $this->plugin_name . '_settings_' . 'pvc_page_view_count_function_box' . '_start', array( $this, 'page_view_count_function_content' ) ); + + } + + /*-----------------------------------------------------------------------------------*/ + /* subtab_init() */ + /* Sub Tab Init */ + /*-----------------------------------------------------------------------------------*/ + public function subtab_init() { + + add_filter( $this->plugin_name . '-' . $this->parent_tab . '_settings_subtabs_array', array( $this, 'add_subtab' ), $this->position ); + + } + + /*-----------------------------------------------------------------------------------*/ + /* set_default_settings() + /* Set default settings with function called from Admin Interface */ + /*-----------------------------------------------------------------------------------*/ + public function set_default_settings() { + global $wp_pvc_admin_interface; + $this->init_form_fields(); + $wp_pvc_admin_interface->reset_settings( $this->form_fields, $this->option_name, false ); + } + + /*-----------------------------------------------------------------------------------*/ + /* clean_on_deletion() + /* Process when clean on deletion option is un selected */ + /*-----------------------------------------------------------------------------------*/ + public function clean_on_deletion() { + if ( isset( $_POST['bt_save_settings'] ) && isset( $_POST['pvc_reset_all_individual'] ) ) { + delete_option( 'pvc_reset_all_individual' ); + A3_PVC::pvc_reset_individual_items(); + } + + if ( ( isset( $_POST['bt_save_settings'] ) || isset( $_POST['bt_reset_settings'] ) ) && get_option( 'pvc_clean_on_deletion' ) == 0 ) { + $uninstallable_plugins = (array) get_option('uninstall_plugins'); + unset($uninstallable_plugins[A3_PVC_PLUGIN_NAME]); + update_option('uninstall_plugins', $uninstallable_plugins); + } + } + + /*-----------------------------------------------------------------------------------*/ + /* get_settings() + /* Get settings with function called from Admin Interface */ + /*-----------------------------------------------------------------------------------*/ + public function get_settings() { + global $wp_pvc_admin_interface; + $this->init_form_fields(); + $wp_pvc_admin_interface->get_settings( $this->form_fields, $this->option_name ); + } + + /** + * subtab_data() + * Get SubTab Data + * ============================================= + * array ( + * 'name' => 'my_subtab_name' : (required) Enter your subtab name that you want to set for this subtab + * 'label' => 'My SubTab Name' : (required) Enter the subtab label + * 'callback_function' => 'my_callback_function' : (required) The callback function is called to show content of this subtab + * ) + * + */ + public function subtab_data() { + + $subtab_data = array( + 'name' => 'general', + 'label' => __( 'General', 'page-views-count' ), + 'callback_function' => 'wp_pvc_general_settings_form', + ); + + if ( $this->subtab_data ) return $this->subtab_data; + return $this->subtab_data = $subtab_data; + + } + + /*-----------------------------------------------------------------------------------*/ + /* add_subtab() */ + /* Add Subtab to Admin Init + /*-----------------------------------------------------------------------------------*/ + public function add_subtab( $subtabs_array ) { + + if ( ! is_array( $subtabs_array ) ) $subtabs_array = array(); + $subtabs_array[] = $this->subtab_data(); + + return $subtabs_array; + } + + /*-----------------------------------------------------------------------------------*/ + /* settings_form() */ + /* Call the form from Admin Interface + /*-----------------------------------------------------------------------------------*/ + public function settings_form() { + global $wp_pvc_admin_interface; + $this->init_form_fields(); + + $output = ''; + $output .= $wp_pvc_admin_interface->admin_forms( $this->form_fields, $this->form_key, $this->option_name, $this->form_messages ); + + return $output; + } + + /*-----------------------------------------------------------------------------------*/ + /* init_form_fields() */ + /* Init all fields of this form */ + /*-----------------------------------------------------------------------------------*/ + public function init_form_fields() { + + // Define settings + $this->form_fields = array( + array( + 'name' => __( 'Plugin Framework Global Settings', 'page-views-count' ), + 'id' => 'plugin_framework_global_box', + 'type' => 'heading', + 'first_open'=> true, + 'is_box' => true, + ), + array( + 'name' => __( 'Customize Admin Setting Box Display', 'page-views-count' ), + 'desc' => __( 'By default each admin panel will open with all Setting Boxes in the CLOSED position.', 'page-views-count' ), + 'type' => 'heading', + ), + array( + 'type' => 'onoff_toggle_box', + ), + array( + 'name' => __( 'House Keeping', 'page-views-count' ), + 'type' => 'heading', + ), + array( + 'name' => __( 'Clean up on Deletion', 'page-views-count' ), + 'desc' => __( 'On deletion (not deactivate) the plugin will completely remove all tables and data it created, leaving no trace it was ever here.', 'page-views-count'), + 'id' => 'pvc_clean_on_deletion', + 'type' => 'onoff_checkbox', + 'default' => '0', + 'separate_option' => true, + 'free_version' => true, + 'checked_value' => '1', + 'unchecked_value' => '0', + 'checked_label' => __( 'ON', 'page-views-count' ), + 'unchecked_label' => __( 'OFF', 'page-views-count' ), + ), + + array( + 'name' => __( 'Page Views Count Load', 'page-views-count' ), + 'type' => 'heading', + 'id' => 'page_views_count_load_box', + 'is_box' => true, + ), + array( + 'name' => __( 'Ajax Load', 'page-views-count' ), + 'desc' => __( 'ON to load page views counter on front end by ajax event (recommended). Prevents caching plugins and CDNs from caching the count. If using caching you must clear the cache to see changes after turning this setting ON or OFF.', 'page-views-count' ), + 'id' => 'enable_ajax_load', + 'type' => 'onoff_checkbox', + 'default' => 'no', + 'checked_value' => 'yes', + 'unchecked_value' => 'no', + 'checked_label' => __( 'ON', 'page-views-count' ), + 'unchecked_label' => __( 'OFF', 'page-views-count' ), + ), + + array( + 'name' => __( 'Page Views Count for Excerpt Content', 'page-views-count' ), + 'type' => 'heading', + 'id' => 'page_views_count_excerpt_box', + 'is_box' => true, + ), + array( + 'name' => __( 'Show on Excerpt Content', 'page-views-count' ), + 'desc' => __( 'ON to show page views counter on the Excerpt Content ( Archives, Homepage, Frontpage, Category pages ).', 'page-views-count' ), + 'id' => 'show_on_excerpt_content', + 'type' => 'onoff_checkbox', + 'default' => 'yes', + 'checked_value' => 'yes', + 'unchecked_value' => 'no', + 'checked_label' => __( 'ON', 'page-views-count' ), + 'unchecked_label' => __( 'OFF', 'page-views-count' ), + ), + + array( + 'name' => __( 'Activate on Posts and Pages', 'page-views-count' ), + 'type' => 'heading', + 'desc' => __( 'The settings below apply to all posts and pages on your site. You can switch the counter ON or OFF from the Page View Counter Meta box on each post or page edit page as well as manually set / reset the count values.', 'page-views-count' ), + 'id' => 'activate_posts_pages_box', + 'is_box' => true, + ), + array( + 'name' => __( 'Posts', 'page-views-count' ), + 'desc' => __( 'All posts including posts extracts on category and tags Archives', 'page-views-count' ), + 'id' => 'post_types[post]', + 'type' => 'onoff_checkbox', + 'default' => 'post', + 'checked_value' => 'post', + 'unchecked_value' => '', + 'checked_label' => __( 'ON', 'page-views-count' ), + 'unchecked_label' => __( 'OFF', 'page-views-count' ), + ), + array( + 'name' => __( 'Pages', 'page-views-count' ), + 'id' => 'post_types[page]', + 'type' => 'onoff_checkbox', + 'default' => 'page', + 'checked_value' => 'page', + 'unchecked_value' => '', + 'checked_label' => __( 'ON', 'page-views-count' ), + 'unchecked_label' => __( 'OFF', 'page-views-count' ), + ), + ); + + $post_types = get_post_types( array( 'public' => true, '_builtin' => false ) , 'objects' ); + + if ( is_array( $post_types ) && count( $post_types ) > 0 ) { + $form_fields_custom_posts = array(); + $form_fields_custom_posts[] = array( + 'name' => __( 'Activate on these Custom Post Types', 'page-views-count' ), + 'type' => 'heading', + 'desc' => __( 'The settings below apply to these custom post types on your site. You can switch the counter ON or OFF from the Page View Counter Meta box on each custom post edit page as well as manually set / reset the count values.', 'page-views-count' ), + 'id' => 'activate_custom_post_types_box', + 'is_box' => true, + ); + foreach ( $post_types as $post_type => $post_type_data ) { + $form_fields_custom_posts[] = array( + 'name' => $post_type_data->labels->name, + 'id' => 'post_types['.$post_type.']', + 'type' => 'onoff_checkbox', + 'default' => '', + 'checked_value' => $post_type, + 'unchecked_value' => '', + 'checked_label' => __( 'ON', 'page-views-count' ), + 'unchecked_label' => __( 'OFF', 'page-views-count' ), + ); + } + + $this->form_fields = array_merge( $this->form_fields, $form_fields_custom_posts ); + } + + $this->form_fields = array_merge( $this->form_fields, array( + + array( + 'name' => __( 'Activation Reset', 'page-views-count' ), + 'type' => 'heading', + 'id' => 'page_views_count_activation_reset_box', + 'is_box' => true, + ), + array( + 'name' => __( "Reset All Individual Items", 'page-views-count' ), + 'desc' => __( "Switch ON and Save Changes to reset all custom setting are set for individual item from Item Edit Page.", 'page-views-count' ) + .'
          '.__( "Important Clear your cache after so that visitors see changes.", 'page-views-count' ), + 'id' => 'pvc_reset_all_individual', + 'type' => 'onoff_checkbox', + 'default' => 'no', + 'separate_option' => true, + 'checked_value' => 'yes', + 'unchecked_value' => 'no', + 'checked_label' => __( 'ON', 'page-views-count' ), + 'unchecked_label' => __( 'OFF', 'page-views-count' ), + ), + + array( + 'name' => __( 'Page Views Count Function', 'page-views-count' ), + 'type' => 'heading', + 'id' => 'pvc_page_view_count_function_box', + 'is_box' => true, + ), + ) ); + + $this->form_fields = apply_filters( $this->option_name . '_settings_fields', $this->form_fields ); + } + + public function page_view_count_function_content() { + ?> + +
          .
          + + + + + + + + + + settings_form(); +} + +?> \ No newline at end of file diff --git a/admin/tabs/admin-pvc-tab.php b/admin/tabs/admin-pvc-tab.php new file mode 100755 index 0000000..634988e --- /dev/null +++ b/admin/tabs/admin-pvc-tab.php @@ -0,0 +1,136 @@ + +settings_include(); + //$this->tab_init(); + } + + /*-----------------------------------------------------------------------------------*/ + /* tab_init() */ + /* Tab Init */ + /*-----------------------------------------------------------------------------------*/ + public function tab_init() { + + add_filter( $this->plugin_name . '-' . $this->parent_page . '_settings_tabs_array', array( $this, 'add_tab' ), $this->position ); + + } + + /** + * tab_data() + * Get Tab Data + * ============================================= + * array ( + * 'name' => 'my_tab_name' : (required) Enter your tab name that you want to set for this tab + * 'label' => 'My Tab Name' : (required) Enter the tab label + * 'callback_function' => 'my_callback_function' : (required) The callback function is called to show content of this tab + * ) + * + */ + public function tab_data() { + + $tab_data = array( + 'name' => 'general', + 'label' => __( 'General', 'page-views-count' ), + 'callback_function' => 'wp_pvc_general_tab_manager', + ); + + if ( $this->tab_data ) return $this->tab_data; + return $this->tab_data = $tab_data; + + } + + /*-----------------------------------------------------------------------------------*/ + /* add_tab() */ + /* Add tab to Admin Init and Parent Page + /*-----------------------------------------------------------------------------------*/ + public function add_tab( $tabs_array ) { + + if ( ! is_array( $tabs_array ) ) $tabs_array = array(); + $tabs_array[] = $this->tab_data(); + + return $tabs_array; + } + + /*-----------------------------------------------------------------------------------*/ + /* panels_include() */ + /* Include form settings panels + /*-----------------------------------------------------------------------------------*/ + public function settings_include() { + + // Includes Settings file + include_once( $this->admin_plugin_dir() . '/settings/general-settings.php' ); + + } + + /*-----------------------------------------------------------------------------------*/ + /* tab_manager() */ + /* Call tab layout from Admin Init + /*-----------------------------------------------------------------------------------*/ + public function tab_manager() { + global $wp_pvc_general_settings; + + $this->plugin_extension_start(); + $wp_pvc_general_settings->settings_form(); + $this->plugin_extension_end(); + + } +} + +global $wp_pvc_general_tab; +$wp_pvc_general_tab = new WP_PVC_Generate_Tab(); + +/** + * wp_pvc_general_tab_manager() + * Define the callback function to show tab content + */ +function wp_pvc_general_tab_manager() { + global $wp_pvc_general_tab; + $wp_pvc_general_tab->tab_manager(); +} + +?> \ No newline at end of file diff --git a/ajax-loader.gif b/ajax-loader.gif new file mode 100755 index 0000000..52c7ad6 Binary files /dev/null and b/ajax-loader.gif differ diff --git a/api/pvc-api.php b/api/pvc-api.php new file mode 100755 index 0000000..31eb5ab --- /dev/null +++ b/api/pvc-api.php @@ -0,0 +1,124 @@ +pvc_backbone_load_stats(); + } + + // Done, clear buffer and exit + ob_end_clean(); + die($ouput); + } + } + + public function pvc_backbone_load_stats() + { + $post_ids = $_REQUEST['post_ids']; + + $data = array(); + $ids = array(); + if (is_array($post_ids) && count($post_ids) > 0) { + foreach ($post_ids as $post_id => $post_data) { + $ids[] = $post_id; + if (isset($post_data['ask_update']) && $post_data['ask_update'] == 'true') { + $this->pvc_stats_update($post_id); + } + } + $results = $this->pvc_fetch_posts_stats($ids); + if ($results) { + foreach ($results as $result) { + $data[$result->post_id] = array('post_id' => (int)$result->post_id, 'total_view' => (int)$result->total, 'today_view' => (int)$result->today); + $ids = array_diff($ids, array($result->post_id)); + } + } + + foreach ($ids as $post_id) { + $total = $this->pvc_fetch_post_total($post_id); + $data[$post_id] = array('post_id' => (int)$post_id, 'total_view' => (int)$total, 'today_view' => 0); + } + } + header('Content-Type: application/json', true, 200); + return json_encode($data); + } + + public function pvc_fetch_posts_stats($post_ids) + { + global $wpdb; + $nowisnow = date('Y-m-d'); + + if (!is_array($post_ids)) $post_ids = array($post_ids); + + $sql = $wpdb->prepare("SELECT t.postnum AS post_id, t.postcount AS total, d.postcount AS today FROM " . $wpdb->prefix . "pvc_total AS t + LEFT JOIN " . $wpdb->prefix . "pvc_daily AS d ON t.postnum = d.postnum + WHERE t.postnum IN ( " . implode(',', $post_ids) . " ) AND d.time = %s", $nowisnow); + return $wpdb->get_results($sql); + } + + public function pvc_fetch_post_total($post_id) + { + global $wpdb; + + $sql = $wpdb->prepare("SELECT t.postcount AS total FROM " . $wpdb->prefix . "pvc_total AS t + WHERE t.postnum = %s", $post_id); + return $wpdb->get_var($sql); + } + + public function pvc_stats_update($post_id) + { + global $wpdb; + + // get the local time based off WordPress setting + $nowisnow = date('Y-m-d'); + + // first try and update the existing total post counter + $results = $wpdb->query($wpdb->prepare("UPDATE " . $wpdb->prefix . "pvc_total SET postcount = postcount+1 WHERE postnum = '%s' LIMIT 1", $post_id)); + + // if it doesn't exist, then insert two new records + // one in the total views, another in today's views + if ($results == 0) { + $wpdb->query($wpdb->prepare("INSERT INTO " . $wpdb->prefix . "pvc_total (postnum, postcount) VALUES ('%s', 1)", $post_id)); + $wpdb->query($wpdb->prepare("INSERT INTO " . $wpdb->prefix . "pvc_daily (time, postnum, postcount) VALUES ('%s', '%s', 1)", $nowisnow, $post_id)); + + // post exists so let's just update the counter + + } else { + $results2 = $wpdb->query($wpdb->prepare("UPDATE " . $wpdb->prefix . "pvc_daily SET postcount = postcount+1 WHERE time = '%s' AND postnum = '%s' LIMIT 1", $nowisnow, $post_id)); + + // insert a new record since one hasn't been created for current day + if ($results2 == 0) $wpdb->query($wpdb->prepare("INSERT INTO " . $wpdb->prefix . "pvc_daily (time, postnum, postcount) VALUES ('%s', '%s', 1)", $nowisnow, $post_id)); + } + + // get all the post view info so we can update meta fields + //$row = A3_PVC::pvc_fetch_post_counts( $post_id ); + + } +} + +new PVC_API(); +?> \ No newline at end of file diff --git a/assets/css/a3_wp_admin.css b/assets/css/a3_wp_admin.css new file mode 100755 index 0000000..d07bd46 --- /dev/null +++ b/assets/css/a3_wp_admin.css @@ -0,0 +1,29 @@ +/*-------------------------------------------------------------------------------------------*/ +/* WP Admin */ +/*-------------------------------------------------------------------------------------------*/ +@charset "UTF-8"; + +@font-face { + font-family: "a3-sidebar-menu"; + src:url("../fonts/a3-sidebar-menu.eot"); + src:url("../fonts/a3-sidebar-menu.eot?#iefix") format("embedded-opentype"), + url("../fonts/a3-sidebar-menu.woff") format("woff"), + url("../fonts/a3-sidebar-menu.ttf") format("truetype"), + url("../fonts/a3-sidebar-menu.svg#a3-sidebar-menu") format("svg"); + font-weight: normal; + font-style: normal; + +} + +#media-upload .ui-sortable .media-item { + clear:both; +} + +@media screen and ( max-width: 782px ) { + #media-items { + width:100%; + } + .media-item .describe input[type="text"], .media-item .describe textarea { + width:100%; + } +} \ No newline at end of file diff --git a/assets/css/admin_sidebar_menu.css b/assets/css/admin_sidebar_menu.css new file mode 100755 index 0000000..ad5e24f --- /dev/null +++ b/assets/css/admin_sidebar_menu.css @@ -0,0 +1,35 @@ +/*-------------------------------------------------------------------------------------------*/ +/* WP Admin */ +/*-------------------------------------------------------------------------------------------*/ +@charset "UTF-8"; + +#toplevel_page_email-inquiry-ultimate .wp-menu-image:before { + font-family: "a3-sidebar-menu" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display:inline-block; + font-size:17px !important; + font-weight:400; + height: 36px; + padding: 8px 0; + transition: all 0.1s ease-in-out 0s; + width: 20px; + + content: "\a3" !important; +} +#toplevel_page_email-inquiry-ultimate .wp-menu-image { + text-align:center; + background:none; +} + +@media screen and ( max-width: 782px ) { + .auto-fold #adminmenu #toplevel_page_email-inquiry-ultimate a.menu-top { + height:auto; + } +} diff --git a/assets/css/mixins.less b/assets/css/mixins.less new file mode 100644 index 0000000..2605484 --- /dev/null +++ b/assets/css/mixins.less @@ -0,0 +1,138 @@ +.clearfix() { + *zoom:1; + &:before, + &:after { + content: " "; + display: table; + } + &:after { + clear: both; + } +} +.border_radius(@radius:4px) { + -webkit-border-radius:@radius; + border-radius:@radius; +} +.border_radius_right(@radius:4px) { + -webkit-border-top-right-radius: @radius; + -webkit-border-bottom-right-radius: @radius; + border-top-right-radius: @radius; + border-bottom-right-radius: @radius; +} +.border_radius_left(@radius:4px) { + -webkit-border-top-left-radius: @radius; + -webkit-border-bottom-left-radius: @radius; + border-top-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.border_radius_bottom(@radius:4px) { + -webkit-border-bottom-left-radius: @radius; + -webkit-border-bottom-right-radius: @radius; + border-bottom-left-radius: @radius; + border-bottom-right-radius: @radius; +} +.border_radius_top(@radius:4px) { + -webkit-border-top-left-radius: @radius; + -webkit-border-top-right-radius: @radius; + border-top-left-radius: @radius; + border-top-right-radius: @radius; +} +.opacity(@opacity:0.75) { + filter:~"alpha(opacity=@opacity * 100)"; + -moz-opacity:@opacity; + -khtml-opacity: @opacity; + opacity: @opacity; +} +.box_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_in:3px, @shadow_color:#888) { + box-shadow:@shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; + -webkit-box-shadow:@shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; +} +.inset_box_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_in:3px, @shadow_color:#888) { + box-shadow:inset @shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; + -webkit-box-shadow:inset @shadow_x @shadow_y @shadow_rad @shadow_in @shadow_color; +} +.text_shadow(@shadow_x:3px, @shadow_y:3px, @shadow_rad:3px, @shadow_color:#fff) { + text-shadow:@shadow_x @shadow_y @shadow_rad @shadow_color; +} +.vertical_gradient(@from: #000, @to: #FFF) { + background: @from; + background: -webkit-gradient(linear, left top, left bottom, from(@from), to(@to)); + background: -webkit-linear-gradient(@from, @to); + background: -moz-linear-gradient(center top, @from 0%, @to 100%); + background: -moz-gradient(center top, @from 0%, @to 100%); +} +.transition(@selector:all, @animation:ease-in-out, @duration:.2s) { + -webkit-transition:@selector @animation @duration; + -moz-transition:@selector @animation @duration; + -o-transition:@selector @animation @duration; + transition:@selector @animation @duration; +} + +.scale(@ratio:1.5){ + -webkit-transform:scale(@ratio); + -moz-transform:scale(@ratio); + -ms-transform:scale(@ratio); + -o-transform:scale(@ratio); + transform:scale(@ratio); +} + +.borderbox () { + -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ + -moz-box-sizing: border-box; /* Firefox, other Gecko */ + box-sizing: border-box; /* Opera/IE 8+ */ +} + +.clear { clear: both; } +.nobr { white-space: nowrap; } + +.darkorlighttextshadow ( @a, @opacity: 0.8 ) when (lightness(@a) >= 65%) { .text_shadow( 0, -1px, 0, rgba(0,0,0,@opacity) ); } +.darkorlighttextshadow ( @a, @opacity: 0.8 ) when (lightness(@a) < 65%) { .text_shadow( 0, 1px, 0, rgba(255,255,255,@opacity) ); } + +/** + * Objects + */ +.menu() { + .clearfix; + li { + display: inline-block; + } +} +.mediaright() { + .clearfix; + img { + float:right; + height:auto; + } +} +.medialeft() { + .clearfix; + img { + float:right; + height:auto; + } +} +.ir() { + display: block; + text-indent: -9999px; + position: relative; + height:1em; + width:1em; +} + +.margin( @top:0, @right:0px, @bottom:0px , @left:0 ){ + margin-top: @top; + margin-right: @right; + margin-bottom: @bottom; + margin-left: @left; +} + +.padding( @top:0, @right:0px, @bottom:0px , @left:0 ){ + padding-top: @top; + padding-right: @right; + padding-bottom: @bottom; + padding-left: @left; +} + +.background( @url, @repeat:no-repeat, @hoz:0, @ver:0, @color ){ + background: url(@url) @repeat @hoz @ver @color; +} \ No newline at end of file diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..9d9ec69 --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,17 @@ +.pvc_clear { + clear: both; +} +.clear { + clear: both; +} +.nobr { + white-space: nowrap; +} +.pvc_stats { + background: url("../../chart-bar.png") no-repeat 0 center transparent !important; + float: left; + padding-top: 5px !important; + padding-right: 5px !important; + padding-bottom: 5px !important; + padding-left: 25px !important; +} diff --git a/assets/css/style.less b/assets/css/style.less new file mode 100644 index 0000000..6e47ace --- /dev/null +++ b/assets/css/style.less @@ -0,0 +1,9 @@ +@import "mixins.less"; +.pvc_clear { + clear: both; +} +.pvc_stats { + .background( "../../chart-bar.png", no-repeat, 0, center, transparent !important ); + float: left; + .padding(5px !important, 5px !important, 5px !important, 25px !important); +} \ No newline at end of file diff --git a/assets/css/style.min.css b/assets/css/style.min.css new file mode 100644 index 0000000..c093b5f --- /dev/null +++ b/assets/css/style.min.css @@ -0,0 +1 @@ +.pvc_clear{clear:both}.clear{clear:both}.nobr{white-space:nowrap}.pvc_stats{background:url("../../chart-bar.png") no-repeat 0 center transparent !important;float:left;padding-top:5px !important;padding-right:5px !important;padding-bottom:5px !important;padding-left:25px !important} \ No newline at end of file diff --git a/assets/fonts/a3-sidebar-menu.eot b/assets/fonts/a3-sidebar-menu.eot new file mode 100755 index 0000000..3e4c35b Binary files /dev/null and b/assets/fonts/a3-sidebar-menu.eot differ diff --git a/assets/fonts/a3-sidebar-menu.svg b/assets/fonts/a3-sidebar-menu.svg new file mode 100755 index 0000000..d09b22b --- /dev/null +++ b/assets/fonts/a3-sidebar-menu.svg @@ -0,0 +1,11 @@ + + + +Generated by Fontastic.me + + + + + + + diff --git a/assets/fonts/a3-sidebar-menu.ttf b/assets/fonts/a3-sidebar-menu.ttf new file mode 100755 index 0000000..2940620 Binary files /dev/null and b/assets/fonts/a3-sidebar-menu.ttf differ diff --git a/assets/fonts/a3-sidebar-menu.woff b/assets/fonts/a3-sidebar-menu.woff new file mode 100755 index 0000000..9319e6f Binary files /dev/null and b/assets/fonts/a3-sidebar-menu.woff differ diff --git a/assets/images/a-5-star-rating-would-be-appreciated.png b/assets/images/a-5-star-rating-would-be-appreciated.png new file mode 100644 index 0000000..d3e99ac Binary files /dev/null and b/assets/images/a-5-star-rating-would-be-appreciated.png differ diff --git a/assets/images/follow-facebook.png b/assets/images/follow-facebook.png new file mode 100644 index 0000000..46aa49b Binary files /dev/null and b/assets/images/follow-facebook.png differ diff --git a/assets/images/follow-twitter.png b/assets/images/follow-twitter.png new file mode 100644 index 0000000..41d93ad Binary files /dev/null and b/assets/images/follow-twitter.png differ diff --git a/assets/images/free-woocommerce-plugins.png b/assets/images/free-woocommerce-plugins.png new file mode 100644 index 0000000..76cab50 Binary files /dev/null and b/assets/images/free-woocommerce-plugins.png differ diff --git a/assets/images/free-wordpress-plugins.png b/assets/images/free-wordpress-plugins.png new file mode 100644 index 0000000..11efdc1 Binary files /dev/null and b/assets/images/free-wordpress-plugins.png differ diff --git a/assets/images/go-to-support-forum.png b/assets/images/go-to-support-forum.png new file mode 100644 index 0000000..df110af Binary files /dev/null and b/assets/images/go-to-support-forum.png differ diff --git a/assets/images/video.jpg b/assets/images/video.jpg new file mode 100644 index 0000000..33ec1ea Binary files /dev/null and b/assets/images/video.jpg differ diff --git a/assets/js/pvc.backbone.js b/assets/js/pvc.backbone.js new file mode 100755 index 0000000..e9fa29f --- /dev/null +++ b/assets/js/pvc.backbone.js @@ -0,0 +1,91 @@ +jQuery( function( $ ) { + var api_url = vars.api_url; + + pvc = { apps: {}, models: {}, collections: {}, views: {} }; + + _.templateSettings = { + evaluate: /[<{][%{](.+?)[%}][}>]/g, + interpolate: /[<{][%{]=(.+?)[%}][}>]/g, + escape: /[<{][%{]-(.+?)[%}][}>]/g + } + + pvc.models.State = Backbone.Model.extend({ + defaults: { + post_id: 0, + total_view: 1, + today_view: 1 + } + }); + + pvc.collections.Stats = Backbone.Collection.extend({ + model: pvc.models.State, + + url: api_url + + }); + + pvc.views.State = Backbone.View.extend({ + model: pvc.models.State, + + tagName: 'span', + + template: _.template( $('#pvc-stats-view-template').html() ), + + initialize: function() { + + }, + + render: function() { + console.log('Rendering Page View Count of ID #' + this.model.get('post_id') + ' - Today: #' + this.model.get('today_view') + ' - Total: #' + this.model.get('total_view')); + this.$el.html( this.template( this.model.toJSON() ) ); + + return this; + } + + }); + + pvc.views.AppView = Backbone.View.extend({ + + initialize: function() { + this.listenTo( this.collection, 'add', this.addOne ); + + }, + addOne: function( state_model ) { + var state_view = new pvc.views.State( { model: state_model } ); + this.$el.html( state_view.render().el ); + } + }); + + pvc.apps.app = { + initialize: function( pvc_ids, api_url ) { + this.api_url = api_url; + console.log('Load Page View Count of ' + JSON.stringify(pvc_ids) ); + $.get( this.api_url, { action: 'pvc_backbone_load_stats', post_ids: pvc_ids }, function( data_pvc ) { + console.log(data_pvc); + $.each( data_pvc, function (index, data) { + collection = new pvc.collections.Stats; + new pvc.views.AppView( { collection: collection, el : $('#pvc_stats_' + index ) } ); + collection.add( data ); + + }); + }); + } + + } + +}); + +jQuery( document ).ready( function( $ ) { + var pvc_stats = $( '.pvc_stats' ); + if ( pvc_stats.length ) { + var pvc_ids = {}; + $(".pvc_stats").each( function() { + post_id = $(this).attr('element-id'); + update_status = $(this).hasClass('pvc_load_by_ajax_update'); + pvc_ids[post_id] = { post_id: post_id, ask_update : update_status }; + }); + + var app = pvc.apps.app; + app.initialize( pvc_ids, vars.api_url ); + } +}); \ No newline at end of file diff --git a/assets/js/pvc.backbone.min.js b/assets/js/pvc.backbone.min.js new file mode 100755 index 0000000..433249a --- /dev/null +++ b/assets/js/pvc.backbone.min.js @@ -0,0 +1 @@ +jQuery(function(a){var b=vars.api_url;pvc={apps:{},models:{},collections:{},views:{}},_.templateSettings={evaluate:/[<{][%{](.+?)[%}][}>]/g,interpolate:/[<{][%{]=(.+?)[%}][}>]/g,escape:/[<{][%{]-(.+?)[%}][}>]/g},pvc.models.State=Backbone.Model.extend({defaults:{post_id:0,total_view:1,today_view:1}}),pvc.collections.Stats=Backbone.Collection.extend({model:pvc.models.State,url:b}),pvc.views.State=Backbone.View.extend({model:pvc.models.State,tagName:"span",template:_.template(a("#pvc-stats-view-template").html()),initialize:function(){},render:function(){return console.log("Rendering Page View Count of ID #"+this.model.get("post_id")+" - Today: #"+this.model.get("today_view")+" - Total: #"+this.model.get("total_view")),this.$el.html(this.template(this.model.toJSON())),this}}),pvc.views.AppView=Backbone.View.extend({initialize:function(){this.listenTo(this.collection,"add",this.addOne)},addOne:function(a){var b=new pvc.views.State({model:a});this.$el.html(b.render().el)}}),pvc.apps.app={initialize:function(b,c){this.api_url=c,console.log("Load Page View Count of "+JSON.stringify(b)),a.get(this.api_url,{action:"pvc_backbone_load_stats",post_ids:b},function(b){console.log(b),a.each(b,function(b,c){collection=new pvc.collections.Stats,new pvc.views.AppView({collection:collection,el:a("#pvc_stats_"+b)}),collection.add(c)})})}}}),jQuery(document).ready(function(a){if(a(".pvc_stats").length){var c={};a(".pvc_stats").each(function(){post_id=a(this).attr("element-id"),update_status=a(this).hasClass("pvc_load_by_ajax_update"),c[post_id]={post_id:post_id,ask_update:update_status}}),pvc.apps.app.initialize(c,vars.api_url)}}); \ No newline at end of file diff --git a/chart-bar.png b/chart-bar.png new file mode 100755 index 0000000..9051fbc Binary files /dev/null and b/chart-bar.png differ diff --git a/classes/class-pvc-metabox.php b/classes/class-pvc-metabox.php new file mode 100644 index 0000000..4b5c85e --- /dev/null +++ b/classes/class-pvc-metabox.php @@ -0,0 +1,156 @@ +ID ); + $view_status = A3_PVC::pvc_fetch_post_counts( $post->ID ); + + $total_views = 0; + $today_views = 0; + if ( $view_status ) { + $total_views = $view_status->total; + $today_views = $view_status->today; + } + + // Display the form, using the current value. + ?> +
          +
          +
          + /> + +
          +
          +
          +

          + + +

          +

          + + +

          +
          +
          +
          + +
          + diff --git a/languages/page-views-count-id_ID.mo b/languages/page-views-count-id_ID.mo new file mode 100644 index 0000000..5c4a3d6 Binary files /dev/null and b/languages/page-views-count-id_ID.mo differ diff --git a/languages/page-views-count-id_ID.po b/languages/page-views-count-id_ID.po new file mode 100644 index 0000000..73274fe --- /dev/null +++ b/languages/page-views-count-id_ID.po @@ -0,0 +1,606 @@ +msgid "" +msgstr "" +"Project-Id-Version: Page Views Count\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-10 13:12+0700\n" +"PO-Revision-Date: 2015-12-10 13:13+0700\n" +"Last-Translator: Nguyen Cong Tuan \n" +"Language-Team: a3rev \n" +"Language: id_ID\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Basepath: ../\n" +"X-Generator: Poedit 1.6.4\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-SearchPath-0: .\n" + +#: admin/admin-interface.php:171 +msgid "Great! You have the latest version installed." +msgstr "" + +#: admin/admin-interface.php:236 +msgid "Settings successfully saved." +msgstr "Pengaturan berhasil disimpan." + +#: admin/admin-interface.php:244 +msgid "Error: Settings can not save." +msgstr "Eror: Pengaturan tidak bisa disimpan." + +#: admin/admin-interface.php:252 +msgid "Settings successfully reseted." +msgstr "Pengaturan berhasil diatur ulang." + +#: admin/admin-interface.php:273 +msgid "Thin" +msgstr "Tipis" + +#: admin/admin-interface.php:274 +msgid "Thin/Italic" +msgstr "Tipis/Miring" + +#: admin/admin-interface.php:275 +msgid "Normal" +msgstr "Normal" + +#: admin/admin-interface.php:276 +msgid "Italic" +msgstr "Miring" + +#: admin/admin-interface.php:277 +msgid "Bold" +msgstr "Tebal" + +#: admin/admin-interface.php:278 +msgid "Bold/Italic" +msgstr "Tebal/Miring" + +#: admin/admin-interface.php:288 +msgid "Solid" +msgstr "Padat" + +#: admin/admin-interface.php:289 +msgid "Double" +msgstr "Rangkap" + +#: admin/admin-interface.php:290 +msgid "Dashed" +msgstr "Putus-Putus" + +#: admin/admin-interface.php:291 +msgid "Dotted" +msgstr "Titik-Titik" + +#: admin/admin-interface.php:292 +msgid "Groove" +msgstr "3D Cekung" + +#: admin/admin-interface.php:293 +msgid "Ridge" +msgstr "3D Timbul" + +#: admin/admin-interface.php:294 +msgid "Inset" +msgstr "Ke Dalam" + +#: admin/admin-interface.php:295 +msgid "Outset" +msgstr "Ke Luar" + +#: admin/admin-interface.php:1539 admin/admin-interface.php:1625 +#: admin/admin-interface.php:1828 admin/admin-interface.php:1918 +#: admin/admin-interface.php:1947 admin/settings/general-settings.php:230 +#: admin/settings/general-settings.php:248 +#: admin/settings/general-settings.php:266 +#: admin/settings/general-settings.php:285 +#: admin/settings/general-settings.php:295 +#: admin/settings/general-settings.php:319 +#: admin/settings/general-settings.php:345 classes/class-pvc-metabox.php:73 +msgid "ON" +msgstr "AKTIF" + +#: admin/admin-interface.php:1540 admin/admin-interface.php:1626 +#: admin/admin-interface.php:1829 admin/admin-interface.php:1919 +#: admin/admin-interface.php:1948 admin/settings/general-settings.php:231 +#: admin/settings/general-settings.php:249 +#: admin/settings/general-settings.php:267 +#: admin/settings/general-settings.php:286 +#: admin/settings/general-settings.php:296 +#: admin/settings/general-settings.php:320 +#: admin/settings/general-settings.php:346 classes/class-pvc-metabox.php:74 +msgid "OFF" +msgstr "MATI" + +#: admin/admin-interface.php:1545 +#, fuzzy +msgid "Google Fonts API" +msgstr "-- Huruf Google --" + +#: admin/admin-interface.php:1557 +msgid "" +"ON to connect to Google Fonts API and have auto font updates direct from " +"Google." +msgstr "" + +#: admin/admin-interface.php:1561 +#, php-format +msgid "" +"Enter your existing Google Fonts API Key below. Don't have a key? Visit Google Developer API to create a key" +msgstr "" + +#: admin/admin-interface.php:1578 +#, fuzzy +msgid "Google Fonts API Key" +msgstr "-- Huruf Google --" + +#: admin/admin-interface.php:1581 +msgid "Your Google API Key is valid and automatic font updates are enabled." +msgstr "" + +#: admin/admin-interface.php:1582 +msgid "Please enter a valid Google API Key." +msgstr "" + +#: admin/admin-interface.php:1601 +msgid "Check New Version" +msgstr "" + +#: admin/admin-interface.php:1612 +msgid "Check Now" +msgstr "" + +#: admin/admin-interface.php:1631 +msgid "Open Box Display" +msgstr "" + +#: admin/admin-interface.php:1644 +msgid "" +"ON and each admin panel setting box OPEN | CLOSED position are saved each " +"time changes are SAVED." +msgstr "" + +#: admin/admin-interface.php:1983 +msgid "Width" +msgstr "Lebar" + +#: admin/admin-interface.php:1985 +msgid "Height" +msgstr "Tinggi" + +#: admin/admin-interface.php:1987 +msgid "Hard Crop" +msgstr "Potong Paksa" + +#: admin/admin-interface.php:2060 +msgid "-- Default Fonts --" +msgstr "-- Huruf Awal --" + +#: admin/admin-interface.php:2071 +msgid "-- Google Fonts --" +msgstr "-- Huruf Google --" + +#: admin/admin-interface.php:2112 +msgid "Preview your customized typography settings" +msgstr "Pratinjau pengaturan tipografi pilihan Anda" + +#: admin/admin-interface.php:2221 admin/admin-interface.php:2455 +msgid "Preview your customized border settings" +msgstr "Pratinjau pengaturan garis pilihan Anda" + +#: admin/admin-interface.php:2230 admin/admin-interface.php:2446 +msgid "Rounded" +msgstr "Bulat" + +#: admin/admin-interface.php:2231 admin/admin-interface.php:2447 +msgid "Square" +msgstr "Siku" + +#: admin/admin-interface.php:2241 admin/admin-interface.php:2460 +msgid "Top Left Corner" +msgstr "Pojok Kiri Atas" + +#: admin/admin-interface.php:2261 admin/admin-interface.php:2480 +msgid "Top Right Corner" +msgstr "Pojok Kanan Atas" + +#: admin/admin-interface.php:2281 admin/admin-interface.php:2500 +msgid "Bottom Right Corner" +msgstr "Pojok Kanan Bawah" + +#: admin/admin-interface.php:2301 admin/admin-interface.php:2520 +msgid "Bottom Left Corner" +msgstr "Pojok Kiri Bawah" + +#: admin/admin-interface.php:2388 +msgid "Preview your customized border styles settings" +msgstr "Pratinjau pengaturan garis pilihan Anda" + +#: admin/admin-interface.php:2571 +msgid "YES" +msgstr "YA" + +#: admin/admin-interface.php:2572 +msgid "NO" +msgstr "TIDAK" + +#: admin/admin-interface.php:2586 +msgid "Horizontal Shadow" +msgstr "Bayangan Horizontal" + +#: admin/admin-interface.php:2604 +msgid "Vertical Shadow" +msgstr "Bayangan Vertikal" + +#: admin/admin-interface.php:2622 +msgid "Blur Distance" +msgstr "Jarak Kabur" + +#: admin/admin-interface.php:2640 +msgid "Spread Size" +msgstr "Ukuran Sebaran" + +#: admin/admin-interface.php:2658 +msgid "INNER" +msgstr "DALAM" + +#: admin/admin-interface.php:2659 +msgid "OUTER" +msgstr "LUAR" + +#: admin/admin-interface.php:2677 +msgid "Preview your customized box shadow settings" +msgstr "Pratinjau pengaturan bayangan kotak pilihan Anda" + +#: admin/admin-interface.php:2940 +msgid "Save changes" +msgstr "Simpan perubahan" + +#: admin/admin-interface.php:2941 +msgid "Reset Settings" +msgstr "Atur Ulang Pengaturan" + +#: admin/admin-pages/admin-pvc-page.php:63 +#: admin/admin-pages/admin-pvc-page.php:64 +msgid "Page Views Count" +msgstr "Page Views Count" + +#: admin/admin-ui.php:179 +#, fuzzy, php-format +msgid "" +"Advanced Settings - Upgrade to the %s " +"License to activate these settings." +msgstr "" +"Lakukan peningkatan ke %s untuk " +"mengaktifkan pengaturan ini." + +#: admin/admin-ui.php:182 +msgid "Pro Version" +msgstr "Versi Pro" + +#: admin/admin-ui.php:232 admin/admin-ui.php:251 +msgid "You should check now to see if have any new version is available" +msgstr "" + +#: admin/admin-ui.php:234 +#, php-format +msgid "" +"Connection Failure! Please try again. If this issue persists please create a " +"support request on the plugin a3rev support " +"forum." +msgstr "" + +#: admin/admin-ui.php:242 +#, php-format +msgid "" +"There is a new version %s " +"available, update now or download " +"direct from My Account on a3rev.com" +msgstr "" + +#: admin/includes/uploader/class-uploader.php:95 +msgid "Upload" +msgstr "Unggah" + +#: admin/includes/uploader/class-uploader.php:115 +msgid "View File" +msgstr "Lihat Berkas" + +#: admin/settings/general-settings.php:81 +msgid "Page View Count Settings successfully saved." +msgstr "Pengaturan Page View Count berhasil disimpan." + +#: admin/settings/general-settings.php:82 +msgid "Error: Page View Count Settings can not save." +msgstr "Eror: Pengaturan Page View Count tidak bisa disimpan." + +#: admin/settings/general-settings.php:83 +msgid "Page View Count Settings successfully reseted." +msgstr "Pengaturan Page View Count berhasil diatur ulang." + +#: admin/settings/general-settings.php:158 admin/tabs/admin-pvc-tab.php:78 +msgid "General" +msgstr "Umum" + +#: admin/settings/general-settings.php:202 +msgid "Plugin Framework Global Settings" +msgstr "" + +#: admin/settings/general-settings.php:209 +msgid "Customize Admin Setting Box Display" +msgstr "" + +#: admin/settings/general-settings.php:210 +msgid "" +"By default each admin panel will open with all Setting Boxes in the CLOSED " +"position." +msgstr "" + +#: admin/settings/general-settings.php:217 +#, fuzzy +msgid "House Keeping" +msgstr "Kerumahtanggaan :" + +#: admin/settings/general-settings.php:221 +msgid "Clean up on Deletion" +msgstr "Bersihkan saat Penghapusan" + +#: admin/settings/general-settings.php:222 +msgid "" +"On deletion (not deactivate) the plugin will completely remove all tables " +"and data it created, leaving no trace it was ever here." +msgstr "" +"Saat penghapusan (tidak dimatikan) plugin ini akan menghapus seluruh tabel " +"dan data yang sudah dibuat, tidak meninggalkan jejak yang sudah ada di sini." + +#: admin/settings/general-settings.php:235 +msgid "Page Views Count Load" +msgstr "Muat Page Views Count" + +#: admin/settings/general-settings.php:241 +msgid "Ajax Load" +msgstr "Muat Ajax" + +#: admin/settings/general-settings.php:242 +msgid "" +"ON to load page views counter on front end by ajax event (recommended). " +"Prevents caching plugins and CDNs from caching the count. If using caching " +"you must clear the cache to see changes after turning this setting ON or OFF." +msgstr "" +"AKTIF untuk memuat penghitung jumlah halaman yang akan dilihat pengunjung " +"dengan aktivitas ajax (disarankan). Cegah plugin tembolok (cache) dan " +"jaringan pengirim konten (CDN) dari menyimpan hitungan. Jika menggunakan " +"penyimpanan Anda harus menghapus tembolok untuk melihat perubahan setelah " +"mengubah pengaturan AKTIF atau MATI." + +#: admin/settings/general-settings.php:253 +#, fuzzy +msgid "Page Views Count for Excerpt Content" +msgstr "Fungsi Page Views Count" + +#: admin/settings/general-settings.php:259 +msgid "Show on Excerpt Content" +msgstr "" + +#: admin/settings/general-settings.php:260 +msgid "" +"ON to show page views counter on the Excerpt Content ( Archives, Homepage, " +"Frontpage, Category pages )." +msgstr "" + +#: admin/settings/general-settings.php:271 +msgid "Activate on Posts and Pages" +msgstr "Aktifkan di Pos dan Laman" + +#: admin/settings/general-settings.php:273 +msgid "" +"The settings below apply to all posts and pages on your site. You can switch " +"the counter ON or OFF from the Page View Counter Meta box on each post or " +"page edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:278 +msgid "Posts" +msgstr "Pos" + +#: admin/settings/general-settings.php:279 +msgid "All posts including posts extracts on category and tags Archives" +msgstr "Semua pos termasuk ekstrak pos di kategori dan tag Arsip" + +#: admin/settings/general-settings.php:289 +msgid "Pages" +msgstr "Laman" + +#: admin/settings/general-settings.php:305 +msgid "Activate on these Custom Post Types" +msgstr "Aktifkan di Tipe Pos Tersuai ini" + +#: admin/settings/general-settings.php:307 +msgid "" +"The settings below apply to these custom post types on your site. You can " +"switch the counter ON or OFF from the Page View Counter Meta box on each " +"custom post edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:330 +msgid "Activation Reset" +msgstr "" + +#: admin/settings/general-settings.php:336 +msgid "Reset All Individual Items" +msgstr "" + +#: admin/settings/general-settings.php:337 +msgid "" +"Switch ON and Save Changes to reset all custom setting are set for " +"individual item from Item Edit Page." +msgstr "" + +#: admin/settings/general-settings.php:338 +msgid "" +"Important Clear your cache after so that visitors see " +"changes." +msgstr "" + +#: admin/settings/general-settings.php:350 +msgid "Page Views Count Function" +msgstr "Fungsi Page Views Count" + +#: admin/settings/general-settings.php:363 +msgid "" +"There are 2 functions that you can use to manually add Page Views Count to " +"any content or post type that is created by your theme or plugin that " +"creates it's own table instead of using custom post types" +msgstr "" +"Terdapat 2 fungsi yang dapat Anda gunakan untuk menambah Page View Count " +"secara manual pada konten apa saja atau tipe pos yang dibuat oleh tema atau " +"plugin Anda yang membuat tabelnya sendiri daripada menggunakan tipe pos " +"tersuai" + +#: admin/settings/general-settings.php:366 +msgid "Single post, page, object" +msgstr "Pos tunggal, laman, objek" + +#: admin/settings/general-settings.php:368 +msgid "Increase Page Views Count and echo stats of this post" +msgstr "Naikkan Page View Count dan statistik eko pos ini" + +#: admin/settings/general-settings.php:369 +msgid "Increase Page Views Count and return stats of this post" +msgstr "Naikkan Page View Count dan statistik balik pos ini" + +#: admin/settings/general-settings.php:372 +msgid "Index pages" +msgstr "Laman indeks" + +#: admin/settings/general-settings.php:374 +msgid "Echo stats of this post" +msgstr "Statistik eko pos ini" + +#: admin/settings/general-settings.php:375 +msgid "Return stats of this post" +msgstr "Statistik balik pos ini" + +#: classes/class-pvc-metabox.php:15 +#, fuzzy +msgid "Page View Counter" +msgstr "Page Views Count" + +#: classes/class-pvc-metabox.php:76 +#, fuzzy +msgid "Activate on this item" +msgstr "Aktifkan di Pos dan Laman" + +#: classes/class-pvc-metabox.php:81 +msgid "All Time Views" +msgstr "" + +#: classes/class-pvc-metabox.php:85 +#, fuzzy +msgid "Today Views" +msgstr "kali dilihat" + +#: pvc_class.php:128 pvc_class.php:132 +msgid "total views" +msgstr "kali dilihat" + +#: pvc_class.php:128 +msgid "views today" +msgstr "kali dilihat hari ini" + +#: pvc_class.php:132 pvc_class.php:218 +msgid "no views today" +msgstr "belum ada yang melihat hari ini" + +#: pvc_class.php:134 pvc_class.php:221 +msgid "No views yet" +msgstr "Belum ada yang melihat" + +#: pvc_class.php:406 +#, fuzzy +msgid "Go to Support Forum" +msgstr "forum bantuan" + +#: pvc_class.php:412 +#, fuzzy +msgid "Free WordPress Plugins" +msgstr "Plugin WordPress Lain a3rev yang GRATIS" + +#: pvc_class.php:419 +msgid "Free WooCommerce Plugins" +msgstr "" + +#: pvc_class.php:426 +msgid "Is this plugin is just what you needed? If so" +msgstr "" + +#: pvc_class.php:427 +msgid "Submit Review for Plugin on WordPress" +msgstr "" + +#: pvc_class.php:434 +msgid "Connect with us via" +msgstr "" + +#: pvc_class.php:435 +msgid "a3rev Facebook" +msgstr "" + +#: pvc_class.php:436 +msgid "a3rev Twitter" +msgstr "" + +#: pvc_class.php:447 +msgid "Settings" +msgstr "Pengaturan" + +#: pvc_class.php:456 +msgid "Documentation" +msgstr "Dokumentasi" + +#: pvc_class.php:457 +msgid "Support" +msgstr "Bantuan" + +#~ msgid "Use this Image" +#~ msgstr "Gunakan gambar ini" + +#~ msgid "Use as" +#~ msgstr "Gunakan sebagai" + +#~ msgid "Previously Uploaded" +#~ msgstr "Diunggah sebelumnya" + +#~ msgid "Settings inside this yellow border are %s Features." +#~ msgstr "Pengaturan dalam garis kuning ini adalah Fitur %s ." + +#~ msgid "Help spread the Word about this plugin" +#~ msgstr "Bantu sebarkan Pendapat tentang plugin ini" + +#~ msgid "View this plugins" +#~ msgstr "Lihat plugin ini" + +#~ msgid "documentation" +#~ msgstr "dokumentasi" + +#~ msgid "Visit this plugins" +#~ msgstr "Kunjungi plugin ini" + +#~ msgid "a3 Responsive Slider" +#~ msgstr "a3 Responsive Slider" + +#~ msgid "Contact Us page - Contact People" +#~ msgstr "Halaman Contact Us- Contact People" + +#~ msgid "WordPress Email Template" +#~ msgstr "WordPress Email Template" + +#~ msgid "View all" +#~ msgstr "Lihat semua" + +#~ msgid "17 a3rev plugins" +#~ msgstr "plugin 17 a3rev" + +#~ msgid "on the WordPress repository" +#~ msgstr "di penyimpanan WordPress" diff --git a/languages/page-views-count-it_IT.mo b/languages/page-views-count-it_IT.mo new file mode 100644 index 0000000..0396343 Binary files /dev/null and b/languages/page-views-count-it_IT.mo differ diff --git a/languages/page-views-count-it_IT.po b/languages/page-views-count-it_IT.po new file mode 100644 index 0000000..3a4d689 --- /dev/null +++ b/languages/page-views-count-it_IT.po @@ -0,0 +1,605 @@ +msgid "" +msgstr "" +"Project-Id-Version: Page Views Count\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-10 13:12+0700\n" +"PO-Revision-Date: 2015-12-10 13:12+0700\n" +"Last-Translator: Nguyen Cong Tuan \n" +"Language-Team: a3rev\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;" +"__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;" +"_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;" +"esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;" +"esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n" +"X-Poedit-Basepath: ../\n" +"X-Generator: Poedit 1.6.4\n" +"X-Loco-Target-Locale: it_IT\n" +"X-Poedit-SearchPath-0: .\n" + +#: admin/admin-interface.php:171 +msgid "Great! You have the latest version installed." +msgstr "" + +#: admin/admin-interface.php:236 +msgid "Settings successfully saved." +msgstr "Impostazioni salvate con successo." + +#: admin/admin-interface.php:244 +msgid "Error: Settings can not save." +msgstr "Errore: impossibile salvare le impostazioni." + +#: admin/admin-interface.php:252 +msgid "Settings successfully reseted." +msgstr "Impostazioni resettate con successo." + +#: admin/admin-interface.php:273 +msgid "Thin" +msgstr "Sottile" + +#: admin/admin-interface.php:274 +msgid "Thin/Italic" +msgstr "Sottile/Italico" + +#: admin/admin-interface.php:275 +msgid "Normal" +msgstr "Normale" + +#: admin/admin-interface.php:276 +msgid "Italic" +msgstr "Italico" + +#: admin/admin-interface.php:277 +msgid "Bold" +msgstr "Grassetto" + +#: admin/admin-interface.php:278 +msgid "Bold/Italic" +msgstr "Grassetto/Italico" + +#: admin/admin-interface.php:288 +msgid "Solid" +msgstr "Solido" + +#: admin/admin-interface.php:289 +msgid "Double" +msgstr "Doppio" + +#: admin/admin-interface.php:290 +msgid "Dashed" +msgstr "Tratteggiato" + +#: admin/admin-interface.php:291 +msgid "Dotted" +msgstr "Punteggiato" + +#: admin/admin-interface.php:292 +msgid "Groove" +msgstr "Groove" + +#: admin/admin-interface.php:293 +msgid "Ridge" +msgstr "Ridge" + +#: admin/admin-interface.php:294 +msgid "Inset" +msgstr "Inset" + +#: admin/admin-interface.php:295 +msgid "Outset" +msgstr "Outset" + +#: admin/admin-interface.php:1539 admin/admin-interface.php:1625 +#: admin/admin-interface.php:1828 admin/admin-interface.php:1918 +#: admin/admin-interface.php:1947 admin/settings/general-settings.php:230 +#: admin/settings/general-settings.php:248 +#: admin/settings/general-settings.php:266 +#: admin/settings/general-settings.php:285 +#: admin/settings/general-settings.php:295 +#: admin/settings/general-settings.php:319 +#: admin/settings/general-settings.php:345 classes/class-pvc-metabox.php:73 +msgid "ON" +msgstr "ON" + +#: admin/admin-interface.php:1540 admin/admin-interface.php:1626 +#: admin/admin-interface.php:1829 admin/admin-interface.php:1919 +#: admin/admin-interface.php:1948 admin/settings/general-settings.php:231 +#: admin/settings/general-settings.php:249 +#: admin/settings/general-settings.php:267 +#: admin/settings/general-settings.php:286 +#: admin/settings/general-settings.php:296 +#: admin/settings/general-settings.php:320 +#: admin/settings/general-settings.php:346 classes/class-pvc-metabox.php:74 +msgid "OFF" +msgstr "OFF" + +#: admin/admin-interface.php:1545 +#, fuzzy +msgid "Google Fonts API" +msgstr "-- Caratteri Google --" + +#: admin/admin-interface.php:1557 +msgid "" +"ON to connect to Google Fonts API and have auto font updates direct from " +"Google." +msgstr "" + +#: admin/admin-interface.php:1561 +#, php-format +msgid "" +"Enter your existing Google Fonts API Key below. Don't have a key? Visit Google Developer API to create a key" +msgstr "" + +#: admin/admin-interface.php:1578 +#, fuzzy +msgid "Google Fonts API Key" +msgstr "-- Caratteri Google --" + +#: admin/admin-interface.php:1581 +msgid "Your Google API Key is valid and automatic font updates are enabled." +msgstr "" + +#: admin/admin-interface.php:1582 +msgid "Please enter a valid Google API Key." +msgstr "" + +#: admin/admin-interface.php:1601 +msgid "Check New Version" +msgstr "" + +#: admin/admin-interface.php:1612 +msgid "Check Now" +msgstr "" + +#: admin/admin-interface.php:1631 +msgid "Open Box Display" +msgstr "" + +#: admin/admin-interface.php:1644 +msgid "" +"ON and each admin panel setting box OPEN | CLOSED position are saved each " +"time changes are SAVED." +msgstr "" + +#: admin/admin-interface.php:1983 +msgid "Width" +msgstr "Larghezza" + +#: admin/admin-interface.php:1985 +msgid "Height" +msgstr "Altezza" + +#: admin/admin-interface.php:1987 +msgid "Hard Crop" +msgstr "Ritaglio" + +#: admin/admin-interface.php:2060 +msgid "-- Default Fonts --" +msgstr "-- Caratteri Standard --" + +#: admin/admin-interface.php:2071 +msgid "-- Google Fonts --" +msgstr "-- Caratteri Google --" + +#: admin/admin-interface.php:2112 +msgid "Preview your customized typography settings" +msgstr "Anteprima delle tue impostazioni tipografiche" + +#: admin/admin-interface.php:2221 admin/admin-interface.php:2455 +msgid "Preview your customized border settings" +msgstr "Anteprima delle tue impostazioni personalizzate dei bordi" + +#: admin/admin-interface.php:2230 admin/admin-interface.php:2446 +msgid "Rounded" +msgstr "Arrotondato" + +#: admin/admin-interface.php:2231 admin/admin-interface.php:2447 +msgid "Square" +msgstr "Quadrato" + +#: admin/admin-interface.php:2241 admin/admin-interface.php:2460 +msgid "Top Left Corner" +msgstr "Angole Superiore Sinistro" + +#: admin/admin-interface.php:2261 admin/admin-interface.php:2480 +msgid "Top Right Corner" +msgstr "Angolo Superiore Destro" + +#: admin/admin-interface.php:2281 admin/admin-interface.php:2500 +msgid "Bottom Right Corner" +msgstr "Angole Inferiore Destro" + +#: admin/admin-interface.php:2301 admin/admin-interface.php:2520 +msgid "Bottom Left Corner" +msgstr "Angolo Inferiore Sinistro" + +#: admin/admin-interface.php:2388 +msgid "Preview your customized border styles settings" +msgstr "Anteprima delle impostazioni dei tuoi bordi personalizzati" + +#: admin/admin-interface.php:2571 +msgid "YES" +msgstr "SI" + +#: admin/admin-interface.php:2572 +msgid "NO" +msgstr "NO" + +#: admin/admin-interface.php:2586 +msgid "Horizontal Shadow" +msgstr "Ombreggiatura Orizzontale" + +#: admin/admin-interface.php:2604 +msgid "Vertical Shadow" +msgstr "Ombreggiatura Verticale" + +#: admin/admin-interface.php:2622 +msgid "Blur Distance" +msgstr "Distanza Sfocatura" + +#: admin/admin-interface.php:2640 +msgid "Spread Size" +msgstr "Dimensione Spread" + +#: admin/admin-interface.php:2658 +msgid "INNER" +msgstr "INTERO" + +#: admin/admin-interface.php:2659 +msgid "OUTER" +msgstr "ESTERNO" + +#: admin/admin-interface.php:2677 +msgid "Preview your customized box shadow settings" +msgstr "Anteprima della tua ombreggiatura personalizzata" + +#: admin/admin-interface.php:2940 +msgid "Save changes" +msgstr "Salva modifiche" + +#: admin/admin-interface.php:2941 +msgid "Reset Settings" +msgstr "Resetta Impostazioni" + +#: admin/admin-pages/admin-pvc-page.php:63 +#: admin/admin-pages/admin-pvc-page.php:64 +msgid "Page Views Count" +msgstr "Visite Pagina" + +#: admin/admin-ui.php:179 +#, php-format +msgid "" +"Advanced Settings - Upgrade to the %s " +"License to activate these settings." +msgstr "" + +#: admin/admin-ui.php:182 +msgid "Pro Version" +msgstr "" + +#: admin/admin-ui.php:232 admin/admin-ui.php:251 +msgid "You should check now to see if have any new version is available" +msgstr "" + +#: admin/admin-ui.php:234 +#, php-format +msgid "" +"Connection Failure! Please try again. If this issue persists please create a " +"support request on the plugin a3rev support " +"forum." +msgstr "" + +#: admin/admin-ui.php:242 +#, php-format +msgid "" +"There is a new version %s " +"available, update now or download " +"direct from My Account on a3rev.com" +msgstr "" + +#: admin/includes/uploader/class-uploader.php:95 +msgid "Upload" +msgstr "Carica" + +#: admin/includes/uploader/class-uploader.php:115 +msgid "View File" +msgstr "Visualizza File" + +#: admin/settings/general-settings.php:81 +msgid "Page View Count Settings successfully saved." +msgstr "Impostazioni Contatore Visite Pagina installato con successo." + +#: admin/settings/general-settings.php:82 +msgid "Error: Page View Count Settings can not save." +msgstr "" +"Errore: impossibile salvare le impostazioni del Contatore Visite Pagina." + +#: admin/settings/general-settings.php:83 +msgid "Page View Count Settings successfully reseted." +msgstr "Impostazioni Contatore Visite Pagina resettate." + +#: admin/settings/general-settings.php:158 admin/tabs/admin-pvc-tab.php:78 +msgid "General" +msgstr "Generale" + +#: admin/settings/general-settings.php:202 +msgid "Plugin Framework Global Settings" +msgstr "" + +#: admin/settings/general-settings.php:209 +msgid "Customize Admin Setting Box Display" +msgstr "" + +#: admin/settings/general-settings.php:210 +msgid "" +"By default each admin panel will open with all Setting Boxes in the CLOSED " +"position." +msgstr "" + +#: admin/settings/general-settings.php:217 +#, fuzzy +msgid "House Keeping" +msgstr "House Keeping :" + +#: admin/settings/general-settings.php:221 +msgid "Clean up on Deletion" +msgstr "Pulisci durante la Cancellazione" + +#: admin/settings/general-settings.php:222 +msgid "" +"On deletion (not deactivate) the plugin will completely remove all tables " +"and data it created, leaving no trace it was ever here." +msgstr "" +"Durante la cancellazione (non disattivazione) il plugin rimuoverà " +"completamente tutte le tabelle e i dati che ha generato, non lasciando " +"alcuna traccia. " + +#: admin/settings/general-settings.php:235 +#, fuzzy +msgid "Page Views Count Load" +msgstr "Caricamento Contatore Visite Pagina" + +#: admin/settings/general-settings.php:241 +msgid "Ajax Load" +msgstr "Caricamento Ajax" + +#: admin/settings/general-settings.php:242 +msgid "" +"ON to load page views counter on front end by ajax event (recommended). " +"Prevents caching plugins and CDNs from caching the count. If using caching " +"you must clear the cache to see changes after turning this setting ON or OFF." +msgstr "" + +#: admin/settings/general-settings.php:253 +#, fuzzy +msgid "Page Views Count for Excerpt Content" +msgstr "Funziona Contatore Visite Pagina" + +#: admin/settings/general-settings.php:259 +msgid "Show on Excerpt Content" +msgstr "" + +#: admin/settings/general-settings.php:260 +msgid "" +"ON to show page views counter on the Excerpt Content ( Archives, Homepage, " +"Frontpage, Category pages )." +msgstr "" + +#: admin/settings/general-settings.php:271 +msgid "Activate on Posts and Pages" +msgstr "Attiva sui Post e sulle Pagine" + +#: admin/settings/general-settings.php:273 +msgid "" +"The settings below apply to all posts and pages on your site. You can switch " +"the counter ON or OFF from the Page View Counter Meta box on each post or " +"page edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:278 +msgid "Posts" +msgstr "Post" + +#: admin/settings/general-settings.php:279 +msgid "All posts including posts extracts on category and tags Archives" +msgstr "" +"Alle berichten waaronder berichten extracten op categorie en tags archieven" + +#: admin/settings/general-settings.php:289 +msgid "Pages" +msgstr "Pagine" + +#: admin/settings/general-settings.php:305 +msgid "Activate on these Custom Post Types" +msgstr "Attivate su questi Tipi Post Personalizzati" + +#: admin/settings/general-settings.php:307 +msgid "" +"The settings below apply to these custom post types on your site. You can " +"switch the counter ON or OFF from the Page View Counter Meta box on each " +"custom post edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:330 +msgid "Activation Reset" +msgstr "" + +#: admin/settings/general-settings.php:336 +msgid "Reset All Individual Items" +msgstr "" + +#: admin/settings/general-settings.php:337 +msgid "" +"Switch ON and Save Changes to reset all custom setting are set for " +"individual item from Item Edit Page." +msgstr "" + +#: admin/settings/general-settings.php:338 +msgid "" +"Important Clear your cache after so that visitors see " +"changes." +msgstr "" + +#: admin/settings/general-settings.php:350 +msgid "Page Views Count Function" +msgstr "Funziona Contatore Visite Pagina" + +#: admin/settings/general-settings.php:363 +#, fuzzy +msgid "" +"There are 2 functions that you can use to manually add Page Views Count to " +"any content or post type that is created by your theme or plugin that " +"creates it's own table instead of using custom post types" +msgstr "" +"Esistono 2 funzioni che puoi usare per aggiungere manualmente il Contatore " +"Visite Pagina a qualunque contenuto o tipo di post creato dal tuo theme o " +"plugin che crea la propria tabella invece di usare un tipo di post " +"personalizzato custom post types." + +#: admin/settings/general-settings.php:366 +msgid "Single post, page, object" +msgstr "Post, pagina, oggetto singolo" + +#: admin/settings/general-settings.php:368 +msgid "Increase Page Views Count and echo stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:369 +msgid "Increase Page Views Count and return stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:372 +msgid "Index pages" +msgstr "Indice pagine" + +#: admin/settings/general-settings.php:374 +msgid "Echo stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:375 +msgid "Return stats of this post" +msgstr "" + +#: classes/class-pvc-metabox.php:15 +#, fuzzy +msgid "Page View Counter" +msgstr "Visite Pagina" + +#: classes/class-pvc-metabox.php:76 +#, fuzzy +msgid "Activate on this item" +msgstr "Attiva sui Post e sulle Pagine" + +#: classes/class-pvc-metabox.php:81 +msgid "All Time Views" +msgstr "" + +#: classes/class-pvc-metabox.php:85 +#, fuzzy +msgid "Today Views" +msgstr "Visite totali" + +#: pvc_class.php:128 pvc_class.php:132 +msgid "total views" +msgstr "Visite totali" + +#: pvc_class.php:128 +msgid "views today" +msgstr "visite odierne" + +#: pvc_class.php:132 pvc_class.php:218 +msgid "no views today" +msgstr "nessuna visita odierna" + +#: pvc_class.php:134 pvc_class.php:221 +msgid "No views yet" +msgstr "Ancora nessuna visita" + +#: pvc_class.php:406 +#, fuzzy +msgid "Go to Support Forum" +msgstr "forum di supporto" + +#: pvc_class.php:412 +#, fuzzy +msgid "Free WordPress Plugins" +msgstr "Altri a3rv Plugin FREE per WordPress" + +#: pvc_class.php:419 +msgid "Free WooCommerce Plugins" +msgstr "" + +#: pvc_class.php:426 +msgid "Is this plugin is just what you needed? If so" +msgstr "" + +#: pvc_class.php:427 +msgid "Submit Review for Plugin on WordPress" +msgstr "" + +#: pvc_class.php:434 +msgid "Connect with us via" +msgstr "" + +#: pvc_class.php:435 +msgid "a3rev Facebook" +msgstr "" + +#: pvc_class.php:436 +msgid "a3rev Twitter" +msgstr "" + +#: pvc_class.php:447 +msgid "Settings" +msgstr "Impostazioni" + +#: pvc_class.php:456 +msgid "Documentation" +msgstr "Documentazione" + +#: pvc_class.php:457 +msgid "Support" +msgstr "Supporto" + +#~ msgid "Use this Image" +#~ msgstr "Usa questa immagine" + +#~ msgid "Use as" +#~ msgstr "Usa come" + +#~ msgid "Previously Uploaded" +#~ msgstr "Caricato Precedentemente" + +#~ msgid "Help spread the Word about this plugin" +#~ msgstr "Aiutami a pubblicizzare questo plugin" + +#~ msgid "View this plugins" +#~ msgstr "Vedi questo plugin" + +#~ msgid "documentation" +#~ msgstr "documentazione" + +#~ msgid "Visit this plugins" +#~ msgstr "Visita questi plugin" + +#~ msgid "Contact Us page - Contact People" +#~ msgstr "Pagina Contatti - Contatta Staff" + +#~ msgid "WordPress Email Template" +#~ msgstr "Template Email WordPress" + +#~ msgid "View all" +#~ msgstr "Vedi tutto" + +#, fuzzy +#~ msgid "17 a3rev plugins" +#~ msgstr "17 plygin a3rev" + +#~ msgid "on the WordPress repository" +#~ msgstr "nel repository di WordPress" diff --git a/languages/page-views-count-nl_NL.mo b/languages/page-views-count-nl_NL.mo new file mode 100755 index 0000000..a1755c7 Binary files /dev/null and b/languages/page-views-count-nl_NL.mo differ diff --git a/languages/page-views-count-nl_NL.po b/languages/page-views-count-nl_NL.po new file mode 100755 index 0000000..3f2e590 --- /dev/null +++ b/languages/page-views-count-nl_NL.po @@ -0,0 +1,612 @@ +msgid "" +msgstr "" +"Project-Id-Version: Page Views Count\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-10 13:12+0700\n" +"PO-Revision-Date: 2015-12-10 13:12+0700\n" +"Last-Translator: Nguyen Cong Tuan \n" +"Language-Team: a3rev\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Basepath: ../\n" +"X-Generator: Poedit 1.6.4\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-SearchPath-0: .\n" + +#: admin/admin-interface.php:171 +msgid "Great! You have the latest version installed." +msgstr "" + +#: admin/admin-interface.php:236 +msgid "Settings successfully saved." +msgstr "Instellingen succesvol opgeslagen." + +#: admin/admin-interface.php:244 +msgid "Error: Settings can not save." +msgstr "Fout: Instellingen kunnen niet opgeslagen worden." + +#: admin/admin-interface.php:252 +msgid "Settings successfully reseted." +msgstr "Instellingen met succes gereset." + +#: admin/admin-interface.php:273 +msgid "Thin" +msgstr "Dun" + +#: admin/admin-interface.php:274 +msgid "Thin/Italic" +msgstr "Dun/Cursief" + +#: admin/admin-interface.php:275 +msgid "Normal" +msgstr "Normaal" + +#: admin/admin-interface.php:276 +msgid "Italic" +msgstr "Cursief" + +#: admin/admin-interface.php:277 +msgid "Bold" +msgstr "Vetgedrukt" + +#: admin/admin-interface.php:278 +msgid "Bold/Italic" +msgstr "Vetgedrukt/Cursief" + +#: admin/admin-interface.php:288 +msgid "Solid" +msgstr "Solide" + +#: admin/admin-interface.php:289 +msgid "Double" +msgstr "Dubbel" + +#: admin/admin-interface.php:290 +msgid "Dashed" +msgstr "Gestreept" + +#: admin/admin-interface.php:291 +msgid "Dotted" +msgstr "Gestippelt" + +#: admin/admin-interface.php:292 +msgid "Groove" +msgstr "" + +#: admin/admin-interface.php:293 +msgid "Ridge" +msgstr "" + +#: admin/admin-interface.php:294 +msgid "Inset" +msgstr "" + +#: admin/admin-interface.php:295 +msgid "Outset" +msgstr "" + +#: admin/admin-interface.php:1539 admin/admin-interface.php:1625 +#: admin/admin-interface.php:1828 admin/admin-interface.php:1918 +#: admin/admin-interface.php:1947 admin/settings/general-settings.php:230 +#: admin/settings/general-settings.php:248 +#: admin/settings/general-settings.php:266 +#: admin/settings/general-settings.php:285 +#: admin/settings/general-settings.php:295 +#: admin/settings/general-settings.php:319 +#: admin/settings/general-settings.php:345 classes/class-pvc-metabox.php:73 +msgid "ON" +msgstr "AAN" + +#: admin/admin-interface.php:1540 admin/admin-interface.php:1626 +#: admin/admin-interface.php:1829 admin/admin-interface.php:1919 +#: admin/admin-interface.php:1948 admin/settings/general-settings.php:231 +#: admin/settings/general-settings.php:249 +#: admin/settings/general-settings.php:267 +#: admin/settings/general-settings.php:286 +#: admin/settings/general-settings.php:296 +#: admin/settings/general-settings.php:320 +#: admin/settings/general-settings.php:346 classes/class-pvc-metabox.php:74 +msgid "OFF" +msgstr "UIT" + +#: admin/admin-interface.php:1545 +#, fuzzy +msgid "Google Fonts API" +msgstr "-- Google Fonts --" + +#: admin/admin-interface.php:1557 +msgid "" +"ON to connect to Google Fonts API and have auto font updates direct from " +"Google." +msgstr "" + +#: admin/admin-interface.php:1561 +#, php-format +msgid "" +"Enter your existing Google Fonts API Key below. Don't have a key? Visit Google Developer API to create a key" +msgstr "" + +#: admin/admin-interface.php:1578 +#, fuzzy +msgid "Google Fonts API Key" +msgstr "-- Google Fonts --" + +#: admin/admin-interface.php:1581 +msgid "Your Google API Key is valid and automatic font updates are enabled." +msgstr "" + +#: admin/admin-interface.php:1582 +msgid "Please enter a valid Google API Key." +msgstr "" + +#: admin/admin-interface.php:1601 +msgid "Check New Version" +msgstr "" + +#: admin/admin-interface.php:1612 +msgid "Check Now" +msgstr "" + +#: admin/admin-interface.php:1631 +msgid "Open Box Display" +msgstr "" + +#: admin/admin-interface.php:1644 +msgid "" +"ON and each admin panel setting box OPEN | CLOSED position are saved each " +"time changes are SAVED." +msgstr "" + +#: admin/admin-interface.php:1983 +msgid "Width" +msgstr "Breedte" + +#: admin/admin-interface.php:1985 +msgid "Height" +msgstr "Hoogte" + +#: admin/admin-interface.php:1987 +msgid "Hard Crop" +msgstr "Hard Knippen" + +#: admin/admin-interface.php:2060 +msgid "-- Default Fonts --" +msgstr "-- Standaard Fonts --" + +#: admin/admin-interface.php:2071 +msgid "-- Google Fonts --" +msgstr "-- Google Fonts --" + +#: admin/admin-interface.php:2112 +msgid "Preview your customized typography settings" +msgstr "Bekijk vooraf uw aangepaste typografie instellingen" + +#: admin/admin-interface.php:2221 admin/admin-interface.php:2455 +msgid "Preview your customized border settings" +msgstr "Bekijk vooraf uw aangepaste rand instellingen" + +#: admin/admin-interface.php:2230 admin/admin-interface.php:2446 +msgid "Rounded" +msgstr "Afgerond" + +#: admin/admin-interface.php:2231 admin/admin-interface.php:2447 +msgid "Square" +msgstr "Vierkant" + +#: admin/admin-interface.php:2241 admin/admin-interface.php:2460 +msgid "Top Left Corner" +msgstr "" + +#: admin/admin-interface.php:2261 admin/admin-interface.php:2480 +msgid "Top Right Corner" +msgstr "" + +#: admin/admin-interface.php:2281 admin/admin-interface.php:2500 +msgid "Bottom Right Corner" +msgstr "" + +#: admin/admin-interface.php:2301 admin/admin-interface.php:2520 +msgid "Bottom Left Corner" +msgstr "" + +#: admin/admin-interface.php:2388 +msgid "Preview your customized border styles settings" +msgstr "Bekijk vooraf uw aangepaste randstijl instellingen" + +#: admin/admin-interface.php:2571 +msgid "YES" +msgstr "JA" + +#: admin/admin-interface.php:2572 +msgid "NO" +msgstr "NEE" + +#: admin/admin-interface.php:2586 +msgid "Horizontal Shadow" +msgstr "Horizontale Schaduw" + +#: admin/admin-interface.php:2604 +msgid "Vertical Shadow" +msgstr "Verticale Schaduw" + +#: admin/admin-interface.php:2622 +msgid "Blur Distance" +msgstr "Vervaag Afstand" + +#: admin/admin-interface.php:2640 +msgid "Spread Size" +msgstr "Spreiding Grootte" + +#: admin/admin-interface.php:2658 +msgid "INNER" +msgstr "BINNEN" + +#: admin/admin-interface.php:2659 +msgid "OUTER" +msgstr "BUITEN" + +#: admin/admin-interface.php:2677 +msgid "Preview your customized box shadow settings" +msgstr "Bekijk vooraf uw aangepaste vak schaduw instellingen" + +#: admin/admin-interface.php:2940 +msgid "Save changes" +msgstr "Opslaan wijzigingen" + +#: admin/admin-interface.php:2941 +msgid "Reset Settings" +msgstr "Reset Instellingen" + +#: admin/admin-pages/admin-pvc-page.php:63 +#: admin/admin-pages/admin-pvc-page.php:64 +msgid "Page Views Count" +msgstr "Page Views Count" + +#: admin/admin-ui.php:179 +#, php-format +msgid "" +"Advanced Settings - Upgrade to the %s " +"License to activate these settings." +msgstr "" + +#: admin/admin-ui.php:182 +msgid "Pro Version" +msgstr "" + +#: admin/admin-ui.php:232 admin/admin-ui.php:251 +msgid "You should check now to see if have any new version is available" +msgstr "" + +#: admin/admin-ui.php:234 +#, php-format +msgid "" +"Connection Failure! Please try again. If this issue persists please create a " +"support request on the plugin a3rev support " +"forum." +msgstr "" + +#: admin/admin-ui.php:242 +#, php-format +msgid "" +"There is a new version %s " +"available, update now or download " +"direct from My Account on a3rev.com" +msgstr "" + +#: admin/includes/uploader/class-uploader.php:95 +msgid "Upload" +msgstr "Uploaden" + +#: admin/includes/uploader/class-uploader.php:115 +msgid "View File" +msgstr "Bekijk Bestand" + +#: admin/settings/general-settings.php:81 +msgid "Page View Count Settings successfully saved." +msgstr "Page View Count Instellingen successvol opgeslagen." + +#: admin/settings/general-settings.php:82 +msgid "Error: Page View Count Settings can not save." +msgstr "Fou: Page View Count Instellingen kunnen niet opgeslagen worden." + +#: admin/settings/general-settings.php:83 +msgid "Page View Count Settings successfully reseted." +msgstr "Page View Count Instellingen successvol gereset." + +#: admin/settings/general-settings.php:158 admin/tabs/admin-pvc-tab.php:78 +msgid "General" +msgstr "Algemeen" + +#: admin/settings/general-settings.php:202 +msgid "Plugin Framework Global Settings" +msgstr "" + +#: admin/settings/general-settings.php:209 +msgid "Customize Admin Setting Box Display" +msgstr "" + +#: admin/settings/general-settings.php:210 +msgid "" +"By default each admin panel will open with all Setting Boxes in the CLOSED " +"position." +msgstr "" + +#: admin/settings/general-settings.php:217 +#, fuzzy +msgid "House Keeping" +msgstr "Huishouding :" + +#: admin/settings/general-settings.php:221 +msgid "Clean up on Deletion" +msgstr "Schoonmaken bij Verwijdering" + +#: admin/settings/general-settings.php:222 +msgid "" +"On deletion (not deactivate) the plugin will completely remove all tables " +"and data it created, leaving no trace it was ever here." +msgstr "" +"Bij verwijdering (niet deactivering) zal de plugin alle tabellen en gegevens " +"die het gemaakt heeft volledig verwijderen, waardoor er geen sporen " +"achterblijven." + +#: admin/settings/general-settings.php:235 +#, fuzzy +msgid "Page Views Count Load" +msgstr "Page Views Count" + +#: admin/settings/general-settings.php:241 +msgid "Ajax Load" +msgstr "" + +#: admin/settings/general-settings.php:242 +msgid "" +"ON to load page views counter on front end by ajax event (recommended). " +"Prevents caching plugins and CDNs from caching the count. If using caching " +"you must clear the cache to see changes after turning this setting ON or OFF." +msgstr "" + +#: admin/settings/general-settings.php:253 +#, fuzzy +msgid "Page Views Count for Excerpt Content" +msgstr "Page Views Count Functie" + +#: admin/settings/general-settings.php:259 +msgid "Show on Excerpt Content" +msgstr "" + +#: admin/settings/general-settings.php:260 +msgid "" +"ON to show page views counter on the Excerpt Content ( Archives, Homepage, " +"Frontpage, Category pages )." +msgstr "" + +#: admin/settings/general-settings.php:271 +msgid "Activate on Posts and Pages" +msgstr "Activeren op Berichten en Pagina's" + +#: admin/settings/general-settings.php:273 +msgid "" +"The settings below apply to all posts and pages on your site. You can switch " +"the counter ON or OFF from the Page View Counter Meta box on each post or " +"page edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:278 +msgid "Posts" +msgstr "Berichten" + +#: admin/settings/general-settings.php:279 +msgid "All posts including posts extracts on category and tags Archives" +msgstr "" +"Alle berichten waaronder berichten extracten op categorie en tags archieven" + +#: admin/settings/general-settings.php:289 +msgid "Pages" +msgstr "Pagina's" + +#: admin/settings/general-settings.php:305 +msgid "Activate on these Custom Post Types" +msgstr "Activeren van deze Custom Post Types" + +#: admin/settings/general-settings.php:307 +msgid "" +"The settings below apply to these custom post types on your site. You can " +"switch the counter ON or OFF from the Page View Counter Meta box on each " +"custom post edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:330 +msgid "Activation Reset" +msgstr "" + +#: admin/settings/general-settings.php:336 +msgid "Reset All Individual Items" +msgstr "" + +#: admin/settings/general-settings.php:337 +msgid "" +"Switch ON and Save Changes to reset all custom setting are set for " +"individual item from Item Edit Page." +msgstr "" + +#: admin/settings/general-settings.php:338 +msgid "" +"Important Clear your cache after so that visitors see " +"changes." +msgstr "" + +#: admin/settings/general-settings.php:350 +msgid "Page Views Count Function" +msgstr "Page Views Count Functie" + +#: admin/settings/general-settings.php:363 +#, fuzzy +msgid "" +"There are 2 functions that you can use to manually add Page Views Count to " +"any content or post type that is created by your theme or plugin that " +"creates it's own table instead of using custom post types" +msgstr "" +"Er zijn 2 functies die u kunt gebruiken om handmatig Page Views Count toe te " +"voegen aan elke inhoud of post type dat wordt gemaakt door uw thema of " +"plugin, die dan zorgt voor zijn eigen tabel in plaats van het gebruik van " +"custom post types." + +#: admin/settings/general-settings.php:366 +msgid "Single post, page, object" +msgstr "Individueel bericht, pagina, object" + +#: admin/settings/general-settings.php:368 +msgid "Increase Page Views Count and echo stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:369 +msgid "Increase Page Views Count and return stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:372 +msgid "Index pages" +msgstr "Index pagina's" + +#: admin/settings/general-settings.php:374 +msgid "Echo stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:375 +msgid "Return stats of this post" +msgstr "" + +#: classes/class-pvc-metabox.php:15 +#, fuzzy +msgid "Page View Counter" +msgstr "Page Views Count" + +#: classes/class-pvc-metabox.php:76 +#, fuzzy +msgid "Activate on this item" +msgstr "Activeren op Berichten en Pagina's" + +#: classes/class-pvc-metabox.php:81 +msgid "All Time Views" +msgstr "" + +#: classes/class-pvc-metabox.php:85 +#, fuzzy +msgid "Today Views" +msgstr "totaal aantal vertoningen" + +#: pvc_class.php:128 pvc_class.php:132 +msgid "total views" +msgstr "totaal aantal vertoningen" + +#: pvc_class.php:128 +msgid "views today" +msgstr "aantal vertoningen vandaag" + +#: pvc_class.php:132 pvc_class.php:218 +msgid "no views today" +msgstr "geen vertoningen vandaag" + +#: pvc_class.php:134 pvc_class.php:221 +msgid "No views yet" +msgstr "Nog geen vertoningen" + +#: pvc_class.php:406 +#, fuzzy +msgid "Go to Support Forum" +msgstr "support forum" + +#: pvc_class.php:412 +#, fuzzy +msgid "Free WordPress Plugins" +msgstr "Andere GRATIS a3rev WordPress Plugins" + +#: pvc_class.php:419 +msgid "Free WooCommerce Plugins" +msgstr "" + +#: pvc_class.php:426 +msgid "Is this plugin is just what you needed? If so" +msgstr "" + +#: pvc_class.php:427 +msgid "Submit Review for Plugin on WordPress" +msgstr "" + +#: pvc_class.php:434 +msgid "Connect with us via" +msgstr "" + +#: pvc_class.php:435 +msgid "a3rev Facebook" +msgstr "" + +#: pvc_class.php:436 +msgid "a3rev Twitter" +msgstr "" + +#: pvc_class.php:447 +msgid "Settings" +msgstr "Instellingen" + +#: pvc_class.php:456 +msgid "Documentation" +msgstr "Documentatie" + +#: pvc_class.php:457 +msgid "Support" +msgstr "Support" + +#~ msgid "Use this Image" +#~ msgstr "Gebruik deze Afbeelding" + +#~ msgid "Use as" +#~ msgstr "Gebruik als" + +#~ msgid "Previously Uploaded" +#~ msgstr "Eerder Geuploaded" + +#~ msgid "Help spread the Word about this plugin" +#~ msgstr "Help met het promoten van deze plugin" + +#~ msgid "View this plugins" +#~ msgstr "Bekijk deze plugins" + +#~ msgid "documentation" +#~ msgstr "documentatie" + +#~ msgid "Visit this plugins" +#~ msgstr "Bezoek deze plugins" + +#~ msgid "Contact Us page - Contact People" +#~ msgstr "Contact pagina - Contact Personen" + +#~ msgid "WordPress Email Template" +#~ msgstr "WordPress Email Sjabloon" + +#~ msgid "View all" +#~ msgstr "Toon alles" + +#, fuzzy +#~ msgid "17 a3rev plugins" +#~ msgstr "16 a3rev plugins" + +#~ msgid "on the WordPress repository" +#~ msgstr "van de WordPress opslagruimte" + +#~ msgid "Rounded Value" +#~ msgstr "Afgeronde Waarde" + +#~ msgid "See" +#~ msgstr "Bekijk" + +#~ msgid "the plugins wiki" +#~ msgstr "de plugins wiki" + +#~ msgid "docs for detailed explanation on using the funtions" +#~ msgstr "" +#~ "documenten voor gedetailleerde uitleg over het gebruik van de functies" diff --git a/languages/page-views-count-ru_RU.mo b/languages/page-views-count-ru_RU.mo new file mode 100644 index 0000000..0c5a48c Binary files /dev/null and b/languages/page-views-count-ru_RU.mo differ diff --git a/languages/page-views-count-ru_RU.po b/languages/page-views-count-ru_RU.po new file mode 100644 index 0000000..afb2f12 --- /dev/null +++ b/languages/page-views-count-ru_RU.po @@ -0,0 +1,602 @@ +msgid "" +msgstr "" +"Project-Id-Version: Page Views Count\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-10 13:12+0700\n" +"PO-Revision-Date: 2015-12-10 13:12+0700\n" +"Last-Translator: Nguyen Cong Tuan \n" +"Language-Team: a3rev\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Basepath: ../\n" +"X-Generator: Poedit 1.6.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: admin/admin-interface.php:171 +msgid "Great! You have the latest version installed." +msgstr "" + +#: admin/admin-interface.php:236 +msgid "Settings successfully saved." +msgstr "Настройки успешно сохранены." + +#: admin/admin-interface.php:244 +msgid "Error: Settings can not save." +msgstr "Ошибка: Настройки не могут быть сохранены." + +#: admin/admin-interface.php:252 +msgid "Settings successfully reseted." +msgstr "Настройки успешно сброшены." + +#: admin/admin-interface.php:273 +msgid "Thin" +msgstr "Тонкий" + +#: admin/admin-interface.php:274 +msgid "Thin/Italic" +msgstr "Тонкий/Курсив" + +#: admin/admin-interface.php:275 +msgid "Normal" +msgstr "Обычный" + +#: admin/admin-interface.php:276 +msgid "Italic" +msgstr "Курсив" + +#: admin/admin-interface.php:277 +msgid "Bold" +msgstr "Жирный" + +#: admin/admin-interface.php:278 +msgid "Bold/Italic" +msgstr "Жирный/Курсив" + +#: admin/admin-interface.php:288 +msgid "Solid" +msgstr "Сплошной" + +#: admin/admin-interface.php:289 +msgid "Double" +msgstr "Двойной" + +#: admin/admin-interface.php:290 +msgid "Dashed" +msgstr "Пунктирный" + +#: admin/admin-interface.php:291 +msgid "Dotted" +msgstr "Точечный" + +#: admin/admin-interface.php:292 +msgid "Groove" +msgstr "Выемка" + +#: admin/admin-interface.php:293 +msgid "Ridge" +msgstr "Грани" + +#: admin/admin-interface.php:294 +msgid "Inset" +msgstr "Вогнутый" + +#: admin/admin-interface.php:295 +msgid "Outset" +msgstr "Выпуклый" + +#: admin/admin-interface.php:1539 admin/admin-interface.php:1625 +#: admin/admin-interface.php:1828 admin/admin-interface.php:1918 +#: admin/admin-interface.php:1947 admin/settings/general-settings.php:230 +#: admin/settings/general-settings.php:248 +#: admin/settings/general-settings.php:266 +#: admin/settings/general-settings.php:285 +#: admin/settings/general-settings.php:295 +#: admin/settings/general-settings.php:319 +#: admin/settings/general-settings.php:345 classes/class-pvc-metabox.php:73 +msgid "ON" +msgstr "ВКЛ" + +#: admin/admin-interface.php:1540 admin/admin-interface.php:1626 +#: admin/admin-interface.php:1829 admin/admin-interface.php:1919 +#: admin/admin-interface.php:1948 admin/settings/general-settings.php:231 +#: admin/settings/general-settings.php:249 +#: admin/settings/general-settings.php:267 +#: admin/settings/general-settings.php:286 +#: admin/settings/general-settings.php:296 +#: admin/settings/general-settings.php:320 +#: admin/settings/general-settings.php:346 classes/class-pvc-metabox.php:74 +msgid "OFF" +msgstr "ВЫКЛ" + +#: admin/admin-interface.php:1545 +#, fuzzy +msgid "Google Fonts API" +msgstr "-- Шрифты Google --" + +#: admin/admin-interface.php:1557 +msgid "" +"ON to connect to Google Fonts API and have auto font updates direct from " +"Google." +msgstr "" + +#: admin/admin-interface.php:1561 +#, php-format +msgid "" +"Enter your existing Google Fonts API Key below. Don't have a key? Visit Google Developer API to create a key" +msgstr "" + +#: admin/admin-interface.php:1578 +#, fuzzy +msgid "Google Fonts API Key" +msgstr "-- Шрифты Google --" + +#: admin/admin-interface.php:1581 +msgid "Your Google API Key is valid and automatic font updates are enabled." +msgstr "" + +#: admin/admin-interface.php:1582 +msgid "Please enter a valid Google API Key." +msgstr "" + +#: admin/admin-interface.php:1601 +msgid "Check New Version" +msgstr "" + +#: admin/admin-interface.php:1612 +msgid "Check Now" +msgstr "" + +#: admin/admin-interface.php:1631 +msgid "Open Box Display" +msgstr "" + +#: admin/admin-interface.php:1644 +msgid "" +"ON and each admin panel setting box OPEN | CLOSED position are saved each " +"time changes are SAVED." +msgstr "" + +#: admin/admin-interface.php:1983 +msgid "Width" +msgstr "Ширина" + +#: admin/admin-interface.php:1985 +msgid "Height" +msgstr "Высота" + +#: admin/admin-interface.php:1987 +msgid "Hard Crop" +msgstr "Жесткое обрезание" + +#: admin/admin-interface.php:2060 +msgid "-- Default Fonts --" +msgstr "-- Шрифты по умолчанию --" + +#: admin/admin-interface.php:2071 +msgid "-- Google Fonts --" +msgstr "-- Шрифты Google --" + +#: admin/admin-interface.php:2112 +msgid "Preview your customized typography settings" +msgstr "Предварительный просмотр Ваших настроек оформления" + +#: admin/admin-interface.php:2221 admin/admin-interface.php:2455 +msgid "Preview your customized border settings" +msgstr "Предварительный просмотр Ваших настроек границы" + +#: admin/admin-interface.php:2230 admin/admin-interface.php:2446 +msgid "Rounded" +msgstr "Скругленный" + +#: admin/admin-interface.php:2231 admin/admin-interface.php:2447 +msgid "Square" +msgstr "Квадрат" + +#: admin/admin-interface.php:2241 admin/admin-interface.php:2460 +msgid "Top Left Corner" +msgstr "Верхний Левый Угол" + +#: admin/admin-interface.php:2261 admin/admin-interface.php:2480 +msgid "Top Right Corner" +msgstr "Верхний Правый Угол" + +#: admin/admin-interface.php:2281 admin/admin-interface.php:2500 +msgid "Bottom Right Corner" +msgstr "Нижний Правый Угол" + +#: admin/admin-interface.php:2301 admin/admin-interface.php:2520 +msgid "Bottom Left Corner" +msgstr "Верхний Левый Угол" + +#: admin/admin-interface.php:2388 +msgid "Preview your customized border styles settings" +msgstr "Предварительный просмотр Ваших настроек стиля границы" + +#: admin/admin-interface.php:2571 +msgid "YES" +msgstr "ДА" + +#: admin/admin-interface.php:2572 +msgid "NO" +msgstr "НЕТ" + +#: admin/admin-interface.php:2586 +msgid "Horizontal Shadow" +msgstr "Горизонтальная Тень" + +#: admin/admin-interface.php:2604 +msgid "Vertical Shadow" +msgstr "Вертикальная Тень" + +#: admin/admin-interface.php:2622 +msgid "Blur Distance" +msgstr "Размытие Расстояния" + +#: admin/admin-interface.php:2640 +msgid "Spread Size" +msgstr "Простирающийся Размер" + +#: admin/admin-interface.php:2658 +msgid "INNER" +msgstr "ВНУТРЕННИЙ" + +#: admin/admin-interface.php:2659 +msgid "OUTER" +msgstr "ВНЕШНИЙ" + +#: admin/admin-interface.php:2677 +msgid "Preview your customized box shadow settings" +msgstr "Предварительный просмотр Ваших настроек тени коробки" + +#: admin/admin-interface.php:2940 +msgid "Save changes" +msgstr "Сохранить изменения" + +#: admin/admin-interface.php:2941 +msgid "Reset Settings" +msgstr "Сбросить Настройки" + +#: admin/admin-pages/admin-pvc-page.php:63 +#: admin/admin-pages/admin-pvc-page.php:64 +msgid "Page Views Count" +msgstr "Счетчик Просмотров Страниц" + +#: admin/admin-ui.php:179 +#, fuzzy, php-format +msgid "" +"Advanced Settings - Upgrade to the %s " +"License to activate these settings." +msgstr "" +"Обновите %s чтобы активировать эти " +"настройки." + +#: admin/admin-ui.php:182 +msgid "Pro Version" +msgstr "Про Версия" + +#: admin/admin-ui.php:232 admin/admin-ui.php:251 +msgid "You should check now to see if have any new version is available" +msgstr "" + +#: admin/admin-ui.php:234 +#, php-format +msgid "" +"Connection Failure! Please try again. If this issue persists please create a " +"support request on the plugin a3rev support " +"forum." +msgstr "" + +#: admin/admin-ui.php:242 +#, php-format +msgid "" +"There is a new version %s " +"available, update now or download " +"direct from My Account on a3rev.com" +msgstr "" + +#: admin/includes/uploader/class-uploader.php:95 +msgid "Upload" +msgstr "Загрузить" + +#: admin/includes/uploader/class-uploader.php:115 +msgid "View File" +msgstr "Просмотреть Файл" + +#: admin/settings/general-settings.php:81 +msgid "Page View Count Settings successfully saved." +msgstr "Настройки Счетчика Просмотров Страниц успешно сохранены." + +#: admin/settings/general-settings.php:82 +msgid "Error: Page View Count Settings can not save." +msgstr "Ошибка: Настройки Счетчика Просмотров Страниц не могут быть сохранены." + +#: admin/settings/general-settings.php:83 +msgid "Page View Count Settings successfully reseted." +msgstr "Настройки Счетчика Просмотров Страниц успешно сброшены." + +#: admin/settings/general-settings.php:158 admin/tabs/admin-pvc-tab.php:78 +msgid "General" +msgstr "Общие" + +#: admin/settings/general-settings.php:202 +msgid "Plugin Framework Global Settings" +msgstr "" + +#: admin/settings/general-settings.php:209 +msgid "Customize Admin Setting Box Display" +msgstr "" + +#: admin/settings/general-settings.php:210 +msgid "" +"By default each admin panel will open with all Setting Boxes in the CLOSED " +"position." +msgstr "" + +#: admin/settings/general-settings.php:217 +#, fuzzy +msgid "House Keeping" +msgstr "Служба Очистки :" + +#: admin/settings/general-settings.php:221 +msgid "Clean up on Deletion" +msgstr "Очистка при Удалении" + +#: admin/settings/general-settings.php:222 +msgid "" +"On deletion (not deactivate) the plugin will completely remove all tables " +"and data it created, leaving no trace it was ever here." +msgstr "" +"При удалении (не отключать) плагин полностью удалит все таблицы и данные, " +"которые он создал, не оставляя следов, что он когда-либо был здесь." + +#: admin/settings/general-settings.php:235 +#, fuzzy +msgid "Page Views Count Load" +msgstr "Счетчик Просмотров Страниц" + +#: admin/settings/general-settings.php:241 +msgid "Ajax Load" +msgstr "" + +#: admin/settings/general-settings.php:242 +msgid "" +"ON to load page views counter on front end by ajax event (recommended). " +"Prevents caching plugins and CDNs from caching the count. If using caching " +"you must clear the cache to see changes after turning this setting ON or OFF." +msgstr "" + +#: admin/settings/general-settings.php:253 +#, fuzzy +msgid "Page Views Count for Excerpt Content" +msgstr "Функция Счетчика Просмотров Страниц" + +#: admin/settings/general-settings.php:259 +msgid "Show on Excerpt Content" +msgstr "" + +#: admin/settings/general-settings.php:260 +msgid "" +"ON to show page views counter on the Excerpt Content ( Archives, Homepage, " +"Frontpage, Category pages )." +msgstr "" + +#: admin/settings/general-settings.php:271 +msgid "Activate on Posts and Pages" +msgstr "Включить в Записях и на Страницах" + +#: admin/settings/general-settings.php:273 +msgid "" +"The settings below apply to all posts and pages on your site. You can switch " +"the counter ON or OFF from the Page View Counter Meta box on each post or " +"page edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:278 +msgid "Posts" +msgstr "Записи" + +#: admin/settings/general-settings.php:279 +msgid "All posts including posts extracts on category and tags Archives" +msgstr "Все записи, включая выдержки записей в категории и теги Архивов" + +#: admin/settings/general-settings.php:289 +msgid "Pages" +msgstr "Страницы" + +#: admin/settings/general-settings.php:305 +msgid "Activate on these Custom Post Types" +msgstr "Включить на следующих Выбранных Типах Записей" + +#: admin/settings/general-settings.php:307 +msgid "" +"The settings below apply to these custom post types on your site. You can " +"switch the counter ON or OFF from the Page View Counter Meta box on each " +"custom post edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:330 +msgid "Activation Reset" +msgstr "" + +#: admin/settings/general-settings.php:336 +msgid "Reset All Individual Items" +msgstr "" + +#: admin/settings/general-settings.php:337 +msgid "" +"Switch ON and Save Changes to reset all custom setting are set for " +"individual item from Item Edit Page." +msgstr "" + +#: admin/settings/general-settings.php:338 +msgid "" +"Important Clear your cache after so that visitors see " +"changes." +msgstr "" + +#: admin/settings/general-settings.php:350 +msgid "Page Views Count Function" +msgstr "Функция Счетчика Просмотров Страниц" + +#: admin/settings/general-settings.php:363 +msgid "" +"There are 2 functions that you can use to manually add Page Views Count to " +"any content or post type that is created by your theme or plugin that " +"creates it's own table instead of using custom post types" +msgstr "" +"Есть 2 функции, которые можно использовать, чтобы вручную добавить Счетчик " +"Просмотров Страниц к любому содержанию или типу записей, которые были " +"созданы Вашей темой или плагином, который создает свою ​​собственную таблицу " +"вместо использования пользовательских типов записей" + +#: admin/settings/general-settings.php:366 +msgid "Single post, page, object" +msgstr "Отдельная запись, страница, объект" + +#: admin/settings/general-settings.php:368 +msgid "Increase Page Views Count and echo stats of this post" +msgstr "Увеличить Счетчик Просмотров Страниц и вывести статистику этой записи" + +#: admin/settings/general-settings.php:369 +msgid "Increase Page Views Count and return stats of this post" +msgstr "Увеличить Счетчик Просмотров Страниц и вернуть статистику этой записи" + +#: admin/settings/general-settings.php:372 +msgid "Index pages" +msgstr "Показатели страниц" + +#: admin/settings/general-settings.php:374 +msgid "Echo stats of this post" +msgstr "Вывод статистики этой записи" + +#: admin/settings/general-settings.php:375 +msgid "Return stats of this post" +msgstr "Возврат статистики этой записи" + +#: classes/class-pvc-metabox.php:15 +#, fuzzy +msgid "Page View Counter" +msgstr "Счетчик Просмотров Страниц" + +#: classes/class-pvc-metabox.php:76 +#, fuzzy +msgid "Activate on this item" +msgstr "Включить в Записях и на Страницах" + +#: classes/class-pvc-metabox.php:81 +msgid "All Time Views" +msgstr "" + +#: classes/class-pvc-metabox.php:85 +#, fuzzy +msgid "Today Views" +msgstr "просмотров всего" + +#: pvc_class.php:128 pvc_class.php:132 +msgid "total views" +msgstr "просмотров всего" + +#: pvc_class.php:128 +msgid "views today" +msgstr "просмотров сегодня" + +#: pvc_class.php:132 pvc_class.php:218 +msgid "no views today" +msgstr "сегодня нет просмотров" + +#: pvc_class.php:134 pvc_class.php:221 +msgid "No views yet" +msgstr "Еще нет просмотров" + +#: pvc_class.php:406 +#, fuzzy +msgid "Go to Support Forum" +msgstr "форум поддержки" + +#: pvc_class.php:412 +#, fuzzy +msgid "Free WordPress Plugins" +msgstr "Другие БЕСПЛАТНЫЕ a3rev WordPress Плагины" + +#: pvc_class.php:419 +msgid "Free WooCommerce Plugins" +msgstr "" + +#: pvc_class.php:426 +msgid "Is this plugin is just what you needed? If so" +msgstr "" + +#: pvc_class.php:427 +msgid "Submit Review for Plugin on WordPress" +msgstr "" + +#: pvc_class.php:434 +msgid "Connect with us via" +msgstr "" + +#: pvc_class.php:435 +msgid "a3rev Facebook" +msgstr "" + +#: pvc_class.php:436 +msgid "a3rev Twitter" +msgstr "" + +#: pvc_class.php:447 +msgid "Settings" +msgstr "Настройки" + +#: pvc_class.php:456 +msgid "Documentation" +msgstr "Документация" + +#: pvc_class.php:457 +msgid "Support" +msgstr "Поддержка" + +#~ msgid "Use this Image" +#~ msgstr "Использовать это Изображение" + +#~ msgid "Use as" +#~ msgstr "Использовать как" + +#~ msgid "Previously Uploaded" +#~ msgstr "Ранее Загруженное" + +#~ msgid "Settings inside this yellow border are %s Features." +#~ msgstr "Настройки внутри этой желтой рамки являются %s Характеристиками." + +#~ msgid "Help spread the Word about this plugin" +#~ msgstr "Помогите распространить информацию об этом плагине" + +#~ msgid "View this plugins" +#~ msgstr "Смотреть у этих плагинов" + +#~ msgid "documentation" +#~ msgstr "документацию" + +#~ msgid "Visit this plugins" +#~ msgstr "Посетить у этих плагинов" + +#~ msgid "a3 Responsive Slider" +#~ msgstr "a3 Отзывчивый Слайдер" + +#~ msgid "Contact Us page - Contact People" +#~ msgstr "Страница Связи с Нами - Связаться с Людьми" + +#~ msgid "WordPress Email Template" +#~ msgstr "WordPress Email Шаблон" + +#~ msgid "View all" +#~ msgstr "Смотреть все" + +#~ msgid "17 a3rev plugins" +#~ msgstr "17 a3rev плагинов" + +#~ msgid "on the WordPress repository" +#~ msgstr "на складе WordPress" diff --git a/languages/page-views-count.mo b/languages/page-views-count.mo new file mode 100755 index 0000000..50a63d2 Binary files /dev/null and b/languages/page-views-count.mo differ diff --git a/languages/page-views-count.po b/languages/page-views-count.po new file mode 100755 index 0000000..6a26eae --- /dev/null +++ b/languages/page-views-count.po @@ -0,0 +1,542 @@ +msgid "" +msgstr "" +"Project-Id-Version: Page Views Count\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-10 13:09+0700\n" +"PO-Revision-Date: 2015-12-10 13:09+0700\n" +"Last-Translator: Nguyen Cong Tuan \n" +"Language-Team: a3rev\n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Basepath: ../\n" +"X-Generator: Poedit 1.6.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: admin/admin-interface.php:171 +msgid "Great! You have the latest version installed." +msgstr "" + +#: admin/admin-interface.php:236 +msgid "Settings successfully saved." +msgstr "" + +#: admin/admin-interface.php:244 +msgid "Error: Settings can not save." +msgstr "" + +#: admin/admin-interface.php:252 +msgid "Settings successfully reseted." +msgstr "" + +#: admin/admin-interface.php:273 +msgid "Thin" +msgstr "" + +#: admin/admin-interface.php:274 +msgid "Thin/Italic" +msgstr "" + +#: admin/admin-interface.php:275 +msgid "Normal" +msgstr "" + +#: admin/admin-interface.php:276 +msgid "Italic" +msgstr "" + +#: admin/admin-interface.php:277 +msgid "Bold" +msgstr "" + +#: admin/admin-interface.php:278 +msgid "Bold/Italic" +msgstr "" + +#: admin/admin-interface.php:288 +msgid "Solid" +msgstr "" + +#: admin/admin-interface.php:289 +msgid "Double" +msgstr "" + +#: admin/admin-interface.php:290 +msgid "Dashed" +msgstr "" + +#: admin/admin-interface.php:291 +msgid "Dotted" +msgstr "" + +#: admin/admin-interface.php:292 +msgid "Groove" +msgstr "" + +#: admin/admin-interface.php:293 +msgid "Ridge" +msgstr "" + +#: admin/admin-interface.php:294 +msgid "Inset" +msgstr "" + +#: admin/admin-interface.php:295 +msgid "Outset" +msgstr "" + +#: admin/admin-interface.php:1539 admin/admin-interface.php:1625 +#: admin/admin-interface.php:1828 admin/admin-interface.php:1918 +#: admin/admin-interface.php:1947 admin/settings/general-settings.php:230 +#: admin/settings/general-settings.php:248 +#: admin/settings/general-settings.php:266 +#: admin/settings/general-settings.php:285 +#: admin/settings/general-settings.php:295 +#: admin/settings/general-settings.php:319 +#: admin/settings/general-settings.php:345 classes/class-pvc-metabox.php:73 +msgid "ON" +msgstr "" + +#: admin/admin-interface.php:1540 admin/admin-interface.php:1626 +#: admin/admin-interface.php:1829 admin/admin-interface.php:1919 +#: admin/admin-interface.php:1948 admin/settings/general-settings.php:231 +#: admin/settings/general-settings.php:249 +#: admin/settings/general-settings.php:267 +#: admin/settings/general-settings.php:286 +#: admin/settings/general-settings.php:296 +#: admin/settings/general-settings.php:320 +#: admin/settings/general-settings.php:346 classes/class-pvc-metabox.php:74 +msgid "OFF" +msgstr "" + +#: admin/admin-interface.php:1545 +msgid "Google Fonts API" +msgstr "" + +#: admin/admin-interface.php:1557 +msgid "" +"ON to connect to Google Fonts API and have auto font updates direct from " +"Google." +msgstr "" + +#: admin/admin-interface.php:1561 +#, php-format +msgid "" +"Enter your existing Google Fonts API Key below. Don't have a key? Visit Google Developer API to create a key" +msgstr "" + +#: admin/admin-interface.php:1578 +msgid "Google Fonts API Key" +msgstr "" + +#: admin/admin-interface.php:1581 +msgid "Your Google API Key is valid and automatic font updates are enabled." +msgstr "" + +#: admin/admin-interface.php:1582 +msgid "Please enter a valid Google API Key." +msgstr "" + +#: admin/admin-interface.php:1601 +msgid "Check New Version" +msgstr "" + +#: admin/admin-interface.php:1612 +msgid "Check Now" +msgstr "" + +#: admin/admin-interface.php:1631 +msgid "Open Box Display" +msgstr "" + +#: admin/admin-interface.php:1644 +msgid "" +"ON and each admin panel setting box OPEN | CLOSED position are saved each " +"time changes are SAVED." +msgstr "" + +#: admin/admin-interface.php:1983 +msgid "Width" +msgstr "" + +#: admin/admin-interface.php:1985 +msgid "Height" +msgstr "" + +#: admin/admin-interface.php:1987 +msgid "Hard Crop" +msgstr "" + +#: admin/admin-interface.php:2060 +msgid "-- Default Fonts --" +msgstr "" + +#: admin/admin-interface.php:2071 +msgid "-- Google Fonts --" +msgstr "" + +#: admin/admin-interface.php:2112 +msgid "Preview your customized typography settings" +msgstr "" + +#: admin/admin-interface.php:2221 admin/admin-interface.php:2455 +msgid "Preview your customized border settings" +msgstr "" + +#: admin/admin-interface.php:2230 admin/admin-interface.php:2446 +msgid "Rounded" +msgstr "" + +#: admin/admin-interface.php:2231 admin/admin-interface.php:2447 +msgid "Square" +msgstr "" + +#: admin/admin-interface.php:2241 admin/admin-interface.php:2460 +msgid "Top Left Corner" +msgstr "" + +#: admin/admin-interface.php:2261 admin/admin-interface.php:2480 +msgid "Top Right Corner" +msgstr "" + +#: admin/admin-interface.php:2281 admin/admin-interface.php:2500 +msgid "Bottom Right Corner" +msgstr "" + +#: admin/admin-interface.php:2301 admin/admin-interface.php:2520 +msgid "Bottom Left Corner" +msgstr "" + +#: admin/admin-interface.php:2388 +msgid "Preview your customized border styles settings" +msgstr "" + +#: admin/admin-interface.php:2571 +msgid "YES" +msgstr "" + +#: admin/admin-interface.php:2572 +msgid "NO" +msgstr "" + +#: admin/admin-interface.php:2586 +msgid "Horizontal Shadow" +msgstr "" + +#: admin/admin-interface.php:2604 +msgid "Vertical Shadow" +msgstr "" + +#: admin/admin-interface.php:2622 +msgid "Blur Distance" +msgstr "" + +#: admin/admin-interface.php:2640 +msgid "Spread Size" +msgstr "" + +#: admin/admin-interface.php:2658 +msgid "INNER" +msgstr "" + +#: admin/admin-interface.php:2659 +msgid "OUTER" +msgstr "" + +#: admin/admin-interface.php:2677 +msgid "Preview your customized box shadow settings" +msgstr "" + +#: admin/admin-interface.php:2940 +msgid "Save changes" +msgstr "" + +#: admin/admin-interface.php:2941 +msgid "Reset Settings" +msgstr "" + +#: admin/admin-pages/admin-pvc-page.php:63 +#: admin/admin-pages/admin-pvc-page.php:64 +msgid "Page Views Count" +msgstr "" + +#: admin/admin-ui.php:179 +#, php-format +msgid "" +"Advanced Settings - Upgrade to the %s " +"License to activate these settings." +msgstr "" + +#: admin/admin-ui.php:182 +msgid "Pro Version" +msgstr "" + +#: admin/admin-ui.php:232 admin/admin-ui.php:251 +msgid "You should check now to see if have any new version is available" +msgstr "" + +#: admin/admin-ui.php:234 +#, php-format +msgid "" +"Connection Failure! Please try again. If this issue persists please create a " +"support request on the plugin a3rev support " +"forum." +msgstr "" + +#: admin/admin-ui.php:242 +#, php-format +msgid "" +"There is a new version %s " +"available, update now or download " +"direct from My Account on a3rev.com" +msgstr "" + +#: admin/includes/uploader/class-uploader.php:95 +msgid "Upload" +msgstr "" + +#: admin/includes/uploader/class-uploader.php:115 +msgid "View File" +msgstr "" + +#: admin/settings/general-settings.php:81 +msgid "Page View Count Settings successfully saved." +msgstr "" + +#: admin/settings/general-settings.php:82 +msgid "Error: Page View Count Settings can not save." +msgstr "" + +#: admin/settings/general-settings.php:83 +msgid "Page View Count Settings successfully reseted." +msgstr "" + +#: admin/settings/general-settings.php:158 admin/tabs/admin-pvc-tab.php:78 +msgid "General" +msgstr "" + +#: admin/settings/general-settings.php:202 +msgid "Plugin Framework Global Settings" +msgstr "" + +#: admin/settings/general-settings.php:209 +msgid "Customize Admin Setting Box Display" +msgstr "" + +#: admin/settings/general-settings.php:210 +msgid "" +"By default each admin panel will open with all Setting Boxes in the CLOSED " +"position." +msgstr "" + +#: admin/settings/general-settings.php:217 +msgid "House Keeping" +msgstr "" + +#: admin/settings/general-settings.php:221 +msgid "Clean up on Deletion" +msgstr "" + +#: admin/settings/general-settings.php:222 +msgid "" +"On deletion (not deactivate) the plugin will completely remove all tables " +"and data it created, leaving no trace it was ever here." +msgstr "" + +#: admin/settings/general-settings.php:235 +msgid "Page Views Count Load" +msgstr "" + +#: admin/settings/general-settings.php:241 +msgid "Ajax Load" +msgstr "" + +#: admin/settings/general-settings.php:242 +msgid "" +"ON to load page views counter on front end by ajax event (recommended). " +"Prevents caching plugins and CDNs from caching the count. If using caching " +"you must clear the cache to see changes after turning this setting ON or OFF." +msgstr "" + +#: admin/settings/general-settings.php:253 +msgid "Page Views Count for Excerpt Content" +msgstr "" + +#: admin/settings/general-settings.php:259 +msgid "Show on Excerpt Content" +msgstr "" + +#: admin/settings/general-settings.php:260 +msgid "" +"ON to show page views counter on the Excerpt Content ( Archives, Homepage, " +"Frontpage, Category pages )." +msgstr "" + +#: admin/settings/general-settings.php:271 +msgid "Activate on Posts and Pages" +msgstr "" + +#: admin/settings/general-settings.php:273 +msgid "" +"The settings below apply to all posts and pages on your site. You can switch " +"the counter ON or OFF from the Page View Counter Meta box on each post or " +"page edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:278 +msgid "Posts" +msgstr "" + +#: admin/settings/general-settings.php:279 +msgid "All posts including posts extracts on category and tags Archives" +msgstr "" + +#: admin/settings/general-settings.php:289 +msgid "Pages" +msgstr "" + +#: admin/settings/general-settings.php:305 +msgid "Activate on these Custom Post Types" +msgstr "" + +#: admin/settings/general-settings.php:307 +msgid "" +"The settings below apply to these custom post types on your site. You can " +"switch the counter ON or OFF from the Page View Counter Meta box on each " +"custom post edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:330 +msgid "Activation Reset" +msgstr "" + +#: admin/settings/general-settings.php:336 +msgid "Reset All Individual Items" +msgstr "" + +#: admin/settings/general-settings.php:337 +msgid "" +"Switch ON and Save Changes to reset all custom setting are set for " +"individual item from Item Edit Page." +msgstr "" + +#: admin/settings/general-settings.php:338 +msgid "" +"Important Clear your cache after so that visitors see " +"changes." +msgstr "" + +#: admin/settings/general-settings.php:350 +msgid "Page Views Count Function" +msgstr "" + +#: admin/settings/general-settings.php:363 +msgid "" +"There are 2 functions that you can use to manually add Page Views Count to " +"any content or post type that is created by your theme or plugin that " +"creates it's own table instead of using custom post types" +msgstr "" + +#: admin/settings/general-settings.php:366 +msgid "Single post, page, object" +msgstr "" + +#: admin/settings/general-settings.php:368 +msgid "Increase Page Views Count and echo stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:369 +msgid "Increase Page Views Count and return stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:372 +msgid "Index pages" +msgstr "" + +#: admin/settings/general-settings.php:374 +msgid "Echo stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:375 +msgid "Return stats of this post" +msgstr "" + +#: classes/class-pvc-metabox.php:15 +msgid "Page View Counter" +msgstr "" + +#: classes/class-pvc-metabox.php:76 +msgid "Activate on this item" +msgstr "" + +#: classes/class-pvc-metabox.php:81 +msgid "All Time Views" +msgstr "" + +#: classes/class-pvc-metabox.php:85 +msgid "Today Views" +msgstr "" + +#: pvc_class.php:128 pvc_class.php:132 +msgid "total views" +msgstr "" + +#: pvc_class.php:128 +msgid "views today" +msgstr "" + +#: pvc_class.php:132 pvc_class.php:218 +msgid "no views today" +msgstr "" + +#: pvc_class.php:134 pvc_class.php:221 +msgid "No views yet" +msgstr "" + +#: pvc_class.php:406 +msgid "Go to Support Forum" +msgstr "" + +#: pvc_class.php:412 +msgid "Free WordPress Plugins" +msgstr "" + +#: pvc_class.php:419 +msgid "Free WooCommerce Plugins" +msgstr "" + +#: pvc_class.php:426 +msgid "Is this plugin is just what you needed? If so" +msgstr "" + +#: pvc_class.php:427 +msgid "Submit Review for Plugin on WordPress" +msgstr "" + +#: pvc_class.php:434 +msgid "Connect with us via" +msgstr "" + +#: pvc_class.php:435 +msgid "a3rev Facebook" +msgstr "" + +#: pvc_class.php:436 +msgid "a3rev Twitter" +msgstr "" + +#: pvc_class.php:447 +msgid "Settings" +msgstr "" + +#: pvc_class.php:456 +msgid "Documentation" +msgstr "" + +#: pvc_class.php:457 +msgid "Support" +msgstr "" diff --git a/languages/page-views-count.pot b/languages/page-views-count.pot new file mode 100644 index 0000000..6a26eae --- /dev/null +++ b/languages/page-views-count.pot @@ -0,0 +1,542 @@ +msgid "" +msgstr "" +"Project-Id-Version: Page Views Count\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-10 13:09+0700\n" +"PO-Revision-Date: 2015-12-10 13:09+0700\n" +"Last-Translator: Nguyen Cong Tuan \n" +"Language-Team: a3rev\n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Basepath: ../\n" +"X-Generator: Poedit 1.6.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: admin/admin-interface.php:171 +msgid "Great! You have the latest version installed." +msgstr "" + +#: admin/admin-interface.php:236 +msgid "Settings successfully saved." +msgstr "" + +#: admin/admin-interface.php:244 +msgid "Error: Settings can not save." +msgstr "" + +#: admin/admin-interface.php:252 +msgid "Settings successfully reseted." +msgstr "" + +#: admin/admin-interface.php:273 +msgid "Thin" +msgstr "" + +#: admin/admin-interface.php:274 +msgid "Thin/Italic" +msgstr "" + +#: admin/admin-interface.php:275 +msgid "Normal" +msgstr "" + +#: admin/admin-interface.php:276 +msgid "Italic" +msgstr "" + +#: admin/admin-interface.php:277 +msgid "Bold" +msgstr "" + +#: admin/admin-interface.php:278 +msgid "Bold/Italic" +msgstr "" + +#: admin/admin-interface.php:288 +msgid "Solid" +msgstr "" + +#: admin/admin-interface.php:289 +msgid "Double" +msgstr "" + +#: admin/admin-interface.php:290 +msgid "Dashed" +msgstr "" + +#: admin/admin-interface.php:291 +msgid "Dotted" +msgstr "" + +#: admin/admin-interface.php:292 +msgid "Groove" +msgstr "" + +#: admin/admin-interface.php:293 +msgid "Ridge" +msgstr "" + +#: admin/admin-interface.php:294 +msgid "Inset" +msgstr "" + +#: admin/admin-interface.php:295 +msgid "Outset" +msgstr "" + +#: admin/admin-interface.php:1539 admin/admin-interface.php:1625 +#: admin/admin-interface.php:1828 admin/admin-interface.php:1918 +#: admin/admin-interface.php:1947 admin/settings/general-settings.php:230 +#: admin/settings/general-settings.php:248 +#: admin/settings/general-settings.php:266 +#: admin/settings/general-settings.php:285 +#: admin/settings/general-settings.php:295 +#: admin/settings/general-settings.php:319 +#: admin/settings/general-settings.php:345 classes/class-pvc-metabox.php:73 +msgid "ON" +msgstr "" + +#: admin/admin-interface.php:1540 admin/admin-interface.php:1626 +#: admin/admin-interface.php:1829 admin/admin-interface.php:1919 +#: admin/admin-interface.php:1948 admin/settings/general-settings.php:231 +#: admin/settings/general-settings.php:249 +#: admin/settings/general-settings.php:267 +#: admin/settings/general-settings.php:286 +#: admin/settings/general-settings.php:296 +#: admin/settings/general-settings.php:320 +#: admin/settings/general-settings.php:346 classes/class-pvc-metabox.php:74 +msgid "OFF" +msgstr "" + +#: admin/admin-interface.php:1545 +msgid "Google Fonts API" +msgstr "" + +#: admin/admin-interface.php:1557 +msgid "" +"ON to connect to Google Fonts API and have auto font updates direct from " +"Google." +msgstr "" + +#: admin/admin-interface.php:1561 +#, php-format +msgid "" +"Enter your existing Google Fonts API Key below. Don't have a key? Visit Google Developer API to create a key" +msgstr "" + +#: admin/admin-interface.php:1578 +msgid "Google Fonts API Key" +msgstr "" + +#: admin/admin-interface.php:1581 +msgid "Your Google API Key is valid and automatic font updates are enabled." +msgstr "" + +#: admin/admin-interface.php:1582 +msgid "Please enter a valid Google API Key." +msgstr "" + +#: admin/admin-interface.php:1601 +msgid "Check New Version" +msgstr "" + +#: admin/admin-interface.php:1612 +msgid "Check Now" +msgstr "" + +#: admin/admin-interface.php:1631 +msgid "Open Box Display" +msgstr "" + +#: admin/admin-interface.php:1644 +msgid "" +"ON and each admin panel setting box OPEN | CLOSED position are saved each " +"time changes are SAVED." +msgstr "" + +#: admin/admin-interface.php:1983 +msgid "Width" +msgstr "" + +#: admin/admin-interface.php:1985 +msgid "Height" +msgstr "" + +#: admin/admin-interface.php:1987 +msgid "Hard Crop" +msgstr "" + +#: admin/admin-interface.php:2060 +msgid "-- Default Fonts --" +msgstr "" + +#: admin/admin-interface.php:2071 +msgid "-- Google Fonts --" +msgstr "" + +#: admin/admin-interface.php:2112 +msgid "Preview your customized typography settings" +msgstr "" + +#: admin/admin-interface.php:2221 admin/admin-interface.php:2455 +msgid "Preview your customized border settings" +msgstr "" + +#: admin/admin-interface.php:2230 admin/admin-interface.php:2446 +msgid "Rounded" +msgstr "" + +#: admin/admin-interface.php:2231 admin/admin-interface.php:2447 +msgid "Square" +msgstr "" + +#: admin/admin-interface.php:2241 admin/admin-interface.php:2460 +msgid "Top Left Corner" +msgstr "" + +#: admin/admin-interface.php:2261 admin/admin-interface.php:2480 +msgid "Top Right Corner" +msgstr "" + +#: admin/admin-interface.php:2281 admin/admin-interface.php:2500 +msgid "Bottom Right Corner" +msgstr "" + +#: admin/admin-interface.php:2301 admin/admin-interface.php:2520 +msgid "Bottom Left Corner" +msgstr "" + +#: admin/admin-interface.php:2388 +msgid "Preview your customized border styles settings" +msgstr "" + +#: admin/admin-interface.php:2571 +msgid "YES" +msgstr "" + +#: admin/admin-interface.php:2572 +msgid "NO" +msgstr "" + +#: admin/admin-interface.php:2586 +msgid "Horizontal Shadow" +msgstr "" + +#: admin/admin-interface.php:2604 +msgid "Vertical Shadow" +msgstr "" + +#: admin/admin-interface.php:2622 +msgid "Blur Distance" +msgstr "" + +#: admin/admin-interface.php:2640 +msgid "Spread Size" +msgstr "" + +#: admin/admin-interface.php:2658 +msgid "INNER" +msgstr "" + +#: admin/admin-interface.php:2659 +msgid "OUTER" +msgstr "" + +#: admin/admin-interface.php:2677 +msgid "Preview your customized box shadow settings" +msgstr "" + +#: admin/admin-interface.php:2940 +msgid "Save changes" +msgstr "" + +#: admin/admin-interface.php:2941 +msgid "Reset Settings" +msgstr "" + +#: admin/admin-pages/admin-pvc-page.php:63 +#: admin/admin-pages/admin-pvc-page.php:64 +msgid "Page Views Count" +msgstr "" + +#: admin/admin-ui.php:179 +#, php-format +msgid "" +"Advanced Settings - Upgrade to the %s " +"License to activate these settings." +msgstr "" + +#: admin/admin-ui.php:182 +msgid "Pro Version" +msgstr "" + +#: admin/admin-ui.php:232 admin/admin-ui.php:251 +msgid "You should check now to see if have any new version is available" +msgstr "" + +#: admin/admin-ui.php:234 +#, php-format +msgid "" +"Connection Failure! Please try again. If this issue persists please create a " +"support request on the plugin a3rev support " +"forum." +msgstr "" + +#: admin/admin-ui.php:242 +#, php-format +msgid "" +"There is a new version %s " +"available, update now or download " +"direct from My Account on a3rev.com" +msgstr "" + +#: admin/includes/uploader/class-uploader.php:95 +msgid "Upload" +msgstr "" + +#: admin/includes/uploader/class-uploader.php:115 +msgid "View File" +msgstr "" + +#: admin/settings/general-settings.php:81 +msgid "Page View Count Settings successfully saved." +msgstr "" + +#: admin/settings/general-settings.php:82 +msgid "Error: Page View Count Settings can not save." +msgstr "" + +#: admin/settings/general-settings.php:83 +msgid "Page View Count Settings successfully reseted." +msgstr "" + +#: admin/settings/general-settings.php:158 admin/tabs/admin-pvc-tab.php:78 +msgid "General" +msgstr "" + +#: admin/settings/general-settings.php:202 +msgid "Plugin Framework Global Settings" +msgstr "" + +#: admin/settings/general-settings.php:209 +msgid "Customize Admin Setting Box Display" +msgstr "" + +#: admin/settings/general-settings.php:210 +msgid "" +"By default each admin panel will open with all Setting Boxes in the CLOSED " +"position." +msgstr "" + +#: admin/settings/general-settings.php:217 +msgid "House Keeping" +msgstr "" + +#: admin/settings/general-settings.php:221 +msgid "Clean up on Deletion" +msgstr "" + +#: admin/settings/general-settings.php:222 +msgid "" +"On deletion (not deactivate) the plugin will completely remove all tables " +"and data it created, leaving no trace it was ever here." +msgstr "" + +#: admin/settings/general-settings.php:235 +msgid "Page Views Count Load" +msgstr "" + +#: admin/settings/general-settings.php:241 +msgid "Ajax Load" +msgstr "" + +#: admin/settings/general-settings.php:242 +msgid "" +"ON to load page views counter on front end by ajax event (recommended). " +"Prevents caching plugins and CDNs from caching the count. If using caching " +"you must clear the cache to see changes after turning this setting ON or OFF." +msgstr "" + +#: admin/settings/general-settings.php:253 +msgid "Page Views Count for Excerpt Content" +msgstr "" + +#: admin/settings/general-settings.php:259 +msgid "Show on Excerpt Content" +msgstr "" + +#: admin/settings/general-settings.php:260 +msgid "" +"ON to show page views counter on the Excerpt Content ( Archives, Homepage, " +"Frontpage, Category pages )." +msgstr "" + +#: admin/settings/general-settings.php:271 +msgid "Activate on Posts and Pages" +msgstr "" + +#: admin/settings/general-settings.php:273 +msgid "" +"The settings below apply to all posts and pages on your site. You can switch " +"the counter ON or OFF from the Page View Counter Meta box on each post or " +"page edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:278 +msgid "Posts" +msgstr "" + +#: admin/settings/general-settings.php:279 +msgid "All posts including posts extracts on category and tags Archives" +msgstr "" + +#: admin/settings/general-settings.php:289 +msgid "Pages" +msgstr "" + +#: admin/settings/general-settings.php:305 +msgid "Activate on these Custom Post Types" +msgstr "" + +#: admin/settings/general-settings.php:307 +msgid "" +"The settings below apply to these custom post types on your site. You can " +"switch the counter ON or OFF from the Page View Counter Meta box on each " +"custom post edit page as well as manually set / reset the count values." +msgstr "" + +#: admin/settings/general-settings.php:330 +msgid "Activation Reset" +msgstr "" + +#: admin/settings/general-settings.php:336 +msgid "Reset All Individual Items" +msgstr "" + +#: admin/settings/general-settings.php:337 +msgid "" +"Switch ON and Save Changes to reset all custom setting are set for " +"individual item from Item Edit Page." +msgstr "" + +#: admin/settings/general-settings.php:338 +msgid "" +"Important Clear your cache after so that visitors see " +"changes." +msgstr "" + +#: admin/settings/general-settings.php:350 +msgid "Page Views Count Function" +msgstr "" + +#: admin/settings/general-settings.php:363 +msgid "" +"There are 2 functions that you can use to manually add Page Views Count to " +"any content or post type that is created by your theme or plugin that " +"creates it's own table instead of using custom post types" +msgstr "" + +#: admin/settings/general-settings.php:366 +msgid "Single post, page, object" +msgstr "" + +#: admin/settings/general-settings.php:368 +msgid "Increase Page Views Count and echo stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:369 +msgid "Increase Page Views Count and return stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:372 +msgid "Index pages" +msgstr "" + +#: admin/settings/general-settings.php:374 +msgid "Echo stats of this post" +msgstr "" + +#: admin/settings/general-settings.php:375 +msgid "Return stats of this post" +msgstr "" + +#: classes/class-pvc-metabox.php:15 +msgid "Page View Counter" +msgstr "" + +#: classes/class-pvc-metabox.php:76 +msgid "Activate on this item" +msgstr "" + +#: classes/class-pvc-metabox.php:81 +msgid "All Time Views" +msgstr "" + +#: classes/class-pvc-metabox.php:85 +msgid "Today Views" +msgstr "" + +#: pvc_class.php:128 pvc_class.php:132 +msgid "total views" +msgstr "" + +#: pvc_class.php:128 +msgid "views today" +msgstr "" + +#: pvc_class.php:132 pvc_class.php:218 +msgid "no views today" +msgstr "" + +#: pvc_class.php:134 pvc_class.php:221 +msgid "No views yet" +msgstr "" + +#: pvc_class.php:406 +msgid "Go to Support Forum" +msgstr "" + +#: pvc_class.php:412 +msgid "Free WordPress Plugins" +msgstr "" + +#: pvc_class.php:419 +msgid "Free WooCommerce Plugins" +msgstr "" + +#: pvc_class.php:426 +msgid "Is this plugin is just what you needed? If so" +msgstr "" + +#: pvc_class.php:427 +msgid "Submit Review for Plugin on WordPress" +msgstr "" + +#: pvc_class.php:434 +msgid "Connect with us via" +msgstr "" + +#: pvc_class.php:435 +msgid "a3rev Facebook" +msgstr "" + +#: pvc_class.php:436 +msgid "a3rev Twitter" +msgstr "" + +#: pvc_class.php:447 +msgid "Settings" +msgstr "" + +#: pvc_class.php:456 +msgid "Documentation" +msgstr "" + +#: pvc_class.php:457 +msgid "Support" +msgstr "" diff --git a/page-views-count.php b/page-views-count.php new file mode 100755 index 0000000..7703c37 --- /dev/null +++ b/page-views-count.php @@ -0,0 +1,71 @@ + + diff --git a/pvc_class.php b/pvc_class.php new file mode 100755 index 0000000..28f0764 --- /dev/null +++ b/pvc_class.php @@ -0,0 +1,501 @@ +prefix . "pvc_total CHANGE `postnum` `postnum` VARCHAR( 255 ) NOT NULL"; + $wpdb->query($sql); + + $sql = "ALTER TABLE ". $wpdb->prefix . "pvc_daily CHANGE `postnum` `postnum` VARCHAR( 255 ) NOT NULL"; + $wpdb->query($sql); + } + public static function install_database(){ + global $wpdb; + $collate = ''; + if ( $wpdb->has_cap( 'collation' ) ) { + if ( !empty($wpdb->charset) ) $collate = "DEFAULT CHARACTER SET $wpdb->charset"; + if ( !empty($wpdb->collate) ) $collate .= " COLLATE $wpdb->collate"; + } + + $sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "pvc_daily" ." ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `time` date DEFAULT '0000-00-00' NOT NULL, + `postnum` varchar(255) NOT NULL, + `postcount` int DEFAULT '0' NOT NULL, + UNIQUE KEY id (id)) $collate;"; + + $wpdb->query($sql); + + + $sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "pvc_total" ." ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `postnum` varchar(255) NOT NULL, + `postcount` int DEFAULT '0' NOT NULL, + UNIQUE KEY id (id)) $collate;"; + + $wpdb->query($sql); + } + + public static function pvc_fetch_posts_stats( $post_ids ) { + global $wpdb; + $nowisnow = date('Y-m-d'); + + if ( !is_array( $post_ids ) ) $post_ids = array( $post_ids ); + + $sql = $wpdb->prepare( "SELECT t.postnum AS post_id, t.postcount AS total, d.postcount AS today FROM ". $wpdb->prefix . "pvc_total AS t + LEFT JOIN ". $wpdb->prefix . "pvc_daily AS d ON t.postnum = d.postnum + WHERE t.postnum IN ( ".implode( ',', $post_ids )." ) AND d.time = %s", $nowisnow ); + return $wpdb->get_results($sql); + } + + public static function pvc_fetch_post_counts( $post_id ) { + global $wpdb; + $nowisnow = date('Y-m-d'); + + $sql = $wpdb->prepare( "SELECT t.postcount AS total, d.postcount AS today FROM ". $wpdb->prefix . "pvc_total AS t + LEFT JOIN ". $wpdb->prefix . "pvc_daily AS d ON t.postnum = d.postnum + WHERE t.postnum = %s AND d.time = %s", $post_id, $nowisnow ); + return $wpdb->get_row($sql); + } + + public static function pvc_fetch_post_total( $post_id ) { + global $wpdb; + + $sql = $wpdb->prepare( "SELECT t.postcount AS total FROM ". $wpdb->prefix . "pvc_total AS t + WHERE t.postnum = %s", $post_id ); + return $wpdb->get_var($sql); + } + + public static function pvc_stats_update($post_id) { + global $wpdb; + + // get the local time based off WordPress setting + $nowisnow = date('Y-m-d'); + + // first try and update the existing total post counter + $results = $wpdb->query( $wpdb->prepare( "UPDATE ". $wpdb->prefix . "pvc_total SET postcount = postcount+1 WHERE postnum = '%s' LIMIT 1", $post_id ) ); + + // if it doesn't exist, then insert two new records + // one in the total views, another in today's views + if ($results == 0) { + $wpdb->query( $wpdb->prepare( "INSERT INTO ". $wpdb->prefix . "pvc_total (postnum, postcount) VALUES ('%s', 1)", $post_id ) ); + $wpdb->query( $wpdb->prepare ( "INSERT INTO ". $wpdb->prefix . "pvc_daily (time, postnum, postcount) VALUES ('%s', '%s', 1)", $nowisnow, $post_id ) ); + // post exists so let's just update the counter + } else { + $results2 = $wpdb->query( $wpdb->prepare ( "UPDATE ". $wpdb->prefix . "pvc_daily SET postcount = postcount+1 WHERE time = '%s' AND postnum = '%s' LIMIT 1", $nowisnow, $post_id ) ); + // insert a new record since one hasn't been created for current day + if ($results2 == 0) + $wpdb->query( $wpdb->prepare( "INSERT INTO ". $wpdb->prefix . "pvc_daily (time, postnum, postcount) VALUES ('%s', '%s', 1)", $nowisnow, $post_id ) ); + } + + // get all the post view info so we can update meta fields + //$row = A3_PVC::pvc_fetch_post_counts( $post_id ); + } + + public static function pvc_stats_manual_update( $post_id, $new_total_views, $new_today_views ) { + global $wpdb; + + // get the local time based off WordPress setting + $nowisnow = date('Y-m-d'); + + // if it doesn't exist, then insert new record + // one in the total views + if ( '1' != $wpdb->get_var( $wpdb->prepare( "SELECT EXISTS( SELECT 1 FROM ". $wpdb->prefix . "pvc_total WHERE postnum = %s LIMIT 0, 1 )", $post_id ) ) ) { + $wpdb->query( $wpdb->prepare( "INSERT INTO ". $wpdb->prefix . "pvc_total ( postnum, postcount ) VALUES ( %s, %d )", $post_id, $new_total_views ) ); + // post exists so let's just update the counter + } else { + $wpdb->query( $wpdb->prepare( "UPDATE ". $wpdb->prefix . "pvc_total SET postcount = %d WHERE postnum = %s LIMIT 1", $new_total_views, $post_id ) ); + } + + // if it doesn't exist, then insert new record + // one in today's views + if ( '1' != $wpdb->get_var( $wpdb->prepare( "SELECT EXISTS( SELECT 1 FROM ". $wpdb->prefix . "pvc_daily WHERE time = %s AND postnum = %s LIMIT 0, 1 )", $nowisnow, $post_id ) ) ) { + $wpdb->query( $wpdb->prepare ( "INSERT INTO ". $wpdb->prefix . "pvc_daily ( time, postnum, postcount ) VALUES ( %s, %s, %d )", $nowisnow, $post_id, $new_today_views ) ); + // post exists so let's just update the counter + } else { + $wpdb->query( $wpdb->prepare ( "UPDATE ". $wpdb->prefix . "pvc_daily SET postcount = %d WHERE time = %s AND postnum = %s LIMIT 1", $new_today_views, $nowisnow, $post_id ) ); + } + } + + public static function pvc_get_stats($post_id) { + global $wpdb; + + $output_html = ''; + // get all the post view info to display + $results = A3_PVC::pvc_fetch_post_counts( $post_id ); + // get the stats and + if ( $results ){ + $output_html .= number_format( $results->total ) . ' ' .__('total views', 'page-views-count') . ', ' . number_format( $results->today ) . ' ' .__('views today', 'page-views-count'); + } else { + $total = A3_PVC::pvc_fetch_post_total( $post_id ); + if ( $total > 0 ) { + $output_html .= number_format( $total ) . ' ' .__('total views', 'page-views-count') . ', ' .__('no views today', 'page-views-count'); + } else { + $output_html .= __('No views yet', 'page-views-count'); + } + } + $output_html = apply_filters( 'pvc_filter_get_stats', $output_html, $post_id ); + + return $output_html; + } + + // get the total page views and daily page views for the post + public static function pvc_stats_counter( $post_id, $increase_views = false ) { + global $wpdb; + global $pvc_settings; + + $load_by_ajax_update_class = ''; + if ( $increase_views ) $load_by_ajax_update_class = 'pvc_load_by_ajax_update'; + + // get the stats and + $html = '
          '; + + if ( $pvc_settings['enable_ajax_load'] == 'yes' ) { + $stats_html = '

          '; + } else { + $stats_html = '

          ' . A3_PVC::pvc_get_stats( $post_id ) . '

          '; + } + + $html .= apply_filters( 'pvc_filter_stats', $stats_html, $post_id ); + $html .= '
          '; + return $html; + } + + public static function pvc_backbone_load_stats() { + $post_ids = $_REQUEST['post_ids']; + + $data = array(); + $ids = array(); + if ( is_array( $post_ids ) && count( $post_ids ) > 0 ) { + foreach ( $post_ids as $post_id => $post_data ) { + $ids[] = $post_id; + if ( isset( $post_data['ask_update'] ) && $post_data['ask_update'] == 'true' ) { + A3_PVC::pvc_stats_update( $post_id ); + } + } + $results = A3_PVC::pvc_fetch_posts_stats( $ids ); + if ( $results ) { + foreach( $results as $result ) { + $data[$result->post_id] = array ( + 'post_id' => (int) $result->post_id, + 'total_view' => (int) $result->total, + 'today_view' => (int) $result->today + ); + $ids = array_diff( $ids, array( $result->post_id ) ); + } + } + + foreach ( $ids as $post_id ) { + $total = A3_PVC::pvc_fetch_post_total( $post_id ); + $data[$post_id] = array ( + 'post_id' => (int) $post_id, + 'total_view' => (int) $total, + 'today_view' => 0 + ); + } + } + header( 'Content-Type: application/json', true, 200 ); + die( json_encode( $data ) ); + } + + public static function register_plugin_scripts() { + global $pvc_settings; + + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; + + wp_enqueue_style( 'a3-pvc-style', A3_PVC_CSS_URL . '/style'.$suffix.'.css', false, A3_PVC_VERSION ); + + if ( $pvc_settings['enable_ajax_load'] != 'yes' ) return; + + ?> + + + admin_url( 'admin-ajax.php' ) ) ); + } + + public static function fixed_wordpress_seo_plugin( $ogdesc = '' ) { + if ( function_exists( 'wpseo_set_value' ) ) { + global $post; + $postid = $post->ID; + wpseo_set_value( 'opengraph-description', $ogdesc, $postid ); + } + return $ogdesc; + } + + public static function pvc_remove_stats($content) { + remove_action('the_content', array('A3_PVC','pvc_stats_show')); + return $content; + } + + public static function pvc_stats_show($content){ + remove_action('loop_end', array('A3_PVC', 'pvc_stats_echo')); + remove_action('genesis_after_post_content', array('A3_PVC', 'genesis_pvc_stats_echo')); + global $post; + if ( ! $post ) return; + + $args=array( + 'public' => true, + '_builtin' => false + ); + $output = 'names'; // names or objects, note names is the default + $operator = 'and'; // 'and' or 'or' + $post_types = get_post_types($args, $output, $operator ); + + global $pvc_settings; + if ( empty( $pvc_settings ) ) { + $pvc_settings = get_option('pvc_settings', array() ); + } + + if ( self::pvc_is_activated( $post->ID ) ) { + if ( is_singular() || is_singular( $post_types ) ) { + if ( ! isset( $pvc_settings['enable_ajax_load'] ) || $pvc_settings['enable_ajax_load'] != 'yes' ) { + A3_PVC::pvc_stats_update($post->ID); + } + $content .= A3_PVC::pvc_stats_counter($post->ID, true ); + } else { + $content .= A3_PVC::pvc_stats_counter($post->ID); + } + } + return $content; + } + + public static function excerpt_pvc_stats_show($excerpt){ + remove_action('loop_end', array('A3_PVC', 'pvc_stats_echo')); + remove_action('genesis_after_post_content', array('A3_PVC', 'genesis_pvc_stats_echo')); + global $post; + if ( ! $post ) return; + global $pvc_settings; + if ( empty( $pvc_settings ) ) { + $pvc_settings = get_option('pvc_settings', array() ); + } + if ( self::pvc_is_activated( $post->ID ) && 'no' != $pvc_settings['show_on_excerpt_content'] ) { + $excerpt .= A3_PVC::pvc_stats_counter($post->ID); + } + return $excerpt; + } + + public static function pvc_stats_echo(){ + global $post; + global $pvc_settings; + if ( empty( $pvc_settings ) ) { + $pvc_settings = get_option('pvc_settings', array() ); + } + if ( self::pvc_is_activated( $post->ID ) && 'no' != $pvc_settings['show_on_excerpt_content'] ) { + echo A3_PVC::pvc_stats_counter($post->ID); + } + } + + public static function genesis_pvc_stats_echo(){ + remove_action('loop_end', array('A3_PVC', 'pvc_stats_echo')); + global $post; + global $pvc_settings; + if ( empty( $pvc_settings ) ) { + $pvc_settings = get_option('pvc_settings', array() ); + } + if ( self::pvc_is_activated( $post->ID ) && 'no' != $pvc_settings['show_on_excerpt_content'] ) { + echo A3_PVC::pvc_stats_counter($post->ID); + } + } + + public static function custom_stats_echo($postid=0, $have_echo = 1){ + if($have_echo == 1) + echo A3_PVC::pvc_stats_counter($postid); + else + return A3_PVC::pvc_stats_counter($postid); + } + + public static function custom_stats_update_echo($postid=0, $have_echo=1){ + $output = ''; + global $pvc_settings; + if ( empty( $pvc_settings ) ) { + $pvc_settings = get_option('pvc_settings', array() ); + } + if ( ! isset( $pvc_settings['enable_ajax_load'] ) || $pvc_settings['enable_ajax_load'] != 'yes' ) { + A3_PVC::pvc_stats_update($postid); + } + + $output .= A3_PVC::pvc_stats_counter($postid, true ); + + if ( $have_echo == 1 ) + echo $output; + else + return $output; + } + + public static function pvc_is_activated( $post_id = 0 ) { + if ( 0 == $post_id || '' == trim( $post_id ) ) { + global $post; + if ( $post ) { + $post_id = $post->ID; + } else { + return false; + } + } + + global $pvc_settings; + if ( empty( $pvc_settings ) ) { + $pvc_settings = get_option( 'pvc_settings', array() ); + } + + // Don't show counter on homepage, frontpage, archive page if admin deactivate for excerpt + if( 'no' == $pvc_settings['show_on_excerpt_content'] && ( is_home() || is_front_page() || is_archive() || is_tax() ) ) { + return false; + } + + $is_acticvated = self::pvc_admin_is_activated( $post_id ); + + return $is_acticvated; + } + + public static function pvc_admin_is_activated( $post_id = 0 ) { + if ( $post_id < 0 ) { + return false; + } + + $post_type = get_post_type( $post_id ); + if ( false == $post_type ) { + return false; + } + + $is_activated = get_post_meta( $post_id, '_a3_pvc_activated', true ); + if ( empty( $is_activated ) ) { + global $pvc_settings; + if ( empty( $pvc_settings ) ) { + $pvc_settings = get_option( 'pvc_settings', array() ); + } + if ( isset( $pvc_settings['post_types'] ) && in_array( $post_type, (array) $pvc_settings['post_types'] ) ) { + return true; + } else { + return false; + } + } else { + if ( 'true' == $is_activated ) { + return true; + } else { + return false; + } + } + + return false; + } + + public static function pvc_reset_individual_items() { + global $wpdb; + $wpdb->query( "DELETE FROM ".$wpdb->postmeta." WHERE meta_key='_a3_pvc_activated' " ); + } + + public static function a3_wp_admin() { + wp_enqueue_style( 'a3rev-wp-admin-style', A3_PVC_CSS_URL . '/a3_wp_admin.css' ); + } + + public static function plugin_extension_box( $boxes = array() ) { + $support_box = ''; + $boxes[] = array( + 'content' => $support_box, + 'css' => 'border: none; padding: 0; background: none;' + ); + + $first_box = ''; + + $boxes[] = array( + 'content' => $first_box, + 'css' => 'border: none; padding: 0; background: none;' + ); + + $second_box = ''; + + $boxes[] = array( + 'content' => $second_box, + 'css' => 'border: none; padding: 0; background: none;' + ); + + $third_box = '
          ' . __('Is this plugin is just what you needed? If so', 'page-views-count') . '
          '; + $third_box .= ''; + + $boxes[] = array( + 'content' => $third_box, + 'css' => 'border: none; padding: 0; background: none;' + ); + + $four_box = '
          ' . __('Connect with us via','page-views-count') . '
          '; + $four_box .= ' '; + $four_box .= ''; + + $boxes[] = array( + 'content' => $four_box, + 'css' => 'border-color: #3a5795;' + ); + + return $boxes; + } + + public static function settings_plugin_links($actions) { + $actions = array_merge( array( 'settings' => '' . __( 'Settings', 'page-views-count' ) . '' ), $actions ); + + return $actions; + } + + public static function plugin_extra_links($links, $plugin_name) { + if ( $plugin_name != A3_PVC_PLUGIN_NAME) { + return $links; + } + $links[] = ''.__('Documentation', 'page-views-count').''; + $links[] = ''.__('Support', 'page-views-count').''; + return $links; + } +} + +if ( 'responsi' === get_template() ) { + remove_filter('the_content', array( + 'A3_PVC', + 'pvc_stats_show' + ), 8); + remove_filter('the_excerpt', array( + 'A3_PVC', + 'excerpt_pvc_stats_show' + ), 8); + remove_action('wp_head', 'add_view_count_for_theme'); + add_action('wp_head', 'add_view_count_for_theme'); + + if (!function_exists('add_view_count_for_theme')) { + function add_view_count_for_theme() + { + remove_filter('the_content', array('A3_PVC','pvc_stats_show'), 8); + remove_filter('the_excerpt', array('A3_PVC','excerpt_pvc_stats_show'), 8); + if ( !is_admin() && !is_home() ) { + add_action('responsi_loop_after', 'add_view_count', 30); + } + } + } + if (!function_exists('add_view_count')) { + function add_view_count() + { + $postid = get_the_ID(); + $html = ''; + $class = ''; + if (!is_single() && !is_page() && !is_404()) { + $class = ' custom_box'; + } + if (function_exists('pvc_check_exclude') && pvc_check_exclude()) + return ''; + + if (function_exists('pvc_stats_update')) + $html .= '
          ' . pvc_stats_update($postid, 0) . '
          '; + echo $html; + } + } +} +?> \ No newline at end of file diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..81f3271 --- /dev/null +++ b/readme.txt @@ -0,0 +1,326 @@ +=== Page View Count === +Contributors: a3rev, nguyencongtuan +Tags: wordpress page view, page view count , post views, postview count, +Requires at least: 3.8 +Tested up to: 4.5 +Stable tag: 1.4.0 +License: GPLv3 +License URI: http://www.gnu.org/licenses/gpl-3.0.html + +Places an icon, all time views count and views today count at the bottom of posts, pages and custom post types on any Wordpress website. + +== Description == + +Page Views Count does 2 things - beautifully + +1. On the front end it adds an icon and page views count to the bottom of pages and posts on your WordPress website. + +2. On the back end via check boxes you can apply or hide Page Views Count on all Posts, Pages and all custom posts types including WooCommerce and WP e-Commerce custom post types. + + += Why we built it = + +We built this plugin and use this plugin because we think its is very good visual feedback for site users and site admins about the all time popularity and visits that day of individual posts and pages on any Wordpress website. + += Functions = + +Using the 2 functions the plugin provides that allows you to manually add view counts to any content or object in your theme. This is very useful if your theme or a plugin creates content that does not use custom post type. Also useful if you want to change the position of the Page View Count from the default bottom of the page. Support for echo and return parameters when getting visitor stats on any variable. + += Featuring Sass (Simply Awesome Stylesheets) = + +* All the front end style display is created via Sass for faster loader and render. +* Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. +* This plugins backend admin panel are created in Sass. + + += Featuring backbone.js = + +* All front end functions build with backbone.js +* Will add full automatic integration with WordPress JSON RESTful API when it is released. + += Mobile Responsive App style admin interface = + +* 100% compatible with WordPress v4.0 admin interface. +* Backward compatibility to WordPress v3.8 +* Sass app style admin interface. +* Admin app interface is fully mobile and tablet responsive. + += Localization = + +If you do a translation for your site please send it to us and we'll include it in the plugins language folder and credit you here with the translation and a link to your site. + +* English (default) - always included. +* Dutch - thanks to [Renee Klein](http://wpdiscounts.com) +* Italian - thanks to [Antonio Petricca](http://www.gvmprotezionecivile.it) +* Indonesian - thanks to [Ridha Harwan](https://tarjiem.com/ ) +* Russian +* .pot file (page-views-count.pot) in languages folder for translations. +* [Go here](http://a3rev.com/contact-us-page/) to send your translation files to us. + += Documentation & Support = + +If you require support first of all please view the plugins docs on the a3rev wiki. [Click Here to view](http://docs.a3rev.com/user-guides/page-view-count/) If you don't find the information you are looking for - THEN please post your support request under the support tab here on this page. If the Page View Count gadget does not show on any page or post it will be because the theme you are using does not use the WordPress Codex not because the plugin does not work. + +PLEASE do not give the plugin a bad star rating - its the theme you are using not the plugin. Instead post about it on the support forum and we will have a look at it for you. + +== Installation == + += Minimum Requirements = + +* WordPress 3.8 +* PHP version 5.2.4 or greater +* MySQL version 5.0 or greater + += Automatic installation = + +Automatic installation is the easiest option as WordPress handles the file transfers itself and you don't even need to leave your web browser. To do an automatic install of Page Views Count, log in to your WordPress admin panel, navigate to the Plugins menu and click Add New. + +In the search field type "Page Views Count" and click Search Plugins. Once you have found our plugin you can install it by simply clicking Install Now. After clicking that link you will be asked if you are sure you want to install the plugin. Click yes and WordPress will automatically complete the installation. + += Manual installation = + +The manual installation method involves down loading our plugin and uploading it to your web server via your favorite FTP application. + +1. Download the plugin file to your computer and unzip it +2. Using an FTP program, or your hosting control panel, upload the unzipped plugin folder to your WordPress installations wp-content/plugins/ directory. +3. Activate the plugin from the Plugins menu within the WordPress admin. + + +== Screenshots == + +1. Page Views Count is added to the bottom of posts and pages +2. Page Views Count simple admin panel. + + +== Usage == + +1. Install and activate the plugin + +2. Go to Settings > Page View Count + +3. Select which post and page types you want the Page View Count to show on. + +4. Have fun. + +== Frequently Asked Questions == + + +== Changelog == + += 1.4.0 - 2016/04/15 = +* Feature - Define new 'Background Color' type on plugin framework with ON | OFF switch to disable background or enable it +* Feature - Define new function - hextorgb() - for convert hex color to rgb color on plugin framework +* Feature - Define new function - generate_background_color_css() - for export background style code on plugin framework that is used to make custom style +* Tweak - Register fontawesome in plugin framework with style name is 'font-awesome-styles' +* Tweak - Saved the time number into database for one time customize style and Save change on the Plugin Settings +* Tweak - Replace version number by time number for dynamic style file are generated by Sass to solve the issue get cache file on CDN server +* Tweak - Update core style and script of plugin framework for support Background Color type +* Tweak - Update plugin framework to latest version +* Tweak - Tested for full compatibility with WordPress major version 4.5 + += 1.3.2 - 2015/12/10 = +* Tweak - Upgrade media uploader to New UI of WordPress media uploader with WordPress Backbone and Underscore +* Tweak - Update the uploader script to save the Attachment ID and work with New Uploader +* Tweak - Updated a3 Plugin Framework to the latest version +* Tweak - Tested for full compatibility with WordPress major version 4.4 + += 1.3.1 - 2015/11/27 = +* Fix - Don't include the script and styles from plugin framework on Post, Page Edit to fix the conflict with TinyMCE +* Fix - Don't convert the total views to number format so they can save into the database when edit total views + += 1.3.0 - 2015/10/14 = +* Feature - Add Page View Counter meta box on post, pages and custom post edit pages. +* Feature - Switch Counter ON or OFF from the new meta box controller, individually from the global settings +* Feature - Set and edit the All Total Views and Today Views for each item from the new View Counter meta box +* Feature - Add new feature for show Counter from the Excerpt Content, this option support for admin to turn the Counter ON or OFF for the homepage, Front Page, archives page, category pages +* Tweak - Change Text Domain of plugin to Plugin slug +* Tweak - Added Text Domain and Domain Path to the plugin header +* Tweak - Change file name of languages files inside /laguages/ folder from 'pvc' to 'page-views-count', so if you have make your language file then just simple rename file from 'pvc.mo' to 'page-views-count.mo' +* Tweak - Tested for full compatibility with WordPress version 4.3.1 + += 1.2.1 - 2015/08/22 = +* Tweak - include new CSSMin lib from https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port into plugin framework instead of old CSSMin lib from http://code.google.com/p/cssmin/ , to avoid conflict with plugins or themes that have CSSMin lib +* Tweak - make __construct() function for 'Compile_Less_Sass' class instead of using a method with the same name as the class for compatibility on WP 4.3 and is deprecated on PHP4 +* Tweak - change class name from 'lessc' to 'a3_lessc' so that it does not conflict with plugins or themes that have another Lessc lib +* Tweak - Plugin Framework DB query optimization. Refactored settings_get_option call for dynamic style elements, example typography, border, border_styles, border_corner, box_shadow +* Tweak - Tested for full compatibility with WordPress major version 4.3.0 +* Fix - Update the plugin framework for setup correct default settings on first installed +* Fix - Update the plugin framework for reset to correct default settings when hit on 'Reset Settings' button on each settings tab + += 1.2.0 - 2015/06/18 = +* Feature - Plugin framework Mobile First focus upgrade +* Feature - Massive improvement in admin UI and UX in PC, tablet and mobile browsers +* Feature - Introducing opening and closing Setting Boxes on admin panels. +* Feature - Added Plugin Framework Customization settings. Control how the admin panel settings show when editing. +* Feature - Added a 260px wide images to the right sidebar for support forum link, Documentation links. +* Feature - Added full support for Right to Left RTL layout on plugins admin dashboard. +* Fix - Check 'request_filesystem_credentials' function, if it does not exists then require the core php lib file from WP where it is defined + += 1.1.0 - 2015/06/03 = +* Tweak - Security Hardening. Removed all php file_put_contents functions in the plugin framework and replace with the WP_Filesystem API +* Tweak - Security Hardening. Removed all php file_get_contents functions in the plugin framework and replace with the WP_Filesystem API +* Fix - Update dynamic stylesheet url in uploads folder to the format //domain.com/ so it's always is correct when loaded as http or https + += 1.0.9 - 2015/05/30 = +* Tweak - Tested and Tweaked for full compatibility with WordPress Version 4.2.2 +* Localization - Italian translation by Antonio Petricca. +* Localization - Indonesian translation by [Ridha Harwan](https://tarjiem.com/). + += 1.0.8 - 2015/04/21 = +* Tweak - Tested and Tweaked for full compatibility with WordPress Version 4.2.0 +* Tweak - Update style of plugin framework. Removed the [data-icon] selector to prevent conflict with other plugins that have font awesome icons + += 1.0.7 = +* Feature - Next step in full conversion of plugin to backbone.js and Sass - full admin panel conversion from CSS to Sass. + += 1.0.6.4 - 2014/09/13 = +* Tweak - Added WordPress plugin icon. +* Fix - Changed __DIR__ to dirname( __FILE__ ) for Sass script so that on some server __DIR__ is not defined + += 1.0.6.3 - 2014/09/10 = +* Tweak - Updated google font face in plugin framework. +* Tweak - Tested 100% compatible with WordPress Version 4.0 +* Fix - Use correct variable $postid instead of $post->ID for 'custom_stats_update_echo()' function to fix the problem don't auto increase total view for use template tag '' + += 1.0.6.2 - 2014/07/22 = +* Fix - Add missed style when disable AJAX load for view counts + += 1.0.6.1 - 2014/07/22 = +* Fix - Add missed style for class .pvc_clear in Sass + += 1.0.6 - 2014/07/21 = +* Feature - Beginning of conversion of the plugin to backbone.js and Sass +* Feature - Loads superfast on frontend with substantially less calls to the server making it very lightweight and super fast. +* Feature - On Category extract pages plugin now only calls once to admin-ajax.php regardless of how many extract view counts are shown. +* Feature - Upgrade Page View Count front end count and load function to backbone.js +* Feature - Upgraded plugins front end CSS to Sass. + += 1.0.5 - 2014/06/27 = +* Feature - Added load Counter on front end by Ajax option to prevent count being cached by caching plugins. +* Tweak - added ajax event 'pvc_ajax_load_stats' and trigger $("body").trigger("pvc_stats_loaded_" + pvc_object_id ); for that event +* Tweak - added ajax event 'pvc_ajax_update_stats' and trigger $("body").trigger("pvc_stats_updated_" + post_id ); for that event +* Tweak - use $wpdb->prepare() for all sql command for security +* Tweak - Updated chosen js script to latest version 1.1.0 on the a3rev Plugin Framework +* Tweak - Added support for placeholder feature for input, email , password , text area types. +* Tweak - Added Russiian translation thanks to [Renat Nurlyev](http://kluchkuspexu.ru/) + += 1.0.4.3 - 2014/05/26 = +* Tweak - Changed add_filter( 'gettext', array( $this, 'change_button_text' ), null, 2 ); to add_filter( 'gettext', array( $this, 'change_button_text' ), null, 3 ); +* Tweak - Update change_button_text() function from ( $original == 'Insert into Post' ) to ( is_admin() && $original === 'Insert into Post' ) +* Tweak - Checked and updated for full compatibility with WordPress version 3.9.1 +* Tweak - Updated plugins description text and admin panel yellow sidebar text. +* Tweak - Updated Framework help text font for consistency. +* Tweak - Added remove_all_filters('mce_external_plugins'); before call to wp_editor to remove extension scripts from other plugins. +* Tweak - Full WP_DEBUG ran, all uncaught exceptions, errors, warnings, notices and php strict standard notices fixed. +* Tweak - Added PHP Public Static to functions in Class. Done so that Public Static warnings don't show in DE_BUG mode. +* Fix - Code tweaks to fix a3 Plugins Framework conflict with WP e-Commerce tax rates. + += 1.0.4.2 - 2013/12/24 = +* Feature - a3rev Plugin Framework admin interface upgraded to 100% Compatibility with WordPress v3.8.0 with backward compatibility. +* Feature - Feature - a3rev framework 100% mobile and tablet responsive, portrait and landscape viewing. +* Feature - Added option of return parameter to existing echo for getting page view stats on any variable. +* Tweak - Upgraded dashboard switches to Vector based display that shows when WordPress version 3.8.0 is activated. +* Tweak - Tweak - Upgraded all plugin .jpg icons and images to Vector based display for full compatibility with new WordPress version. +* Tweak - Admin panel Yellow sidebar not show in Mobile screens to optimize admin panel screen space. +* Tweak - Tested 100% compatible with WP 3.8.0 +* Fix - Upgraded array_textareas type for Padding, Margin settings on the a3rev plugin framework. + += 1.0.4.1 - 2013/10/14 = +* Tweak - Fixed typos on admin panel. +* Fix - Conflict with new version of WordPress SEO plugin causing duplicate page counts - add_filter( 'wpseo_opengraph_desc', array( 'A3_PVC', 'fixed_wordpress_seo_plugin' ) ); +* Fix - Updated Plugin Admin Framework by added array_map( array( $this, 'admin_stripslashes' ) , $current_settings ) to strip slashes on value when show on frontend +* Translation - Added Dutch translation thanks to Renee Klein + += 1.0.4 - 2013/10/10 = +* Tweak - a3rev logo image now resizes to the size of the yellow sidebar in tablets and mobiles. +* Fix - Intuitive Radio Switch settings not saving. Input with disabled attribute could not parse when form is submitted, replace disabled with custom attribute: checkbox-disabled +* Fix - App interface Radio switches not working properly on Android platform, replace removeProp() with removeAttr() function script + += 1.0.3 - 2013/10/05 = +* Feature - Upgraded the plugin to the newly developed a3rev admin panel app interface. +* Feature - New admin UI features check boxes replaced by switches. +* Fix - Plugins admin script and style not loading in Firefox with SSL on admin. Stripped http// and https// protocols so browser will use the protocol that the page was loaded with. + += 1.0.2 - 2013/08/28 = +* Feature - Major performance enhancement. All Time Views table data emptied each day on 24 hour cron. +* Featue - Added House Keeping function to settings. Clean up on Deletion. Option - Choose if you ever delete this plugin it will completely remove all tables and data it has created. +* Tweak - Plugin in code tested fully compatible with WordPress v3.6.0 +* Tweak - Ran full WP_DEBUG All Uncaught exceptions errors and warnings fixed. +* Tweak - Added PHP Public Static to functions in Class. Done so that PHP Public Static warnings don't show in WP_DEBUG mode. +* Tweak - Added when install and activate plugin link redirects to the plugins dashboard instead of the wp-plugins dashboard. +* Tweak - Updated plugins support forum link to the wordpress support forum. + += 1.0.1 - 2013/01/10 = +* Tweak - Updated Support and Pro Version link URL's on wordpress.org description, plugins and plugins dashboard. Links were returning 404 errors since the launch of the all new a3rev.com mobile responsive site as the base e-commerce permalinks is changed. + += 1.0.0 - 2012/12/20 = +* First Release. + + +== Upgrade Notice == + += 1.4.0 = +Feature Upgrade. 3 new features, 5 tweaks for full compatibility with WordPress major version 4.5 + += 1.3.2 = +Maintenance update. Tweaks for full compatibility with WordPress major version 4.4 + += 1.3.1 = +Maintenance Update. 2 bug fixes for conflict with TinyMCE and WordPress editor conflict + += 1.3.0 = +Major Feature Upgrade. 3 much requested new features (see the changelog) plus 3 tweaks to plugins text domains - Note if you have a translation you need to chnage the .mo file name (see changelog) + += 1.2.1 = +Major Maintenance Upgrade. 5 Code Tweaks plus 2 bug fixes for full compatibility with WordPress v 4.3.0 + += 1.2.0 = +Major Feature Upgrade. Massive admin panel UI and UX upgrade. Includes 6 new features plus 1 bug fix + += 1.1.0 = +Important Maintenance Upgrade. 2 x major a3rev Plugin Framework Security Hardening Tweaks plus 1 https bug fix + += 1.0.9 = +Maintenance upgrade. Code tweaks for full compatibility with WordPress 4.2.2 and Italian, Indonesian translations. + += 1.0.8 = +Maintenance upgrade. Code tweaks for full compatibility with WordPress 4.2.0 + += 1.0.7 = +Upgrade now for full admin panel conversion from CSS to Sass + += 1.0.6.4 = +Upgrade now for 1 Sass bug fix + += 1.0.6.3 = +Update you plugin now for 1 framework code tweak plus 1 bug fix and full compatibility with WordPress Version 4.0 + += 1.0.6.2 = +Upgrade now for a bug fix for missed style when disable AJAX load view counts in version release 1.0.6.1. + += 1.0.6.1 = +Upgrade now for a bug fix for Sass in yesterday’s major version release 1.0.6. + += 1.0.6 = +Upgrade now for the beginning of conversion of plugin to backbone.js and Sass. Much faster front-end load and less calls on server. + += 1.0.5 = +Update now for new feature - load counter by Ajax event plus security hardening and 2 framework code tweaks and Russian translation. + += 1.0.4.3 = +Upgrade now for full compatoibility with WordPress Version 3.9.1, 8 code tweaks and 1 bug fix. + += 1.0.4.2 = +Upgrade now for full a3rev Plugin Framework compatibility with WordPress version 3.8.0 and backwards. New admin interface full mobile and tablet responsive display. + += 1.0.4.1 = +Update you plugin now for 2 bug fixes - especially important to upgrade now if you use the WordPress SEO plugin. + += 1.0.4 = +Upgrade now for another admin panel intuitive app interface feature plus a Radio switch bug fix and Android platform bug fix + += 1.0.3 = +Upgrade you plugin now for the all new a3rev admin panel app type interface and a protocols in browser bug fix + += 1.0.2 = +Important upgrade - please update your plugin now for a major performance enhancement. diff --git a/uninstall.php b/uninstall.php new file mode 100755 index 0000000..8ac2143 --- /dev/null +++ b/uninstall.php @@ -0,0 +1,34 @@ +query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'pvc_total'); + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'pvc_daily'); + + $wpdb->query( "DELETE FROM ".$wpdb->postmeta." WHERE meta_key='_a3_pvc_activated' " ); +} \ No newline at end of file
          +

          <?php pvc_stats_update( $postid, 1 ); ?>

          +

          <?php pvc_stats_update( $postid, 0 ); ?>

          +

          <?php pvc_stats( $postid, 1 ); ?>

          +

          <?php pvc_stats( $postid, 0 ); ?>

          +