init
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"presets": [
|
||||
[
|
||||
"@babel/preset-env", {
|
||||
"corejs": "3",
|
||||
"useBuiltIns": "usage",
|
||||
"debug": false
|
||||
}]
|
||||
],
|
||||
"plugins": [
|
||||
"@babel/plugin-syntax-dynamic-import",
|
||||
"@babel/plugin-proposal-class-properties",
|
||||
"@babel/plugin-proposal-object-rest-spread"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
# http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.php]
|
||||
indent_size = 4
|
||||
@@ -0,0 +1,12 @@
|
||||
### WebStorm/IntelliJ ###
|
||||
/.idea
|
||||
|
||||
# Dependency directories
|
||||
/node_modules
|
||||
|
||||
# Build generated
|
||||
/dist
|
||||
/archives
|
||||
/sourcefiles
|
||||
/releasefiles
|
||||
/package
|
||||
@@ -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>.
|
||||
@@ -0,0 +1,23 @@
|
||||
# Joomla Boilerplate
|
||||
Boilerplate files for Joomla! extensions.
|
||||
|
||||
# Installation
|
||||
The boilerplates can be installed as-is using the Extension Manager. However, the component, module and plugin will be called Foo :)
|
||||
|
||||
To create installable zip packages, you only need to zip the folder with the files and it is ready to be installed.
|
||||
|
||||
# Customizing
|
||||
To customize the boilerplates using your own name you need to take the following steps:
|
||||
|
||||
1. Do a **case-sensitive** replace on the following strings and replace them with your own name:
|
||||
* joomlaboilerplate
|
||||
* JoomlaBoilerplate
|
||||
* JOOMLABOILERPLATE
|
||||
2. Do a **case-sensitive** replace on the following tags with their actual information:
|
||||
* [DATE]
|
||||
* [PROJECT_NAME]
|
||||
* [AUTHOR]
|
||||
* [AUTHOR_EMAIL]
|
||||
* [AUTHOR_URL]
|
||||
* [COPYRIGHT]
|
||||
* [PACKAGE_NAME]
|
||||
@@ -0,0 +1,154 @@
|
||||
export const pjson = require('../package.json');
|
||||
|
||||
export const config = {
|
||||
browserSyncConfig: {
|
||||
ghostMode: {
|
||||
clicks: true,
|
||||
scroll: true,
|
||||
links: true,
|
||||
forms: true
|
||||
},
|
||||
server: {
|
||||
baseDir: ['/dist/']
|
||||
},
|
||||
proxy: pjson.buildconfigs.proxy,
|
||||
https: false,
|
||||
open: false,
|
||||
debugInfo: false,
|
||||
watchTask: false,
|
||||
notify: {
|
||||
styles: [
|
||||
'padding: 8px 16px;',
|
||||
'position: fixed;',
|
||||
'font-size: 12px;',
|
||||
'font-weight: bold',
|
||||
'z-index: 9999;',
|
||||
'top: inherit',
|
||||
'border-radius: 0',
|
||||
'right: 0;',
|
||||
'top: 0;',
|
||||
'color: #f4f8f9;',
|
||||
'background-color: #026277;',
|
||||
'text-transform: uppercase'
|
||||
]
|
||||
}
|
||||
},
|
||||
paths: {
|
||||
src: './src/',
|
||||
dest: './dist/',
|
||||
copy: {
|
||||
src: ['src/structure/**/**', 'src/structure/**/.*', '!src/structure/**/*.{php,html,xml,ini,less,json,js,css}', '!src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
|
||||
replacesrc: ['src/structure/**/**.{php,html,xml,ini,less,json,js,css}', 'src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
|
||||
dest: 'dist/',
|
||||
watch: ['src/structure/**/*.{php,html,xml,ini,less,json,js,css}'],
|
||||
},
|
||||
copyrelease: {
|
||||
src: ['src/structure/**/**', 'src/structure/**/.*', '!src/structure/**/*.{php,html,xml,ini,less,json,js,css}', '!src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
|
||||
replacesrc: ['src/structure/**/**.{php,html,xml,ini,less,json,js,css}', 'src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
|
||||
dest: 'releasefiles/'
|
||||
},
|
||||
cleaner: {
|
||||
releasefiles: 'releasefiles/',
|
||||
sourcefiles: 'sourcefiles/',
|
||||
archives: 'archives/',
|
||||
packages: 'package/'
|
||||
},
|
||||
},
|
||||
packagefiles: [
|
||||
{
|
||||
src: './releasefiles/components/com_kickboilerplate/**/**',
|
||||
dest: 'sourcefiles/com_kickboilerplate/site'
|
||||
},
|
||||
{
|
||||
src: './releasefiles/administrator/components/com_kickboilerplate/**/**',
|
||||
dest: 'sourcefiles/com_kickboilerplate/admin'
|
||||
},
|
||||
{
|
||||
src: './releasefiles/administrator/components/com_kickboilerplate/kickboilerplate.xml',
|
||||
dest: 'sourcefiles/com_kickboilerplate/'
|
||||
},
|
||||
{
|
||||
src: './releasefiles/administrator/components/com_kickboilerplate/script.php',
|
||||
dest: 'sourcefiles/com_kickboilerplate/'
|
||||
},
|
||||
{
|
||||
src: './releasefiles/media/com_kickboilerplate/**/**',
|
||||
dest: 'sourcefiles/com_kickboilerplate/media'
|
||||
},
|
||||
{
|
||||
src: './releasefiles/plugins/system/kickboilerplate/**/**',
|
||||
dest: 'sourcefiles/plg_system_kickboilerplate'
|
||||
}
|
||||
],
|
||||
package: [
|
||||
{
|
||||
destination : 'archives/',
|
||||
name: 'pkg_kickytp',
|
||||
types: [
|
||||
{
|
||||
extension: '.zip',
|
||||
type: 'zip'
|
||||
}
|
||||
],
|
||||
folders: [
|
||||
'package'
|
||||
],
|
||||
files: [
|
||||
]
|
||||
}
|
||||
],
|
||||
archiver: [
|
||||
{
|
||||
destination : 'package/packages/',
|
||||
name: 'plg_system_kickboilerplate',
|
||||
suffixversion: false,
|
||||
types: [
|
||||
{
|
||||
extension: '.zip',
|
||||
type: 'zip',
|
||||
options: {
|
||||
zlib: { 'level': 9 }
|
||||
}
|
||||
}
|
||||
],
|
||||
folders: [
|
||||
'sourcefiles/plg_system_kickboilerplate'
|
||||
],
|
||||
files: [
|
||||
]
|
||||
},
|
||||
{
|
||||
destination : 'package/packages/',
|
||||
name: 'com_kickboilerplate',
|
||||
suffixversion: false,
|
||||
types: [
|
||||
{
|
||||
extension: '.zip',
|
||||
type: 'zip',
|
||||
options: {
|
||||
zlib: { 'level': 9 }
|
||||
}
|
||||
}
|
||||
],
|
||||
folders: [
|
||||
'sourcefiles/com_kickboilerplate'
|
||||
],
|
||||
files: [
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
export const isProd = process.env.NODE_ENV === 'production';
|
||||
|
||||
export const stringsreplace = extend({}, {"[VERSION]": pjson.version} , pjson.placeholder);
|
||||
|
||||
function extend(target) {
|
||||
var sources = [].slice.call(arguments, 1);
|
||||
sources.forEach(function (source) {
|
||||
for (var prop in source) {
|
||||
target[prop] = source[prop];
|
||||
}
|
||||
});
|
||||
return target;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* @title gulpfile.babel.js
|
||||
* @description A directory file loader to include all the gulp tasks
|
||||
*
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import gulp from 'gulp';
|
||||
|
||||
import { boilerplate } from './tasks/boilerplate';
|
||||
import { watch } from './tasks/watch';
|
||||
import { build } from './tasks/build';
|
||||
import { copy } from './tasks/copy';
|
||||
import { copyRelease } from './tasks/copy-release';
|
||||
import { cleaner } from './tasks/clean';
|
||||
import { copyPackageFiles } from './tasks/copy-packagefiles';
|
||||
import { buildArchives } from './tasks/archives';
|
||||
import { release } from './tasks/release';
|
||||
|
||||
exports.boilerplate = boilerplate;
|
||||
exports.watch = watch;
|
||||
exports.build = build;
|
||||
exports.copyFiles = copy;
|
||||
exports.copyRelease = copyRelease;
|
||||
exports.cleaner = cleaner;
|
||||
exports.copyPackageFiles = copyPackageFiles;
|
||||
exports.archiver = buildArchives;
|
||||
exports.release = release;
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* @title Package Files
|
||||
* @description A task to copy images
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import fs from 'fs'
|
||||
import archiver from 'archiver'
|
||||
|
||||
// Config
|
||||
import { config, pjson } from '../config';
|
||||
|
||||
// Task
|
||||
export function buildArchives(cb) {
|
||||
|
||||
const builder = async () => {
|
||||
for (const archivesetup of config.archiver) {
|
||||
await build(archivesetup)
|
||||
};
|
||||
};
|
||||
|
||||
builder().then(() => {
|
||||
cb()
|
||||
});
|
||||
}
|
||||
|
||||
const build = archivesetup => {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!fs.existsSync(archivesetup.destination)){
|
||||
fs.mkdirSync(archivesetup.destination, { recursive: true });
|
||||
}
|
||||
|
||||
let finisher = 0;
|
||||
|
||||
let forEach = archivesetup.types.forEach( function(item) {
|
||||
let extensionname = archivesetup.destination + archivesetup.name + item.extension
|
||||
if (archivesetup.suffixversion) {
|
||||
extensionname = archivesetup.destination + archivesetup.name + '_' + pjson.version + item.extension;
|
||||
}
|
||||
let output = fs.createWriteStream(extensionname);
|
||||
const archive = archiver((item.type).toString(), item.options);
|
||||
output.on('close', function() {
|
||||
finisher++;
|
||||
console.log(archive.pointer() + ' total bytes');
|
||||
console.log('archiver has been finalized and the output file ('+archivesetup.name+') descriptor has closed.');
|
||||
|
||||
if(finisher == archivesetup.types.length) {
|
||||
resolve()
|
||||
}
|
||||
});
|
||||
|
||||
// This event is fired when the data source is drained no matter what was the data source.
|
||||
// It is not part of this library but rather from the NodeJS Stream API.
|
||||
// @see: https://nodejs.org/api/stream.html#stream_event_end
|
||||
output.on('end', function() {
|
||||
console.log('Data has been drained');
|
||||
});
|
||||
|
||||
// good practice to catch warnings (ie stat failures and other non-blocking errors)
|
||||
archive.on('warning', function(err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
// log warning
|
||||
} else {
|
||||
// throw error
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
|
||||
archive.on('error', function(err) {
|
||||
throw err;
|
||||
});
|
||||
|
||||
archive.pipe(output);
|
||||
|
||||
archivesetup.folders.forEach(function (folder) {
|
||||
archive.directory(folder, false);
|
||||
})
|
||||
|
||||
archive.finalize();
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* Automatic Release
|
||||
*
|
||||
* @description: Deploy Task for an automated Build Process
|
||||
*/
|
||||
|
||||
import { series } from 'gulp'
|
||||
|
||||
import { copyBoilerplate } from './copy-boilerplate'
|
||||
import { cleanBoilerplate } from './clean-boilerplate';
|
||||
|
||||
export const boilerplate = series(
|
||||
cleanBoilerplate,
|
||||
copyBoilerplate
|
||||
);
|
||||
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Automatic Deploy
|
||||
*
|
||||
* @description: Deploy Task for an automated Build Process
|
||||
*/
|
||||
|
||||
import { series } from 'gulp'
|
||||
|
||||
import { copy } from './copy'
|
||||
|
||||
export const build = series(
|
||||
copy
|
||||
);
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* @title Copy
|
||||
* @description A task to copy files to the output directory
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import { src } from 'gulp';
|
||||
import mergeStream from 'merge-stream';
|
||||
import plumber from "gulp-plumber";
|
||||
import errorHandler from "../util/errorHandler";
|
||||
import clean from "gulp-clean";
|
||||
|
||||
// Config
|
||||
import { pjson } from '../config';
|
||||
|
||||
// Task
|
||||
export function cleanBoilerplate() {
|
||||
return mergeStream(pjson.boilerplate.files.map(function(item) {
|
||||
return src(item.dest, {allowEmpty: true})
|
||||
.pipe(plumber({errorHandler}))
|
||||
.pipe(clean({force: true}))
|
||||
}))
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* @title Scripts
|
||||
* @description A task to concatenate and compress js files via webpack
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import { src, series } from 'gulp';
|
||||
import plumber from 'gulp-plumber';
|
||||
import clean from 'gulp-clean';
|
||||
import errorHandler from '../util/errorHandler.js';
|
||||
|
||||
// Config
|
||||
import { config } from '../config';
|
||||
|
||||
// Task
|
||||
export function deleteReleasefilesFolder() {
|
||||
return src(config.paths.cleaner.releasefiles, {allowEmpty: true})
|
||||
.pipe(plumber({errorHandler}))
|
||||
.pipe(clean({force: true}))
|
||||
}
|
||||
|
||||
|
||||
export function deleteSourcefilesFolder() {
|
||||
return src(config.paths.cleaner.sourcefiles, {allowEmpty: true})
|
||||
.pipe(plumber({errorHandler}))
|
||||
.pipe(clean({force: true}))
|
||||
}
|
||||
|
||||
export function deleteArchivesFolder() {
|
||||
return src(config.paths.cleaner.archives, {allowEmpty: true})
|
||||
.pipe(plumber({errorHandler}))
|
||||
.pipe(clean({force: true}))
|
||||
}
|
||||
|
||||
export function deletePackageFolder() {
|
||||
return src(config.paths.cleaner.packages, {allowEmpty: true})
|
||||
.pipe(plumber({errorHandler}))
|
||||
.pipe(clean({force: true}))
|
||||
}
|
||||
|
||||
export const cleaner = series(deleteReleasefilesFolder, deleteSourcefilesFolder, deleteArchivesFolder, deletePackageFolder);
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* @title Package Files
|
||||
* @description A task to copy images
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import {src, dest, series} from 'gulp';
|
||||
import plumber from 'gulp-plumber';
|
||||
import changed from 'gulp-changed';
|
||||
import rename from 'gulp-rename';
|
||||
import mergeStream from 'merge-stream'
|
||||
import errorHandler from '../util/errorHandler.js';
|
||||
import replaceStrings from '../util/replaceStrings.js';
|
||||
|
||||
|
||||
// Config
|
||||
import { isProd, pjson } from '../config';
|
||||
import gulpif from "gulp-if";
|
||||
|
||||
// Task
|
||||
function cleancopy() {
|
||||
return mergeStream(pjson.boilerplate.files.map(function(item) {
|
||||
return src(item.src)
|
||||
.pipe(rename(function (path) {
|
||||
path.dirname = path.dirname.replace(/joomlaboilerplate/g, pjson.casesensitive.joomlaboilerplate);
|
||||
path.basename = path.basename.replace(/joomlaboilerplate/g, pjson.casesensitive.joomlaboilerplate);
|
||||
}))
|
||||
.pipe(plumber({errorHandler}))
|
||||
.pipe(gulpif(!isProd, changed(item.dest)))
|
||||
.pipe(dest(item.dest.replace(/joomlaboilerplate/g, pjson.casesensitive.joomlaboilerplate)))
|
||||
}))
|
||||
}
|
||||
|
||||
function replacecopy() {
|
||||
return mergeStream(pjson.boilerplate.files.map(function(item) {
|
||||
return src(item.replacesrc)
|
||||
.pipe(rename(function (path) {
|
||||
path.dirname = path.dirname.replace(/joomlaboilerplate/g, pjson.casesensitive.joomlaboilerplate);
|
||||
path.basename = path.basename.replace(/joomlaboilerplate/g, pjson.casesensitive.joomlaboilerplate);
|
||||
}))
|
||||
.pipe(replaceStrings(pjson.casesensitive))
|
||||
.pipe(plumber({errorHandler}))
|
||||
.pipe(gulpif(!isProd, changed(item.dest)))
|
||||
.pipe(dest(item.dest.replace(/joomlaboilerplate/g, pjson.casesensitive.joomlaboilerplate)))
|
||||
}))
|
||||
}
|
||||
|
||||
|
||||
export const copyBoilerplate = series(
|
||||
cleancopy,
|
||||
replacecopy
|
||||
);
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* @title Package Files
|
||||
* @description A task to copy images
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import { src, dest } from 'gulp';
|
||||
import plumber from 'gulp-plumber';
|
||||
import changed from 'gulp-changed';
|
||||
import mergeStream from 'merge-stream'
|
||||
import errorHandler from '../util/errorHandler.js';
|
||||
|
||||
// Config
|
||||
import {config, isProd} from '../config';
|
||||
import gulpif from "gulp-if";
|
||||
|
||||
// Task
|
||||
export function copyPackageFiles() {
|
||||
return mergeStream(config.packagefiles.map(function(item) {
|
||||
return src([item.src])
|
||||
.pipe(plumber({errorHandler}))
|
||||
.pipe(gulpif(!isProd, changed(item.dest)))
|
||||
.pipe(dest(item.dest))
|
||||
}))
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* @title Copy
|
||||
* @description A task to copy files to the output directory
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import {src, dest, series} from 'gulp';
|
||||
import changed from 'gulp-changed';
|
||||
import replacestrings from '../util/replaceStrings.js';
|
||||
import gulpif from 'gulp-if';
|
||||
|
||||
// Config
|
||||
import {config, isProd, stringsreplace} from '../config';
|
||||
|
||||
function cleancopy() {
|
||||
return src(config.paths.copyrelease.src)
|
||||
.pipe(gulpif(!isProd, changed(config.paths.copyrelease.dest)))
|
||||
.pipe(dest(config.paths.copyrelease.dest));
|
||||
}
|
||||
|
||||
function replacecopy() {
|
||||
return src(config.paths.copyrelease.replacesrc)
|
||||
.pipe(replacestrings(stringsreplace))
|
||||
.pipe(gulpif(!isProd, changed(config.paths.copyrelease.dest)))
|
||||
.pipe(dest(config.paths.copyrelease.dest));
|
||||
}
|
||||
|
||||
export const copyRelease = series(
|
||||
cleancopy,
|
||||
replacecopy
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* @title Copy
|
||||
* @description A task to copy files to the output directory
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import {src, dest, series} from 'gulp';
|
||||
import changed from 'gulp-changed';
|
||||
import replacestrings from '../util/replaceStrings.js';
|
||||
import gulpif from 'gulp-if';
|
||||
|
||||
// Config
|
||||
import {config, isProd, stringsreplace} from '../config';
|
||||
|
||||
function cleancopy() {
|
||||
return src(config.paths.copy.src)
|
||||
.pipe(gulpif(!isProd, changed(config.paths.copy.dest)))
|
||||
.pipe(dest(config.paths.copy.dest));
|
||||
}
|
||||
|
||||
function replacecopy() {
|
||||
return src(config.paths.copy.replacesrc)
|
||||
.pipe(replacestrings(stringsreplace))
|
||||
.pipe(gulpif(!isProd, changed(config.paths.copy.dest)))
|
||||
.pipe(dest(config.paths.copy.dest));
|
||||
}
|
||||
|
||||
export const copy = series(
|
||||
cleancopy,
|
||||
replacecopy
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Automatic Release
|
||||
*
|
||||
* @description: Deploy Task for an automated Build Process
|
||||
*/
|
||||
|
||||
import { series, parallel } from 'gulp'
|
||||
|
||||
import { copyRelease } from './copy-release'
|
||||
import { copyPackageFiles } from './copy-packagefiles'
|
||||
import { buildArchives } from './archives'
|
||||
import { cleaner, deleteReleasefilesFolder } from './clean';
|
||||
|
||||
// Config
|
||||
import { config } from '../config';
|
||||
|
||||
export const release = series(
|
||||
cleaner,
|
||||
copyRelease,
|
||||
copyPackageFiles,
|
||||
buildArchives
|
||||
);
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* @title serve
|
||||
* @description A task to initialise browser-sync
|
||||
* either via proxy or serving the files directly
|
||||
* depending on your settings
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import browserSync from 'browser-sync';
|
||||
import gulp from 'gulp';
|
||||
|
||||
// Config
|
||||
import {config} from '../config';
|
||||
|
||||
// Task
|
||||
// const server = browserSync.create();
|
||||
|
||||
export function serve(cb) {
|
||||
// Build a condition when Proxy is active
|
||||
let bsProxy;
|
||||
let bsServer;
|
||||
|
||||
// Condition for Proxy
|
||||
if (config.browserSyncConfig.proxy != '') {
|
||||
bsProxy = {
|
||||
target: config.browserSyncConfig.proxy,
|
||||
ws: true
|
||||
};
|
||||
bsServer = false;
|
||||
} else {
|
||||
bsProxy = false;
|
||||
bsServer = {
|
||||
baseDir: [config.paths.dest]
|
||||
};
|
||||
}
|
||||
|
||||
browserSync.init({
|
||||
server: bsServer,
|
||||
proxy: bsProxy,
|
||||
notify: config.browserSyncConfig.notify,
|
||||
open: config.browserSyncConfig.open,
|
||||
https: config.browserSyncConfig.https,
|
||||
ghostMode: config.browserSyncConfig.ghostMode,
|
||||
debugInfo: config.browserSyncConfig.debugInfo,
|
||||
watchTask: config.browserSyncConfig.watchTask,
|
||||
});
|
||||
cb();
|
||||
}
|
||||
|
||||
gulp.task('browser-sync', serve);
|
||||
|
||||
export function reload(cb) {
|
||||
browserSync.reload();
|
||||
cb();
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* @title Watch
|
||||
* @description A task to start the server and watch for changes.
|
||||
*/
|
||||
|
||||
// Dependencies
|
||||
import gulp from 'gulp';
|
||||
import { series } from 'gulp';
|
||||
|
||||
// Tasks
|
||||
import { reload, serve } from './server';
|
||||
import { copy } from './copy';
|
||||
|
||||
// Config
|
||||
import { config } from '../config';
|
||||
|
||||
function watchFiles() {
|
||||
gulp.watch(config.paths.copy.watch, series(copy, reload));
|
||||
}
|
||||
|
||||
export const watch = series(
|
||||
serve,
|
||||
watchFiles
|
||||
);
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* @title Error Handler
|
||||
*/
|
||||
|
||||
import notifier from "node-notifier";
|
||||
|
||||
function errorHandler(error) {
|
||||
notifier.notify({
|
||||
title: 'Gulp Error',
|
||||
message: error.message,
|
||||
timeout: 3
|
||||
});
|
||||
console.error('\x1b[31m', error.message ,'\x1b[0m');
|
||||
this.emit('end');
|
||||
}
|
||||
|
||||
export default errorHandler;
|
||||
@@ -0,0 +1,47 @@
|
||||
'use strict';
|
||||
|
||||
var through2 = require('through2');
|
||||
var gutil = require('gulp-util');
|
||||
|
||||
var PLUGIN_NAME = 'gulp-replace-task';
|
||||
|
||||
// plugin
|
||||
|
||||
module.exports = function (opts) {
|
||||
|
||||
return through2.obj(function (file, enc, cb) {
|
||||
|
||||
if (file.isNull()) {
|
||||
this.push(file);
|
||||
return cb();
|
||||
}
|
||||
|
||||
if (file.isStream()) {
|
||||
this.emit('error', new gutil.PluginError(PLUGIN_NAME,
|
||||
'Streaming not supported'));
|
||||
return cb();
|
||||
}
|
||||
|
||||
var options = opts || {};
|
||||
var contents = file.contents.toString();
|
||||
|
||||
for (const [key, value] of Object.entries(opts)) {
|
||||
key = key.replace('[','\\[');
|
||||
key = key.replace(']','\\]');
|
||||
var re = new RegExp(key, 'g');
|
||||
contents = contents.replace(re, value);
|
||||
}
|
||||
|
||||
var result = contents;
|
||||
if (result !== false) {
|
||||
file.contents = new Buffer.from(result);
|
||||
} else {
|
||||
// preserve original file
|
||||
}
|
||||
|
||||
this.push(file);
|
||||
cb();
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
@@ -0,0 +1,138 @@
|
||||
{
|
||||
"name": "sportsmanager",
|
||||
"description": "",
|
||||
"version": "0.0.1",
|
||||
"scripts": {
|
||||
"boilerplate": "cross-env NODE_ENV=development gulp boilerplate",
|
||||
"build": "cross-env NODE_ENV=production gulp build",
|
||||
"watch": "cross-env NODE_ENV=development gulp watch",
|
||||
"cleaner": "cross-env NODE_ENV=production gulp cleaner",
|
||||
"package": "cross-env NODE_ENV=production gulp copyPackageFiles",
|
||||
"copy": "cross-env NODE_ENV=production gulp copyFiles",
|
||||
"copyrelease": "cross-env NODE_ENV=production gulp copyRelease",
|
||||
"archiver": "cross-env NODE_ENV=production gulp archiver",
|
||||
"release": "cross-env NODE_ENV=production gulp release",
|
||||
"download:joomla": "sh ./scripts/joomla.sh"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/nielsnuebel/com_sportsmanager.git"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": {
|
||||
"name": "Kicktemp GmbH",
|
||||
"email": "hello@kicktemp.com",
|
||||
"url": "https://kicktemp.com"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Niels Nübel",
|
||||
"email": "niels@kicktemp.com"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/nielsnuebel/com_sportsmanager/issues"
|
||||
},
|
||||
"homepage": "https://github.com/nielsnuebel/com_sportsmanager#readme",
|
||||
"buildconfigs": {
|
||||
"proxy": "http://com_sportsmanager.kick"
|
||||
},
|
||||
"placeholder": {
|
||||
"[UPDATEURL]": "https://kicktemp.shop/download?e=[PACKAGE_NAME]&v=[VERSION]",
|
||||
"[PACKAGE_NAME]": "com_sportsmanager",
|
||||
"[PROJECT_NAME]": "com_sportsmanager",
|
||||
"[PRODUCT_NAME]": "SportsManager",
|
||||
"[AUTHOR]": "Kicktemp GmbH",
|
||||
"[AUTHOR_EMAIL]": "hello@kicktemp.com",
|
||||
"[COPYRIGHT]": "Copyright © 2020 Kicktemp GmbH. All rights reserved.",
|
||||
"[AUTHOR_URL]": "https://kicktemp.com",
|
||||
"[DATE]": "17.07.2020",
|
||||
"[PLUGINTYPE]": "system"
|
||||
},
|
||||
"casesensitive": {
|
||||
"joomlaboilerplate": "kickboilerplate",
|
||||
"JoomlaBoilerplate": "KickBoilerPlate",
|
||||
"JOOMLABOILERPLATE": "KICKBOILERPLATE"
|
||||
},
|
||||
"boilerplate": {
|
||||
"files": [
|
||||
{
|
||||
"src": [
|
||||
"./boilerplates/plugin/system/**/**",
|
||||
"./boilerplates/plugin/system/**/.*",
|
||||
"!./boilerplates/plugin/system/**/*.{php,html,xml,ini,less,json,js,css}",
|
||||
"!./boilerplates/plugin/system/**/.*.{php,html,xml,ini,less,json,js,css}"
|
||||
],
|
||||
"replacesrc": [
|
||||
"./boilerplates/plugin/system/**/**.{php,html,xml,ini,less,json,js,css}",
|
||||
"./boilerplates/plugin/system/**/.*.{php,html,xml,ini,less,json,js,css}"
|
||||
],
|
||||
"dest": "src/structure/plugins/system/kickboilerplate"
|
||||
},
|
||||
{
|
||||
"src": [
|
||||
"./boilerplates/component/administrator/**/**",
|
||||
"./boilerplates/component/administrator/**/.*",
|
||||
"!./boilerplates/component/administrator/**/*.{php,html,xml,ini,less,json,js,css}",
|
||||
"!./boilerplates/component/administrator/**/.*.{php,html,xml,ini,less,json,js,css}"
|
||||
],
|
||||
"replacesrc": [
|
||||
"./boilerplates/component/administrator/**/**.{php,html,xml,ini,less,json,js,css}",
|
||||
"./boilerplates/component/administrator/**/.*.{php,html,xml,ini,less,json,js,css}"
|
||||
],
|
||||
"dest": "src/structure/administrator"
|
||||
},
|
||||
{
|
||||
"src": [
|
||||
"./boilerplates/component/components/**/**",
|
||||
"./boilerplates/component/components/**/.*",
|
||||
"!./boilerplates/component/components/**/*.{php,html,xml,ini,less,json,js,css}",
|
||||
"!./boilerplates/component/components/**/.*.{php,html,xml,ini,less,json,js,css}"
|
||||
],
|
||||
"replacesrc": [
|
||||
"./boilerplates/component/components/**/**.{php,html,xml,ini,less,json,js,css}",
|
||||
"./boilerplates/component/components/**/.*.{php,html,xml,ini,less,json,js,css}"
|
||||
],
|
||||
"dest": "src/structure/components"
|
||||
},
|
||||
{
|
||||
"src": [
|
||||
"./boilerplates/component/media/**/**",
|
||||
"./boilerplates/component/media/**/.*",
|
||||
"!./boilerplates/component/media/**/*.{php,html,xml,ini,less,json,js,css}",
|
||||
"!./boilerplates/component/media/**/.*.{php,html,xml,ini,less,json,js,css}"
|
||||
],
|
||||
"replacesrc": [
|
||||
"./boilerplates/component/media/**/**.{php,html,xml,ini,less,json,js,css}",
|
||||
"./boilerplates/component/media/**/.*.{php,html,xml,ini,less,json,js,css}"
|
||||
],
|
||||
"dest": "src/structure/media"
|
||||
}
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.0",
|
||||
"@babel/plugin-proposal-class-properties": "^7.10.4",
|
||||
"@babel/plugin-proposal-object-rest-spread": "^7.11.0",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||
"@babel/preset-env": "^7.12.0",
|
||||
"@babel/register": "^7.12.0",
|
||||
"archiver": "^5.0.2",
|
||||
"browser-sync": "^2.26.12",
|
||||
"core-js": "^3.6.5",
|
||||
"cross-env": "^7.0.2",
|
||||
"fs": "0.0.1-security",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-changed": "^4.0.2",
|
||||
"gulp-clean": "^0.4.0",
|
||||
"gulp-if": "^3.0.0",
|
||||
"gulp-plumber": "^1.2.1",
|
||||
"gulp-rename": "^2.0.0",
|
||||
"gulp-replace-task": "^0.11.0",
|
||||
"gulp-util": "^3.0.8",
|
||||
"merge-stream": "^2.0.0",
|
||||
"node-notifier": "^8.0.0",
|
||||
"through2": "^4.0.2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
|
||||
INSTALLDIR=$SCRIPTPATH/../dist/
|
||||
|
||||
if [ ! -d INSTALLDIR ]; then
|
||||
mkdir -p ${INSTALLDIR}
|
||||
fi
|
||||
|
||||
current="$(curl -fsSL 'https://downloads.joomla.org/api/v1/latest/cms' | jq -r '.branches[3].version')"
|
||||
|
||||
curl -o ${INSTALLDIR}joomla.tar.bz2 -SL https://github.com/joomla/joomla-cms/releases/download/${current}/Joomla_${current}-Stable-Full_Package.tar.bz2
|
||||
tar xfvj ${INSTALLDIR}joomla.tar.bz2 -C ${INSTALLDIR}
|
||||
rm -f ${INSTALLDIR}joomla.tar.bz2
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<access component="com_sportsmanager">
|
||||
<section name="component">
|
||||
<!-- Joomla! core privileges -->
|
||||
<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
|
||||
<!-- <action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" /> -->
|
||||
<!-- Custom privileges -->
|
||||
<!-- <action name="example.something" title="COM_EXAMPLE_ACL_SOMETHING_TITLE" description="COM_EXAMPLE_ACL_SOMETHING_DESC" /> -->
|
||||
</section>
|
||||
</access>
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
// no direct access
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
// Require the base controller
|
||||
require_once (JPATH_COMPONENT.DS.'controller.php');
|
||||
|
||||
// Require specific controller if requested
|
||||
//if($controller = JRequest::getVar('controller')) {
|
||||
// require_once (JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php');
|
||||
//}
|
||||
|
||||
// Create the controller
|
||||
//$classname = 'AutosController'.$controller;
|
||||
//$controller = new $classname( );
|
||||
|
||||
// Perform the Request task
|
||||
//$controller->execute( JRequest::getVar('task'));
|
||||
|
||||
// Redirect if set by the controller
|
||||
//$controller->redirect();
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/*
|
||||
* Sports Manager (C) 2006-2020, Sven Nickel
|
||||
*/
|
||||
|
||||
// No direct access to this file
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
// import Joomla controller library
|
||||
jimport('joomla.application.component.controller');
|
||||
|
||||
/**
|
||||
* General Controller of SportsManager component
|
||||
*/
|
||||
class SportsManagerController extends JControllerLegacy
|
||||
{
|
||||
/**
|
||||
* display task
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function display($cachable = false, $urlparams = false)
|
||||
{
|
||||
// set default view if not set
|
||||
$input = JFactory::getApplication()->input;
|
||||
$input->set('view', $input->getCmd('view', 'SportsManager'));
|
||||
|
||||
// call parent behavior
|
||||
parent::display($cachable);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
// No direct access to this file
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
// import joomla controller library
|
||||
jimport('joomla.application.component.controller');
|
||||
|
||||
// Get an instance of the controller prefixed by HelloWorld
|
||||
$controller = JControllerLegacy::getInstance('SportsManager');
|
||||
|
||||
// Get the task
|
||||
$jinput = JFactory::getApplication()->input;
|
||||
$task = $jinput->get('task', "", 'STR' );
|
||||
|
||||
// Perform the Request task
|
||||
$controller->execute($task);
|
||||
|
||||
// Redirect if set by the controller
|
||||
$controller->redirect();
|
||||
@@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-install.dtd">
|
||||
<extension type="component" version="3.0" method="upgrade">
|
||||
<name>Sports manager</name>
|
||||
<creationDate>2020-09-30</creationDate>
|
||||
<author>Sven Nickel</author>
|
||||
<authorEmail>sven.nickel@gmail.com</authorEmail>
|
||||
<copyright>All rights reserved</copyright>
|
||||
<license>GNU/GPL</license>
|
||||
<version>1.7.1</version>
|
||||
<description>Verwaltung von Spielern und Vereinen in Mannschafts- und Individualwettbewerben</description>
|
||||
<files folder="site">
|
||||
<filename>index.html</filename>
|
||||
<filename>admin.php</filename>
|
||||
<filename>api.php</filename>
|
||||
<filename>controller.php</filename>
|
||||
<filename>database.php</filename>
|
||||
<filename>sportsmanager.php</filename>
|
||||
<filename>mathparser.php</filename>
|
||||
<filename>tools.php</filename>
|
||||
<filename>js/jquery.min.js</filename>
|
||||
<folder>images</folder>
|
||||
<folder>models</folder>
|
||||
<folder>views</folder>
|
||||
</files>
|
||||
<languages folder="site">
|
||||
<language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.ini
|
||||
</language>
|
||||
<language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.ini
|
||||
</language>
|
||||
<language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.ini
|
||||
</language>
|
||||
</languages>
|
||||
<scriptfile>install.php</scriptfile>
|
||||
<administration>
|
||||
<files folder="admin">
|
||||
<filename>access.xml</filename>
|
||||
<filename>sportsmanager.php</filename>
|
||||
<filename>controller.php</filename>
|
||||
<filename>index.html</filename>
|
||||
<folder>views</folder>
|
||||
</files>
|
||||
<languages folder="admin">
|
||||
<language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.ini
|
||||
</language>
|
||||
<language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.sys.ini
|
||||
</language>
|
||||
<language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.ini
|
||||
</language>
|
||||
<language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.sys.ini
|
||||
</language>
|
||||
<language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.ini
|
||||
</language>
|
||||
<language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.sys.ini
|
||||
</language>
|
||||
</languages>
|
||||
</administration>
|
||||
</extension>
|
||||
@@ -0,0 +1,5 @@
|
||||
[.ShellClassInfo]
|
||||
InfoTip=Dieser Ordner wird online freigegeben.
|
||||
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
|
||||
IconIndex=16
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
||||
@@ -0,0 +1,5 @@
|
||||
[.ShellClassInfo]
|
||||
InfoTip=Dieser Ordner wird online freigegeben.
|
||||
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
|
||||
IconIndex=16
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
/*
|
||||
* Sports Manager (C) 2006-2020, Sven Nickel
|
||||
*/
|
||||
|
||||
// No direct access to this file
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
[.ShellClassInfo]
|
||||
InfoTip=Dieser Ordner wird online freigegeben.
|
||||
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
|
||||
IconIndex=16
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/*
|
||||
* Sports Manager (C) 2006-2020, Sven Nickel
|
||||
*/
|
||||
|
||||
// No direct access to this file
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
// import Joomla view library
|
||||
jimport('joomla.application.component.view');
|
||||
|
||||
/**
|
||||
* SportsManager View
|
||||
*/
|
||||
|
||||
class SportsManagerViewSportsManager extends JViewLegacy
|
||||
{
|
||||
/**
|
||||
* SportsManager view display method
|
||||
* @return void
|
||||
*/
|
||||
function display($tpl = null)
|
||||
{
|
||||
JToolbarHelper::title(JText::_('COM_SPORTSMANAGER'));
|
||||
|
||||
?>
|
||||
<h2><?php echo JText::_('COM_SPORTSMANAGER'); ?> Copyright © 2006 – 2014 Sven Nickel</h2>
|
||||
<?php
|
||||
/*
|
||||
// Get data from the model
|
||||
$items = $this->get('Items');
|
||||
$pagination = $this->get('Pagination');
|
||||
|
||||
// Check for errors.
|
||||
if (count($errors = $this->get('Errors')))
|
||||
{
|
||||
JError::raiseError(500, implode('<br />', $errors));
|
||||
return false;
|
||||
}
|
||||
// Assign data to the view
|
||||
$this->items = $items;
|
||||
$this->pagination = $pagination;
|
||||
*/
|
||||
|
||||
// Display the template
|
||||
parent::display($tpl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,279 @@
|
||||
<?php
|
||||
/*
|
||||
* Sports Manager API Extension
|
||||
*/
|
||||
defined('_JEXEC') or die();
|
||||
|
||||
$secret = JFactory::$config['secret'];
|
||||
|
||||
function abortWithError($error) {
|
||||
if (isJson()) {
|
||||
header('content-type: application/json');
|
||||
die(json_encode(['error' => $error]));
|
||||
} else {
|
||||
die($error);
|
||||
}
|
||||
}
|
||||
|
||||
function isJson() {
|
||||
$jinput = JFactory::getApplication()->input;
|
||||
|
||||
return $jinput->get('format') === 'json';
|
||||
}
|
||||
|
||||
function notifyChange($data) {
|
||||
|
||||
try {
|
||||
$db = &getDatabase();
|
||||
$query = "SELECT wert from #__sportsmanager_einstellungen WHERE name='api_push_key'";
|
||||
$db->setQuery($query);
|
||||
$push_key = $db->loadResult();
|
||||
$push_server = !empty($push_key) && isset(_payload($push_key)->aud) ? _payload($push_key)->aud : '';
|
||||
if ($push_server != '' && $push_key != '') {
|
||||
$url = $push_server . (substr($push_server, -1) == '/' ? '' : '/') . 'v1/notifications/send';
|
||||
$key = 'key=' . $push_key;
|
||||
|
||||
$ch = curl_init($url);
|
||||
curl_setopt_array($ch, array(
|
||||
CURLOPT_POST => TRUE,
|
||||
CURLOPT_RETURNTRANSFER => TRUE,
|
||||
CURLOPT_HEADER => TRUE,
|
||||
CURLOPT_HTTPHEADER => array(
|
||||
'Authorization: ' . $key,
|
||||
'Content-Type: application/json',
|
||||
),
|
||||
CURLOPT_POSTFIELDS => json_encode($data),
|
||||
));
|
||||
$resp = curl_exec($ch);
|
||||
if ($resp == FALSE) {
|
||||
error_log("failed to send notification");
|
||||
}
|
||||
}
|
||||
} catch (Exception $ex) {
|
||||
error_log($ex);
|
||||
}
|
||||
}
|
||||
|
||||
function begegnungChanged($begegnung, $begegnung_vorher, $modus, $heim_team, $gast_team, $spiele) {
|
||||
notifyChange(['payload' => [
|
||||
'begegnung' => $begegnung,
|
||||
'begegnung_vorher' => $begegnung_vorher,
|
||||
'$modus' => $modus,
|
||||
'heim_team' => $heim_team,
|
||||
'gast_team' => $gast_team,
|
||||
'spiele' => $spiele,
|
||||
], 'type' => 'FIXTURE_RESULT_CHANGED']);
|
||||
}
|
||||
|
||||
function begegnungTischChanged($begegnung, $heim_team, $gast_team) {
|
||||
notifyChange(['payload' => [
|
||||
'begegnung' => $begegnung,
|
||||
'heim_team' => $heim_team,
|
||||
'gast_team' => $gast_team,
|
||||
], 'type' => 'TABLE_CHANGED']);
|
||||
}
|
||||
|
||||
function begegnungVerlegenNotify($begegnung, $users, $vorschlagendes_team_id, $heim_team, $gast_team) {
|
||||
notifyChange([
|
||||
'payload' => [
|
||||
'begegnung' => $begegnung,
|
||||
'users' => $users,
|
||||
'vorschlagendes_team_id' => $vorschlagendes_team_id,
|
||||
'heim_team' => $heim_team,
|
||||
'gast_team' => $gast_team,
|
||||
],
|
||||
'type' => 'FIXTURE_DATE_CHANGED'
|
||||
]);
|
||||
}
|
||||
|
||||
/*
|
||||
* erstellen von request tokens. diese sind 16 stunden gültig.
|
||||
* @reponse body
|
||||
* { data: { token: "reqest_token", access_for_team: ["team_id_1", "team_id_2"]}, expires: 1520013747000}
|
||||
*/
|
||||
function userToken() {
|
||||
global $secret;
|
||||
if (!isJson()) {
|
||||
abortWithError("JSON Request only");
|
||||
}
|
||||
if (isExternalDatabase()) {
|
||||
abortWithError("Local Database only");
|
||||
}
|
||||
$jinput = JFactory::getApplication()->input->json;
|
||||
$access_key = $jinput->getString('access_key');
|
||||
|
||||
$user_id = _payload($access_key)->sub;
|
||||
$user = JFactory::getUser($user_id);
|
||||
|
||||
if (!jwt_validate($access_key, $secret.$user->password)) {
|
||||
abortWithError('Access Key is invalid');
|
||||
}
|
||||
|
||||
$expires = new DateTime();
|
||||
$expires->modify('+16 hours');
|
||||
$db = &getDatabase();
|
||||
$query = "SELECT berechtigt_team_id from #__sportsmanager_berechtigt_fuer_team where berechtigt_user_id = $user_id";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
abortWithError($db->stderr(true));
|
||||
}
|
||||
$team_id = $db->loadObjectList();
|
||||
JSON_sportsmanager::JSON([
|
||||
'token' => jwt_token([
|
||||
'sub' => $user_id,
|
||||
'exp' => $expires->getTimestamp(),
|
||||
], $secret),
|
||||
'access_for_teams' => array_map(function($item) { return $item->berechtigt_team_id; }, $team_id),
|
||||
'expires' => $expires->getTimestamp() * 1000, //
|
||||
]);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* @response body
|
||||
* { data: { token: "api_acccess_token" }}
|
||||
*/
|
||||
function userAuth() {
|
||||
global $secret;
|
||||
if (!isJson()) {
|
||||
die();
|
||||
}
|
||||
if (isExternalDatabase()) {
|
||||
abortWithError("Local Database only");
|
||||
}
|
||||
$jinput = JFactory::getApplication()->input->json;
|
||||
$username = $jinput->getString('username');
|
||||
$password = $jinput->getString('password');
|
||||
|
||||
$db = &getDatabase();
|
||||
$query = $db->getQuery(true);
|
||||
$query->select('id')->from('#__users')->where('username = "' . $username . '"')->limit(1);
|
||||
$db->setQuery($query);
|
||||
$user_id = $db->loadResult();
|
||||
$user = JFactory::getUser($user_id);
|
||||
|
||||
if (JUserHelper::verifyPassword($password, $user->password, $user->id)) {
|
||||
|
||||
JSON_sportsmanager::JSON([
|
||||
'token' => jwt_token([
|
||||
'sub' => $user_id,
|
||||
'iat' => (new DateTime())->getTimestamp(),
|
||||
], $secret.$user->password)
|
||||
]);
|
||||
return;
|
||||
}
|
||||
abortWithError('Wrong credentials');
|
||||
}
|
||||
|
||||
function getUserID() {
|
||||
global $secret;
|
||||
$token = JFactory::getApplication()->input->server->getString('HTTP_SECRET', NULL);
|
||||
|
||||
return $token != NULL && jwt_validate($token, $secret) && isset(_payload($token)->sub)
|
||||
? (int) _payload($token)->sub
|
||||
: 0;
|
||||
}
|
||||
|
||||
function getColorOfImage($image) {
|
||||
if ($image != NULL) {
|
||||
|
||||
if (strpos($image, '.png') !== false) {
|
||||
$img = imagecreatefrompng($image);
|
||||
} else {
|
||||
$img = imagecreatefromjpeg($image);
|
||||
}
|
||||
$width = imagesx($img);
|
||||
$height = imagesx($img);
|
||||
$colorMap = [];
|
||||
$colors = [];
|
||||
for ($x = 0; $x < $width; $x++) {
|
||||
for ($y = 0; $y < $height; $y++) {
|
||||
$color = imagecolorsforindex($img, imagecolorat($img, $x, $y));
|
||||
if ($color['alpha'] < 20) {
|
||||
$c = colorKey($color);
|
||||
$hex = hex($color);
|
||||
if ($hex != NULL) {
|
||||
if (!isset($colors[$c])) {
|
||||
$colors[$c] = 0;
|
||||
$colorMap[$c] = $hex;
|
||||
}
|
||||
$colors[$c] += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
arsort($colors);
|
||||
$result = array_keys($colors);
|
||||
return sizeof($result) > 1 && $result[0] === '0-0-0' ? $colorMap[$result[1]] : $colorMap[$result[0]];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
function colorKey($rgb) {
|
||||
|
||||
$r = (int)($rgb['red'] / 100);
|
||||
$g = (int)($rgb['green'] / 100);
|
||||
$b = (int)($rgb['blue'] / 100);
|
||||
|
||||
return $r . '-' . $g . '-' . $b;
|
||||
}
|
||||
|
||||
function hex($rgb) {
|
||||
$r = $rgb['red'];
|
||||
$g = $rgb['green'];
|
||||
$b = $rgb['blue'];
|
||||
if (($r + $g + $b) / 3 > 125) {
|
||||
return NULL;
|
||||
}
|
||||
$r = dechex($r);
|
||||
if (strlen($r) < 2) {
|
||||
$r = '0' . $r;
|
||||
}
|
||||
$g = dechex($g);
|
||||
if (strlen($g) < 2) {
|
||||
$g = '0' . $g;
|
||||
}
|
||||
$b = dechex($b);
|
||||
if (strlen($b) < 2) {
|
||||
$b = '0' . $b;
|
||||
}
|
||||
return '#' . $r . $g . $b;
|
||||
}
|
||||
|
||||
/*
|
||||
* sign string with secret
|
||||
*/
|
||||
function _sign($data, $secret, $algo = 'sha256') {
|
||||
return base64_encode(hash_hmac('sha256', $data, $secret));
|
||||
}
|
||||
|
||||
/*
|
||||
* get payload from jwt token
|
||||
*/
|
||||
function _payload($token) {
|
||||
$jwt = explode('.', $token);
|
||||
return json_decode(base64_decode($jwt[0]));
|
||||
}
|
||||
|
||||
/*
|
||||
* headless signed jwt token
|
||||
*/
|
||||
function jwt_token($payload, $secret) {
|
||||
$data = base64_encode(json_encode($payload));
|
||||
|
||||
return $data . '.' . _sign($data, $secret);
|
||||
}
|
||||
|
||||
/*
|
||||
* validate token
|
||||
*/
|
||||
function jwt_validate($token, $secret) {
|
||||
$jwt = explode('.', $token);
|
||||
if (sizeof($jwt) == 2 && $jwt[1] == _sign($jwt[0], $secret)) {
|
||||
if (isset(_payload($token)->exp)) {
|
||||
return _payload($token)->exp > (new DateTime())->getTimestamp();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return sizeof($jwt) == 2 && $jwt[1] == _sign($jwt[0], $secret);
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
/*
|
||||
* Sports Manager (C) 2006-2020, Sven Nickel
|
||||
*/
|
||||
|
||||
// Check to ensure this file is included in Joomla!
|
||||
defined('_JEXEC') or die();
|
||||
jimport('joomla.application.component.controller');
|
||||
|
||||
/**
|
||||
* Auto Component Controller
|
||||
*/
|
||||
class SportsManagerController extends JControllerLegacy
|
||||
{
|
||||
function display()
|
||||
{
|
||||
// Setzt einen Standard view
|
||||
if ( ! JRequest::getCmd( 'view' ) ) {
|
||||
JRequest::setVar('view', 'categories' );
|
||||
}
|
||||
parent::display();
|
||||
}
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
@@ -0,0 +1,5 @@
|
||||
[.ShellClassInfo]
|
||||
InfoTip=Dieser Ordner wird online freigegeben.
|
||||
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
|
||||
IconIndex=16
|
||||
|
||||
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 613 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 522 B |
|
After Width: | Height: | Size: 242 B |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 558 B |
|
After Width: | Height: | Size: 540 B |
|
After Width: | Height: | Size: 517 B |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 276 B |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 761 B |
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
||||
@@ -0,0 +1,5 @@
|
||||
[.ShellClassInfo]
|
||||
InfoTip=Dieser Ordner wird online freigegeben.
|
||||
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
|
||||
IconIndex=16
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
||||
@@ -0,0 +1,393 @@
|
||||
<?php
|
||||
/*
|
||||
* Sports Manager (C) 2006-2020, Sven Nickel
|
||||
*/
|
||||
|
||||
// kein direkter Zugriff
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
require_once (JPATH_COMPONENT.DIRECTORY_SEPARATOR.'mathparser.php');
|
||||
|
||||
function mathParserVerteilung($rohpunkte, $platz, $teilnehmer, $multiplikator) {
|
||||
return max(round($multiplikator * round(((($rohpunkte - 1) * (-log($platz / $teilnehmer) * (1 - ($platz / $teilnehmer)))) / (-log(1 / $teilnehmer) * (1 - (1 / $teilnehmer)))) + 1)), 1);
|
||||
}
|
||||
|
||||
function mathParserVerteilungR($rohpunkte, $platz, $teilnehmer, $multiplikator) {
|
||||
return max(round(((($multiplikator * $rohpunkte - 1) * (-log($platz / $teilnehmer) * (1 - ($platz / $teilnehmer)))) / (-log(1 / $teilnehmer) * (1 - (1 / $teilnehmer)))) + 1), 1);
|
||||
}
|
||||
|
||||
class MathParserSM extends MathParser {
|
||||
// Verteilung nach Klostermann/Wahle
|
||||
public function __construct() {
|
||||
MathParser::__construct();
|
||||
$this->createFunc("ROUND", round, 1);
|
||||
$this->createFunc("VERTEILUNG", mathParserVerteilung, 4);
|
||||
$this->createFunc("VERTEILUNGR", mathParserVerteilungR, 4);
|
||||
}
|
||||
}
|
||||
|
||||
function keinZugriff($login = FALSE) {
|
||||
if (isJson()) {
|
||||
abortWithError(401 . ' Unauthorized');
|
||||
}
|
||||
if (!$login || JFactory::getUser()->id) {
|
||||
JError::raiseError(500, JText::_('JERROR_ALERTNOAUTHOR'));
|
||||
jexit();
|
||||
}
|
||||
$version = new JVersion;
|
||||
$joomla = $version->getShortVersion();
|
||||
$u =& JFactory::getURI();
|
||||
$redirectUrl = urlencode(base64_encode($u->toString()));
|
||||
$redirectUrl = '&return='.$redirectUrl;
|
||||
$joomlaLoginUrl = 'index.php?option=' . (substr($joomla, 0, 3) != '1.5' ? 'com_users' : 'com_user') . '&view=login';
|
||||
$finalUrl = $joomlaLoginUrl . $redirectUrl;
|
||||
$app = &JFactory::getApplication();
|
||||
$app->redirect(JRoute::_($finalUrl));
|
||||
jexit();
|
||||
}
|
||||
|
||||
function bereinigterDateiname($dateiname) {
|
||||
$_convertTable = array(
|
||||
'&' => 'and', '@' => 'at', '©' => 'c', '®' => 'r', 'À' => 'a',
|
||||
'Á' => 'a', 'Â' => 'a', 'Ä' => 'a', 'Å' => 'a', 'Æ' => 'ae','Ç' => 'c',
|
||||
'È' => 'e', 'É' => 'e', 'Ë' => 'e', 'Ì' => 'i', 'Í' => 'i', 'Î' => 'i',
|
||||
'Ï' => 'i', 'Ò' => 'o', 'Ó' => 'o', 'Ô' => 'o', 'Õ' => 'o', 'Ö' => 'o',
|
||||
'Ø' => 'o', 'Ù' => 'u', 'Ú' => 'u', 'Û' => 'u', 'Ü' => 'u', 'Ý' => 'y',
|
||||
'ß' => 'ss','à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', 'å' => 'a',
|
||||
'æ' => 'ae','ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
|
||||
'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ò' => 'o', 'ó' => 'o',
|
||||
'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u',
|
||||
'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'þ' => 'p', 'ÿ' => 'y', 'Ā' => 'a',
|
||||
'ā' => 'a', 'Ă' => 'a', 'ă' => 'a', 'Ą' => 'a', 'ą' => 'a', 'Ć' => 'c',
|
||||
'ć' => 'c', 'Ĉ' => 'c', 'ĉ' => 'c', 'Ċ' => 'c', 'ċ' => 'c', 'Č' => 'c',
|
||||
'č' => 'c', 'Ď' => 'd', 'ď' => 'd', 'Đ' => 'd', 'đ' => 'd', 'Ē' => 'e',
|
||||
'ē' => 'e', 'Ĕ' => 'e', 'ĕ' => 'e', 'Ė' => 'e', 'ė' => 'e', 'Ę' => 'e',
|
||||
'ę' => 'e', 'Ě' => 'e', 'ě' => 'e', 'Ĝ' => 'g', 'ĝ' => 'g', 'Ğ' => 'g',
|
||||
'ğ' => 'g', 'Ġ' => 'g', 'ġ' => 'g', 'Ģ' => 'g', 'ģ' => 'g', 'Ĥ' => 'h',
|
||||
'ĥ' => 'h', 'Ħ' => 'h', 'ħ' => 'h', 'Ĩ' => 'i', 'ĩ' => 'i', 'Ī' => 'i',
|
||||
'ī' => 'i', 'Ĭ' => 'i', 'ĭ' => 'i', 'Į' => 'i', 'į' => 'i', 'İ' => 'i',
|
||||
'ı' => 'i', 'IJ' => 'ij','ij' => 'ij','Ĵ' => 'j', 'ĵ' => 'j', 'Ķ' => 'k',
|
||||
'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'l', 'ĺ' => 'l', 'Ļ' => 'l', 'ļ' => 'l',
|
||||
'Ľ' => 'l', 'ľ' => 'l', 'Ŀ' => 'l', 'ŀ' => 'l', 'Ł' => 'l', 'ł' => 'l',
|
||||
'Ń' => 'n', 'ń' => 'n', 'Ņ' => 'n', 'ņ' => 'n', 'Ň' => 'n', 'ň' => 'n',
|
||||
'ʼn' => 'n', 'Ŋ' => 'n', 'ŋ' => 'n', 'Ō' => 'o', 'ō' => 'o', 'Ŏ' => 'o',
|
||||
'ŏ' => 'o', 'Ő' => 'o', 'ő' => 'o', 'Œ' => 'oe','œ' => 'oe','Ŕ' => 'r',
|
||||
'ŕ' => 'r', 'Ŗ' => 'r', 'ŗ' => 'r', 'Ř' => 'r', 'ř' => 'r', 'Ś' => 's',
|
||||
'ś' => 's', 'Ŝ' => 's', 'ŝ' => 's', 'Ş' => 's', 'ş' => 's', 'Š' => 's',
|
||||
'š' => 's', 'Ţ' => 't', 'ţ' => 't', 'Ť' => 't', 'ť' => 't', 'Ŧ' => 't',
|
||||
'ŧ' => 't', 'Ũ' => 'u', 'ũ' => 'u', 'Ū' => 'u', 'ū' => 'u', 'Ŭ' => 'u',
|
||||
'ŭ' => 'u', 'Ů' => 'u', 'ů' => 'u', 'Ű' => 'u', 'ű' => 'u', 'Ų' => 'u',
|
||||
'ų' => 'u', 'Ŵ' => 'w', 'ŵ' => 'w', 'Ŷ' => 'y', 'ŷ' => 'y', 'Ÿ' => 'y',
|
||||
'Ź' => 'z', 'ź' => 'z', 'Ż' => 'z', 'ż' => 'z', 'Ž' => 'z', 'ž' => 'z',
|
||||
'ſ' => 'z', 'Ə' => 'e', 'ƒ' => 'f', 'Ơ' => 'o', 'ơ' => 'o', 'Ư' => 'u',
|
||||
'ư' => 'u', 'Ǎ' => 'a', 'ǎ' => 'a', 'Ǐ' => 'i', 'ǐ' => 'i', 'Ǒ' => 'o',
|
||||
'ǒ' => 'o', 'Ǔ' => 'u', 'ǔ' => 'u', 'Ǖ' => 'u', 'ǖ' => 'u', 'Ǘ' => 'u',
|
||||
'ǘ' => 'u', 'Ǚ' => 'u', 'ǚ' => 'u', 'Ǜ' => 'u', 'ǜ' => 'u', 'Ǻ' => 'a',
|
||||
'ǻ' => 'a', 'Ǽ' => 'ae','ǽ' => 'ae','Ǿ' => 'o', 'ǿ' => 'o', 'ə' => 'e',
|
||||
'Ё' => 'jo','Є' => 'e', 'І' => 'i', 'Ї' => 'i', 'А' => 'a', 'Б' => 'b',
|
||||
'В' => 'v', 'Г' => 'g', 'Д' => 'd', 'Е' => 'e', 'Ж' => 'zh','З' => 'z',
|
||||
'И' => 'i', 'Й' => 'j', 'К' => 'k', 'Л' => 'l', 'М' => 'm', 'Н' => 'n',
|
||||
'О' => 'o', 'П' => 'p', 'Р' => 'r', 'С' => 's', 'Т' => 't', 'У' => 'u',
|
||||
'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c', 'Ч' => 'ch','Ш' => 'sh','Щ' => 'sch',
|
||||
'Ъ' => '-', 'Ы' => 'y', 'Ь' => '-', 'Э' => 'je','Ю' => 'ju','Я' => 'ja',
|
||||
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e',
|
||||
'ж' => 'zh','з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l',
|
||||
'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's',
|
||||
'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch',
|
||||
'ш' => 'sh','щ' => 'sch','ъ' => '-','ы' => 'y', 'ь' => '-', 'э' => 'je',
|
||||
'ю' => 'ju','я' => 'ja','ё' => 'jo','є' => 'e', 'і' => 'i', 'ї' => 'i',
|
||||
'Ґ' => 'g', 'ґ' => 'g', 'א' => 'a', 'ב' => 'b', 'ג' => 'g', 'ד' => 'd',
|
||||
'ה' => 'h', 'ו' => 'v', 'ז' => 'z', 'ח' => 'h', 'ט' => 't', 'י' => 'i',
|
||||
'ך' => 'k', 'כ' => 'k', 'ל' => 'l', 'ם' => 'm', 'מ' => 'm', 'ן' => 'n',
|
||||
'נ' => 'n', 'ס' => 's', 'ע' => 'e', 'ף' => 'p', 'פ' => 'p', 'ץ' => 'C',
|
||||
'צ' => 'c', 'ק' => 'q', 'ר' => 'r', 'ש' => 'w', 'ת' => 't', '™' => 'tm',
|
||||
);
|
||||
$bad = array_merge(
|
||||
array_map('chr', range(0,31)),
|
||||
array("<", ">", ":", '"', "/", "\\", "|", "?", "*"));
|
||||
|
||||
return str_replace($bad, "", strtr($dateiname, $_convertTable));
|
||||
}
|
||||
|
||||
function setMinMemoryLimit($memDestSize) {
|
||||
if (getBytes(ini_get('memory_limit')) < getBytes($memDestSize))
|
||||
ini_set('memory_limit', $memDestSize);
|
||||
}
|
||||
|
||||
function getBytes($val) {
|
||||
$val = trim($val);
|
||||
$last = strtolower($val{strlen($val)-1});
|
||||
switch($last) {
|
||||
// The 'G' modifier is available since PHP 5.1.0
|
||||
case 'g':
|
||||
$val *= 1024;
|
||||
case 'm':
|
||||
$val *= 1024;
|
||||
case 'k':
|
||||
$val *= 1024;
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
|
||||
function encrypt($str, $key){
|
||||
$result="";
|
||||
for($i=0; $i<strlen($str); $i++) {
|
||||
$char = substr($str, $i, 1);
|
||||
$keychar = substr($key, ($i % strlen($key))-1, 1);
|
||||
$char = chr(ord($char)+ord($keychar));
|
||||
$result.=$char;
|
||||
}
|
||||
return base64_encode($result);
|
||||
}
|
||||
|
||||
function decrypt($str, $key){
|
||||
$str = base64_decode($str);
|
||||
$result="";
|
||||
for($i=0; $i<strlen($str); $i++) {
|
||||
$char = substr($str, $i, 1);
|
||||
$keychar = substr($key, ($i % strlen($key))-1, 1);
|
||||
$char = chr(ord($char)-ord($keychar));
|
||||
$result.=$char;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
function individualwettbewerbFilter($prefix) {
|
||||
$db =& getDatabase();
|
||||
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id;
|
||||
return " " . $prefix . " (SELECT berechtigt_individualwettbewerb_id FROM #__sportsmanager_berechtigt_fuer_individualwettbewerb INNER JOIN #__sportsmanager_individualwettbewerb ON individualwettbewerb_id = berechtigt_individualwettbewerb_id WHERE berechtigt_user_id = $user_id) ";
|
||||
}
|
||||
|
||||
function kategorieFilter($prefix, $suffix = "") {
|
||||
global $params;
|
||||
$kategorien = explode(",", $params->get( 'kategorien' ));
|
||||
$filter = "";
|
||||
foreach ($kategorien as $s) {
|
||||
$kategorie = intval(trim($s));
|
||||
if ($kategorie == 0)
|
||||
continue;
|
||||
if (!empty($filter))
|
||||
$filter .= ", ";
|
||||
$filter .= $kategorie;
|
||||
}
|
||||
return empty($filter) ? "" : (" " . $prefix . " (" . $filter . ") " . $suffix);
|
||||
}
|
||||
|
||||
function turnierFilter($prefix) {
|
||||
$db =& getDatabase();
|
||||
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id;
|
||||
return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) ";
|
||||
}
|
||||
|
||||
function vereinFilter($prefix) {
|
||||
$db =& getDatabase();
|
||||
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id;
|
||||
return " " . $prefix . " (SELECT berechtigt_verein_id FROM #__sportsmanager_berechtigt_fuer_verein INNER JOIN #__sportsmanager_verein ON berechtigt_verein_id = verein_id WHERE berechtigt_user_id = $user_id AND NOT ausgetreten) ";
|
||||
}
|
||||
|
||||
function veranstalterFilter($prefix) {
|
||||
$db =& getDatabase();
|
||||
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id;
|
||||
return " " . $prefix . " (SELECT berechtigt_veranstalter_id FROM #__sportsmanager_berechtigt_fuer_veranstalter WHERE berechtigt_user_id = $user_id) ";
|
||||
}
|
||||
|
||||
function veranstaltungFilter($prefix) {
|
||||
$db =& getDatabase();
|
||||
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id;
|
||||
return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) ";
|
||||
}
|
||||
|
||||
// Berechnet Datum zum Montag der ersten Kalenderwoche eines Jahres
|
||||
function firstkw($jahr) {
|
||||
$erster = mktime(0,0,0,1,1,$jahr);
|
||||
$wtag = date('w',$erster);
|
||||
if ($wtag <= 4) {
|
||||
/**
|
||||
* Donnerstag oder kleiner: auf den Montag zurückrechnen.
|
||||
*/
|
||||
$montag = mktime(0,0,0,1,1-($wtag-1),$jahr);
|
||||
}
|
||||
else {
|
||||
/**
|
||||
* auf den Montag nach vorne rechnen.
|
||||
*/
|
||||
$montag = mktime(0,0,0,1,1+(7-$wtag+1),$jahr);
|
||||
}
|
||||
return $montag;
|
||||
}
|
||||
|
||||
// Berechnet Wochentag über Kalenderwoche, Jahr und Wochentag (0 = Montag, ..., 6 = Sonntag)
|
||||
function mondaykw($kw, $jahr, $weekday) {
|
||||
$firstmonday = firstkw($jahr);
|
||||
$mon_monat = date('m',$firstmonday);
|
||||
$mon_jahr = date('Y',$firstmonday);
|
||||
$mon_tage = date('d',$firstmonday);
|
||||
$tage = ($kw-1)*7;
|
||||
$daykw = mktime(0,0,0,$mon_monat,$mon_tage+$tage+$weekday,$mon_jahr);
|
||||
return $daykw;
|
||||
}
|
||||
|
||||
// Berechnet Termin am Wochentag (0 = Montag, ..., 6 = Sonntag) in Kalenderwoche zum Datum
|
||||
function geaenderterWochentag($datum, $wochentag) {
|
||||
$wtag = date('w', $datum);
|
||||
if ($wtag == 0) // Sonntag
|
||||
$wtag = 7;
|
||||
$mon_monat = date('m', $datum);
|
||||
$mon_jahr = date('Y', $datum);
|
||||
$mon_tage = date('d', $datum);
|
||||
return mktime(0,0,0, $mon_monat, $mon_tage + 1 - $wtag + $wochentag, $mon_jahr);
|
||||
}
|
||||
|
||||
function normalisiertesDatum($datum) {
|
||||
if ($datum == NULL)
|
||||
return NULL;
|
||||
|
||||
if (strpos($datum, "-") !== false)
|
||||
$trennzeichen = "-";
|
||||
else
|
||||
$trennzeichen = ".";
|
||||
|
||||
$t = explode($trennzeichen, $datum);
|
||||
$n = count($t);
|
||||
if ($n == 1) {
|
||||
$s = $t[0];
|
||||
if (strlen($s) < 8)
|
||||
return NULL;
|
||||
$jahr = intval(substr($s, 0, 4));
|
||||
$monat = intval(substr($s, 4, 2));
|
||||
$tag = intval(substr($s, 6, 2));
|
||||
}
|
||||
else if ($n == 3) {
|
||||
if ($trennzeichen != ".") {
|
||||
$jahr = intval($t[0]);
|
||||
if (strlen($t[0]) <= 2)
|
||||
$jahr += 1900;
|
||||
$monat = intval($t[1]);
|
||||
$tag = intval($t[2]);
|
||||
}
|
||||
else {
|
||||
$tag = intval($t[0]);
|
||||
$monat = intval($t[1]);
|
||||
$jahr = intval($t[2]);
|
||||
if (strlen($t[2]) <= 2)
|
||||
$jahr += 1900;
|
||||
}
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
|
||||
if (!checkdate($monat, $tag, $jahr))
|
||||
return NULL;
|
||||
|
||||
return sprintf("%04d-%02d-%02d", $jahr, $monat, $tag);;
|
||||
}
|
||||
|
||||
function normalisierteUhrzeit($uhrzeit) {
|
||||
if ($uhrzeit == NULL)
|
||||
return NULL;
|
||||
|
||||
if (strpos($uhrzeit, "-") !== FALSE)
|
||||
$trennzeichen = "-";
|
||||
else
|
||||
$trennzeichen = ":";
|
||||
|
||||
$t = explode($trennzeichen, $uhrzeit);
|
||||
$n = count($t);
|
||||
if ($n == 1) {
|
||||
$s = $t[0];
|
||||
$len = strlen($s);
|
||||
if ($len != 4 && $len != 6)
|
||||
return NULL;
|
||||
$stunden = intval(substr($s, 0, 2));
|
||||
$minuten = intval(substr($s, 2, 2));
|
||||
$sekunden = $len != 6 ? 0 : intval(substr($s, 4, 2));
|
||||
}
|
||||
else if ($n == 2 || $n == 3) {
|
||||
$stunden = intval($t[0]);
|
||||
$minuten = intval($t[1]);
|
||||
$sekunden = $n != 3 ? 0 : intval($t[2]);
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
|
||||
if ($stunden < 0 || $stunden > 23 || $minuten < 0 || $minuten > 59 || $sekunden < 0 || $sekunden > 59)
|
||||
return NULL;
|
||||
|
||||
return sprintf("%02d:%02d:%02d", $stunden, $minuten, $sekunden);;
|
||||
}
|
||||
|
||||
function runden_detailliert_invers($runden) {
|
||||
if ($runden == null)
|
||||
return null;
|
||||
$runden_invers = "";
|
||||
$saetze = explode(" ", $runden);
|
||||
foreach ($saetze as $satz) {
|
||||
$punkte = explode(":", $satz);
|
||||
if (!empty($runden_invers))
|
||||
$runden_invers .= " ";
|
||||
$runden_invers .= $punkte[1] . ":" . $punkte[0];
|
||||
}
|
||||
return $runden_invers;
|
||||
}
|
||||
|
||||
function runden_detailliert_auswertung($runden) {
|
||||
$ergebnis = 0;
|
||||
$heim_saetze = 0;
|
||||
$unentschieden_saetze = 0;
|
||||
$gast_saetze = 0;
|
||||
$heim_punkte = 0;
|
||||
$gast_punkte = 0;
|
||||
if ($runden != null) {
|
||||
$saetze = explode(" ", $runden);
|
||||
foreach ($saetze as $satz) {
|
||||
$punkte = explode(":", $satz);
|
||||
$heim_punkte += (int)$punkte[0];
|
||||
$gast_punkte += (int)$punkte[1];
|
||||
if ($punkte[0] > $punkte[1])
|
||||
$heim_saetze++;
|
||||
else if ($punkte[0] < $punkte[1])
|
||||
$gast_saetze++;
|
||||
else
|
||||
$unentschieden_saetze++;
|
||||
}
|
||||
if ($heim_saetze > $gast_saetze)
|
||||
$ergebnis = 1;
|
||||
else if ($heim_saetze < $gast_saetze)
|
||||
$ergebnis = 2;
|
||||
}
|
||||
return array($ergebnis, $heim_saetze, $unentschieden_saetze, $gast_saetze, $heim_punkte, $gast_punkte);
|
||||
}
|
||||
|
||||
// pass two file names
|
||||
// returns TRUE if files are the same, FALSE otherwise
|
||||
function files_identical($fn1, $fn2) {
|
||||
if(!is_file($fn1) || !is_file($fn2))
|
||||
return FALSE;
|
||||
|
||||
if(filesize($fn1) !== filesize($fn2))
|
||||
return FALSE;
|
||||
|
||||
if(!$fp1 = fopen($fn1, 'rb'))
|
||||
return FALSE;
|
||||
|
||||
if(!$fp2 = fopen($fn2, 'rb')) {
|
||||
fclose($fp1);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$same = TRUE;
|
||||
while (!feof($fp1) and !feof($fp2))
|
||||
if(fread($fp1, 4096) !== fread($fp2, 4096)) {
|
||||
$same = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
if(feof($fp1) !== feof($fp2))
|
||||
$same = FALSE;
|
||||
|
||||
fclose($fp1);
|
||||
fclose($fp2);
|
||||
|
||||
return $same;
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,5 @@
|
||||
[.ShellClassInfo]
|
||||
InfoTip=Dieser Ordner wird online freigegeben.
|
||||
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
|
||||
IconIndex=16
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
||||
@@ -0,0 +1,143 @@
|
||||
--Do not remove this if you are using--
|
||||
Original Author: Remiz Rahnas
|
||||
Original Author URL: http://www.htmlremix.com
|
||||
Published date: 2008/09/24
|
||||
|
||||
Changes by Nick Fetchak:
|
||||
- IE8 standards mode compatibility
|
||||
- VML elements now positioned behind original box rather than inside of it - should be less prone to breakage
|
||||
Published date : 2009/11/18
|
||||
|
||||
|
||||
<public:attach event="oncontentready" onevent="oncontentready('v08vnSVo78t4JfjH')" />
|
||||
<script type="text/javascript">
|
||||
|
||||
// findPos() borrowed from http://www.quirksmode.org/js/findpos.html
|
||||
function findPos(obj) {
|
||||
var curleft = curtop = 0;
|
||||
|
||||
if (obj.offsetParent) {
|
||||
do {
|
||||
curleft += obj.offsetLeft;
|
||||
curtop += obj.offsetTop;
|
||||
} while (obj = obj.offsetParent);
|
||||
}
|
||||
|
||||
return({
|
||||
'x': curleft,
|
||||
'y': curtop
|
||||
});
|
||||
}
|
||||
|
||||
function oncontentready(classID) {
|
||||
if (this.className.match(classID)) { return(false); }
|
||||
|
||||
if (!document.namespaces.v) { document.namespaces.add("v", "urn:schemas-microsoft-com:vml"); }
|
||||
|
||||
this.className = this.className.concat(' ', classID);
|
||||
var arcSize = Math.min(parseInt(this.currentStyle['-moz-border-radius'] ||
|
||||
this.currentStyle['-webkit-border-radius'] ||
|
||||
this.currentStyle['border-radius'] ||
|
||||
this.currentStyle['-khtml-border-radius']) /
|
||||
Math.min(this.offsetWidth, this.offsetHeight), 1);
|
||||
var fillColor = this.currentStyle.backgroundColor;
|
||||
var fillSrc = this.currentStyle.backgroundImage.replace(/^url\("(.+)"\)$/, '$1');
|
||||
var strokeColor = this.currentStyle.borderColor;
|
||||
var strokeWeight = parseInt(this.currentStyle.borderWidth);
|
||||
var stroked = 'true';
|
||||
if (isNaN(strokeWeight)) {
|
||||
strokeWeight = 0;
|
||||
strokeColor = fillColor;
|
||||
stroked = 'false';
|
||||
}
|
||||
|
||||
this.style.background = 'transparent';
|
||||
this.style.borderColor = 'transparent';
|
||||
|
||||
// Find which element provides position:relative for the target element (default to BODY)
|
||||
var el = this;
|
||||
var limit = 100, i = 0;
|
||||
while ((typeof(el) != 'unknown') && (el.currentStyle.position != 'relative') && (el.tagName != 'BODY')) {
|
||||
el = el.parentElement;
|
||||
i++;
|
||||
if (i >= limit) { return(false); }
|
||||
}
|
||||
var el_zindex = parseInt(el.currentStyle.zIndex);
|
||||
if (isNaN(el_zindex)) { el_zindex = 0; }
|
||||
//alert('got tag '+ el.tagName +' with pos '+ el.currentStyle.position);
|
||||
|
||||
var rect_size = {
|
||||
'width': this.offsetWidth - strokeWeight,
|
||||
'height': this.offsetHeight - strokeWeight
|
||||
};
|
||||
var el_pos = findPos(el);
|
||||
var this_pos = findPos(this);
|
||||
this_pos.y = this_pos.y + (0.5 * strokeWeight) - el_pos.y;
|
||||
this_pos.x = this_pos.x + (0.5 * strokeWeight) - el_pos.x;
|
||||
|
||||
var rect = document.createElement('v:roundrect');
|
||||
rect.arcsize = arcSize +'px';
|
||||
rect.strokecolor = strokeColor;
|
||||
rect.strokeWeight = strokeWeight +'px';
|
||||
rect.stroked = stroked;
|
||||
rect.style.display = 'block';
|
||||
rect.style.position = 'absolute';
|
||||
rect.style.top = this_pos.y +'px';
|
||||
rect.style.left = this_pos.x +'px';
|
||||
rect.style.width = rect_size.width +'px';
|
||||
rect.style.height = rect_size.height +'px';
|
||||
rect.style.antialias = true;
|
||||
rect.style.zIndex = el_zindex - 1;
|
||||
|
||||
var fill = document.createElement('v:fill');
|
||||
fill.color = fillColor;
|
||||
fill.src = fillSrc;
|
||||
fill.type = 'tile';
|
||||
|
||||
rect.appendChild(fill);
|
||||
el.appendChild(rect);
|
||||
|
||||
var css = el.document.createStyleSheet();
|
||||
css.addRule("v\\:roundrect", "behavior: url(#default#VML)");
|
||||
css.addRule("v\\:fill", "behavior: url(#default#VML)");
|
||||
|
||||
isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
|
||||
// IE6 doesn't support transparent borders, use padding to offset original element
|
||||
if (isIE6 && (strokeWeight > 0)) {
|
||||
this.style.borderStyle = 'none';
|
||||
this.style.paddingTop = parseInt(this.currentStyle.paddingTop || 0) + strokeWeight;
|
||||
this.style.paddingBottom = parseInt(this.currentStyle.paddingBottom || 0) + strokeWeight;
|
||||
}
|
||||
|
||||
if (typeof(window.rounded_elements) == 'undefined') {
|
||||
window.rounded_elements = new Array();
|
||||
|
||||
if (typeof(window.onresize) == 'function') { window.previous_onresize = window.onresize; }
|
||||
window.onresize = window_resize;
|
||||
}
|
||||
this.element.vml = rect;
|
||||
window.rounded_elements.push(this.element);
|
||||
}
|
||||
|
||||
function window_resize() {
|
||||
if (typeof(window.rounded_elements) == 'undefined') { return(false); }
|
||||
|
||||
for (var i in window.rounded_elements) {
|
||||
var el = window.rounded_elements[i];
|
||||
|
||||
var strokeWeight = parseInt(el.currentStyle.borderWidth);
|
||||
if (isNaN(strokeWeight)) { strokeWeight = 0; }
|
||||
|
||||
var parent_pos = findPos(el.vml.parentNode);
|
||||
var pos = findPos(el);
|
||||
pos.y = pos.y + (0.5 * strokeWeight) - parent_pos.y;
|
||||
pos.x = pos.x + (0.5 * strokeWeight) - parent_pos.x;
|
||||
|
||||
el.vml.style.top = pos.y +'px';
|
||||
el.vml.style.left = pos.x +'px';
|
||||
}
|
||||
|
||||
if (typeof(window.previous_onresize) == 'function') { window.previous_onresize(); }
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
[.ShellClassInfo]
|
||||
InfoTip=Dieser Ordner wird online freigegeben.
|
||||
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
|
||||
IconIndex=16
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<html><body bgcolor="#FFFFFF"></body></html>
|
||||