Added PhotoSwipe plugin. PhotoSwipe and Gallery captions plugins are activated by default.
This commit is contained in:
parent
057cd17dd2
commit
1ba31cf0a1
@ -28,5 +28,7 @@ $fp_plugins = array(
|
|||||||
'readmore',
|
'readmore',
|
||||||
'favicon',
|
'favicon',
|
||||||
'commentcenter',
|
'commentcenter',
|
||||||
'mediamanager'
|
'mediamanager',
|
||||||
|
'gallerycaptions',
|
||||||
|
'photoswipe'
|
||||||
);
|
);
|
674
fp-plugins/photoswipe/gpl-3.0.txt
Normal file
674
fp-plugins/photoswipe/gpl-3.0.txt
Normal file
@ -0,0 +1,674 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
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.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
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
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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
|
||||||
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
13
fp-plugins/photoswipe/lang/lang.de-de.php
Normal file
13
fp-plugins/photoswipe/lang/lang.de-de.php
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
// Phrases for the frontend
|
||||||
|
$lang ['plugin'] ['photoswipe'] = array(
|
||||||
|
'tooltip_closebutton' => 'Schließen (Esc)',
|
||||||
|
'tooltip_sharebutton' => 'Teilen',
|
||||||
|
'tooltip_fullscreenbutton' => 'Vollbildansicht',
|
||||||
|
'tooltip_zoombutton' => 'Zoom',
|
||||||
|
'tooltip_autoplaybutton' => 'Slideshow starten',
|
||||||
|
'tooltip_prevbutton' => 'Voriges Bild (Pfeiltaste links)',
|
||||||
|
'tooltip_nextbutton' => 'Nächstes Bild (Pfeiltaste rechts)',
|
||||||
|
'label_gallerydoesntexist' => 'Galerie existiert nicht:',
|
||||||
|
'label_imagedoesntexist' => 'Bild existiert nicht:'
|
||||||
|
);
|
13
fp-plugins/photoswipe/lang/lang.en-us.php
Normal file
13
fp-plugins/photoswipe/lang/lang.en-us.php
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
// Phrases for the frontend
|
||||||
|
$lang ['plugin'] ['photoswipe'] = array(
|
||||||
|
'tooltip_closebutton' => 'Close (Esc key)',
|
||||||
|
'tooltip_sharebutton' => 'Share',
|
||||||
|
'tooltip_fullscreenbutton' => 'Full screen',
|
||||||
|
'tooltip_zoombutton' => 'Zoom',
|
||||||
|
'tooltip_autoplaybutton' => 'Start slide show',
|
||||||
|
'tooltip_prevbutton' => 'Previous image (left key)',
|
||||||
|
'tooltip_nextbutton' => 'Next image (right key)',
|
||||||
|
'label_gallerydoesntexist' => 'Gallery does not exist:',
|
||||||
|
'label_imagedoesntexist' => 'Image does not exist:'
|
||||||
|
);
|
303
fp-plugins/photoswipe/photoswipefunctions.class.php
Normal file
303
fp-plugins/photoswipe/photoswipefunctions.class.php
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static functions for the plugin.
|
||||||
|
*/
|
||||||
|
class PhotoSwipeFunctions {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class-wide flag that the PhotoSwipe overlay UI has already been initialized
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private static $photoswipeUiIsInitialized = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class-wide index counter for the shown images
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private static $lastusedDataIndex = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback function called for [img] tags which returns the HTML code for a single PhotoSwipe image.
|
||||||
|
*
|
||||||
|
* @param string $action
|
||||||
|
* @param array $attr
|
||||||
|
* the attributes given in the tag
|
||||||
|
* @param string $content
|
||||||
|
* @param array $params
|
||||||
|
* @param string $node_object
|
||||||
|
* @return boolean|string the HTML code for a single PhotoSwipe image
|
||||||
|
*/
|
||||||
|
static function getImageHtml($action, $attr, $content, $params, $node_object) {
|
||||||
|
global $lang;
|
||||||
|
|
||||||
|
if ($action == 'validate') {
|
||||||
|
// not used for now
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the name of the image - and its relative path
|
||||||
|
$img = $attr ['default'];
|
||||||
|
|
||||||
|
// sanitize first
|
||||||
|
if (strpos($img, '..') !== false) {
|
||||||
|
return $lang ['plugin'] ['photoswipe'] ['label_imagedoesntexist'];
|
||||||
|
}
|
||||||
|
$imgPathRel = 'fp-content/' . $img;
|
||||||
|
$imgUrl = BLOG_BASEURL . 'fp-content/' . $img;
|
||||||
|
|
||||||
|
// check if dir exists
|
||||||
|
if (!file_exists($imgPathRel)) {
|
||||||
|
return $lang ['plugin'] ['photoswipe'] ['label_imagedoesntexist'] . ' ' . $img;
|
||||||
|
}
|
||||||
|
|
||||||
|
// image title will be its file name - or the title from the tag attributes, if given
|
||||||
|
$title = isset($attr ['title']) ? $attr ['title'] : '';
|
||||||
|
// for usage in HTML attributes, we need to remove quotes and HTML tags from the title
|
||||||
|
$titleForAttributes = isset($attr ['title']) ? htmlentities(strip_tags($attr ['title'])) : '';
|
||||||
|
|
||||||
|
// image may float, according the the given float attribute
|
||||||
|
$float = ' class="thumbnail nofloat" ';
|
||||||
|
if (isset($attr ['float'])) {
|
||||||
|
$float = ' class="thumbnail float' . $attr ['float'] . '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
// to get the HTML code for preview image, we use the Flatpress standard function do_bbcode_img()
|
||||||
|
$attr ['title'] = $titleForAttributes;
|
||||||
|
$previewHtml = do_bbcode_img(null, $attr, null, null, null);
|
||||||
|
// but: we don't need the popup link surrounding the resulting <img> tag
|
||||||
|
$matches = null;
|
||||||
|
preg_match('/<img[^>]*/u', $previewHtml, $matches);
|
||||||
|
$previewHtml = $matches [0];
|
||||||
|
if ($previewHtml [strlen($previewHtml) - 1] === '/') {
|
||||||
|
$previewHtml = substr($previewHtml, 0, strlen($previewHtml) - 1);
|
||||||
|
}
|
||||||
|
// add some additional attributes to the <img> tag and close it properly
|
||||||
|
$previewHtml .= ' itemprop="thumbnail" title="' . $titleForAttributes . '">';
|
||||||
|
|
||||||
|
// PhotoSwipe needs to know the dimensions of the image - so we read them
|
||||||
|
$imgsize = getimagesize($imgPathRel);
|
||||||
|
|
||||||
|
// now lets assemble the whole HTML code - including the overlay HTML, if not inserted into the DOM before
|
||||||
|
$imgHtml = self::getPhotoSwipeOverlay() . //
|
||||||
|
'<div class="photoswipe">
|
||||||
|
<figure ' . //
|
||||||
|
'itemprop="associatedMedia" ' . //
|
||||||
|
'itemscope ' . //
|
||||||
|
'itemtype="http://schema.org/ImageObject" ' . //
|
||||||
|
'data-index="' . self::$lastusedDataIndex . '" ' . //
|
||||||
|
$float . ' ' . //
|
||||||
|
'>' . //
|
||||||
|
'<a ' . //
|
||||||
|
'href="' . $imgUrl . '" ' . //
|
||||||
|
'itemprop="contentUrl" ' . //
|
||||||
|
'data-size="' . $imgsize [0] . 'x' . $imgsize [1] . '" ' . //
|
||||||
|
'data-index="' . self::$lastusedDataIndex . '" ' . //
|
||||||
|
'title="' . htmlentities($title) . '" ' . //
|
||||||
|
'>' . //
|
||||||
|
$previewHtml . //
|
||||||
|
'</a>' . //
|
||||||
|
'<figcaption>' . $title . '</figcaption>' . //
|
||||||
|
'</figure>' . //
|
||||||
|
'</div>';
|
||||||
|
|
||||||
|
self::$lastusedDataIndex++;
|
||||||
|
return $imgHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback function called for [gallery] tags which returns the HTML code for a PhotoSwipe gallery.
|
||||||
|
*
|
||||||
|
* @param string $action
|
||||||
|
* @param array $attr
|
||||||
|
* the attributes given in the tag
|
||||||
|
* @param string $content
|
||||||
|
* @param array $params
|
||||||
|
* @param string $node_object
|
||||||
|
* @return boolean|string the HTML code for a PhotoSwipe gallery
|
||||||
|
*/
|
||||||
|
static function getGalleryHtml($action, $attr, $content, $params, $node_object) {
|
||||||
|
global $lang;
|
||||||
|
if ($action == 'validate') {
|
||||||
|
// not used for now
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// gallery dir is set as tag attribute
|
||||||
|
$dir = $attr ['default'];
|
||||||
|
|
||||||
|
// sanitize first
|
||||||
|
if (strpos($dir, '..') !== false) {
|
||||||
|
return $lang ['plugin'] ['photoswipe'] ['label_gallerydoesntexist'];
|
||||||
|
}
|
||||||
|
// check if dir exists
|
||||||
|
if (!file_exists("fp-content/" . $dir)) {
|
||||||
|
return $lang ['plugin'] ['photoswipe'] ['label_gallerydoesntexist'] . ' ' . $dir;
|
||||||
|
}
|
||||||
|
// force slash at the end
|
||||||
|
if (substr($dir, -1) != '/') {
|
||||||
|
$dir .= '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
// read images from gallery directory
|
||||||
|
$imagefiles = gallery_read_images($dir);
|
||||||
|
|
||||||
|
// read image caption from captions file (if existant in the gallery directory)
|
||||||
|
$captions = gallery_read_captions($dir);
|
||||||
|
|
||||||
|
// call getImageHtml() to get the image's HTML code for each image in the gallery dir
|
||||||
|
$imgattr = $attr;
|
||||||
|
$str = '<div class="img-gallery ' . sanitize_title($dir) . '">';
|
||||||
|
foreach ($imagefiles as $f) {
|
||||||
|
// set the image's caption as title attribut of the img tag
|
||||||
|
$imgattr ['default'] = $dir . $f;
|
||||||
|
$imgattr ['title'] = array_key_exists($f, $captions) ? $captions [$f] : '';
|
||||||
|
$str .= self::getImageHtml($action, $imgattr, $content, $params, $node_object);
|
||||||
|
}
|
||||||
|
return $str . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the overlay HTML.
|
||||||
|
* This needs to be inserted into the DOM only once, so a second call will return an empty string.
|
||||||
|
*
|
||||||
|
* @return string the PhotoSwipe overlay HTML
|
||||||
|
*/
|
||||||
|
static function getPhotoSwipeOverlay() {
|
||||||
|
global $lang;
|
||||||
|
|
||||||
|
$photoswipeoverlay = self::$photoswipeUiIsInitialized ? '' : '<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">' . //
|
||||||
|
'<div class="pswp__bg"></div>' . //
|
||||||
|
'<div class="pswp__scroll-wrap">' . //
|
||||||
|
'<div class="pswp__container">' . //
|
||||||
|
'<div class="pswp__item"></div>' . //
|
||||||
|
'<div class="pswp__item"></div>' . //
|
||||||
|
'<div class="pswp__item">' . //
|
||||||
|
'</div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'<div class="pswp__ui pswp__ui--hidden">' . //
|
||||||
|
'<div class="pswp__top-bar">' . //
|
||||||
|
'<div class="pswp__counter"></div>' . //
|
||||||
|
'<button class="pswp__button pswp__button--close" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_closebutton'] . '"></button>' . //
|
||||||
|
'<button class="pswp__button pswp__button--share" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_sharebutton'] . '"></button>' . //
|
||||||
|
'<button class="pswp__button pswp__button--fs" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_fullscreenbutton'] . '"></button>' . //
|
||||||
|
'<button class="pswp__button pswp__button--zoom" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_zoombutton'] . '"></button>' . //
|
||||||
|
'<div class="pswp__preloader">' . //
|
||||||
|
'<div class="pswp__preloader__icn">' . //
|
||||||
|
'<div class="pswp__preloader__cut">' . //
|
||||||
|
'<div class="pswp__preloader__donut"></div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">' . //
|
||||||
|
'<div class="pswp__share-tooltip"></div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'<button class="pswp__button pswp__button--arrow--left" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_prevbutton'] . '"></button>' . //
|
||||||
|
'<button class="pswp__button pswp__button--arrow--right" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_nextbutton'] . '"></button>' . //
|
||||||
|
'<div class="pswp__caption">' . //
|
||||||
|
'<div class="pswp__caption__center"></div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'</div>' . //
|
||||||
|
'</div>';
|
||||||
|
self::$photoswipeUiIsInitialized = true;
|
||||||
|
return $photoswipeoverlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Header hook for loading the PhotoSwipe scripts.
|
||||||
|
* Echoes the <script> tags.
|
||||||
|
*/
|
||||||
|
static function echoScriptTags() {
|
||||||
|
$pdir = plugin_geturl('photoswipe');
|
||||||
|
echo '<!-- PhotoSwipe -->
|
||||||
|
';
|
||||||
|
if (!function_exists('plugin_jquery_head')) {
|
||||||
|
echo '<script src="' . $pdir . 'res/jquery-2.2.2/jquery-2.2.2.min.js"></script>
|
||||||
|
';
|
||||||
|
}
|
||||||
|
echo '
|
||||||
|
<script src="' . $pdir . 'res/photoswipe-4.1.1/photoswipe-ui-default.min.js"></script>
|
||||||
|
<script src="' . $pdir . 'res/photoswipe-4.1.1/photoswipe.min.js"></script>
|
||||||
|
<scripst src="' . $pdir . 'res/photoswipe.js.php">
|
||||||
|
<script>';
|
||||||
|
include_once (dirname(__FILE__) . '/res/photoswipe.js.php');
|
||||||
|
echo '
|
||||||
|
</script>
|
||||||
|
<link rel="stylesheet" property="stylesheet" href="' . $pdir . 'res/photoswipe-4.1.1/default-skin/default-skin.css">
|
||||||
|
<link media="screen" href="' . $pdir . 'res/photoswipe-4.1.1/photoswipe.css" type="text/css" rel="stylesheet">
|
||||||
|
<!-- /PhotoSwipe -->';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the BBCode tags of the plugin.
|
||||||
|
*/
|
||||||
|
public static function initializePluginTags() {
|
||||||
|
// At first: check if BBCode plugin is active
|
||||||
|
if (!function_exists('plugin_bbcode_init')) {
|
||||||
|
// if not, there's no use in adding any bbcode tags :)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the global bbcode object
|
||||||
|
$bbcode = plugin_bbcode_init();
|
||||||
|
|
||||||
|
// gallery tags
|
||||||
|
$supportedGalleryTags = array(
|
||||||
|
'gallery', // default tag
|
||||||
|
'photoswipegallery' // legacy tag - maintaining compatibility with plugin versions <= 1.1
|
||||||
|
);
|
||||||
|
foreach ($supportedGalleryTags as $tag) {
|
||||||
|
// add gallery tag
|
||||||
|
$bbcode->addCode($tag, // tag name: this will go between square brackets
|
||||||
|
'callback_replace_single', // type of action: we'll use a callback function
|
||||||
|
'PhotoSwipeFunctions::getGalleryHtml', // name of the callback function
|
||||||
|
array(
|
||||||
|
'usecontent_param' => array(
|
||||||
|
'default'
|
||||||
|
)
|
||||||
|
), // supported parameters: "default" is [acronym=valore]
|
||||||
|
'inline', // type of the tag, inline or block, etc
|
||||||
|
array(
|
||||||
|
'listitem',
|
||||||
|
'block',
|
||||||
|
'inline',
|
||||||
|
'link'
|
||||||
|
), // type of elements in which you can use this tag
|
||||||
|
array()); // type of elements where this tag CAN'T go (in this case, none, so it can go everywhere)
|
||||||
|
$bbcode->setCodeFlag($tag, 'closetag', BBCODE_CLOSETAG_FORBIDDEN); // a closing tag is forbidden (no [/tag])
|
||||||
|
}
|
||||||
|
|
||||||
|
// single image tags
|
||||||
|
$supportedImageTags = array(
|
||||||
|
'img', // default tag
|
||||||
|
'photoswipeimage' // legacy tag - maintaining compatibility with plugin versions <= 1.1
|
||||||
|
);
|
||||||
|
foreach ($supportedImageTags as $tag) {
|
||||||
|
// at first: remove tag to make sure it will be overridden
|
||||||
|
$bbcode->removeCode($tag);
|
||||||
|
// add image tag
|
||||||
|
$bbcode->addCode($tag, // tag name: this will go between square brackets
|
||||||
|
'callback_replace_single', // type of action: we'll use a callback function
|
||||||
|
'PhotoSwipeFunctions::getImageHtml', // name of the callback function
|
||||||
|
array(
|
||||||
|
'usecontent_param' => array(
|
||||||
|
'default'
|
||||||
|
)
|
||||||
|
), // supported parameters: "default" is [acronym=valore]
|
||||||
|
'inline', // type of the tag, inline or block, etc
|
||||||
|
array(
|
||||||
|
'listitem',
|
||||||
|
'block',
|
||||||
|
'inline',
|
||||||
|
'link'
|
||||||
|
), // type of elements in which you can use this tag
|
||||||
|
array()); // type of elements where this tag CAN'T go (in this case, none, so it can go everywhere)
|
||||||
|
$bbcode->setCodeFlag($tag, 'closetag', BBCODE_CLOSETAG_FORBIDDEN); // a closing tag is forbidden (no [/tag])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
67
fp-plugins/photoswipe/plugin.photoswipe.php
Normal file
67
fp-plugins/photoswipe/plugin.photoswipe.php
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin Name: PhotoSwipe
|
||||||
|
* Version: 2.0
|
||||||
|
* Plugin URI: https://www.flatpress.org
|
||||||
|
* Description: Displays images and galleries with <a href="http://photoswipe.com">PhotoSwipe</a>.<br>Part of the standard distribution. Needs the BBCode plugin to be activated.
|
||||||
|
* Author: FlatPress
|
||||||
|
* Author URI: https://www.flatpress.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------
|
||||||
|
* About
|
||||||
|
* --------
|
||||||
|
*
|
||||||
|
* This plugin displays single images and whole image galleries with the JavaScript library
|
||||||
|
* PhotoSwipe (photoswipe.com). Since it uses FlatPress default functionality for building
|
||||||
|
* the image HTML, you may use the documented parameters of the [img] tag such as "alt",
|
||||||
|
* "title", "height", "width" or "float" (see FlatPress BBCode documentation for details).
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* --------
|
||||||
|
* Usage
|
||||||
|
* --------
|
||||||
|
*
|
||||||
|
* For a single image: [img="images/image.jpg"]
|
||||||
|
* Floating image with given width: [img="images/image.jpg" width="200" float="right"]
|
||||||
|
*
|
||||||
|
* For an image gallery: [gallery="images/GalleryName"]
|
||||||
|
* Gallery width given image height: [gallery="images/GalleryName" height="100"]
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* --------
|
||||||
|
* HTML+CSS
|
||||||
|
* --------
|
||||||
|
*
|
||||||
|
* The HTML code of the images is generated by the FlatPress standard function
|
||||||
|
* do_bbcode_img() (see fp-plugins/bbcode/plugin.bbcode.php). Therefore, standard image
|
||||||
|
* attributes (such as "width", "height", etc.) can be used. Floating images will get a
|
||||||
|
* corresponding CSS class (e.g. "floatright").
|
||||||
|
* The plugin will wrap that HTML in a <figure> element with the same CSS class as the
|
||||||
|
* image (e.g. "floatright"). The <figure> also contains a <figcaption> displaying the
|
||||||
|
* title of the image.
|
||||||
|
* The <figure> element itself is surrounded by a <div class="photoswipe">.
|
||||||
|
*
|
||||||
|
* Galleries are displayed as a series of images as described above, encapsulated by a
|
||||||
|
* <div class="img-gallery GalleryName">.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* --------
|
||||||
|
* Captions
|
||||||
|
* --------
|
||||||
|
*
|
||||||
|
* Captions of the gallery images are read from a text file "captions.conf" within the
|
||||||
|
* gallery directory. You may edit them with the Gallery captions plugin.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// include the plugin's PHP files
|
||||||
|
include_once dirname(__FILE__) . '/photoswipefunctions.class.php';
|
||||||
|
|
||||||
|
// intialize the BBCode tags of the plugin
|
||||||
|
add_filter('init', 'PhotoSwipeFunctions::initializePluginTags');
|
||||||
|
|
||||||
|
// inject neccessary JS in the <head> section
|
||||||
|
add_action('wp_head', 'PhotoSwipeFunctions::echoScriptTags', 0);
|
||||||
|
|
3
fp-plugins/photoswipe/res/adminstyle.css
Normal file
3
fp-plugins/photoswipe/res/adminstyle.css
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
table.photoswipecaptions tr td { padding:1em; }
|
||||||
|
table.photoswipecaptions tr td:first-child { width:1%; }
|
||||||
|
table.photoswipecaptions input {width:95%;}
|
BIN
fp-plugins/photoswipe/res/img/play.png
Normal file
BIN
fp-plugins/photoswipe/res/img/play.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 141 B |
BIN
fp-plugins/photoswipe/res/img/stop.png
Normal file
BIN
fp-plugins/photoswipe/res/img/stop.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 119 B |
4
fp-plugins/photoswipe/res/jquery-2.2.2/jquery-2.2.2.min.js
vendored
Normal file
4
fp-plugins/photoswipe/res/jquery-2.2.2/jquery-2.2.2.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
21
fp-plugins/photoswipe/res/photoswipe-4.1.1/LICENSE
Normal file
21
fp-plugins/photoswipe/res/photoswipe-4.1.1/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2016 Dmitry Semenov, http://dimsemenov.com
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
@ -0,0 +1,483 @@
|
|||||||
|
/*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */
|
||||||
|
/*
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
1. Buttons
|
||||||
|
2. Share modal and links
|
||||||
|
3. Index indicator ("1 of X" counter)
|
||||||
|
4. Caption
|
||||||
|
5. Loading indicator
|
||||||
|
6. Additional styles (root element, top bar, idle state, hidden state, etc.)
|
||||||
|
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
|
||||||
|
1. Buttons
|
||||||
|
|
||||||
|
*/
|
||||||
|
/* <button> css reset */
|
||||||
|
.pswp__button {
|
||||||
|
width: 44px;
|
||||||
|
height: 44px;
|
||||||
|
position: relative;
|
||||||
|
background: none;
|
||||||
|
cursor: pointer;
|
||||||
|
overflow: visible;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
display: block;
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
float: right;
|
||||||
|
opacity: 0.75;
|
||||||
|
-webkit-transition: opacity 0.2s;
|
||||||
|
transition: opacity 0.2s;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none; }
|
||||||
|
.pswp__button:focus,
|
||||||
|
.pswp__button:hover {
|
||||||
|
opacity: 1; }
|
||||||
|
.pswp__button:active {
|
||||||
|
outline: none;
|
||||||
|
opacity: 0.9; }
|
||||||
|
.pswp__button::-moz-focus-inner {
|
||||||
|
padding: 0;
|
||||||
|
border: 0; }
|
||||||
|
|
||||||
|
/* pswp__ui--over-close class it added when mouse is over element that should close gallery */
|
||||||
|
.pswp__ui--over-close .pswp__button--close {
|
||||||
|
opacity: 1; }
|
||||||
|
|
||||||
|
.pswp__button,
|
||||||
|
.pswp__button--arrow--left:before,
|
||||||
|
.pswp__button--arrow--right:before {
|
||||||
|
background: url(default-skin.png) 0 0 no-repeat;
|
||||||
|
background-size: 264px 88px;
|
||||||
|
width: 44px;
|
||||||
|
height: 44px; }
|
||||||
|
|
||||||
|
@media (-webkit-min-device-pixel-ratio: 1.1), (-webkit-min-device-pixel-ratio: 1.09375), (min-resolution: 105dpi), (min-resolution: 1.1dppx) {
|
||||||
|
/* Serve SVG sprite if browser supports SVG and resolution is more than 105dpi */
|
||||||
|
.pswp--svg .pswp__button,
|
||||||
|
.pswp--svg .pswp__button--arrow--left:before,
|
||||||
|
.pswp--svg .pswp__button--arrow--right:before {
|
||||||
|
background-image: url(default-skin.svg); }
|
||||||
|
.pswp--svg .pswp__button--arrow--left,
|
||||||
|
.pswp--svg .pswp__button--arrow--right {
|
||||||
|
background: none; } }
|
||||||
|
|
||||||
|
.pswp__button--close {
|
||||||
|
background-position: 0 -44px; }
|
||||||
|
|
||||||
|
.pswp__button--share {
|
||||||
|
background-position: -44px -44px; }
|
||||||
|
|
||||||
|
.pswp__button--fs {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.pswp--supports-fs .pswp__button--fs {
|
||||||
|
display: block; }
|
||||||
|
|
||||||
|
.pswp--fs .pswp__button--fs {
|
||||||
|
background-position: -44px 0; }
|
||||||
|
|
||||||
|
.pswp__button--zoom {
|
||||||
|
display: none;
|
||||||
|
background-position: -88px 0; }
|
||||||
|
|
||||||
|
.pswp--zoom-allowed .pswp__button--zoom {
|
||||||
|
display: block; }
|
||||||
|
|
||||||
|
.pswp--zoomed-in .pswp__button--zoom {
|
||||||
|
background-position: -132px 0; }
|
||||||
|
|
||||||
|
/* no arrows on touch screens */
|
||||||
|
.pswp--touch .pswp__button--arrow--left,
|
||||||
|
.pswp--touch .pswp__button--arrow--right {
|
||||||
|
visibility: hidden; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Arrow buttons hit area
|
||||||
|
(icon is added to :before pseudo-element)
|
||||||
|
*/
|
||||||
|
.pswp__button--arrow--left,
|
||||||
|
.pswp__button--arrow--right {
|
||||||
|
background: none;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -50px;
|
||||||
|
width: 70px;
|
||||||
|
height: 100px;
|
||||||
|
position: absolute; }
|
||||||
|
|
||||||
|
.pswp__button--arrow--left {
|
||||||
|
left: 0; }
|
||||||
|
|
||||||
|
.pswp__button--arrow--right {
|
||||||
|
right: 0; }
|
||||||
|
|
||||||
|
.pswp__button--arrow--left:before,
|
||||||
|
.pswp__button--arrow--right:before {
|
||||||
|
content: '';
|
||||||
|
top: 35px;
|
||||||
|
background-color: rgba(0, 0, 0, 0.3);
|
||||||
|
height: 30px;
|
||||||
|
width: 32px;
|
||||||
|
position: absolute; }
|
||||||
|
|
||||||
|
.pswp__button--arrow--left:before {
|
||||||
|
left: 6px;
|
||||||
|
background-position: -138px -44px; }
|
||||||
|
|
||||||
|
.pswp__button--arrow--right:before {
|
||||||
|
right: 6px;
|
||||||
|
background-position: -94px -44px; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
2. Share modal/popup and links
|
||||||
|
|
||||||
|
*/
|
||||||
|
.pswp__counter,
|
||||||
|
.pswp__share-modal {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none; }
|
||||||
|
|
||||||
|
.pswp__share-modal {
|
||||||
|
display: block;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
padding: 10px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1600;
|
||||||
|
opacity: 0;
|
||||||
|
-webkit-transition: opacity 0.25s ease-out;
|
||||||
|
transition: opacity 0.25s ease-out;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
will-change: opacity; }
|
||||||
|
|
||||||
|
.pswp__share-modal--hidden {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.pswp__share-tooltip {
|
||||||
|
z-index: 1620;
|
||||||
|
position: absolute;
|
||||||
|
background: #FFF;
|
||||||
|
top: 56px;
|
||||||
|
border-radius: 2px;
|
||||||
|
display: block;
|
||||||
|
width: auto;
|
||||||
|
right: 44px;
|
||||||
|
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
|
||||||
|
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
|
||||||
|
-webkit-transform: translateY(6px);
|
||||||
|
-ms-transform: translateY(6px);
|
||||||
|
transform: translateY(6px);
|
||||||
|
-webkit-transition: -webkit-transform 0.25s;
|
||||||
|
transition: transform 0.25s;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
will-change: transform; }
|
||||||
|
.pswp__share-tooltip a {
|
||||||
|
display: block;
|
||||||
|
padding: 8px 12px;
|
||||||
|
color: #000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 18px; }
|
||||||
|
.pswp__share-tooltip a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #000; }
|
||||||
|
.pswp__share-tooltip a:first-child {
|
||||||
|
/* round corners on the first/last list item */
|
||||||
|
border-radius: 2px 2px 0 0; }
|
||||||
|
.pswp__share-tooltip a:last-child {
|
||||||
|
border-radius: 0 0 2px 2px; }
|
||||||
|
|
||||||
|
.pswp__share-modal--fade-in {
|
||||||
|
opacity: 1; }
|
||||||
|
.pswp__share-modal--fade-in .pswp__share-tooltip {
|
||||||
|
-webkit-transform: translateY(0);
|
||||||
|
-ms-transform: translateY(0);
|
||||||
|
transform: translateY(0); }
|
||||||
|
|
||||||
|
/* increase size of share links on touch devices */
|
||||||
|
.pswp--touch .pswp__share-tooltip a {
|
||||||
|
padding: 16px 12px; }
|
||||||
|
|
||||||
|
a.pswp__share--facebook:before {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
position: absolute;
|
||||||
|
top: -12px;
|
||||||
|
right: 15px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-bottom-color: #FFF;
|
||||||
|
-webkit-pointer-events: none;
|
||||||
|
-moz-pointer-events: none;
|
||||||
|
pointer-events: none; }
|
||||||
|
|
||||||
|
a.pswp__share--facebook:hover {
|
||||||
|
background: #3E5C9A;
|
||||||
|
color: #FFF; }
|
||||||
|
a.pswp__share--facebook:hover:before {
|
||||||
|
border-bottom-color: #3E5C9A; }
|
||||||
|
|
||||||
|
a.pswp__share--twitter:hover {
|
||||||
|
background: #55ACEE;
|
||||||
|
color: #FFF; }
|
||||||
|
|
||||||
|
a.pswp__share--pinterest:hover {
|
||||||
|
background: #CCC;
|
||||||
|
color: #CE272D; }
|
||||||
|
|
||||||
|
a.pswp__share--download:hover {
|
||||||
|
background: #DDD; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
3. Index indicator ("1 of X" counter)
|
||||||
|
|
||||||
|
*/
|
||||||
|
.pswp__counter {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
height: 44px;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 44px;
|
||||||
|
color: #FFF;
|
||||||
|
opacity: 0.75;
|
||||||
|
padding: 0 10px; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
4. Caption
|
||||||
|
|
||||||
|
*/
|
||||||
|
.pswp__caption {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 44px; }
|
||||||
|
.pswp__caption small {
|
||||||
|
font-size: 11px;
|
||||||
|
color: #BBB; }
|
||||||
|
|
||||||
|
.pswp__caption__center {
|
||||||
|
text-align: left;
|
||||||
|
max-width: 420px;
|
||||||
|
margin: 0 auto;
|
||||||
|
font-size: 13px;
|
||||||
|
padding: 10px;
|
||||||
|
line-height: 20px;
|
||||||
|
color: #CCC; }
|
||||||
|
|
||||||
|
.pswp__caption--empty {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
/* Fake caption element, used to calculate height of next/prev image */
|
||||||
|
.pswp__caption--fake {
|
||||||
|
visibility: hidden; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
5. Loading indicator (preloader)
|
||||||
|
|
||||||
|
You can play with it here - http://codepen.io/dimsemenov/pen/yyBWoR
|
||||||
|
|
||||||
|
*/
|
||||||
|
.pswp__preloader {
|
||||||
|
width: 44px;
|
||||||
|
height: 44px;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -22px;
|
||||||
|
opacity: 0;
|
||||||
|
-webkit-transition: opacity 0.25s ease-out;
|
||||||
|
transition: opacity 0.25s ease-out;
|
||||||
|
will-change: opacity;
|
||||||
|
direction: ltr; }
|
||||||
|
|
||||||
|
.pswp__preloader__icn {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
margin: 12px; }
|
||||||
|
|
||||||
|
.pswp__preloader--active {
|
||||||
|
opacity: 1; }
|
||||||
|
.pswp__preloader--active .pswp__preloader__icn {
|
||||||
|
/* We use .gif in browsers that don't support CSS animation */
|
||||||
|
background: url(preloader.gif) 0 0 no-repeat; }
|
||||||
|
|
||||||
|
.pswp--css_animation .pswp__preloader--active {
|
||||||
|
opacity: 1; }
|
||||||
|
.pswp--css_animation .pswp__preloader--active .pswp__preloader__icn {
|
||||||
|
-webkit-animation: clockwise 500ms linear infinite;
|
||||||
|
animation: clockwise 500ms linear infinite; }
|
||||||
|
.pswp--css_animation .pswp__preloader--active .pswp__preloader__donut {
|
||||||
|
-webkit-animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite;
|
||||||
|
animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite; }
|
||||||
|
|
||||||
|
.pswp--css_animation .pswp__preloader__icn {
|
||||||
|
background: none;
|
||||||
|
opacity: 0.75;
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
position: absolute;
|
||||||
|
left: 15px;
|
||||||
|
top: 15px;
|
||||||
|
margin: 0; }
|
||||||
|
|
||||||
|
.pswp--css_animation .pswp__preloader__cut {
|
||||||
|
/*
|
||||||
|
The idea of animating inner circle is based on Polymer ("material") loading indicator
|
||||||
|
by Keanu Lee https://blog.keanulee.com/2014/10/20/the-tale-of-three-spinners.html
|
||||||
|
*/
|
||||||
|
position: relative;
|
||||||
|
width: 7px;
|
||||||
|
height: 14px;
|
||||||
|
overflow: hidden; }
|
||||||
|
|
||||||
|
.pswp--css_animation .pswp__preloader__donut {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
border: 2px solid #FFF;
|
||||||
|
border-radius: 50%;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
background: none;
|
||||||
|
margin: 0; }
|
||||||
|
|
||||||
|
@media screen and (max-width: 1024px) {
|
||||||
|
.pswp__preloader {
|
||||||
|
position: relative;
|
||||||
|
left: auto;
|
||||||
|
top: auto;
|
||||||
|
margin: 0;
|
||||||
|
float: right; } }
|
||||||
|
|
||||||
|
@-webkit-keyframes clockwise {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
@keyframes clockwise {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
@-webkit-keyframes donut-rotate {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0);
|
||||||
|
transform: rotate(0); }
|
||||||
|
50% {
|
||||||
|
-webkit-transform: rotate(-140deg);
|
||||||
|
transform: rotate(-140deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(0);
|
||||||
|
transform: rotate(0); } }
|
||||||
|
|
||||||
|
@keyframes donut-rotate {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0);
|
||||||
|
transform: rotate(0); }
|
||||||
|
50% {
|
||||||
|
-webkit-transform: rotate(-140deg);
|
||||||
|
transform: rotate(-140deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(0);
|
||||||
|
transform: rotate(0); } }
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
6. Additional styles
|
||||||
|
|
||||||
|
*/
|
||||||
|
/* root element of UI */
|
||||||
|
.pswp__ui {
|
||||||
|
-webkit-font-smoothing: auto;
|
||||||
|
visibility: visible;
|
||||||
|
opacity: 1;
|
||||||
|
z-index: 1550; }
|
||||||
|
|
||||||
|
/* top black bar with buttons and "1 of X" indicator */
|
||||||
|
.pswp__top-bar {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
height: 44px;
|
||||||
|
width: 100%; }
|
||||||
|
|
||||||
|
.pswp__caption,
|
||||||
|
.pswp__top-bar,
|
||||||
|
.pswp--has_mouse .pswp__button--arrow--left,
|
||||||
|
.pswp--has_mouse .pswp__button--arrow--right {
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
will-change: opacity;
|
||||||
|
-webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
||||||
|
transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1); }
|
||||||
|
|
||||||
|
/* pswp--has_mouse class is added only when two subsequent mousemove events occur */
|
||||||
|
.pswp--has_mouse .pswp__button--arrow--left,
|
||||||
|
.pswp--has_mouse .pswp__button--arrow--right {
|
||||||
|
visibility: visible; }
|
||||||
|
|
||||||
|
.pswp__top-bar,
|
||||||
|
.pswp__caption {
|
||||||
|
background-color: rgba(0, 0, 0, 0.5); }
|
||||||
|
|
||||||
|
/* pswp__ui--fit class is added when main image "fits" between top bar and bottom bar (caption) */
|
||||||
|
.pswp__ui--fit .pswp__top-bar,
|
||||||
|
.pswp__ui--fit .pswp__caption {
|
||||||
|
background-color: rgba(0, 0, 0, 0.3); }
|
||||||
|
|
||||||
|
/* pswp__ui--idle class is added when mouse isn't moving for several seconds (JS option timeToIdle) */
|
||||||
|
.pswp__ui--idle .pswp__top-bar {
|
||||||
|
opacity: 0; }
|
||||||
|
|
||||||
|
.pswp__ui--idle .pswp__button--arrow--left,
|
||||||
|
.pswp__ui--idle .pswp__button--arrow--right {
|
||||||
|
opacity: 0; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
pswp__ui--hidden class is added when controls are hidden
|
||||||
|
e.g. when user taps to toggle visibility of controls
|
||||||
|
*/
|
||||||
|
.pswp__ui--hidden .pswp__top-bar,
|
||||||
|
.pswp__ui--hidden .pswp__caption,
|
||||||
|
.pswp__ui--hidden .pswp__button--arrow--left,
|
||||||
|
.pswp__ui--hidden .pswp__button--arrow--right {
|
||||||
|
/* Force paint & create composition layer for controls. */
|
||||||
|
opacity: 0.001; }
|
||||||
|
|
||||||
|
/* pswp__ui--one-slide class is added when there is just one item in gallery */
|
||||||
|
.pswp__ui--one-slide .pswp__button--arrow--left,
|
||||||
|
.pswp__ui--one-slide .pswp__button--arrow--right,
|
||||||
|
.pswp__ui--one-slide .pswp__counter {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.pswp__element--disabled {
|
||||||
|
display: none !important; }
|
||||||
|
|
||||||
|
.pswp--minimal--dark .pswp__top-bar {
|
||||||
|
background: none; }
|
Binary file not shown.
After Width: | Height: | Size: 547 B |
@ -0,0 +1 @@
|
|||||||
|
<svg width="264" height="88" viewBox="0 0 264 88" xmlns="http://www.w3.org/2000/svg"><title>default-skin 2</title><g fill="none" fill-rule="evenodd"><g><path d="M67.002 59.5v3.768c-6.307.84-9.184 5.75-10.002 9.732 2.22-2.83 5.564-5.098 10.002-5.098V71.5L73 65.585 67.002 59.5z" id="Shape" fill="#fff"/><g fill="#fff"><path d="M13 29v-5h2v3h3v2h-5zM13 15h5v2h-3v3h-2v-5zM31 15v5h-2v-3h-3v-2h5zM31 29h-5v-2h3v-3h2v5z" id="Shape"/></g><g fill="#fff"><path d="M62 24v5h-2v-3h-3v-2h5zM62 20h-5v-2h3v-3h2v5zM70 20v-5h2v3h3v2h-5zM70 24h5v2h-3v3h-2v-5z"/></g><path d="M20.586 66l-5.656-5.656 1.414-1.414L22 64.586l5.656-5.656 1.414 1.414L23.414 66l5.656 5.656-1.414 1.414L22 67.414l-5.656 5.656-1.414-1.414L20.586 66z" fill="#fff"/><path d="M111.785 65.03L110 63.5l3-3.5h-10v-2h10l-3-3.5 1.785-1.468L117 59l-5.215 6.03z" fill="#fff"/><path d="M152.215 65.03L154 63.5l-3-3.5h10v-2h-10l3-3.5-1.785-1.468L147 59l5.215 6.03z" fill="#fff"/><g><path id="Rectangle-11" fill="#fff" d="M160.957 28.543l-3.25-3.25-1.413 1.414 3.25 3.25z"/><path d="M152.5 27c3.038 0 5.5-2.462 5.5-5.5s-2.462-5.5-5.5-5.5-5.5 2.462-5.5 5.5 2.462 5.5 5.5 5.5z" id="Oval-1" stroke="#fff" stroke-width="1.5"/><path fill="#fff" d="M150 21h5v1h-5z"/></g><g><path d="M116.957 28.543l-1.414 1.414-3.25-3.25 1.414-1.414 3.25 3.25z" fill="#fff"/><path d="M108.5 27c3.038 0 5.5-2.462 5.5-5.5s-2.462-5.5-5.5-5.5-5.5 2.462-5.5 5.5 2.462 5.5 5.5 5.5z" stroke="#fff" stroke-width="1.5"/><path fill="#fff" d="M106 21h5v1h-5z"/><path fill="#fff" d="M109.043 19.008l-.085 5-1-.017.085-5z"/></g></g></g></svg>
|
After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 866 B |
@ -0,0 +1,861 @@
|
|||||||
|
/*! PhotoSwipe Default UI - 4.1.1 - 2015-12-24
|
||||||
|
* http://photoswipe.com
|
||||||
|
* Copyright (c) 2015 Dmitry Semenov; */
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* UI on top of main sliding area (caption, arrows, close button, etc.).
|
||||||
|
* Built just using public methods/properties of PhotoSwipe.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
(function (root, factory) {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define(factory);
|
||||||
|
} else if (typeof exports === 'object') {
|
||||||
|
module.exports = factory();
|
||||||
|
} else {
|
||||||
|
root.PhotoSwipeUI_Default = factory();
|
||||||
|
}
|
||||||
|
})(this, function () {
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var PhotoSwipeUI_Default =
|
||||||
|
function(pswp, framework) {
|
||||||
|
|
||||||
|
var ui = this;
|
||||||
|
var _overlayUIUpdated = false,
|
||||||
|
_controlsVisible = true,
|
||||||
|
_fullscrenAPI,
|
||||||
|
_controls,
|
||||||
|
_captionContainer,
|
||||||
|
_fakeCaptionContainer,
|
||||||
|
_indexIndicator,
|
||||||
|
_shareButton,
|
||||||
|
_shareModal,
|
||||||
|
_shareModalHidden = true,
|
||||||
|
_initalCloseOnScrollValue,
|
||||||
|
_isIdle,
|
||||||
|
_listen,
|
||||||
|
|
||||||
|
_loadingIndicator,
|
||||||
|
_loadingIndicatorHidden,
|
||||||
|
_loadingIndicatorTimeout,
|
||||||
|
|
||||||
|
_galleryHasOneSlide,
|
||||||
|
|
||||||
|
_options,
|
||||||
|
_defaultUIOptions = {
|
||||||
|
barsSize: {top:44, bottom:'auto'},
|
||||||
|
closeElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'],
|
||||||
|
timeToIdle: 4000,
|
||||||
|
timeToIdleOutside: 1000,
|
||||||
|
loadingIndicatorDelay: 1000, // 2s
|
||||||
|
|
||||||
|
addCaptionHTMLFn: function(item, captionEl /*, isFake */) {
|
||||||
|
if(!item.title) {
|
||||||
|
captionEl.children[0].innerHTML = '';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
captionEl.children[0].innerHTML = item.title;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
closeEl:true,
|
||||||
|
captionEl: true,
|
||||||
|
fullscreenEl: true,
|
||||||
|
zoomEl: true,
|
||||||
|
shareEl: true,
|
||||||
|
counterEl: true,
|
||||||
|
arrowEl: true,
|
||||||
|
preloaderEl: true,
|
||||||
|
|
||||||
|
tapToClose: false,
|
||||||
|
tapToToggleControls: true,
|
||||||
|
|
||||||
|
clickToCloseNonZoomable: true,
|
||||||
|
|
||||||
|
shareButtons: [
|
||||||
|
{id:'facebook', label:'Share on Facebook', url:'https://www.facebook.com/sharer/sharer.php?u={{url}}'},
|
||||||
|
{id:'twitter', label:'Tweet', url:'https://twitter.com/intent/tweet?text={{text}}&url={{url}}'},
|
||||||
|
{id:'pinterest', label:'Pin it', url:'http://www.pinterest.com/pin/create/button/'+
|
||||||
|
'?url={{url}}&media={{image_url}}&description={{text}}'},
|
||||||
|
{id:'download', label:'Download image', url:'{{raw_image_url}}', download:true}
|
||||||
|
],
|
||||||
|
getImageURLForShare: function( /* shareButtonData */ ) {
|
||||||
|
return pswp.currItem.src || '';
|
||||||
|
},
|
||||||
|
getPageURLForShare: function( /* shareButtonData */ ) {
|
||||||
|
return window.location.href;
|
||||||
|
},
|
||||||
|
getTextForShare: function( /* shareButtonData */ ) {
|
||||||
|
return pswp.currItem.title || '';
|
||||||
|
},
|
||||||
|
|
||||||
|
indexIndicatorSep: ' / ',
|
||||||
|
fitControlsWidth: 1200
|
||||||
|
|
||||||
|
},
|
||||||
|
_blockControlsTap,
|
||||||
|
_blockControlsTapTimeout;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var _onControlsTap = function(e) {
|
||||||
|
if(_blockControlsTap) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
e = e || window.event;
|
||||||
|
|
||||||
|
if(_options.timeToIdle && _options.mouseUsed && !_isIdle) {
|
||||||
|
// reset idle timer
|
||||||
|
_onIdleMouseMove();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var target = e.target || e.srcElement,
|
||||||
|
uiElement,
|
||||||
|
clickedClass = target.getAttribute('class') || '',
|
||||||
|
found;
|
||||||
|
|
||||||
|
for(var i = 0; i < _uiElements.length; i++) {
|
||||||
|
uiElement = _uiElements[i];
|
||||||
|
if(uiElement.onTap && clickedClass.indexOf('pswp__' + uiElement.name ) > -1 ) {
|
||||||
|
uiElement.onTap();
|
||||||
|
found = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(found) {
|
||||||
|
if(e.stopPropagation) {
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
_blockControlsTap = true;
|
||||||
|
|
||||||
|
// Some versions of Android don't prevent ghost click event
|
||||||
|
// when preventDefault() was called on touchstart and/or touchend.
|
||||||
|
//
|
||||||
|
// This happens on v4.3, 4.2, 4.1,
|
||||||
|
// older versions strangely work correctly,
|
||||||
|
// but just in case we add delay on all of them)
|
||||||
|
var tapDelay = framework.features.isOldAndroid ? 600 : 30;
|
||||||
|
_blockControlsTapTimeout = setTimeout(function() {
|
||||||
|
_blockControlsTap = false;
|
||||||
|
}, tapDelay);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
_fitControlsInViewport = function() {
|
||||||
|
return !pswp.likelyTouchDevice || _options.mouseUsed || screen.width > _options.fitControlsWidth;
|
||||||
|
},
|
||||||
|
_togglePswpClass = function(el, cName, add) {
|
||||||
|
framework[ (add ? 'add' : 'remove') + 'Class' ](el, 'pswp__' + cName);
|
||||||
|
},
|
||||||
|
|
||||||
|
// add class when there is just one item in the gallery
|
||||||
|
// (by default it hides left/right arrows and 1ofX counter)
|
||||||
|
_countNumItems = function() {
|
||||||
|
var hasOneSlide = (_options.getNumItemsFn() === 1);
|
||||||
|
|
||||||
|
if(hasOneSlide !== _galleryHasOneSlide) {
|
||||||
|
_togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);
|
||||||
|
_galleryHasOneSlide = hasOneSlide;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_toggleShareModalClass = function() {
|
||||||
|
_togglePswpClass(_shareModal, 'share-modal--hidden', _shareModalHidden);
|
||||||
|
},
|
||||||
|
_toggleShareModal = function() {
|
||||||
|
|
||||||
|
_shareModalHidden = !_shareModalHidden;
|
||||||
|
|
||||||
|
|
||||||
|
if(!_shareModalHidden) {
|
||||||
|
_toggleShareModalClass();
|
||||||
|
setTimeout(function() {
|
||||||
|
if(!_shareModalHidden) {
|
||||||
|
framework.addClass(_shareModal, 'pswp__share-modal--fade-in');
|
||||||
|
}
|
||||||
|
}, 30);
|
||||||
|
} else {
|
||||||
|
framework.removeClass(_shareModal, 'pswp__share-modal--fade-in');
|
||||||
|
setTimeout(function() {
|
||||||
|
if(_shareModalHidden) {
|
||||||
|
_toggleShareModalClass();
|
||||||
|
}
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!_shareModalHidden) {
|
||||||
|
_updateShareURLs();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
_openWindowPopup = function(e) {
|
||||||
|
e = e || window.event;
|
||||||
|
var target = e.target || e.srcElement;
|
||||||
|
|
||||||
|
pswp.shout('shareLinkClick', e, target);
|
||||||
|
|
||||||
|
if(!target.href) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( target.hasAttribute('download') ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.open(target.href, 'pswp_share', 'scrollbars=yes,resizable=yes,toolbar=no,'+
|
||||||
|
'location=yes,width=550,height=420,top=100,left=' +
|
||||||
|
(window.screen ? Math.round(screen.width / 2 - 275) : 100) );
|
||||||
|
|
||||||
|
if(!_shareModalHidden) {
|
||||||
|
_toggleShareModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
_updateShareURLs = function() {
|
||||||
|
var shareButtonOut = '',
|
||||||
|
shareButtonData,
|
||||||
|
shareURL,
|
||||||
|
image_url,
|
||||||
|
page_url,
|
||||||
|
share_text;
|
||||||
|
|
||||||
|
for(var i = 0; i < _options.shareButtons.length; i++) {
|
||||||
|
shareButtonData = _options.shareButtons[i];
|
||||||
|
|
||||||
|
image_url = _options.getImageURLForShare(shareButtonData);
|
||||||
|
page_url = _options.getPageURLForShare(shareButtonData);
|
||||||
|
share_text = _options.getTextForShare(shareButtonData);
|
||||||
|
|
||||||
|
shareURL = shareButtonData.url.replace('{{url}}', encodeURIComponent(page_url) )
|
||||||
|
.replace('{{image_url}}', encodeURIComponent(image_url) )
|
||||||
|
.replace('{{raw_image_url}}', image_url )
|
||||||
|
.replace('{{text}}', encodeURIComponent(share_text) );
|
||||||
|
|
||||||
|
shareButtonOut += '<a href="' + shareURL + '" target="_blank" '+
|
||||||
|
'class="pswp__share--' + shareButtonData.id + '"' +
|
||||||
|
(shareButtonData.download ? 'download' : '') + '>' +
|
||||||
|
shareButtonData.label + '</a>';
|
||||||
|
|
||||||
|
if(_options.parseShareButtonOut) {
|
||||||
|
shareButtonOut = _options.parseShareButtonOut(shareButtonData, shareButtonOut);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_shareModal.children[0].innerHTML = shareButtonOut;
|
||||||
|
_shareModal.children[0].onclick = _openWindowPopup;
|
||||||
|
|
||||||
|
},
|
||||||
|
_hasCloseClass = function(target) {
|
||||||
|
for(var i = 0; i < _options.closeElClasses.length; i++) {
|
||||||
|
if( framework.hasClass(target, 'pswp__' + _options.closeElClasses[i]) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_idleInterval,
|
||||||
|
_idleTimer,
|
||||||
|
_idleIncrement = 0,
|
||||||
|
_onIdleMouseMove = function() {
|
||||||
|
clearTimeout(_idleTimer);
|
||||||
|
_idleIncrement = 0;
|
||||||
|
if(_isIdle) {
|
||||||
|
ui.setIdle(false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_onMouseLeaveWindow = function(e) {
|
||||||
|
e = e ? e : window.event;
|
||||||
|
var from = e.relatedTarget || e.toElement;
|
||||||
|
if (!from || from.nodeName === 'HTML') {
|
||||||
|
clearTimeout(_idleTimer);
|
||||||
|
_idleTimer = setTimeout(function() {
|
||||||
|
ui.setIdle(true);
|
||||||
|
}, _options.timeToIdleOutside);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_setupFullscreenAPI = function() {
|
||||||
|
if(_options.fullscreenEl && !framework.features.isOldAndroid) {
|
||||||
|
if(!_fullscrenAPI) {
|
||||||
|
_fullscrenAPI = ui.getFullscreenAPI();
|
||||||
|
}
|
||||||
|
if(_fullscrenAPI) {
|
||||||
|
framework.bind(document, _fullscrenAPI.eventK, ui.updateFullscreen);
|
||||||
|
ui.updateFullscreen();
|
||||||
|
framework.addClass(pswp.template, 'pswp--supports-fs');
|
||||||
|
} else {
|
||||||
|
framework.removeClass(pswp.template, 'pswp--supports-fs');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_setupLoadingIndicator = function() {
|
||||||
|
// Setup loading indicator
|
||||||
|
if(_options.preloaderEl) {
|
||||||
|
|
||||||
|
_toggleLoadingIndicator(true);
|
||||||
|
|
||||||
|
_listen('beforeChange', function() {
|
||||||
|
|
||||||
|
clearTimeout(_loadingIndicatorTimeout);
|
||||||
|
|
||||||
|
// display loading indicator with delay
|
||||||
|
_loadingIndicatorTimeout = setTimeout(function() {
|
||||||
|
|
||||||
|
if(pswp.currItem && pswp.currItem.loading) {
|
||||||
|
|
||||||
|
if( !pswp.allowProgressiveImg() || (pswp.currItem.img && !pswp.currItem.img.naturalWidth) ) {
|
||||||
|
// show preloader if progressive loading is not enabled,
|
||||||
|
// or image width is not defined yet (because of slow connection)
|
||||||
|
_toggleLoadingIndicator(false);
|
||||||
|
// items-controller.js function allowProgressiveImg
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_toggleLoadingIndicator(true); // hide preloader
|
||||||
|
}
|
||||||
|
|
||||||
|
}, _options.loadingIndicatorDelay);
|
||||||
|
|
||||||
|
});
|
||||||
|
_listen('imageLoadComplete', function(index, item) {
|
||||||
|
if(pswp.currItem === item) {
|
||||||
|
_toggleLoadingIndicator(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_toggleLoadingIndicator = function(hide) {
|
||||||
|
if( _loadingIndicatorHidden !== hide ) {
|
||||||
|
_togglePswpClass(_loadingIndicator, 'preloader--active', !hide);
|
||||||
|
_loadingIndicatorHidden = hide;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_applyNavBarGaps = function(item) {
|
||||||
|
var gap = item.vGap;
|
||||||
|
|
||||||
|
if( _fitControlsInViewport() ) {
|
||||||
|
|
||||||
|
var bars = _options.barsSize;
|
||||||
|
if(_options.captionEl && bars.bottom === 'auto') {
|
||||||
|
if(!_fakeCaptionContainer) {
|
||||||
|
_fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake');
|
||||||
|
_fakeCaptionContainer.appendChild( framework.createEl('pswp__caption__center') );
|
||||||
|
_controls.insertBefore(_fakeCaptionContainer, _captionContainer);
|
||||||
|
framework.addClass(_controls, 'pswp__ui--fit');
|
||||||
|
}
|
||||||
|
if( _options.addCaptionHTMLFn(item, _fakeCaptionContainer, true) ) {
|
||||||
|
|
||||||
|
var captionSize = _fakeCaptionContainer.clientHeight;
|
||||||
|
gap.bottom = parseInt(captionSize,10) || 44;
|
||||||
|
} else {
|
||||||
|
gap.bottom = bars.top; // if no caption, set size of bottom gap to size of top
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
// height of top bar is static, no need to calculate it
|
||||||
|
gap.top = bars.top;
|
||||||
|
} else {
|
||||||
|
gap.top = gap.bottom = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_setupIdle = function() {
|
||||||
|
// Hide controls when mouse is used
|
||||||
|
if(_options.timeToIdle) {
|
||||||
|
_listen('mouseUsed', function() {
|
||||||
|
|
||||||
|
framework.bind(document, 'mousemove', _onIdleMouseMove);
|
||||||
|
framework.bind(document, 'mouseout', _onMouseLeaveWindow);
|
||||||
|
|
||||||
|
_idleInterval = setInterval(function() {
|
||||||
|
_idleIncrement++;
|
||||||
|
if(_idleIncrement === 2) {
|
||||||
|
ui.setIdle(true);
|
||||||
|
}
|
||||||
|
}, _options.timeToIdle / 2);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_setupHidingControlsDuringGestures = function() {
|
||||||
|
|
||||||
|
// Hide controls on vertical drag
|
||||||
|
_listen('onVerticalDrag', function(now) {
|
||||||
|
if(_controlsVisible && now < 0.95) {
|
||||||
|
ui.hideControls();
|
||||||
|
} else if(!_controlsVisible && now >= 0.95) {
|
||||||
|
ui.showControls();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Hide controls when pinching to close
|
||||||
|
var pinchControlsHidden;
|
||||||
|
_listen('onPinchClose' , function(now) {
|
||||||
|
if(_controlsVisible && now < 0.9) {
|
||||||
|
ui.hideControls();
|
||||||
|
pinchControlsHidden = true;
|
||||||
|
} else if(pinchControlsHidden && !_controlsVisible && now > 0.9) {
|
||||||
|
ui.showControls();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
_listen('zoomGestureEnded', function() {
|
||||||
|
pinchControlsHidden = false;
|
||||||
|
if(pinchControlsHidden && !_controlsVisible) {
|
||||||
|
ui.showControls();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var _uiElements = [
|
||||||
|
{
|
||||||
|
name: 'caption',
|
||||||
|
option: 'captionEl',
|
||||||
|
onInit: function(el) {
|
||||||
|
_captionContainer = el;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'share-modal',
|
||||||
|
option: 'shareEl',
|
||||||
|
onInit: function(el) {
|
||||||
|
_shareModal = el;
|
||||||
|
},
|
||||||
|
onTap: function() {
|
||||||
|
_toggleShareModal();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'button--share',
|
||||||
|
option: 'shareEl',
|
||||||
|
onInit: function(el) {
|
||||||
|
_shareButton = el;
|
||||||
|
},
|
||||||
|
onTap: function() {
|
||||||
|
_toggleShareModal();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'button--zoom',
|
||||||
|
option: 'zoomEl',
|
||||||
|
onTap: pswp.toggleDesktopZoom
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'counter',
|
||||||
|
option: 'counterEl',
|
||||||
|
onInit: function(el) {
|
||||||
|
_indexIndicator = el;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'button--close',
|
||||||
|
option: 'closeEl',
|
||||||
|
onTap: pswp.close
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'button--arrow--left',
|
||||||
|
option: 'arrowEl',
|
||||||
|
onTap: pswp.prev
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'button--arrow--right',
|
||||||
|
option: 'arrowEl',
|
||||||
|
onTap: pswp.next
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'button--fs',
|
||||||
|
option: 'fullscreenEl',
|
||||||
|
onTap: function() {
|
||||||
|
if(_fullscrenAPI.isFullscreen()) {
|
||||||
|
_fullscrenAPI.exit();
|
||||||
|
} else {
|
||||||
|
_fullscrenAPI.enter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'preloader',
|
||||||
|
option: 'preloaderEl',
|
||||||
|
onInit: function(el) {
|
||||||
|
_loadingIndicator = el;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
var _setupUIElements = function() {
|
||||||
|
var item,
|
||||||
|
classAttr,
|
||||||
|
uiElement;
|
||||||
|
|
||||||
|
var loopThroughChildElements = function(sChildren) {
|
||||||
|
if(!sChildren) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var l = sChildren.length;
|
||||||
|
for(var i = 0; i < l; i++) {
|
||||||
|
item = sChildren[i];
|
||||||
|
classAttr = item.className;
|
||||||
|
|
||||||
|
for(var a = 0; a < _uiElements.length; a++) {
|
||||||
|
uiElement = _uiElements[a];
|
||||||
|
|
||||||
|
if(classAttr.indexOf('pswp__' + uiElement.name) > -1 ) {
|
||||||
|
|
||||||
|
if( _options[uiElement.option] ) { // if element is not disabled from options
|
||||||
|
|
||||||
|
framework.removeClass(item, 'pswp__element--disabled');
|
||||||
|
if(uiElement.onInit) {
|
||||||
|
uiElement.onInit(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
//item.style.display = 'block';
|
||||||
|
} else {
|
||||||
|
framework.addClass(item, 'pswp__element--disabled');
|
||||||
|
//item.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
loopThroughChildElements(_controls.children);
|
||||||
|
|
||||||
|
var topBar = framework.getChildByClass(_controls, 'pswp__top-bar');
|
||||||
|
if(topBar) {
|
||||||
|
loopThroughChildElements( topBar.children );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ui.init = function() {
|
||||||
|
|
||||||
|
// extend options
|
||||||
|
framework.extend(pswp.options, _defaultUIOptions, true);
|
||||||
|
|
||||||
|
// create local link for fast access
|
||||||
|
_options = pswp.options;
|
||||||
|
|
||||||
|
// find pswp__ui element
|
||||||
|
_controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');
|
||||||
|
|
||||||
|
// create local link
|
||||||
|
_listen = pswp.listen;
|
||||||
|
|
||||||
|
|
||||||
|
_setupHidingControlsDuringGestures();
|
||||||
|
|
||||||
|
// update controls when slides change
|
||||||
|
_listen('beforeChange', ui.update);
|
||||||
|
|
||||||
|
// toggle zoom on double-tap
|
||||||
|
_listen('doubleTap', function(point) {
|
||||||
|
var initialZoomLevel = pswp.currItem.initialZoomLevel;
|
||||||
|
if(pswp.getZoomLevel() !== initialZoomLevel) {
|
||||||
|
pswp.zoomTo(initialZoomLevel, point, 333);
|
||||||
|
} else {
|
||||||
|
pswp.zoomTo(_options.getDoubleTapZoom(false, pswp.currItem), point, 333);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Allow text selection in caption
|
||||||
|
_listen('preventDragEvent', function(e, isDown, preventObj) {
|
||||||
|
var t = e.target || e.srcElement;
|
||||||
|
if(
|
||||||
|
t &&
|
||||||
|
t.getAttribute('class') && e.type.indexOf('mouse') > -1 &&
|
||||||
|
( t.getAttribute('class').indexOf('__caption') > 0 || (/(SMALL|STRONG|EM)/i).test(t.tagName) )
|
||||||
|
) {
|
||||||
|
preventObj.prevent = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// bind events for UI
|
||||||
|
_listen('bindEvents', function() {
|
||||||
|
framework.bind(_controls, 'pswpTap click', _onControlsTap);
|
||||||
|
framework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
|
||||||
|
|
||||||
|
if(!pswp.likelyTouchDevice) {
|
||||||
|
framework.bind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// unbind events for UI
|
||||||
|
_listen('unbindEvents', function() {
|
||||||
|
if(!_shareModalHidden) {
|
||||||
|
_toggleShareModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_idleInterval) {
|
||||||
|
clearInterval(_idleInterval);
|
||||||
|
}
|
||||||
|
framework.unbind(document, 'mouseout', _onMouseLeaveWindow);
|
||||||
|
framework.unbind(document, 'mousemove', _onIdleMouseMove);
|
||||||
|
framework.unbind(_controls, 'pswpTap click', _onControlsTap);
|
||||||
|
framework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
|
||||||
|
framework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);
|
||||||
|
|
||||||
|
if(_fullscrenAPI) {
|
||||||
|
framework.unbind(document, _fullscrenAPI.eventK, ui.updateFullscreen);
|
||||||
|
if(_fullscrenAPI.isFullscreen()) {
|
||||||
|
_options.hideAnimationDuration = 0;
|
||||||
|
_fullscrenAPI.exit();
|
||||||
|
}
|
||||||
|
_fullscrenAPI = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// clean up things when gallery is destroyed
|
||||||
|
_listen('destroy', function() {
|
||||||
|
if(_options.captionEl) {
|
||||||
|
if(_fakeCaptionContainer) {
|
||||||
|
_controls.removeChild(_fakeCaptionContainer);
|
||||||
|
}
|
||||||
|
framework.removeClass(_captionContainer, 'pswp__caption--empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_shareModal) {
|
||||||
|
_shareModal.children[0].onclick = null;
|
||||||
|
}
|
||||||
|
framework.removeClass(_controls, 'pswp__ui--over-close');
|
||||||
|
framework.addClass( _controls, 'pswp__ui--hidden');
|
||||||
|
ui.setIdle(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
if(!_options.showAnimationDuration) {
|
||||||
|
framework.removeClass( _controls, 'pswp__ui--hidden');
|
||||||
|
}
|
||||||
|
_listen('initialZoomIn', function() {
|
||||||
|
if(_options.showAnimationDuration) {
|
||||||
|
framework.removeClass( _controls, 'pswp__ui--hidden');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
_listen('initialZoomOut', function() {
|
||||||
|
framework.addClass( _controls, 'pswp__ui--hidden');
|
||||||
|
});
|
||||||
|
|
||||||
|
_listen('parseVerticalMargin', _applyNavBarGaps);
|
||||||
|
|
||||||
|
_setupUIElements();
|
||||||
|
|
||||||
|
if(_options.shareEl && _shareButton && _shareModal) {
|
||||||
|
_shareModalHidden = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_countNumItems();
|
||||||
|
|
||||||
|
_setupIdle();
|
||||||
|
|
||||||
|
_setupFullscreenAPI();
|
||||||
|
|
||||||
|
_setupLoadingIndicator();
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.setIdle = function(isIdle) {
|
||||||
|
_isIdle = isIdle;
|
||||||
|
_togglePswpClass(_controls, 'ui--idle', isIdle);
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.update = function() {
|
||||||
|
// Don't update UI if it's hidden
|
||||||
|
if(_controlsVisible && pswp.currItem) {
|
||||||
|
|
||||||
|
ui.updateIndexIndicator();
|
||||||
|
|
||||||
|
if(_options.captionEl) {
|
||||||
|
_options.addCaptionHTMLFn(pswp.currItem, _captionContainer);
|
||||||
|
|
||||||
|
_togglePswpClass(_captionContainer, 'caption--empty', !pswp.currItem.title);
|
||||||
|
}
|
||||||
|
|
||||||
|
_overlayUIUpdated = true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_overlayUIUpdated = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!_shareModalHidden) {
|
||||||
|
_toggleShareModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
_countNumItems();
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.updateFullscreen = function(e) {
|
||||||
|
|
||||||
|
if(e) {
|
||||||
|
// some browsers change window scroll position during the fullscreen
|
||||||
|
// so PhotoSwipe updates it just in case
|
||||||
|
setTimeout(function() {
|
||||||
|
pswp.setScrollOffset( 0, framework.getScrollY() );
|
||||||
|
}, 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
// toogle pswp--fs class on root element
|
||||||
|
framework[ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class' ](pswp.template, 'pswp--fs');
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.updateIndexIndicator = function() {
|
||||||
|
if(_options.counterEl) {
|
||||||
|
_indexIndicator.innerHTML = (pswp.getCurrentIndex()+1) +
|
||||||
|
_options.indexIndicatorSep +
|
||||||
|
_options.getNumItemsFn();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.onGlobalTap = function(e) {
|
||||||
|
e = e || window.event;
|
||||||
|
var target = e.target || e.srcElement;
|
||||||
|
|
||||||
|
if(_blockControlsTap) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(e.detail && e.detail.pointerType === 'mouse') {
|
||||||
|
|
||||||
|
// close gallery if clicked outside of the image
|
||||||
|
if(_hasCloseClass(target)) {
|
||||||
|
pswp.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(framework.hasClass(target, 'pswp__img')) {
|
||||||
|
if(pswp.getZoomLevel() === 1 && pswp.getZoomLevel() <= pswp.currItem.fitRatio) {
|
||||||
|
if(_options.clickToCloseNonZoomable) {
|
||||||
|
pswp.close();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pswp.toggleDesktopZoom(e.detail.releasePoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// tap anywhere (except buttons) to toggle visibility of controls
|
||||||
|
if(_options.tapToToggleControls) {
|
||||||
|
if(_controlsVisible) {
|
||||||
|
ui.hideControls();
|
||||||
|
} else {
|
||||||
|
ui.showControls();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// tap to close gallery
|
||||||
|
if(_options.tapToClose && (framework.hasClass(target, 'pswp__img') || _hasCloseClass(target)) ) {
|
||||||
|
pswp.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ui.onMouseOver = function(e) {
|
||||||
|
e = e || window.event;
|
||||||
|
var target = e.target || e.srcElement;
|
||||||
|
|
||||||
|
// add class when mouse is over an element that should close the gallery
|
||||||
|
_togglePswpClass(_controls, 'ui--over-close', _hasCloseClass(target));
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.hideControls = function() {
|
||||||
|
framework.addClass(_controls,'pswp__ui--hidden');
|
||||||
|
_controlsVisible = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.showControls = function() {
|
||||||
|
_controlsVisible = true;
|
||||||
|
if(!_overlayUIUpdated) {
|
||||||
|
ui.update();
|
||||||
|
}
|
||||||
|
framework.removeClass(_controls,'pswp__ui--hidden');
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.supportsFullscreen = function() {
|
||||||
|
var d = document;
|
||||||
|
return !!(d.exitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen || d.msExitFullscreen);
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.getFullscreenAPI = function() {
|
||||||
|
var dE = document.documentElement,
|
||||||
|
api,
|
||||||
|
tF = 'fullscreenchange';
|
||||||
|
|
||||||
|
if (dE.requestFullscreen) {
|
||||||
|
api = {
|
||||||
|
enterK: 'requestFullscreen',
|
||||||
|
exitK: 'exitFullscreen',
|
||||||
|
elementK: 'fullscreenElement',
|
||||||
|
eventK: tF
|
||||||
|
};
|
||||||
|
|
||||||
|
} else if(dE.mozRequestFullScreen ) {
|
||||||
|
api = {
|
||||||
|
enterK: 'mozRequestFullScreen',
|
||||||
|
exitK: 'mozCancelFullScreen',
|
||||||
|
elementK: 'mozFullScreenElement',
|
||||||
|
eventK: 'moz' + tF
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} else if(dE.webkitRequestFullscreen) {
|
||||||
|
api = {
|
||||||
|
enterK: 'webkitRequestFullscreen',
|
||||||
|
exitK: 'webkitExitFullscreen',
|
||||||
|
elementK: 'webkitFullscreenElement',
|
||||||
|
eventK: 'webkit' + tF
|
||||||
|
};
|
||||||
|
|
||||||
|
} else if(dE.msRequestFullscreen) {
|
||||||
|
api = {
|
||||||
|
enterK: 'msRequestFullscreen',
|
||||||
|
exitK: 'msExitFullscreen',
|
||||||
|
elementK: 'msFullscreenElement',
|
||||||
|
eventK: 'MSFullscreenChange'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if(api) {
|
||||||
|
api.enter = function() {
|
||||||
|
// disable close-on-scroll in fullscreen
|
||||||
|
_initalCloseOnScrollValue = _options.closeOnScroll;
|
||||||
|
_options.closeOnScroll = false;
|
||||||
|
|
||||||
|
if(this.enterK === 'webkitRequestFullscreen') {
|
||||||
|
pswp.template[this.enterK]( Element.ALLOW_KEYBOARD_INPUT );
|
||||||
|
} else {
|
||||||
|
return pswp.template[this.enterK]();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
api.exit = function() {
|
||||||
|
_options.closeOnScroll = _initalCloseOnScrollValue;
|
||||||
|
|
||||||
|
return document[this.exitK]();
|
||||||
|
|
||||||
|
};
|
||||||
|
api.isFullscreen = function() { return document[this.elementK]; };
|
||||||
|
}
|
||||||
|
|
||||||
|
return api;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
return PhotoSwipeUI_Default;
|
||||||
|
|
||||||
|
|
||||||
|
});
|
4
fp-plugins/photoswipe/res/photoswipe-4.1.1/photoswipe-ui-default.min.js
vendored
Normal file
4
fp-plugins/photoswipe/res/photoswipe-4.1.1/photoswipe-ui-default.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
242
fp-plugins/photoswipe/res/photoswipe-4.1.1/photoswipe.css
Normal file
242
fp-plugins/photoswipe/res/photoswipe-4.1.1/photoswipe.css
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
/*! PhotoSwipe main CSS by Dmitry Semenov | photoswipe.com | MIT license */
|
||||||
|
/*
|
||||||
|
Styles for basic PhotoSwipe functionality (sliding area, open/close transitions)
|
||||||
|
*/
|
||||||
|
/* pswp = photoswipe */
|
||||||
|
.pswp {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
-ms-touch-action: none;
|
||||||
|
touch-action: none;
|
||||||
|
z-index: 1500;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
/* create separate layer, to avoid paint on window.onscroll in webkit/blink */
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
outline: none; }
|
||||||
|
.pswp * {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.pswp img {
|
||||||
|
max-width: none; }
|
||||||
|
|
||||||
|
/* style is added when JS option showHideOpacity is set to true */
|
||||||
|
.pswp--animate_opacity {
|
||||||
|
/* 0.001, because opacity:0 doesn't trigger Paint action, which causes lag at start of transition */
|
||||||
|
opacity: 0.001;
|
||||||
|
will-change: opacity;
|
||||||
|
/* for open/close transition */
|
||||||
|
-webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
||||||
|
transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1); }
|
||||||
|
|
||||||
|
.pswp--open {
|
||||||
|
display: block; }
|
||||||
|
|
||||||
|
.pswp--zoom-allowed .pswp__img {
|
||||||
|
/* autoprefixer: off */
|
||||||
|
cursor: -webkit-zoom-in;
|
||||||
|
cursor: -moz-zoom-in;
|
||||||
|
cursor: zoom-in; }
|
||||||
|
|
||||||
|
.pswp--zoomed-in .pswp__img {
|
||||||
|
/* autoprefixer: off */
|
||||||
|
cursor: -webkit-grab;
|
||||||
|
cursor: -moz-grab;
|
||||||
|
cursor: grab; }
|
||||||
|
|
||||||
|
.pswp--dragging .pswp__img {
|
||||||
|
/* autoprefixer: off */
|
||||||
|
cursor: -webkit-grabbing;
|
||||||
|
cursor: -moz-grabbing;
|
||||||
|
cursor: grabbing; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Background is added as a separate element.
|
||||||
|
As animating opacity is much faster than animating rgba() background-color.
|
||||||
|
*/
|
||||||
|
.pswp__bg {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: #000;
|
||||||
|
opacity: 0;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
will-change: opacity; }
|
||||||
|
|
||||||
|
.pswp__scroll-wrap {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden; }
|
||||||
|
|
||||||
|
.pswp__container,
|
||||||
|
.pswp__zoom-wrap {
|
||||||
|
-ms-touch-action: none;
|
||||||
|
touch-action: none;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0; }
|
||||||
|
|
||||||
|
/* Prevent selection and tap highlights */
|
||||||
|
.pswp__container,
|
||||||
|
.pswp__img {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
-webkit-touch-callout: none; }
|
||||||
|
|
||||||
|
.pswp__zoom-wrap {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
-webkit-transform-origin: left top;
|
||||||
|
-ms-transform-origin: left top;
|
||||||
|
transform-origin: left top;
|
||||||
|
/* for open/close transition */
|
||||||
|
-webkit-transition: -webkit-transform 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
||||||
|
transition: transform 333ms cubic-bezier(0.4, 0, 0.22, 1); }
|
||||||
|
|
||||||
|
.pswp__bg {
|
||||||
|
will-change: opacity;
|
||||||
|
/* for open/close transition */
|
||||||
|
-webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
||||||
|
transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1); }
|
||||||
|
|
||||||
|
.pswp--animated-in .pswp__bg,
|
||||||
|
.pswp--animated-in .pswp__zoom-wrap {
|
||||||
|
-webkit-transition: none;
|
||||||
|
transition: none; }
|
||||||
|
|
||||||
|
.pswp__container,
|
||||||
|
.pswp__zoom-wrap {
|
||||||
|
-webkit-backface-visibility: hidden; }
|
||||||
|
|
||||||
|
.pswp__item {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
overflow: hidden; }
|
||||||
|
|
||||||
|
.pswp__img {
|
||||||
|
position: absolute;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
top: 0;
|
||||||
|
left: 0; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
stretched thumbnail or div placeholder element (see below)
|
||||||
|
style is added to avoid flickering in webkit/blink when layers overlap
|
||||||
|
*/
|
||||||
|
.pswp__img--placeholder {
|
||||||
|
-webkit-backface-visibility: hidden; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
div element that matches size of large image
|
||||||
|
large image loads on top of it
|
||||||
|
*/
|
||||||
|
.pswp__img--placeholder--blank {
|
||||||
|
background: #222; }
|
||||||
|
|
||||||
|
.pswp--ie .pswp__img {
|
||||||
|
width: 100% !important;
|
||||||
|
height: auto !important;
|
||||||
|
left: 0;
|
||||||
|
top: 0; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Error message appears when image is not loaded
|
||||||
|
(JS option errorMsg controls markup)
|
||||||
|
*/
|
||||||
|
.pswp__error-msg {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 50%;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 16px;
|
||||||
|
margin-top: -8px;
|
||||||
|
color: #CCC; }
|
||||||
|
|
||||||
|
.pswp__error-msg a {
|
||||||
|
color: #CCC;
|
||||||
|
text-decoration: underline; }
|
||||||
|
|
||||||
|
/* CSS für den Autoplay-Button */
|
||||||
|
.pswp__button--autoplay {
|
||||||
|
/* http://www.iconsplace.com/white-icons/play-icon */
|
||||||
|
background: transparent url(../img/play.png) no-repeat scroll 16px 14px !important;
|
||||||
|
}
|
||||||
|
.pswp__button--autoplay.stop {
|
||||||
|
/* http://www.iconsplace.com/white-icons/stop-icon */
|
||||||
|
background-image: url(../img/stop.png) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.photoswipe figure {
|
||||||
|
text-align:center;
|
||||||
|
}
|
||||||
|
div.photoswipe figure.floatleft {
|
||||||
|
float:left;
|
||||||
|
margin:0 1em 1em 0;
|
||||||
|
}
|
||||||
|
div.photoswipe figure.floatright {
|
||||||
|
float:right;
|
||||||
|
margin:0 0 1em 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-gallery div.photoswipe figure {
|
||||||
|
display:inline-block;
|
||||||
|
width:140px;
|
||||||
|
vertical-align: top;
|
||||||
|
margin:.5em 1em 0 0;
|
||||||
|
}
|
||||||
|
div.photoswipe figure figcaption {
|
||||||
|
width:200px;
|
||||||
|
}
|
||||||
|
.img-gallery div.photoswipe figure figcaption {
|
||||||
|
width:140px;
|
||||||
|
}
|
||||||
|
div.photoswipe figure.nofloat figcaption {
|
||||||
|
width:inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.photoswipe figure img {
|
||||||
|
margin: 0 0 .5em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.pswp__button--share {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.img-gallery div.photoswipe,
|
||||||
|
div.img-gallery figure,
|
||||||
|
div.img-gallery div.photoswipe
|
||||||
|
{
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fixes FP standard behaviour: If no float attribute is given, the image will get float attribute "center"
|
||||||
|
*/
|
||||||
|
figure.nofloat,
|
||||||
|
figure.nofloat figcaption,
|
||||||
|
figure.nofloat img.center {
|
||||||
|
display:inline-block;
|
||||||
|
text-align:left !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pswp__img { margin: 0px !important; }
|
3718
fp-plugins/photoswipe/res/photoswipe-4.1.1/photoswipe.js
Normal file
3718
fp-plugins/photoswipe/res/photoswipe-4.1.1/photoswipe.js
Normal file
File diff suppressed because it is too large
Load Diff
4
fp-plugins/photoswipe/res/photoswipe-4.1.1/photoswipe.min.js
vendored
Normal file
4
fp-plugins/photoswipe/res/photoswipe-4.1.1/photoswipe.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
87
fp-plugins/photoswipe/res/photoswipe.js.php
Normal file
87
fp-plugins/photoswipe/res/photoswipe.js.php
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
global $lang;
|
||||||
|
?>
|
||||||
|
/**
|
||||||
|
* Initializes the PhotoSwipe plugin.
|
||||||
|
*/
|
||||||
|
function initPhotoSwipePlugin() {
|
||||||
|
$('body').each(function() {
|
||||||
|
var $pic = $(this);
|
||||||
|
// function to collect the images
|
||||||
|
var getItems = function() {
|
||||||
|
var items = [];
|
||||||
|
$pic.find('figure').children('a').each(function() {
|
||||||
|
var $href = $(this).attr('href'), $size = $(this).attr('data-size').split('x'), $width = $size[0], $height = $size[1];
|
||||||
|
$title = $(this).attr('title');
|
||||||
|
var item = {
|
||||||
|
src : $href,
|
||||||
|
w : $width,
|
||||||
|
h : $height,
|
||||||
|
title : $title
|
||||||
|
}
|
||||||
|
items.push(item);
|
||||||
|
});
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
var items = getItems();
|
||||||
|
|
||||||
|
// open the image with the current index
|
||||||
|
var $pswp = $('.pswp')[0];
|
||||||
|
$pic.unbind('click').on('click', 'figure', function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
var index = parseInt($(this).attr('data-index'));
|
||||||
|
var options = {
|
||||||
|
// see http://photoswipe.com/documentation/options.html
|
||||||
|
index : index,
|
||||||
|
bgOpacity : .9,
|
||||||
|
loop : false,
|
||||||
|
closeOnScroll : false,
|
||||||
|
closeOnVerticalDrag : false,
|
||||||
|
// elements to show
|
||||||
|
closeEl : true,
|
||||||
|
captionEl : true,
|
||||||
|
fullscreenEl : true,
|
||||||
|
zoomEl : true,
|
||||||
|
shareEl : false,
|
||||||
|
counterEl : true,
|
||||||
|
arrowEl : true,
|
||||||
|
preloaderEl : true
|
||||||
|
}
|
||||||
|
|
||||||
|
// add autoplay button
|
||||||
|
var autoplayIntervall = 5000; // switch to next image each x seconds
|
||||||
|
if ($('.pswp__button--autoplay').length === 0) {
|
||||||
|
$('<button class="pswp__button pswp__button--autoplay" title="<?php
|
||||||
|
|
||||||
|
echo $lang ['plugin'] ['photoswipe'] ['tooltip_autoplaybutton'];
|
||||||
|
?> "></button>').insertAfter('.pswp__button--zoom');
|
||||||
|
}
|
||||||
|
|
||||||
|
var _autoplayId = null;
|
||||||
|
$('.pswp__button--autoplay').on('click', function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
if (_autoplayId) {
|
||||||
|
clearInterval(_autoplayId);
|
||||||
|
_autoplayId = null;
|
||||||
|
$('.pswp__button--autoplay').removeClass('stop').attr('title', 'Automatisch abspielen');
|
||||||
|
} else {
|
||||||
|
_autoplayId = setInterval(function() {
|
||||||
|
lightBox.next();
|
||||||
|
}, autoplayIntervall);
|
||||||
|
$('.pswp__button--autoplay').removeClass('stop').attr('title', 'Abspielen beenden');
|
||||||
|
$('.pswp__button--autoplay').addClass('stop');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GO! :)
|
||||||
|
var lightBox = new PhotoSwipe($pswp, PhotoSwipeUI_Default, items, options);
|
||||||
|
lightBox.init();
|
||||||
|
}); // $pic.on('click' ...
|
||||||
|
|
||||||
|
}); // $('.picture').each( ...
|
||||||
|
|
||||||
|
} // function initPhotoSwipePlugin()
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
initPhotoSwipePlugin();
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user