]> source.dussan.org Git - nextcloud-server.git/commitdiff
Purge unused legacy code and drop 3rdparty jscolor dependency 34359/head
authorChristopher Ng <chrng8@gmail.com>
Fri, 7 Oct 2022 03:38:10 +0000 (03:38 +0000)
committerChristopher Ng <chrng8@gmail.com>
Fri, 28 Oct 2022 00:18:47 +0000 (00:18 +0000)
Signed-off-by: Christopher Ng <chrng8@gmail.com>
apps/theming/css/settings-admin.css [deleted file]
apps/theming/css/settings-admin.css.map [deleted file]
apps/theming/css/settings-admin.scss [deleted file]
apps/theming/js/3rdparty/jscolor/LICENSE.txt [deleted file]
apps/theming/js/3rdparty/jscolor/jscolor.js [deleted file]
apps/theming/js/3rdparty/jscolor/jscolor.min.js [deleted file]
apps/theming/js/settings-admin.js [deleted file]

diff --git a/apps/theming/css/settings-admin.css b/apps/theming/css/settings-admin.css
deleted file mode 100644 (file)
index 283d76e..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-#theming input {
-  width: 230px;
-}
-#theming input:focus,
-#theming input:active {
-  padding-right: 30px;
-}
-#theming .fileupload {
-  display: none;
-}
-#theming div > label {
-  position: relative;
-}
-#theming .theme-undo {
-  position: absolute;
-  top: -7px;
-  right: 4px;
-  cursor: pointer;
-  opacity: 0.3;
-  padding: 7px;
-  vertical-align: top;
-  display: inline-block;
-  visibility: hidden;
-  height: 32px;
-  width: 32px;
-}
-#theming form.uploadButton {
-  width: 411px;
-  display: flex;
-  align-items: center;
-}
-#theming form .theme-undo,
-#theming .theme-remove-bg {
-  cursor: pointer;
-  opacity: 0.3;
-  padding: 7px;
-  vertical-align: top;
-  display: inline-block;
-  float: right;
-  position: relative;
-  top: 4px;
-  right: 0px;
-  visibility: visible;
-  height: 32px;
-  width: 32px;
-  margin-left: auto;
-}
-#theming form .theme-undo:not([style*="display:"]) ~ .theme-remove-bg {
-  margin-left: 0;
-}
-#theming input[type=text]:hover + .theme-undo,
-#theming input[type=text] + .theme-undo:hover,
-#theming input[type=text]:focus + .theme-undo,
-#theming input[type=text]:active + .theme-undo,
-#theming input[type=url]:hover + .theme-undo,
-#theming input[type=url] + .theme-undo:hover,
-#theming input[type=url]:focus + .theme-undo,
-#theming input[type=url]:active + .theme-undo {
-  visibility: visible;
-}
-#theming label span {
-  display: inline-block;
-  min-width: 175px;
-  max-width: 175px;
-  white-space: wrap;
-  padding: 8px 0px;
-  vertical-align: top;
-}
-#theming .icon-upload,
-#theming .uploadButton .icon-loading-small {
-  padding: 8px 20px;
-  width: 20px;
-  margin: 2px 0px;
-  min-height: 32px;
-  display: inline-block;
-}
-#theming #theming_settings_status {
-  height: 26px;
-  margin: 10px;
-}
-#theming #theming_settings_loading {
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 10px;
-}
-#theming #theming_settings_msg {
-  vertical-align: middle;
-  border-radius: 3px;
-}
-#theming #theming-preview {
-  width: 230px;
-  height: 140px;
-  background-size: cover;
-  background-position: center center;
-  text-align: center;
-  margin-left: 178px;
-  margin-top: 10px;
-  margin-bottom: 20px;
-  cursor: pointer;
-  background-color: var(--color-primary-default);
-  background-image: var(--image-background, var(--image-background-plain, url("../../../core/img/app-background.jpg"), linear-gradient(40deg, #0082c9 0%, #30b6ff 100%)));
-}
-#theming #theming-preview #theming-preview-logo {
-  cursor: pointer;
-  width: 20%;
-  height: 20%;
-  margin-top: 20px;
-  display: inline-block;
-  background-position: center;
-  background-repeat: no-repeat;
-  background-size: contain;
-  background-image: var(--image-logo, url("../../../core/img/logo/logo.svg"));
-}
-#theming .theming-hints {
-  margin-top: 20px;
-}
-#theming .image-preview {
-  display: inline-block;
-  width: 80px;
-  height: 36px;
-  background-position: center;
-  background-repeat: no-repeat;
-  background-size: contain;
-}
-#theming #theming-preview-logoheader {
-  background-image: var(--image-logoheader);
-}
-#theming #theming-preview-favicon {
-  background-image: var(--image-favicon);
-}
-#theming #user-theming {
-  margin-top: 44px;
-  display: flex;
-}
-#theming #user-theming > div {
-  max-width: 400px;
-  margin-bottom: 44px;
-}
-
-/* transition effects for theming value changes */
-#header {
-  transition: background-color 500ms linear;
-}
-#header svg, #header img {
-  transition: 500ms filter linear;
-}
-
-/*# sourceMappingURL=settings-admin.css.map */
diff --git a/apps/theming/css/settings-admin.css.map b/apps/theming/css/settings-admin.css.map
deleted file mode 100644 (file)
index bb1b366..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sourceRoot":"","sources":["settings-admin.scss"],"names":[],"mappings":"AACI;EACI;;AAGJ;AAAA;EAEI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;;AAEJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AAEJ;EAEI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGP;EAEO;;AAGP;EACO;;AAGJ;EACI;EACA;;AACD;EACK;EACA;;;AAKZ;AACA;EACI;;AACA;EACI","file":"settings-admin.css"}
\ No newline at end of file
diff --git a/apps/theming/css/settings-admin.scss b/apps/theming/css/settings-admin.scss
deleted file mode 100644 (file)
index 60d9a82..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-#theming {
-    input {
-        width: 230px;
-    }
-
-    input:focus,
-    input:active {
-        padding-right: 30px;
-    }
-
-    .fileupload {
-        display: none;
-    }
-
-    div > label {
-        position: relative;
-    }
-
-    .theme-undo {
-        position: absolute;
-        top: -7px; // input padding
-        right: 4px; // input right margin + border
-        cursor: pointer;
-        opacity: .3;
-        padding: 7px;
-        vertical-align: top;
-        display: inline-block;
-        visibility: hidden;
-        height: 32px; // height of input
-        width: 32px; // height of input
-    }
-    form.uploadButton {
-        width: 411px;
-        display: flex;
-        align-items: center;
-    }
-    form .theme-undo,
-    .theme-remove-bg {
-        cursor: pointer;
-        opacity: .3;
-        padding: 7px;
-        vertical-align: top;
-        display: inline-block;
-        float: right;
-        position: relative;
-        top: 4px;
-        right: 0px;
-        visibility: visible;
-        height: 32px;
-        width: 32px;
-        // right align
-        margin-left: auto;
-    }
-    form .theme-undo:not([style*="display:"]) ~ .theme-remove-bg {
-        // Only align the undo button if both are shown
-        margin-left: 0;
-    }
-
-    input[type='text']:hover + .theme-undo,
-    input[type='text'] + .theme-undo:hover,
-    input[type='text']:focus + .theme-undo,
-    input[type='text']:active + .theme-undo,
-    input[type='url']:hover + .theme-undo,
-    input[type='url'] + .theme-undo:hover,
-    input[type='url']:focus + .theme-undo,
-    input[type='url']:active + .theme-undo{
-        visibility: visible;
-    }
-
-    label span {
-        display: inline-block;
-        min-width: 175px;
-        max-width: 175px;
-        white-space: wrap;
-        padding: 8px 0px;
-        vertical-align: top;
-    }
-
-    .icon-upload,
-    .uploadButton .icon-loading-small {
-        padding: 8px 20px;
-        width: 20px;
-        margin: 2px 0px;
-        min-height: 32px;
-        display: inline-block;
-    }
-
-    #theming_settings_status {
-        height: 26px;
-        margin: 10px;
-    }
-
-    #theming_settings_loading {
-        display: inline-block;
-        vertical-align: middle;
-        margin-right: 10px;
-    }
-
-    #theming_settings_msg {
-        vertical-align: middle;
-        border-radius: 3px;
-    }
-
-    #theming-preview {
-        width: 230px;
-        height: 140px;
-        background-size: cover;
-        background-position: center center;
-        text-align: center;
-        margin-left: 178px;
-        margin-top: 10px;
-        margin-bottom: 20px;
-        cursor: pointer;
-        background-color: var(--color-primary-default);
-        background-image: var(--image-background, var(--image-background-plain, url('../../../core/img/app-background.jpg'), linear-gradient(40deg, #0082c9 0%, #30b6ff 100%)));
-
-        #theming-preview-logo {
-            cursor: pointer;
-            width: 20%;
-            height: 20%;
-            margin-top: 20px;
-            display: inline-block;
-            background-position: center;
-            background-repeat: no-repeat;
-            background-size: contain;
-            background-image: var(--image-logo, url('../../../core/img/logo/logo.svg'));
-        }
-    }
-
-    .theming-hints {
-        margin-top: 20px;
-    }
-
-    .image-preview {
-        display: inline-block;
-        width: 80px;
-        height: 36px;
-        background-position: center;
-        background-repeat: no-repeat;
-        background-size: contain;
-    }
-
-       #theming-preview-logoheader {
-        // Only using --image-logoheader to show the custom value only
-        background-image: var(--image-logoheader);
-    }
-
-       #theming-preview-favicon {
-        background-image: var(--image-favicon);
-    }
-
-    #user-theming {
-        margin-top: 44px;
-        display: flex;
-       & > div {
-            max-width: 400px;
-            margin-bottom: 44px;
-        }
-    }
-}
-
-/* transition effects for theming value changes */
-#header {
-    transition: background-color 500ms linear;
-    svg, img {
-        transition: 500ms filter linear;
-    }
-}
diff --git a/apps/theming/js/3rdparty/jscolor/LICENSE.txt b/apps/theming/js/3rdparty/jscolor/LICENSE.txt
deleted file mode 100644 (file)
index 94a9ed0..0000000
+++ /dev/null
@@ -1,674 +0,0 @@
-                    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>.
diff --git a/apps/theming/js/3rdparty/jscolor/jscolor.js b/apps/theming/js/3rdparty/jscolor/jscolor.js
deleted file mode 100644 (file)
index 9e6e8db..0000000
+++ /dev/null
@@ -1,1846 +0,0 @@
-/**
- * jscolor - JavaScript Color Picker
- *
- * @link    http://jscolor.com
- * @license For open source use: GPLv3
- *          For commercial use: JSColor Commercial License
- * @author  Jan Odvarko
- * @version 2.0.4
- *
- * See usage examples at http://jscolor.com/examples/
- */
-
-
-"use strict";
-
-
-if (!window.jscolor) { window.jscolor = (function () {
-
-
-var jsc = {
-
-
-       register : function () {
-               jsc.attachDOMReadyEvent(jsc.init);
-               jsc.attachEvent(document, 'mousedown', jsc.onDocumentMouseDown);
-               jsc.attachEvent(document, 'touchstart', jsc.onDocumentTouchStart);
-               jsc.attachEvent(window, 'resize', jsc.onWindowResize);
-       },
-
-
-       init : function () {
-               if (jsc.jscolor.lookupClass) {
-                       jsc.jscolor.installByClassName(jsc.jscolor.lookupClass);
-               }
-       },
-
-
-       tryInstallOnElements : function (elms, className) {
-               var matchClass = new RegExp('(^|\\s)(' + className + ')(\\s*(\\{[^}]*\\})|\\s|$)', 'i');
-
-               for (var i = 0; i < elms.length; i += 1) {
-                       if (elms[i].type !== undefined && elms[i].type.toLowerCase() == 'color') {
-                               if (jsc.isColorAttrSupported) {
-                                       // skip inputs of type 'color' if supported by the browser
-                                       continue;
-                               }
-                       }
-                       var m;
-                       if (!elms[i].jscolor && elms[i].className && (m = elms[i].className.match(matchClass))) {
-                               var targetElm = elms[i];
-                               var optsStr = null;
-
-                               var dataOptions = jsc.getDataAttr(targetElm, 'jscolor');
-                               if (dataOptions !== null) {
-                                       optsStr = dataOptions;
-                               } else if (m[4]) {
-                                       optsStr = m[4];
-                               }
-
-                               var opts = {};
-                               if (optsStr) {
-                                       try {
-                                               opts = (new Function ('return (' + optsStr + ')'))();
-                                       } catch(eParseError) {
-                                               jsc.warn('Error parsing jscolor options: ' + eParseError + ':\n' + optsStr);
-                                       }
-                               }
-                               targetElm.jscolor = new jsc.jscolor(targetElm, opts);
-                       }
-               }
-       },
-
-
-       isColorAttrSupported : (function () {
-               var elm = document.createElement('input');
-               if (elm.setAttribute) {
-                       elm.setAttribute('type', 'color');
-                       if (elm.type.toLowerCase() == 'color') {
-                               return true;
-                       }
-               }
-               return false;
-       })(),
-
-
-       isCanvasSupported : (function () {
-               var elm = document.createElement('canvas');
-               return !!(elm.getContext && elm.getContext('2d'));
-       })(),
-
-
-       fetchElement : function (mixed) {
-               return typeof mixed === 'string' ? document.getElementById(mixed) : mixed;
-       },
-
-
-       isElementType : function (elm, type) {
-               return elm.nodeName.toLowerCase() === type.toLowerCase();
-       },
-
-
-       getDataAttr : function (el, name) {
-               var attrName = 'data-' + name;
-               var attrValue = el.getAttribute(attrName);
-               if (attrValue !== null) {
-                       return attrValue;
-               }
-               return null;
-       },
-
-
-       attachEvent : function (el, evnt, func) {
-               if (el.addEventListener) {
-                       el.addEventListener(evnt, func, false);
-               } else if (el.attachEvent) {
-                       el.attachEvent('on' + evnt, func);
-               }
-       },
-
-
-       detachEvent : function (el, evnt, func) {
-               if (el.removeEventListener) {
-                       el.removeEventListener(evnt, func, false);
-               } else if (el.detachEvent) {
-                       el.detachEvent('on' + evnt, func);
-               }
-       },
-
-
-       _attachedGroupEvents : {},
-
-
-       attachGroupEvent : function (groupName, el, evnt, func) {
-               if (!jsc._attachedGroupEvents.hasOwnProperty(groupName)) {
-                       jsc._attachedGroupEvents[groupName] = [];
-               }
-               jsc._attachedGroupEvents[groupName].push([el, evnt, func]);
-               jsc.attachEvent(el, evnt, func);
-       },
-
-
-       detachGroupEvents : function (groupName) {
-               if (jsc._attachedGroupEvents.hasOwnProperty(groupName)) {
-                       for (var i = 0; i < jsc._attachedGroupEvents[groupName].length; i += 1) {
-                               var evt = jsc._attachedGroupEvents[groupName][i];
-                               jsc.detachEvent(evt[0], evt[1], evt[2]);
-                       }
-                       delete jsc._attachedGroupEvents[groupName];
-               }
-       },
-
-
-       attachDOMReadyEvent : function (func) {
-               var fired = false;
-               var fireOnce = function () {
-                       if (!fired) {
-                               fired = true;
-                               func();
-                       }
-               };
-
-               if (document.readyState === 'complete') {
-                       setTimeout(fireOnce, 1); // async
-                       return;
-               }
-
-               if (document.addEventListener) {
-                       document.addEventListener('DOMContentLoaded', fireOnce, false);
-
-                       // Fallback
-                       window.addEventListener('load', fireOnce, false);
-
-               } else if (document.attachEvent) {
-                       // IE
-                       document.attachEvent('onreadystatechange', function () {
-                               if (document.readyState === 'complete') {
-                                       document.detachEvent('onreadystatechange', arguments.callee);
-                                       fireOnce();
-                               }
-                       })
-
-                       // Fallback
-                       window.attachEvent('onload', fireOnce);
-
-                       // IE7/8
-                       if (document.documentElement.doScroll && window == window.top) {
-                               var tryScroll = function () {
-                                       if (!document.body) { return; }
-                                       try {
-                                               document.documentElement.doScroll('left');
-                                               fireOnce();
-                                       } catch (e) {
-                                               setTimeout(tryScroll, 1);
-                                       }
-                               };
-                               tryScroll();
-                       }
-               }
-       },
-
-
-       warn : function (msg) {
-               if (window.console && window.console.warn) {
-                       window.console.warn(msg);
-               }
-       },
-
-
-       preventDefault : function (e) {
-               if (e.preventDefault) { e.preventDefault(); }
-               e.returnValue = false;
-       },
-
-
-       captureTarget : function (target) {
-               // IE
-               if (target.setCapture) {
-                       jsc._capturedTarget = target;
-                       jsc._capturedTarget.setCapture();
-               }
-       },
-
-
-       releaseTarget : function () {
-               // IE
-               if (jsc._capturedTarget) {
-                       jsc._capturedTarget.releaseCapture();
-                       jsc._capturedTarget = null;
-               }
-       },
-
-
-       fireEvent : function (el, evnt) {
-               if (!el) {
-                       return;
-               }
-               if (document.createEvent) {
-                       var ev = document.createEvent('HTMLEvents');
-                       ev.initEvent(evnt, true, true);
-                       el.dispatchEvent(ev);
-               } else if (document.createEventObject) {
-                       var ev = document.createEventObject();
-                       el.fireEvent('on' + evnt, ev);
-               } else if (el['on' + evnt]) { // alternatively use the traditional event model
-                       el['on' + evnt]();
-               }
-       },
-
-
-       classNameToList : function (className) {
-               return className.replace(/^\s+|\s+$/g, '').split(/\s+/);
-       },
-
-
-       // The className parameter (str) can only contain a single class name
-       hasClass : function (elm, className) {
-               if (!className) {
-                       return false;
-               }
-               return -1 != (' ' + elm.className.replace(/\s+/g, ' ') + ' ').indexOf(' ' + className + ' ');
-       },
-
-
-       // The className parameter (str) can contain multiple class names separated by whitespace
-       setClass : function (elm, className) {
-               var classList = jsc.classNameToList(className);
-               for (var i = 0; i < classList.length; i += 1) {
-                       if (!jsc.hasClass(elm, classList[i])) {
-                               elm.className += (elm.className ? ' ' : '') + classList[i];
-                       }
-               }
-       },
-
-
-       // The className parameter (str) can contain multiple class names separated by whitespace
-       unsetClass : function (elm, className) {
-               var classList = jsc.classNameToList(className);
-               for (var i = 0; i < classList.length; i += 1) {
-                       var repl = new RegExp(
-                               '^\\s*' + classList[i] + '\\s*|' +
-                               '\\s*' + classList[i] + '\\s*$|' +
-                               '\\s+' + classList[i] + '(\\s+)',
-                               'g'
-                       );
-                       elm.className = elm.className.replace(repl, '$1');
-               }
-       },
-
-
-       getStyle : function (elm) {
-               return window.getComputedStyle ? window.getComputedStyle(elm) : elm.currentStyle;
-       },
-
-
-       setStyle : (function () {
-               var helper = document.createElement('div');
-               var getSupportedProp = function (names) {
-                       for (var i = 0; i < names.length; i += 1) {
-                               if (names[i] in helper.style) {
-                                       return names[i];
-                               }
-                       }
-               };
-               var props = {
-                       borderRadius: getSupportedProp(['borderRadius', 'MozBorderRadius', 'webkitBorderRadius']),
-                       boxShadow: getSupportedProp(['boxShadow', 'MozBoxShadow', 'webkitBoxShadow'])
-               };
-               return function (elm, prop, value) {
-                       switch (prop.toLowerCase()) {
-                       case 'opacity':
-                               var alphaOpacity = Math.round(parseFloat(value) * 100);
-                               elm.style.opacity = value;
-                               elm.style.filter = 'alpha(opacity=' + alphaOpacity + ')';
-                               break;
-                       default:
-                               elm.style[props[prop]] = value;
-                               break;
-                       }
-               };
-       })(),
-
-
-       setBorderRadius : function (elm, value) {
-               jsc.setStyle(elm, 'borderRadius', value || '0');
-       },
-
-
-       setBoxShadow : function (elm, value) {
-               jsc.setStyle(elm, 'boxShadow', value || 'none');
-       },
-
-
-       getElementPos : function (e, relativeToViewport) {
-               var x=0, y=0;
-               var rect = e.getBoundingClientRect();
-               x = rect.left;
-               y = rect.top;
-               if (!relativeToViewport) {
-                       var viewPos = jsc.getViewPos();
-                       x += viewPos[0];
-                       y += viewPos[1];
-               }
-               return [x, y];
-       },
-
-
-       getElementSize : function (e) {
-               return [e.offsetWidth, e.offsetHeight];
-       },
-
-
-       // get pointer's X/Y coordinates relative to viewport
-       getAbsPointerPos : function (e) {
-               if (!e) { e = window.event; }
-               var x = 0, y = 0;
-               if (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {
-                       // touch devices
-                       x = e.changedTouches[0].clientX;
-                       y = e.changedTouches[0].clientY;
-               } else if (typeof e.clientX === 'number') {
-                       x = e.clientX;
-                       y = e.clientY;
-               }
-               return { x: x, y: y };
-       },
-
-
-       // get pointer's X/Y coordinates relative to target element
-       getRelPointerPos : function (e) {
-               if (!e) { e = window.event; }
-               var target = e.target || e.srcElement;
-               var targetRect = target.getBoundingClientRect();
-
-               var x = 0, y = 0;
-
-               var clientX = 0, clientY = 0;
-               if (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {
-                       // touch devices
-                       clientX = e.changedTouches[0].clientX;
-                       clientY = e.changedTouches[0].clientY;
-               } else if (typeof e.clientX === 'number') {
-                       clientX = e.clientX;
-                       clientY = e.clientY;
-               }
-
-               x = clientX - targetRect.left;
-               y = clientY - targetRect.top;
-               return { x: x, y: y };
-       },
-
-
-       getViewPos : function () {
-               var doc = document.documentElement;
-               return [
-                       (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),
-                       (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)
-               ];
-       },
-
-
-       getViewSize : function () {
-               var doc = document.documentElement;
-               return [
-                       (window.innerWidth || doc.clientWidth),
-                       (window.innerHeight || doc.clientHeight),
-               ];
-       },
-
-
-       redrawPosition : function () {
-
-               if (jsc.picker && jsc.picker.owner) {
-                       var thisObj = jsc.picker.owner;
-
-                       var tp, vp;
-
-                       if (thisObj.fixed) {
-                               // Fixed elements are positioned relative to viewport,
-                               // therefore we can ignore the scroll offset
-                               tp = jsc.getElementPos(thisObj.targetElement, true); // target pos
-                               vp = [0, 0]; // view pos
-                       } else {
-                               tp = jsc.getElementPos(thisObj.targetElement); // target pos
-                               vp = jsc.getViewPos(); // view pos
-                       }
-
-                       var ts = jsc.getElementSize(thisObj.targetElement); // target size
-                       var vs = jsc.getViewSize(); // view size
-                       var ps = jsc.getPickerOuterDims(thisObj); // picker size
-                       var a, b, c;
-                       switch (thisObj.position.toLowerCase()) {
-                               case 'left': a=1; b=0; c=-1; break;
-                               case 'right':a=1; b=0; c=1; break;
-                               case 'top':  a=0; b=1; c=-1; break;
-                               default:     a=0; b=1; c=1; break;
-                       }
-                       var l = (ts[b]+ps[b])/2;
-
-                       // compute picker position
-                       if (!thisObj.smartPosition) {
-                               var pp = [
-                                       tp[a],
-                                       tp[b]+ts[b]-l+l*c
-                               ];
-                       } else {
-                               var pp = [
-                                       -vp[a]+tp[a]+ps[a] > vs[a] ?
-                                               (-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :
-                                               tp[a],
-                                       -vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?
-                                               (-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :
-                                               (tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)
-                               ];
-                       }
-
-                       var x = pp[a];
-                       var y = pp[b];
-                       var positionValue = thisObj.fixed ? 'fixed' : 'absolute';
-                       var contractShadow =
-                               (pp[0] + ps[0] > tp[0] || pp[0] < tp[0] + ts[0]) &&
-                               (pp[1] + ps[1] < tp[1] + ts[1]);
-
-                       jsc._drawPosition(thisObj, x, y, positionValue, contractShadow);
-               }
-       },
-
-
-       _drawPosition : function (thisObj, x, y, positionValue, contractShadow) {
-               var vShadow = contractShadow ? 0 : thisObj.shadowBlur; // px
-
-               jsc.picker.wrap.style.position = positionValue;
-               jsc.picker.wrap.style.left = x + 'px';
-               jsc.picker.wrap.style.top = y + 'px';
-
-               jsc.setBoxShadow(
-                       jsc.picker.boxS,
-                       thisObj.shadow ?
-                               new jsc.BoxShadow(0, vShadow, thisObj.shadowBlur, 0, thisObj.shadowColor) :
-                               null);
-       },
-
-
-       getPickerDims : function (thisObj) {
-               var displaySlider = !!jsc.getSliderComponent(thisObj);
-               var dims = [
-                       2 * thisObj.insetWidth + 2 * thisObj.padding + thisObj.width +
-                               (displaySlider ? 2 * thisObj.insetWidth + jsc.getPadToSliderPadding(thisObj) + thisObj.sliderSize : 0),
-                       2 * thisObj.insetWidth + 2 * thisObj.padding + thisObj.height +
-                               (thisObj.closable ? 2 * thisObj.insetWidth + thisObj.padding + thisObj.buttonHeight : 0)
-               ];
-               return dims;
-       },
-
-
-       getPickerOuterDims : function (thisObj) {
-               var dims = jsc.getPickerDims(thisObj);
-               return [
-                       dims[0] + 2 * thisObj.borderWidth,
-                       dims[1] + 2 * thisObj.borderWidth
-               ];
-       },
-
-
-       getPadToSliderPadding : function (thisObj) {
-               return Math.max(thisObj.padding, 1.5 * (2 * thisObj.pointerBorderWidth + thisObj.pointerThickness));
-       },
-
-
-       getPadYComponent : function (thisObj) {
-               switch (thisObj.mode.charAt(1).toLowerCase()) {
-                       case 'v': return 'v'; break;
-               }
-               return 's';
-       },
-
-
-       getSliderComponent : function (thisObj) {
-               if (thisObj.mode.length > 2) {
-                       switch (thisObj.mode.charAt(2).toLowerCase()) {
-                               case 's': return 's'; break;
-                               case 'v': return 'v'; break;
-                       }
-               }
-               return null;
-       },
-
-
-       onDocumentMouseDown : function (e) {
-               if (!e) { e = window.event; }
-               var target = e.target || e.srcElement;
-
-               if (target._jscLinkedInstance) {
-                       if (target._jscLinkedInstance.showOnClick) {
-                               target._jscLinkedInstance.show();
-                       }
-               } else if (target._jscControlName) {
-                       jsc.onControlPointerStart(e, target, target._jscControlName, 'mouse');
-               } else {
-                       // Mouse is outside the picker controls -> hide the color picker!
-                       if (jsc.picker && jsc.picker.owner) {
-                               jsc.picker.owner.hide();
-                       }
-               }
-       },
-
-
-       onDocumentTouchStart : function (e) {
-               if (!e) { e = window.event; }
-               var target = e.target || e.srcElement;
-
-               if (target._jscLinkedInstance) {
-                       if (target._jscLinkedInstance.showOnClick) {
-                               target._jscLinkedInstance.show();
-                       }
-               } else if (target._jscControlName) {
-                       jsc.onControlPointerStart(e, target, target._jscControlName, 'touch');
-               } else {
-                       if (jsc.picker && jsc.picker.owner) {
-                               jsc.picker.owner.hide();
-                       }
-               }
-       },
-
-
-       onWindowResize : function (e) {
-               jsc.redrawPosition();
-       },
-
-
-       onParentScroll : function (e) {
-               // hide the picker when one of the parent elements is scrolled
-               if (jsc.picker && jsc.picker.owner) {
-                       jsc.picker.owner.hide();
-               }
-       },
-
-
-       _pointerMoveEvent : {
-               mouse: 'mousemove',
-               touch: 'touchmove'
-       },
-       _pointerEndEvent : {
-               mouse: 'mouseup',
-               touch: 'touchend'
-       },
-
-
-       _pointerOrigin : null,
-       _capturedTarget : null,
-
-
-       onControlPointerStart : function (e, target, controlName, pointerType) {
-               var thisObj = target._jscInstance;
-
-               jsc.preventDefault(e);
-               jsc.captureTarget(target);
-
-               var registerDragEvents = function (doc, offset) {
-                       jsc.attachGroupEvent('drag', doc, jsc._pointerMoveEvent[pointerType],
-                               jsc.onDocumentPointerMove(e, target, controlName, pointerType, offset));
-                       jsc.attachGroupEvent('drag', doc, jsc._pointerEndEvent[pointerType],
-                               jsc.onDocumentPointerEnd(e, target, controlName, pointerType));
-               };
-
-               registerDragEvents(document, [0, 0]);
-
-               if (window.parent && window.frameElement) {
-                       var rect = window.frameElement.getBoundingClientRect();
-                       var ofs = [-rect.left, -rect.top];
-                       registerDragEvents(window.parent.window.document, ofs);
-               }
-
-               var abs = jsc.getAbsPointerPos(e);
-               var rel = jsc.getRelPointerPos(e);
-               jsc._pointerOrigin = {
-                       x: abs.x - rel.x,
-                       y: abs.y - rel.y
-               };
-
-               switch (controlName) {
-               case 'pad':
-                       // if the slider is at the bottom, move it up
-                       switch (jsc.getSliderComponent(thisObj)) {
-                       case 's': if (thisObj.hsv[1] === 0) { thisObj.fromHSV(null, 100, null); }; break;
-                       case 'v': if (thisObj.hsv[2] === 0) { thisObj.fromHSV(null, null, 100); }; break;
-                       }
-                       jsc.setPad(thisObj, e, 0, 0);
-                       break;
-
-               case 'sld':
-                       jsc.setSld(thisObj, e, 0);
-                       break;
-               }
-
-               jsc.dispatchFineChange(thisObj);
-       },
-
-
-       onDocumentPointerMove : function (e, target, controlName, pointerType, offset) {
-               return function (e) {
-                       var thisObj = target._jscInstance;
-                       switch (controlName) {
-                       case 'pad':
-                               if (!e) { e = window.event; }
-                               jsc.setPad(thisObj, e, offset[0], offset[1]);
-                               jsc.dispatchFineChange(thisObj);
-                               break;
-
-                       case 'sld':
-                               if (!e) { e = window.event; }
-                               jsc.setSld(thisObj, e, offset[1]);
-                               jsc.dispatchFineChange(thisObj);
-                               break;
-                       }
-               }
-       },
-
-
-       onDocumentPointerEnd : function (e, target, controlName, pointerType) {
-               return function (e) {
-                       var thisObj = target._jscInstance;
-                       jsc.detachGroupEvents('drag');
-                       jsc.releaseTarget();
-                       // Always dispatch changes after detaching outstanding mouse handlers,
-                       // in case some user interaction will occur in user's onchange callback
-                       // that would intrude with current mouse events
-                       jsc.dispatchChange(thisObj);
-               };
-       },
-
-
-       dispatchChange : function (thisObj) {
-               if (thisObj.valueElement) {
-                       if (jsc.isElementType(thisObj.valueElement, 'input')) {
-                               jsc.fireEvent(thisObj.valueElement, 'change');
-                       }
-               }
-       },
-
-
-       dispatchFineChange : function (thisObj) {
-               if (thisObj.onFineChange) {
-                       var callback;
-                       if (typeof thisObj.onFineChange === 'string') {
-                               callback = new Function (thisObj.onFineChange);
-                       } else {
-                               callback = thisObj.onFineChange;
-                       }
-                       callback.call(thisObj);
-               }
-       },
-
-
-       setPad : function (thisObj, e, ofsX, ofsY) {
-               var pointerAbs = jsc.getAbsPointerPos(e);
-               var x = ofsX + pointerAbs.x - jsc._pointerOrigin.x - thisObj.padding - thisObj.insetWidth;
-               var y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.insetWidth;
-
-               var xVal = x * (360 / (thisObj.width - 1));
-               var yVal = 100 - (y * (100 / (thisObj.height - 1)));
-
-               switch (jsc.getPadYComponent(thisObj)) {
-               case 's': thisObj.fromHSV(xVal, yVal, null, jsc.leaveSld); break;
-               case 'v': thisObj.fromHSV(xVal, null, yVal, jsc.leaveSld); break;
-               }
-       },
-
-
-       setSld : function (thisObj, e, ofsY) {
-               var pointerAbs = jsc.getAbsPointerPos(e);
-               var y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.insetWidth;
-
-               var yVal = 100 - (y * (100 / (thisObj.height - 1)));
-
-               switch (jsc.getSliderComponent(thisObj)) {
-               case 's': thisObj.fromHSV(null, yVal, null, jsc.leavePad); break;
-               case 'v': thisObj.fromHSV(null, null, yVal, jsc.leavePad); break;
-               }
-       },
-
-
-       _vmlNS : 'jsc_vml_',
-       _vmlCSS : 'jsc_vml_css_',
-       _vmlReady : false,
-
-
-       initVML : function () {
-               if (!jsc._vmlReady) {
-                       // init VML namespace
-                       var doc = document;
-                       if (!doc.namespaces[jsc._vmlNS]) {
-                               doc.namespaces.add(jsc._vmlNS, 'urn:schemas-microsoft-com:vml');
-                       }
-                       if (!doc.styleSheets[jsc._vmlCSS]) {
-                               var tags = ['shape', 'shapetype', 'group', 'background', 'path', 'formulas', 'handles', 'fill', 'stroke', 'shadow', 'textbox', 'textpath', 'imagedata', 'line', 'polyline', 'curve', 'rect', 'roundrect', 'oval', 'arc', 'image'];
-                               var ss = doc.createStyleSheet();
-                               ss.owningElement.id = jsc._vmlCSS;
-                               for (var i = 0; i < tags.length; i += 1) {
-                                       ss.addRule(jsc._vmlNS + '\\:' + tags[i], 'behavior:url(#default#VML);');
-                               }
-                       }
-                       jsc._vmlReady = true;
-               }
-       },
-
-
-       createPalette : function () {
-
-               var paletteObj = {
-                       elm: null,
-                       draw: null
-               };
-
-               if (jsc.isCanvasSupported) {
-                       // Canvas implementation for modern browsers
-
-                       var canvas = document.createElement('canvas');
-                       var ctx = canvas.getContext('2d');
-
-                       var drawFunc = function (width, height, type) {
-                               canvas.width = width;
-                               canvas.height = height;
-
-                               ctx.clearRect(0, 0, canvas.width, canvas.height);
-
-                               var hGrad = ctx.createLinearGradient(0, 0, canvas.width, 0);
-                               hGrad.addColorStop(0 / 6, '#F00');
-                               hGrad.addColorStop(1 / 6, '#FF0');
-                               hGrad.addColorStop(2 / 6, '#0F0');
-                               hGrad.addColorStop(3 / 6, '#0FF');
-                               hGrad.addColorStop(4 / 6, '#00F');
-                               hGrad.addColorStop(5 / 6, '#F0F');
-                               hGrad.addColorStop(6 / 6, '#F00');
-
-                               ctx.fillStyle = hGrad;
-                               ctx.fillRect(0, 0, canvas.width, canvas.height);
-
-                               var vGrad = ctx.createLinearGradient(0, 0, 0, canvas.height);
-                               switch (type.toLowerCase()) {
-                               case 's':
-                                       vGrad.addColorStop(0, 'rgba(255,255,255,0)');
-                                       vGrad.addColorStop(1, 'rgba(255,255,255,1)');
-                                       break;
-                               case 'v':
-                                       vGrad.addColorStop(0, 'rgba(0,0,0,0)');
-                                       vGrad.addColorStop(1, 'rgba(0,0,0,1)');
-                                       break;
-                               }
-                               ctx.fillStyle = vGrad;
-                               ctx.fillRect(0, 0, canvas.width, canvas.height);
-                       };
-
-                       paletteObj.elm = canvas;
-                       paletteObj.draw = drawFunc;
-
-               } else {
-                       // VML fallback for IE 7 and 8
-
-                       jsc.initVML();
-
-                       var vmlContainer = document.createElement('div');
-                       vmlContainer.style.position = 'relative';
-                       vmlContainer.style.overflow = 'hidden';
-
-                       var hGrad = document.createElement(jsc._vmlNS + ':fill');
-                       hGrad.type = 'gradient';
-                       hGrad.method = 'linear';
-                       hGrad.angle = '90';
-                       hGrad.colors = '16.67% #F0F, 33.33% #00F, 50% #0FF, 66.67% #0F0, 83.33% #FF0'
-
-                       var hRect = document.createElement(jsc._vmlNS + ':rect');
-                       hRect.style.position = 'absolute';
-                       hRect.style.left = -1 + 'px';
-                       hRect.style.top = -1 + 'px';
-                       hRect.stroked = false;
-                       hRect.appendChild(hGrad);
-                       vmlContainer.appendChild(hRect);
-
-                       var vGrad = document.createElement(jsc._vmlNS + ':fill');
-                       vGrad.type = 'gradient';
-                       vGrad.method = 'linear';
-                       vGrad.angle = '180';
-                       vGrad.opacity = '0';
-
-                       var vRect = document.createElement(jsc._vmlNS + ':rect');
-                       vRect.style.position = 'absolute';
-                       vRect.style.left = -1 + 'px';
-                       vRect.style.top = -1 + 'px';
-                       vRect.stroked = false;
-                       vRect.appendChild(vGrad);
-                       vmlContainer.appendChild(vRect);
-
-                       var drawFunc = function (width, height, type) {
-                               vmlContainer.style.width = width + 'px';
-                               vmlContainer.style.height = height + 'px';
-
-                               hRect.style.width =
-                               vRect.style.width =
-                                       (width + 1) + 'px';
-                               hRect.style.height =
-                               vRect.style.height =
-                                       (height + 1) + 'px';
-
-                               // Colors must be specified during every redraw, otherwise IE won't display
-                               // a full gradient during a subsequential redraw
-                               hGrad.color = '#F00';
-                               hGrad.color2 = '#F00';
-
-                               switch (type.toLowerCase()) {
-                               case 's':
-                                       vGrad.color = vGrad.color2 = '#FFF';
-                                       break;
-                               case 'v':
-                                       vGrad.color = vGrad.color2 = '#000';
-                                       break;
-                               }
-                       };
-                       
-                       paletteObj.elm = vmlContainer;
-                       paletteObj.draw = drawFunc;
-               }
-
-               return paletteObj;
-       },
-
-
-       createSliderGradient : function () {
-
-               var sliderObj = {
-                       elm: null,
-                       draw: null
-               };
-
-               if (jsc.isCanvasSupported) {
-                       // Canvas implementation for modern browsers
-
-                       var canvas = document.createElement('canvas');
-                       var ctx = canvas.getContext('2d');
-
-                       var drawFunc = function (width, height, color1, color2) {
-                               canvas.width = width;
-                               canvas.height = height;
-
-                               ctx.clearRect(0, 0, canvas.width, canvas.height);
-
-                               var grad = ctx.createLinearGradient(0, 0, 0, canvas.height);
-                               grad.addColorStop(0, color1);
-                               grad.addColorStop(1, color2);
-
-                               ctx.fillStyle = grad;
-                               ctx.fillRect(0, 0, canvas.width, canvas.height);
-                       };
-
-                       sliderObj.elm = canvas;
-                       sliderObj.draw = drawFunc;
-
-               } else {
-                       // VML fallback for IE 7 and 8
-
-                       jsc.initVML();
-
-                       var vmlContainer = document.createElement('div');
-                       vmlContainer.style.position = 'relative';
-                       vmlContainer.style.overflow = 'hidden';
-
-                       var grad = document.createElement(jsc._vmlNS + ':fill');
-                       grad.type = 'gradient';
-                       grad.method = 'linear';
-                       grad.angle = '180';
-
-                       var rect = document.createElement(jsc._vmlNS + ':rect');
-                       rect.style.position = 'absolute';
-                       rect.style.left = -1 + 'px';
-                       rect.style.top = -1 + 'px';
-                       rect.stroked = false;
-                       rect.appendChild(grad);
-                       vmlContainer.appendChild(rect);
-
-                       var drawFunc = function (width, height, color1, color2) {
-                               vmlContainer.style.width = width + 'px';
-                               vmlContainer.style.height = height + 'px';
-
-                               rect.style.width = (width + 1) + 'px';
-                               rect.style.height = (height + 1) + 'px';
-
-                               grad.color = color1;
-                               grad.color2 = color2;
-                       };
-                       
-                       sliderObj.elm = vmlContainer;
-                       sliderObj.draw = drawFunc;
-               }
-
-               return sliderObj;
-       },
-
-
-       leaveValue : 1<<0,
-       leaveStyle : 1<<1,
-       leavePad : 1<<2,
-       leaveSld : 1<<3,
-
-
-       BoxShadow : (function () {
-               var BoxShadow = function (hShadow, vShadow, blur, spread, color, inset) {
-                       this.hShadow = hShadow;
-                       this.vShadow = vShadow;
-                       this.blur = blur;
-                       this.spread = spread;
-                       this.color = color;
-                       this.inset = !!inset;
-               };
-
-               BoxShadow.prototype.toString = function () {
-                       var vals = [
-                               Math.round(this.hShadow) + 'px',
-                               Math.round(this.vShadow) + 'px',
-                               Math.round(this.blur) + 'px',
-                               Math.round(this.spread) + 'px',
-                               this.color
-                       ];
-                       if (this.inset) {
-                               vals.push('inset');
-                       }
-                       return vals.join(' ');
-               };
-
-               return BoxShadow;
-       })(),
-
-
-       //
-       // Usage:
-       // var myColor = new jscolor(<targetElement> [, <options>])
-       //
-
-       jscolor : function (targetElement, options) {
-
-               // General options
-               //
-               this.value = null; // initial HEX color. To change it later, use methods fromString(), fromHSV() and fromRGB()
-               this.valueElement = targetElement; // element that will be used to display and input the color code
-               this.styleElement = targetElement; // element that will preview the picked color using CSS backgroundColor
-               this.required = true; // whether the associated text <input> can be left empty
-               this.refine = true; // whether to refine the entered color code (e.g. uppercase it and remove whitespace)
-               this.hash = false; // whether to prefix the HEX color code with # symbol
-               this.uppercase = true; // whether to uppercase the color code
-               this.onFineChange = null; // called instantly every time the color changes (value can be either a function or a string with javascript code)
-               this.activeClass = 'jscolor-active'; // class to be set to the target element when a picker window is open on it
-               this.minS = 0; // min allowed saturation (0 - 100)
-               this.maxS = 100; // max allowed saturation (0 - 100)
-               this.minV = 0; // min allowed value (brightness) (0 - 100)
-               this.maxV = 100; // max allowed value (brightness) (0 - 100)
-
-               // Accessing the picked color
-               //
-               this.hsv = [0, 0, 100]; // read-only  [0-360, 0-100, 0-100]
-               this.rgb = [255, 255, 255]; // read-only  [0-255, 0-255, 0-255]
-
-               // Color Picker options
-               //
-               this.width = 181; // width of color palette (in px)
-               this.height = 101; // height of color palette (in px)
-               this.showOnClick = true; // whether to display the color picker when user clicks on its target element
-               this.mode = 'HSV'; // HSV | HVS | HS | HV - layout of the color picker controls
-               this.position = 'bottom'; // left | right | top | bottom - position relative to the target element
-               this.smartPosition = true; // automatically change picker position when there is not enough space for it
-               this.sliderSize = 16; // px
-               this.crossSize = 8; // px
-               this.closable = false; // whether to display the Close button
-               this.closeText = 'Close';
-               this.buttonColor = '#000000'; // CSS color
-               this.buttonHeight = 18; // px
-               this.padding = 12; // px
-               this.backgroundColor = '#FFFFFF'; // CSS color
-               this.borderWidth = 1; // px
-               this.borderColor = '#BBBBBB'; // CSS color
-               this.borderRadius = 8; // px
-               this.insetWidth = 1; // px
-               this.insetColor = '#BBBBBB'; // CSS color
-               this.shadow = true; // whether to display shadow
-               this.shadowBlur = 15; // px
-               this.shadowColor = 'rgba(0,0,0,0.2)'; // CSS color
-               this.pointerColor = '#4C4C4C'; // px
-               this.pointerBorderColor = '#FFFFFF'; // px
-        this.pointerBorderWidth = 1; // px
-        this.pointerThickness = 2; // px
-               this.zIndex = 1000;
-               this.container = null; // where to append the color picker (BODY element by default)
-
-
-               for (var opt in options) {
-                       if (options.hasOwnProperty(opt)) {
-                               this[opt] = options[opt];
-                       }
-               }
-
-
-               this.hide = function () {
-                       if (isPickerOwner()) {
-                               detachPicker();
-                       }
-               };
-
-
-               this.show = function () {
-                       drawPicker();
-               };
-
-
-               this.redraw = function () {
-                       if (isPickerOwner()) {
-                               drawPicker();
-                       }
-               };
-
-
-               this.importColor = function () {
-                       if (!this.valueElement) {
-                               this.exportColor();
-                       } else {
-                               if (jsc.isElementType(this.valueElement, 'input')) {
-                                       if (!this.refine) {
-                                               if (!this.fromString(this.valueElement.value, jsc.leaveValue)) {
-                                                       if (this.styleElement) {
-                                                               this.styleElement.style.backgroundImage = this.styleElement._jscOrigStyle.backgroundImage;
-                                                               this.styleElement.style.backgroundColor = this.styleElement._jscOrigStyle.backgroundColor;
-                                                               this.styleElement.style.color = this.styleElement._jscOrigStyle.color;
-                                                       }
-                                                       this.exportColor(jsc.leaveValue | jsc.leaveStyle);
-                                               }
-                                       } else if (!this.required && /^\s*$/.test(this.valueElement.value)) {
-                                               this.valueElement.value = '';
-                                               if (this.styleElement) {
-                                                       this.styleElement.style.backgroundImage = this.styleElement._jscOrigStyle.backgroundImage;
-                                                       this.styleElement.style.backgroundColor = this.styleElement._jscOrigStyle.backgroundColor;
-                                                       this.styleElement.style.color = this.styleElement._jscOrigStyle.color;
-                                               }
-                                               this.exportColor(jsc.leaveValue | jsc.leaveStyle);
-
-                                       } else if (this.fromString(this.valueElement.value)) {
-                                               // managed to import color successfully from the value -> OK, don't do anything
-                                       } else {
-                                               this.exportColor();
-                                       }
-                               } else {
-                                       // not an input element -> doesn't have any value
-                                       this.exportColor();
-                               }
-                       }
-               };
-
-
-               this.exportColor = function (flags) {
-                       if (!(flags & jsc.leaveValue) && this.valueElement) {
-                               var value = this.toString();
-                               if (this.uppercase) { value = value.toUpperCase(); }
-                               if (this.hash) { value = '#' + value; }
-
-                               if (jsc.isElementType(this.valueElement, 'input')) {
-                                       this.valueElement.value = value;
-                               } else {
-                                       this.valueElement.innerHTML = _.escape(value);
-                               }
-                       }
-                       if (!(flags & jsc.leaveStyle)) {
-                               if (this.styleElement) {
-                                       this.styleElement.style.backgroundImage = 'none';
-                                       this.styleElement.style.backgroundColor = '#' + this.toString();
-                                       this.styleElement.style.color = this.isLight() ? '#000' : '#FFF';
-                               }
-                       }
-                       if (!(flags & jsc.leavePad) && isPickerOwner()) {
-                               redrawPad();
-                       }
-                       if (!(flags & jsc.leaveSld) && isPickerOwner()) {
-                               redrawSld();
-                       }
-               };
-
-
-               // h: 0-360
-               // s: 0-100
-               // v: 0-100
-               //
-               this.fromHSV = function (h, s, v, flags) { // null = don't change
-                       if (h !== null) {
-                               if (isNaN(h)) { return false; }
-                               h = Math.max(0, Math.min(360, h));
-                       }
-                       if (s !== null) {
-                               if (isNaN(s)) { return false; }
-                               s = Math.max(0, Math.min(100, this.maxS, s), this.minS);
-                       }
-                       if (v !== null) {
-                               if (isNaN(v)) { return false; }
-                               v = Math.max(0, Math.min(100, this.maxV, v), this.minV);
-                       }
-
-                       this.rgb = HSV_RGB(
-                               h===null ? this.hsv[0] : (this.hsv[0]=h),
-                               s===null ? this.hsv[1] : (this.hsv[1]=s),
-                               v===null ? this.hsv[2] : (this.hsv[2]=v)
-                       );
-
-                       this.exportColor(flags);
-               };
-
-
-               // r: 0-255
-               // g: 0-255
-               // b: 0-255
-               //
-               this.fromRGB = function (r, g, b, flags) { // null = don't change
-                       if (r !== null) {
-                               if (isNaN(r)) { return false; }
-                               r = Math.max(0, Math.min(255, r));
-                       }
-                       if (g !== null) {
-                               if (isNaN(g)) { return false; }
-                               g = Math.max(0, Math.min(255, g));
-                       }
-                       if (b !== null) {
-                               if (isNaN(b)) { return false; }
-                               b = Math.max(0, Math.min(255, b));
-                       }
-
-                       var hsv = RGB_HSV(
-                               r===null ? this.rgb[0] : r,
-                               g===null ? this.rgb[1] : g,
-                               b===null ? this.rgb[2] : b
-                       );
-                       if (hsv[0] !== null) {
-                               this.hsv[0] = Math.max(0, Math.min(360, hsv[0]));
-                       }
-                       if (hsv[2] !== 0) {
-                               this.hsv[1] = hsv[1]===null ? null : Math.max(0, this.minS, Math.min(100, this.maxS, hsv[1]));
-                       }
-                       this.hsv[2] = hsv[2]===null ? null : Math.max(0, this.minV, Math.min(100, this.maxV, hsv[2]));
-
-                       // update RGB according to final HSV, as some values might be trimmed
-                       var rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]);
-                       this.rgb[0] = rgb[0];
-                       this.rgb[1] = rgb[1];
-                       this.rgb[2] = rgb[2];
-
-                       this.exportColor(flags);
-               };
-
-
-               this.fromString = function (str, flags) {
-                       var m;
-                       if (m = str.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i)) {
-                               // HEX notation
-                               //
-
-                               if (m[1].length === 6) {
-                                       // 6-char notation
-                                       this.fromRGB(
-                                               parseInt(m[1].substr(0,2),16),
-                                               parseInt(m[1].substr(2,2),16),
-                                               parseInt(m[1].substr(4,2),16),
-                                               flags
-                                       );
-                               } else {
-                                       // 3-char notation
-                                       this.fromRGB(
-                                               parseInt(m[1].charAt(0) + m[1].charAt(0),16),
-                                               parseInt(m[1].charAt(1) + m[1].charAt(1),16),
-                                               parseInt(m[1].charAt(2) + m[1].charAt(2),16),
-                                               flags
-                                       );
-                               }
-                               return true;
-
-                       } else if (m = str.match(/^\W*rgba?\(([^)]*)\)\W*$/i)) {
-                               var params = m[1].split(',');
-                               var re = /^\s*(\d*)(\.\d+)?\s*$/;
-                               var mR, mG, mB;
-                               if (
-                                       params.length >= 3 &&
-                                       (mR = params[0].match(re)) &&
-                                       (mG = params[1].match(re)) &&
-                                       (mB = params[2].match(re))
-                               ) {
-                                       var r = parseFloat((mR[1] || '0') + (mR[2] || ''));
-                                       var g = parseFloat((mG[1] || '0') + (mG[2] || ''));
-                                       var b = parseFloat((mB[1] || '0') + (mB[2] || ''));
-                                       this.fromRGB(r, g, b, flags);
-                                       return true;
-                               }
-                       }
-                       return false;
-               };
-
-
-               this.toString = function () {
-                       return (
-                               (0x100 | Math.round(this.rgb[0])).toString(16).substr(1) +
-                               (0x100 | Math.round(this.rgb[1])).toString(16).substr(1) +
-                               (0x100 | Math.round(this.rgb[2])).toString(16).substr(1)
-                       );
-               };
-
-
-               this.toHEXString = function () {
-                       return '#' + this.toString().toUpperCase();
-               };
-
-
-               this.toRGBString = function () {
-                       return ('rgb(' +
-                               Math.round(this.rgb[0]) + ',' +
-                               Math.round(this.rgb[1]) + ',' +
-                               Math.round(this.rgb[2]) + ')'
-                       );
-               };
-
-
-               this.isLight = function () {
-                       return (
-                               0.213 * this.rgb[0] +
-                               0.715 * this.rgb[1] +
-                               0.072 * this.rgb[2] >
-                               255 / 2
-                       );
-               };
-
-
-               this._processParentElementsInDOM = function () {
-                       if (this._linkedElementsProcessed) { return; }
-                       this._linkedElementsProcessed = true;
-
-                       var elm = this.targetElement;
-                       do {
-                               // If the target element or one of its parent nodes has fixed position,
-                               // then use fixed positioning instead
-                               //
-                               // Note: In Firefox, getComputedStyle returns null in a hidden iframe,
-                               // that's why we need to check if the returned style object is non-empty
-                               var currStyle = jsc.getStyle(elm);
-                               if (currStyle && currStyle.position.toLowerCase() === 'fixed') {
-                                       this.fixed = true;
-                               }
-
-                               if (elm !== this.targetElement) {
-                                       // Ensure to attach onParentScroll only once to each parent element
-                                       // (multiple targetElements can share the same parent nodes)
-                                       //
-                                       // Note: It's not just offsetParents that can be scrollable,
-                                       // that's why we loop through all parent nodes
-                                       if (!elm._jscEventsAttached) {
-                                               jsc.attachEvent(elm, 'scroll', jsc.onParentScroll);
-                                               elm._jscEventsAttached = true;
-                                       }
-                               }
-                       } while ((elm = elm.parentNode) && !jsc.isElementType(elm, 'body'));
-               };
-
-
-               // r: 0-255
-               // g: 0-255
-               // b: 0-255
-               //
-               // returns: [ 0-360, 0-100, 0-100 ]
-               //
-               function RGB_HSV (r, g, b) {
-                       r /= 255;
-                       g /= 255;
-                       b /= 255;
-                       var n = Math.min(Math.min(r,g),b);
-                       var v = Math.max(Math.max(r,g),b);
-                       var m = v - n;
-                       if (m === 0) { return [ null, 0, 100 * v ]; }
-                       var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);
-                       return [
-                               60 * (h===6?0:h),
-                               100 * (m/v),
-                               100 * v
-                       ];
-               }
-
-
-               // h: 0-360
-               // s: 0-100
-               // v: 0-100
-               //
-               // returns: [ 0-255, 0-255, 0-255 ]
-               //
-               function HSV_RGB (h, s, v) {
-                       var u = 255 * (v / 100);
-
-                       if (h === null) {
-                               return [ u, u, u ];
-                       }
-
-                       h /= 60;
-                       s /= 100;
-
-                       var i = Math.floor(h);
-                       var f = i%2 ? h-i : 1-(h-i);
-                       var m = u * (1 - s);
-                       var n = u * (1 - s * f);
-                       switch (i) {
-                               case 6:
-                               case 0: return [u,n,m];
-                               case 1: return [n,u,m];
-                               case 2: return [m,u,n];
-                               case 3: return [m,n,u];
-                               case 4: return [n,m,u];
-                               case 5: return [u,m,n];
-                       }
-               }
-
-
-               function detachPicker () {
-                       THIS.targetElement.setAttribute('aria-expanded', 'false');
-                       jsc.unsetClass(THIS.targetElement, THIS.activeClass);
-                       jsc.picker.wrap.parentNode.removeChild(jsc.picker.wrap);
-                       delete jsc.picker.owner;
-               }
-
-
-               function drawPicker () {
-                       THIS.targetElement.setAttribute('aria-expanded', 'true');
-
-                       // At this point, when drawing the picker, we know what the parent elements are
-                       // and we can do all related DOM operations, such as registering events on them
-                       // or checking their positioning
-                       THIS._processParentElementsInDOM();
-
-                       if (!jsc.picker) {
-                               jsc.picker = {
-                                       owner: null,
-                                       wrap : document.createElement('div'),
-                                       box : document.createElement('div'),
-                                       boxS : document.createElement('div'), // shadow area
-                                       boxB : document.createElement('div'), // border
-                                       pad : document.createElement('div'),
-                                       padB : document.createElement('div'), // border
-                                       padM : document.createElement('div'), // mouse/touch area
-                                       padPal : jsc.createPalette(),
-                                       cross : document.createElement('div'),
-                                       crossBY : document.createElement('div'), // border Y
-                                       crossBX : document.createElement('div'), // border X
-                                       crossLY : document.createElement('div'), // line Y
-                                       crossLX : document.createElement('div'), // line X
-                                       sld : document.createElement('div'),
-                                       sldB : document.createElement('div'), // border
-                                       sldM : document.createElement('div'), // mouse/touch area
-                                       sldGrad : jsc.createSliderGradient(),
-                                       sldPtrS : document.createElement('div'), // slider pointer spacer
-                                       sldPtrIB : document.createElement('div'), // slider pointer inner border
-                                       sldPtrMB : document.createElement('div'), // slider pointer middle border
-                                       sldPtrOB : document.createElement('div'), // slider pointer outer border
-                                       btn : document.createElement('div'),
-                                       btnT : document.createElement('span') // text
-                               };
-
-                               jsc.picker.pad.appendChild(jsc.picker.padPal.elm);
-                               jsc.picker.padB.appendChild(jsc.picker.pad);
-                               jsc.picker.cross.appendChild(jsc.picker.crossBY);
-                               jsc.picker.cross.appendChild(jsc.picker.crossBX);
-                               jsc.picker.cross.appendChild(jsc.picker.crossLY);
-                               jsc.picker.cross.appendChild(jsc.picker.crossLX);
-                               jsc.picker.padB.appendChild(jsc.picker.cross);
-                               jsc.picker.box.appendChild(jsc.picker.padB);
-                               jsc.picker.box.appendChild(jsc.picker.padM);
-
-                               jsc.picker.sld.appendChild(jsc.picker.sldGrad.elm);
-                               jsc.picker.sldB.appendChild(jsc.picker.sld);
-                               jsc.picker.sldB.appendChild(jsc.picker.sldPtrOB);
-                               jsc.picker.sldPtrOB.appendChild(jsc.picker.sldPtrMB);
-                               jsc.picker.sldPtrMB.appendChild(jsc.picker.sldPtrIB);
-                               jsc.picker.sldPtrIB.appendChild(jsc.picker.sldPtrS);
-                               jsc.picker.box.appendChild(jsc.picker.sldB);
-                               jsc.picker.box.appendChild(jsc.picker.sldM);
-
-                               jsc.picker.btn.appendChild(jsc.picker.btnT);
-                               jsc.picker.box.appendChild(jsc.picker.btn);
-
-                               jsc.picker.boxB.appendChild(jsc.picker.box);
-                               jsc.picker.wrap.appendChild(jsc.picker.boxS);
-                               jsc.picker.wrap.appendChild(jsc.picker.boxB);
-                       }
-
-                       var p = jsc.picker;
-
-                       var displaySlider = !!jsc.getSliderComponent(THIS);
-                       var dims = jsc.getPickerDims(THIS);
-                       var crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);
-                       var padToSliderPadding = jsc.getPadToSliderPadding(THIS);
-                       var borderRadius = Math.min(
-                               THIS.borderRadius,
-                               Math.round(THIS.padding * Math.PI)); // px
-                       var padCursor = 'crosshair';
-
-                       // wrap
-                       p.wrap.style.clear = 'both';
-                       p.wrap.style.width = (dims[0] + 2 * THIS.borderWidth) + 'px';
-                       p.wrap.style.height = (dims[1] + 2 * THIS.borderWidth) + 'px';
-                       p.wrap.style.zIndex = THIS.zIndex;
-
-                       // picker
-                       p.box.style.width = dims[0] + 'px';
-                       p.box.style.height = dims[1] + 'px';
-
-                       p.boxS.style.position = 'absolute';
-                       p.boxS.style.left = '0';
-                       p.boxS.style.top = '0';
-                       p.boxS.style.width = '100%';
-                       p.boxS.style.height = '100%';
-                       jsc.setBorderRadius(p.boxS, borderRadius + 'px');
-
-                       // picker border
-                       p.boxB.style.position = 'relative';
-                       p.boxB.style.border = THIS.borderWidth + 'px solid';
-                       p.boxB.style.borderColor = THIS.borderColor;
-                       p.boxB.style.background = THIS.backgroundColor;
-                       jsc.setBorderRadius(p.boxB, borderRadius + 'px');
-
-                       // IE hack:
-                       // If the element is transparent, IE will trigger the event on the elements under it,
-                       // e.g. on Canvas or on elements with border
-                       p.padM.style.background =
-                       p.sldM.style.background =
-                               '#FFF';
-                       jsc.setStyle(p.padM, 'opacity', '0');
-                       jsc.setStyle(p.sldM, 'opacity', '0');
-
-                       // pad
-                       p.pad.style.position = 'relative';
-                       p.pad.style.width = THIS.width + 'px';
-                       p.pad.style.height = THIS.height + 'px';
-
-                       // pad palettes (HSV and HVS)
-                       p.padPal.draw(THIS.width, THIS.height, jsc.getPadYComponent(THIS));
-
-                       // pad border
-                       p.padB.style.position = 'absolute';
-                       p.padB.style.left = THIS.padding + 'px';
-                       p.padB.style.top = THIS.padding + 'px';
-                       p.padB.style.border = THIS.insetWidth + 'px solid';
-                       p.padB.style.borderColor = THIS.insetColor;
-
-                       // pad mouse area
-                       p.padM._jscInstance = THIS;
-                       p.padM._jscControlName = 'pad';
-                       p.padM.style.position = 'absolute';
-                       p.padM.style.left = '0';
-                       p.padM.style.top = '0';
-                       p.padM.style.width = (THIS.padding + 2 * THIS.insetWidth + THIS.width + padToSliderPadding / 2) + 'px';
-                       p.padM.style.height = dims[1] + 'px';
-                       p.padM.style.cursor = padCursor;
-
-                       // pad cross
-                       p.cross.style.position = 'absolute';
-                       p.cross.style.left =
-                       p.cross.style.top =
-                               '0';
-                       p.cross.style.width =
-                       p.cross.style.height =
-                               crossOuterSize + 'px';
-
-                       // pad cross border Y and X
-                       p.crossBY.style.position =
-                       p.crossBX.style.position =
-                               'absolute';
-                       p.crossBY.style.background =
-                       p.crossBX.style.background =
-                               THIS.pointerBorderColor;
-                       p.crossBY.style.width =
-                       p.crossBX.style.height =
-                               (2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';
-                       p.crossBY.style.height =
-                       p.crossBX.style.width =
-                               crossOuterSize + 'px';
-                       p.crossBY.style.left =
-                       p.crossBX.style.top =
-                               (Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2) - THIS.pointerBorderWidth) + 'px';
-                       p.crossBY.style.top =
-                       p.crossBX.style.left =
-                               '0';
-
-                       // pad cross line Y and X
-                       p.crossLY.style.position =
-                       p.crossLX.style.position =
-                               'absolute';
-                       p.crossLY.style.background =
-                       p.crossLX.style.background =
-                               THIS.pointerColor;
-                       p.crossLY.style.height =
-                       p.crossLX.style.width =
-                               (crossOuterSize - 2 * THIS.pointerBorderWidth) + 'px';
-                       p.crossLY.style.width =
-                       p.crossLX.style.height =
-                               THIS.pointerThickness + 'px';
-                       p.crossLY.style.left =
-                       p.crossLX.style.top =
-                               (Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2)) + 'px';
-                       p.crossLY.style.top =
-                       p.crossLX.style.left =
-                               THIS.pointerBorderWidth + 'px';
-
-                       // slider
-                       p.sld.style.overflow = 'hidden';
-                       p.sld.style.width = THIS.sliderSize + 'px';
-                       p.sld.style.height = THIS.height + 'px';
-
-                       // slider gradient
-                       p.sldGrad.draw(THIS.sliderSize, THIS.height, '#000', '#000');
-
-                       // slider border
-                       p.sldB.style.display = displaySlider ? 'block' : 'none';
-                       p.sldB.style.position = 'absolute';
-                       p.sldB.style.right = THIS.padding + 'px';
-                       p.sldB.style.top = THIS.padding + 'px';
-                       p.sldB.style.border = THIS.insetWidth + 'px solid';
-                       p.sldB.style.borderColor = THIS.insetColor;
-
-                       // slider mouse area
-                       p.sldM._jscInstance = THIS;
-                       p.sldM._jscControlName = 'sld';
-                       p.sldM.style.display = displaySlider ? 'block' : 'none';
-                       p.sldM.style.position = 'absolute';
-                       p.sldM.style.right = '0';
-                       p.sldM.style.top = '0';
-                       p.sldM.style.width = (THIS.sliderSize + padToSliderPadding / 2 + THIS.padding + 2 * THIS.insetWidth) + 'px';
-                       p.sldM.style.height = dims[1] + 'px';
-                       p.sldM.style.cursor = 'default';
-
-                       // slider pointer inner and outer border
-                       p.sldPtrIB.style.border =
-                       p.sldPtrOB.style.border =
-                               THIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor;
-
-                       // slider pointer outer border
-                       p.sldPtrOB.style.position = 'absolute';
-                       p.sldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px';
-                       p.sldPtrOB.style.top = '0';
-
-                       // slider pointer middle border
-                       p.sldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor;
-
-                       // slider pointer spacer
-                       p.sldPtrS.style.width = THIS.sliderSize + 'px';
-                       p.sldPtrS.style.height = sliderPtrSpace + 'px';
-
-                       // the Close button
-                       function setBtnBorder () {
-                               var insetColors = THIS.insetColor.split(/\s+/);
-                               var outsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1];
-                               p.btn.style.borderColor = outsetColor;
-                       }
-                       p.btn.style.display = THIS.closable ? 'block' : 'none';
-                       p.btn.style.position = 'absolute';
-                       p.btn.style.left = THIS.padding + 'px';
-                       p.btn.style.bottom = THIS.padding + 'px';
-                       p.btn.style.padding = '0 15px';
-                       p.btn.style.height = THIS.buttonHeight + 'px';
-                       p.btn.style.border = THIS.insetWidth + 'px solid';
-                       setBtnBorder();
-                       p.btn.style.color = THIS.buttonColor;
-                       p.btn.style.font = '12px sans-serif';
-                       p.btn.style.textAlign = 'center';
-                       try {
-                               p.btn.style.cursor = 'pointer';
-                       } catch(eOldIE) {
-                               p.btn.style.cursor = 'hand';
-                       }
-                       p.btn.onmousedown = function () {
-                               THIS.hide();
-                       };
-                       p.btnT.style.lineHeight = THIS.buttonHeight + 'px';
-                       p.btnT.innerHTML = '';
-                       p.btnT.appendChild(document.createTextNode(THIS.closeText));
-
-                       // place pointers
-                       redrawPad();
-                       redrawSld();
-
-                       // If we are changing the owner without first closing the picker,
-                       // make sure to first deal with the old owner
-                       if (jsc.picker.owner && jsc.picker.owner !== THIS) {
-                               jsc.unsetClass(jsc.picker.owner.targetElement, THIS.activeClass);
-                       }
-
-                       // Set the new picker owner
-                       jsc.picker.owner = THIS;
-
-                       // The redrawPosition() method needs picker.owner to be set, that's why we call it here,
-                       // after setting the owner
-                       if (jsc.isElementType(container, 'body')) {
-                               jsc.redrawPosition();
-                       } else {
-                               jsc._drawPosition(THIS, 0, 0, 'relative', false);
-                       }
-
-                       if (p.wrap.parentNode != container) {
-                               container.appendChild(p.wrap);
-                       }
-
-                       jsc.setClass(THIS.targetElement, THIS.activeClass);
-               }
-
-
-               function redrawPad () {
-                       // redraw the pad pointer
-                       switch (jsc.getPadYComponent(THIS)) {
-                       case 's': var yComponent = 1; break;
-                       case 'v': var yComponent = 2; break;
-                       }
-                       var x = Math.round((THIS.hsv[0] / 360) * (THIS.width - 1));
-                       var y = Math.round((1 - THIS.hsv[yComponent] / 100) * (THIS.height - 1));
-                       var crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize);
-                       var ofs = -Math.floor(crossOuterSize / 2);
-                       jsc.picker.cross.style.left = (x + ofs) + 'px';
-                       jsc.picker.cross.style.top = (y + ofs) + 'px';
-
-                       // redraw the slider
-                       switch (jsc.getSliderComponent(THIS)) {
-                       case 's':
-                               var rgb1 = HSV_RGB(THIS.hsv[0], 100, THIS.hsv[2]);
-                               var rgb2 = HSV_RGB(THIS.hsv[0], 0, THIS.hsv[2]);
-                               var color1 = 'rgb(' +
-                                       Math.round(rgb1[0]) + ',' +
-                                       Math.round(rgb1[1]) + ',' +
-                                       Math.round(rgb1[2]) + ')';
-                               var color2 = 'rgb(' +
-                                       Math.round(rgb2[0]) + ',' +
-                                       Math.round(rgb2[1]) + ',' +
-                                       Math.round(rgb2[2]) + ')';
-                               jsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);
-                               break;
-                       case 'v':
-                               var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 100);
-                               var color1 = 'rgb(' +
-                                       Math.round(rgb[0]) + ',' +
-                                       Math.round(rgb[1]) + ',' +
-                                       Math.round(rgb[2]) + ')';
-                               var color2 = '#000';
-                               jsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2);
-                               break;
-                       }
-               }
-
-
-               function redrawSld () {
-                       var sldComponent = jsc.getSliderComponent(THIS);
-                       if (sldComponent) {
-                               // redraw the slider pointer
-                               switch (sldComponent) {
-                               case 's': var yComponent = 1; break;
-                               case 'v': var yComponent = 2; break;
-                               }
-                               var y = Math.round((1 - THIS.hsv[yComponent] / 100) * (THIS.height - 1));
-                               jsc.picker.sldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(sliderPtrSpace / 2)) + 'px';
-                       }
-               }
-
-
-               function isPickerOwner () {
-                       return jsc.picker && jsc.picker.owner === THIS;
-               }
-
-
-               function blurValue () {
-                       THIS.importColor();
-               }
-
-
-               // Find the target element
-               if (typeof targetElement === 'string') {
-                       var id = targetElement;
-                       var elm = document.getElementById(id);
-                       if (elm) {
-                               this.targetElement = elm;
-                       } else {
-                               jsc.warn('Could not find target element with ID \'' + id + '\'');
-                       }
-               } else if (targetElement) {
-                       this.targetElement = targetElement;
-               } else {
-                       jsc.warn('Invalid target element: \'' + targetElement + '\'');
-               }
-
-               if (this.targetElement._jscLinkedInstance) {
-                       jsc.warn('Cannot link jscolor twice to the same element. Skipping.');
-                       return;
-               }
-               this.targetElement._jscLinkedInstance = this;
-
-               // Find the value element
-               this.valueElement = jsc.fetchElement(this.valueElement);
-               // Find the style element
-               this.styleElement = jsc.fetchElement(this.styleElement);
-
-               var THIS = this;
-               var container =
-                       this.container ?
-                       jsc.fetchElement(this.container) :
-                       document.getElementsByTagName('body')[0];
-               var sliderPtrSpace = 3; // px
-
-               // For BUTTON elements it's important to stop them from sending the form when clicked
-               // (e.g. in Safari)
-               if (jsc.isElementType(this.targetElement, 'button')) {
-                       if (this.targetElement.onclick) {
-                               var origCallback = this.targetElement.onclick;
-                               this.targetElement.onclick = function (evt) {
-                                       origCallback.call(this, evt);
-                                       return false;
-                               };
-                       } else {
-                               this.targetElement.onclick = function () { return false; };
-                       }
-               }
-
-               /*
-               var elm = this.targetElement;
-               do {
-                       // If the target element or one of its offsetParents has fixed position,
-                       // then use fixed positioning instead
-                       //
-                       // Note: In Firefox, getComputedStyle returns null in a hidden iframe,
-                       // that's why we need to check if the returned style object is non-empty
-                       var currStyle = jsc.getStyle(elm);
-                       if (currStyle && currStyle.position.toLowerCase() === 'fixed') {
-                               this.fixed = true;
-                       }
-
-                       if (elm !== this.targetElement) {
-                               // attach onParentScroll so that we can recompute the picker position
-                               // when one of the offsetParents is scrolled
-                               if (!elm._jscEventsAttached) {
-                                       jsc.attachEvent(elm, 'scroll', jsc.onParentScroll);
-                                       elm._jscEventsAttached = true;
-                               }
-                       }
-               } while ((elm = elm.offsetParent) && !jsc.isElementType(elm, 'body'));
-               */
-
-               // valueElement
-               if (this.valueElement) {
-                       if (jsc.isElementType(this.valueElement, 'input')) {
-                               var updateField = function () {
-                                       THIS.fromString(THIS.valueElement.value, jsc.leaveValue);
-                                       jsc.dispatchFineChange(THIS);
-                               };
-                               jsc.attachEvent(this.valueElement, 'keyup', updateField);
-                               jsc.attachEvent(this.valueElement, 'input', updateField);
-                               jsc.attachEvent(this.valueElement, 'blur', blurValue);
-                               this.valueElement.setAttribute('autocomplete', 'off');
-                       }
-               }
-
-               // styleElement
-               if (this.styleElement) {
-                       this.styleElement._jscOrigStyle = {
-                               backgroundImage : this.styleElement.style.backgroundImage,
-                               backgroundColor : this.styleElement.style.backgroundColor,
-                               color : this.styleElement.style.color
-                       };
-               }
-
-               if (this.value) {
-                       // Try to set the color from the .value option and if unsuccessful,
-                       // export the current color
-                       this.fromString(this.value) || this.exportColor();
-               } else {
-                       this.importColor();
-               }
-       }
-
-};
-
-
-//================================
-// Public properties and methods
-//================================
-
-
-// By default, search for all elements with class="jscolor" and install a color picker on them.
-//
-// You can change what class name will be looked for by setting the property jscolor.lookupClass
-// anywhere in your HTML document. To completely disable the automatic lookup, set it to null.
-//
-jsc.jscolor.lookupClass = 'jscolor';
-
-
-jsc.jscolor.installByClassName = function (className) {
-       var inputElms = document.getElementsByTagName('input');
-       var buttonElms = document.getElementsByTagName('button');
-
-       jsc.tryInstallOnElements(inputElms, className);
-       jsc.tryInstallOnElements(buttonElms, className);
-};
-
-
-jsc.register();
-
-
-return jsc.jscolor;
-
-
-})(); }
diff --git a/apps/theming/js/3rdparty/jscolor/jscolor.min.js b/apps/theming/js/3rdparty/jscolor/jscolor.min.js
deleted file mode 100644 (file)
index 2a7a788..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * jscolor - JavaScript Color Picker
- *
- * @link    http://jscolor.com
- * @license For open source use: GPLv3
- *          For commercial use: JSColor Commercial License
- * @author  Jan Odvarko
- *
- * See usage examples at http://jscolor.com/examples/
- */"use strict";window.jscolor||(window.jscolor=function(){var e={register:function(){e.attachDOMReadyEvent(e.init),e.attachEvent(document,"mousedown",e.onDocumentMouseDown),e.attachEvent(document,"touchstart",e.onDocumentTouchStart),e.attachEvent(window,"resize",e.onWindowResize)},init:function(){e.jscolor.lookupClass&&e.jscolor.installByClassName(e.jscolor.lookupClass)},tryInstallOnElements:function(t,n){var r=new RegExp("(^|\\s)("+n+")(\\s*(\\{[^}]*\\})|\\s|$)","i");for(var i=0;i<t.length;i+=1){if(t[i].type!==undefined&&t[i].type.toLowerCase()=="color"&&e.isColorAttrSupported)continue;var s;if(!t[i].jscolor&&t[i].className&&(s=t[i].className.match(r))){var o=t[i],u=null,a=e.getDataAttr(o,"jscolor");a!==null?u=a:s[4]&&(u=s[4]);var f={};if(u)try{f=(new Function("return ("+u+")"))()}catch(l){e.warn("Error parsing jscolor options: "+l+":\n"+u)}o.jscolor=new e.jscolor(o,f)}}},isColorAttrSupported:function(){var e=document.createElement("input");if(e.setAttribute){e.setAttribute("type","color");if(e.type.toLowerCase()=="color")return!0}return!1}(),isCanvasSupported:function(){var e=document.createElement("canvas");return!!e.getContext&&!!e.getContext("2d")}(),fetchElement:function(e){return typeof e=="string"?document.getElementById(e):e},isElementType:function(e,t){return e.nodeName.toLowerCase()===t.toLowerCase()},getDataAttr:function(e,t){var n="data-"+t,r=e.getAttribute(n);return r!==null?r:null},attachEvent:function(e,t,n){e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent&&e.attachEvent("on"+t,n)},detachEvent:function(e,t,n){e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent&&e.detachEvent("on"+t,n)},_attachedGroupEvents:{},attachGroupEvent:function(t,n,r,i){e._attachedGroupEvents.hasOwnProperty(t)||(e._attachedGroupEvents[t]=[]),e._attachedGroupEvents[t].push([n,r,i]),e.attachEvent(n,r,i)},detachGroupEvents:function(t){if(e._attachedGroupEvents.hasOwnProperty(t)){for(var n=0;n<e._attachedGroupEvents[t].length;n+=1){var r=e._attachedGroupEvents[t][n];e.detachEvent(r[0],r[1],r[2])}delete e._attachedGroupEvents[t]}},attachDOMReadyEvent:function(e){var t=!1,n=function(){t||(t=!0,e())};if(document.readyState==="complete"){setTimeout(n,1);return}if(document.addEventListener)document.addEventListener("DOMContentLoaded",n,!1),window.addEventListener("load",n,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",function(){document.readyState==="complete"&&(document.detachEvent("onreadystatechange",arguments.callee),n())}),window.attachEvent("onload",n);if(document.documentElement.doScroll&&window==window.top){var r=function(){if(!document.body)return;try{document.documentElement.doScroll("left"),n()}catch(e){setTimeout(r,1)}};r()}}},warn:function(e){window.console&&window.console.warn&&window.console.warn(e)},preventDefault:function(e){e.preventDefault&&e.preventDefault(),e.returnValue=!1},captureTarget:function(t){t.setCapture&&(e._capturedTarget=t,e._capturedTarget.setCapture())},releaseTarget:function(){e._capturedTarget&&(e._capturedTarget.releaseCapture(),e._capturedTarget=null)},fireEvent:function(e,t){if(!e)return;if(document.createEvent){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}else if(document.createEventObject){var n=document.createEventObject();e.fireEvent("on"+t,n)}else e["on"+t]&&e["on"+t]()},classNameToList:function(e){return e.replace(/^\s+|\s+$/g,"").split(/\s+/)},hasClass:function(e,t){return t?-1!=(" "+e.className.replace(/\s+/g," ")+" ").indexOf(" "+t+" "):!1},setClass:function(t,n){var r=e.classNameToList(n);for(var i=0;i<r.length;i+=1)e.hasClass(t,r[i])||(t.className+=(t.className?" ":"")+r[i])},unsetClass:function(t,n){var r=e.classNameToList(n);for(var i=0;i<r.length;i+=1){var s=new RegExp("^\\s*"+r[i]+"\\s*|"+"\\s*"+r[i]+"\\s*$|"+"\\s+"+r[i]+"(\\s+)","g");t.className=t.className.replace(s,"$1")}},getStyle:function(e){return window.getComputedStyle?window.getComputedStyle(e):e.currentStyle},setStyle:function(){var e=document.createElement("div"),t=function(t){for(var n=0;n<t.length;n+=1)if(t[n]in e.style)return t[n]},n={borderRadius:t(["borderRadius","MozBorderRadius","webkitBorderRadius"]),boxShadow:t(["boxShadow","MozBoxShadow","webkitBoxShadow"])};return function(e,t,r){switch(t.toLowerCase()){case"opacity":var i=Math.round(parseFloat(r)*100);e.style.opacity=r,e.style.filter="alpha(opacity="+i+")";break;default:e.style[n[t]]=r}}}(),setBorderRadius:function(t,n){e.setStyle(t,"borderRadius",n||"0")},setBoxShadow:function(t,n){e.setStyle(t,"boxShadow",n||"none")},getElementPos:function(t,n){var r=0,i=0,s=t.getBoundingClientRect();r=s.left,i=s.top;if(!n){var o=e.getViewPos();r+=o[0],i+=o[1]}return[r,i]},getElementSize:function(e){return[e.offsetWidth,e.offsetHeight]},getAbsPointerPos:function(e){e||(e=window.event);var t=0,n=0;return typeof e.changedTouches!="undefined"&&e.changedTouches.length?(t=e.changedTouches[0].clientX,n=e.changedTouches[0].clientY):typeof e.clientX=="number"&&(t=e.clientX,n=e.clientY),{x:t,y:n}},getRelPointerPos:function(e){e||(e=window.event);var t=e.target||e.srcElement,n=t.getBoundingClientRect(),r=0,i=0,s=0,o=0;return typeof e.changedTouches!="undefined"&&e.changedTouches.length?(s=e.changedTouches[0].clientX,o=e.changedTouches[0].clientY):typeof e.clientX=="number"&&(s=e.clientX,o=e.clientY),r=s-n.left,i=o-n.top,{x:r,y:i}},getViewPos:function(){var e=document.documentElement;return[(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0),(window.pageYOffset||e.scrollTop)-(e.clientTop||0)]},getViewSize:function(){var e=document.documentElement;return[window.innerWidth||e.clientWidth,window.innerHeight||e.clientHeight]},redrawPosition:function(){if(e.picker&&e.picker.owner){var t=e.picker.owner,n,r;t.fixed?(n=e.getElementPos(t.targetElement,!0),r=[0,0]):(n=e.getElementPos(t.targetElement),r=e.getViewPos());var i=e.getElementSize(t.targetElement),s=e.getViewSize(),o=e.getPickerOuterDims(t),u,a,f;switch(t.position.toLowerCase()){case"left":u=1,a=0,f=-1;break;case"right":u=1,a=0,f=1;break;case"top":u=0,a=1,f=-1;break;default:u=0,a=1,f=1}var l=(i[a]+o[a])/2;if(!t.smartPosition)var c=[n[u],n[a]+i[a]-l+l*f];else var c=[-r[u]+n[u]+o[u]>s[u]?-r[u]+n[u]+i[u]/2>s[u]/2&&n[u]+i[u]-o[u]>=0?n[u]+i[u]-o[u]:n[u]:n[u],-r[a]+n[a]+i[a]+o[a]-l+l*f>s[a]?-r[a]+n[a]+i[a]/2>s[a]/2&&n[a]+i[a]-l-l*f>=0?n[a]+i[a]-l-l*f:n[a]+i[a]-l+l*f:n[a]+i[a]-l+l*f>=0?n[a]+i[a]-l+l*f:n[a]+i[a]-l-l*f];var h=c[u],p=c[a],d=t.fixed?"fixed":"absolute",v=(c[0]+o[0]>n[0]||c[0]<n[0]+i[0])&&c[1]+o[1]<n[1]+i[1];e._drawPosition(t,h,p,d,v)}},_drawPosition:function(t,n,r,i,s){var o=s?0:t.shadowBlur;e.picker.wrap.style.position=i,e.picker.wrap.style.left=n+"px",e.picker.wrap.style.top=r+"px",e.setBoxShadow(e.picker.boxS,t.shadow?new e.BoxShadow(0,o,t.shadowBlur,0,t.shadowColor):null)},getPickerDims:function(t){var n=!!e.getSliderComponent(t),r=[2*t.insetWidth+2*t.padding+t.width+(n?2*t.insetWidth+e.getPadToSliderPadding(t)+t.sliderSize:0),2*t.insetWidth+2*t.padding+t.height+(t.closable?2*t.insetWidth+t.padding+t.buttonHeight:0)];return r},getPickerOuterDims:function(t){var n=e.getPickerDims(t);return[n[0]+2*t.borderWidth,n[1]+2*t.borderWidth]},getPadToSliderPadding:function(e){return Math.max(e.padding,1.5*(2*e.pointerBorderWidth+e.pointerThickness))},getPadYComponent:function(e){switch(e.mode.charAt(1).toLowerCase()){case"v":return"v"}return"s"},getSliderComponent:function(e){if(e.mode.length>2)switch(e.mode.charAt(2).toLowerCase()){case"s":return"s";case"v":return"v"}return null},onDocumentMouseDown:function(t){t||(t=window.event);var n=t.target||t.srcElement;n._jscLinkedInstance?n._jscLinkedInstance.showOnClick&&n._jscLinkedInstance.show():n._jscControlName?e.onControlPointerStart(t,n,n._jscControlName,"mouse"):e.picker&&e.picker.owner&&e.picker.owner.hide()},onDocumentTouchStart:function(t){t||(t=window.event);var n=t.target||t.srcElement;n._jscLinkedInstance?n._jscLinkedInstance.showOnClick&&n._jscLinkedInstance.show():n._jscControlName?e.onControlPointerStart(t,n,n._jscControlName,"touch"):e.picker&&e.picker.owner&&e.picker.owner.hide()},onWindowResize:function(t){e.redrawPosition()},onParentScroll:function(t){e.picker&&e.picker.owner&&e.picker.owner.hide()},_pointerMoveEvent:{mouse:"mousemove",touch:"touchmove"},_pointerEndEvent:{mouse:"mouseup",touch:"touchend"},_pointerOrigin:null,_capturedTarget:null,onControlPointerStart:function(t,n,r,i){var s=n._jscInstance;e.preventDefault(t),e.captureTarget(n);var o=function(s,o){e.attachGroupEvent("drag",s,e._pointerMoveEvent[i],e.onDocumentPointerMove(t,n,r,i,o)),e.attachGroupEvent("drag",s,e._pointerEndEvent[i],e.onDocumentPointerEnd(t,n,r,i))};o(document,[0,0]);if(window.parent&&window.frameElement){var u=window.frameElement.getBoundingClientRect(),a=[-u.left,-u.top];o(window.parent.window.document,a)}var f=e.getAbsPointerPos(t),l=e.getRelPointerPos(t);e._pointerOrigin={x:f.x-l.x,y:f.y-l.y};switch(r){case"pad":switch(e.getSliderComponent(s)){case"s":s.hsv[1]===0&&s.fromHSV(null,100,null);break;case"v":s.hsv[2]===0&&s.fromHSV(null,null,100)}e.setPad(s,t,0,0);break;case"sld":e.setSld(s,t,0)}e.dispatchFineChange(s)},onDocumentPointerMove:function(t,n,r,i,s){return function(t){var i=n._jscInstance;switch(r){case"pad":t||(t=window.event),e.setPad(i,t,s[0],s[1]),e.dispatchFineChange(i);break;case"sld":t||(t=window.event),e.setSld(i,t,s[1]),e.dispatchFineChange(i)}}},onDocumentPointerEnd:function(t,n,r,i){return function(t){var r=n._jscInstance;e.detachGroupEvents("drag"),e.releaseTarget(),e.dispatchChange(r)}},dispatchChange:function(t){t.valueElement&&e.isElementType(t.valueElement,"input")&&e.fireEvent(t.valueElement,"change")},dispatchFineChange:function(e){if(e.onFineChange){var t;typeof e.onFineChange=="string"?t=new Function(e.onFineChange):t=e.onFineChange,t.call(e)}},setPad:function(t,n,r,i){var s=e.getAbsPointerPos(n),o=r+s.x-e._pointerOrigin.x-t.padding-t.insetWidth,u=i+s.y-e._pointerOrigin.y-t.padding-t.insetWidth,a=o*(360/(t.width-1)),f=100-u*(100/(t.height-1));switch(e.getPadYComponent(t)){case"s":t.fromHSV(a,f,null,e.leaveSld);break;case"v":t.fromHSV(a,null,f,e.leaveSld)}},setSld:function(t,n,r){var i=e.getAbsPointerPos(n),s=r+i.y-e._pointerOrigin.y-t.padding-t.insetWidth,o=100-s*(100/(t.height-1));switch(e.getSliderComponent(t)){case"s":t.fromHSV(null,o,null,e.leavePad);break;case"v":t.fromHSV(null,null,o,e.leavePad)}},_vmlNS:"jsc_vml_",_vmlCSS:"jsc_vml_css_",_vmlReady:!1,initVML:function(){if(!e._vmlReady){var t=document;t.namespaces[e._vmlNS]||t.namespaces.add(e._vmlNS,"urn:schemas-microsoft-com:vml");if(!t.styleSheets[e._vmlCSS]){var n=["shape","shapetype","group","background","path","formulas","handles","fill","stroke","shadow","textbox","textpath","imagedata","line","polyline","curve","rect","roundrect","oval","arc","image"],r=t.createStyleSheet();r.owningElement.id=e._vmlCSS;for(var i=0;i<n.length;i+=1)r.addRule(e._vmlNS+"\\:"+n[i],"behavior:url(#default#VML);")}e._vmlReady=!0}},createPalette:function(){var t={elm:null,draw:null};if(e.isCanvasSupported){var n=document.createElement("canvas"),r=n.getContext("2d"),i=function(e,t,i){n.width=e,n.height=t,r.clearRect(0,0,n.width,n.height);var s=r.createLinearGradient(0,0,n.width,0);s.addColorStop(0,"#F00"),s.addColorStop(1/6,"#FF0"),s.addColorStop(2/6,"#0F0"),s.addColorStop(.5,"#0FF"),s.addColorStop(4/6,"#00F"),s.addColorStop(5/6,"#F0F"),s.addColorStop(1,"#F00"),r.fillStyle=s,r.fillRect(0,0,n.width,n.height);var o=r.createLinearGradient(0,0,0,n.height);switch(i.toLowerCase()){case"s":o.addColorStop(0,"rgba(255,255,255,0)"),o.addColorStop(1,"rgba(255,255,255,1)");break;case"v":o.addColorStop(0,"rgba(0,0,0,0)"),o.addColorStop(1,"rgba(0,0,0,1)")}r.fillStyle=o,r.fillRect(0,0,n.width,n.height)};t.elm=n,t.draw=i}else{e.initVML();var s=document.createElement("div");s.style.position="relative",s.style.overflow="hidden";var o=document.createElement(e._vmlNS+":fill");o.type="gradient",o.method="linear",o.angle="90",o.colors="16.67% #F0F, 33.33% #00F, 50% #0FF, 66.67% #0F0, 83.33% #FF0";var u=document.createElement(e._vmlNS+":rect");u.style.position="absolute",u.style.left="-1px",u.style.top="-1px",u.stroked=!1,u.appendChild(o),s.appendChild(u);var a=document.createElement(e._vmlNS+":fill");a.type="gradient",a.method="linear",a.angle="180",a.opacity="0";var f=document.createElement(e._vmlNS+":rect");f.style.position="absolute",f.style.left="-1px",f.style.top="-1px",f.stroked=!1,f.appendChild(a),s.appendChild(f);var i=function(e,t,n){s.style.width=e+"px",s.style.height=t+"px",u.style.width=f.style.width=e+1+"px",u.style.height=f.style.height=t+1+"px",o.color="#F00",o.color2="#F00";switch(n.toLowerCase()){case"s":a.color=a.color2="#FFF";break;case"v":a.color=a.color2="#000"}};t.elm=s,t.draw=i}return t},createSliderGradient:function(){var t={elm:null,draw:null};if(e.isCanvasSupported){var n=document.createElement("canvas"),r=n.getContext("2d"),i=function(e,t,i,s){n.width=e,n.height=t,r.clearRect(0,0,n.width,n.height);var o=r.createLinearGradient(0,0,0,n.height);o.addColorStop(0,i),o.addColorStop(1,s),r.fillStyle=o,r.fillRect(0,0,n.width,n.height)};t.elm=n,t.draw=i}else{e.initVML();var s=document.createElement("div");s.style.position="relative",s.style.overflow="hidden";var o=document.createElement(e._vmlNS+":fill");o.type="gradient",o.method="linear",o.angle="180";var u=document.createElement(e._vmlNS+":rect");u.style.position="absolute",u.style.left="-1px",u.style.top="-1px",u.stroked=!1,u.appendChild(o),s.appendChild(u);var i=function(e,t,n,r){s.style.width=e+"px",s.style.height=t+"px",u.style.width=e+1+"px",u.style.height=t+1+"px",o.color=n,o.color2=r};t.elm=s,t.draw=i}return t},leaveValue:1,leaveStyle:2,leavePad:4,leaveSld:8,BoxShadow:function(){var e=function(e,t,n,r,i,s){this.hShadow=e,this.vShadow=t,this.blur=n,this.spread=r,this.color=i,this.inset=!!s};return e.prototype.toString=function(){var e=[Math.round(this.hShadow)+"px",Math.round(this.vShadow)+"px",Math.round(this.blur)+"px",Math.round(this.spread)+"px",this.color];return this.inset&&e.push("inset"),e.join(" ")},e}(),jscolor:function(t,n){function i(e,t,n){e/=255,t/=255,n/=255;var r=Math.min(Math.min(e,t),n),i=Math.max(Math.max(e,t),n),s=i-r;if(s===0)return[null,0,100*i];var o=e===r?3+(n-t)/s:t===r?5+(e-n)/s:1+(t-e)/s;return[60*(o===6?0:o),100*(s/i),100*i]}function s(e,t,n){var r=255*(n/100);if(e===null)return[r,r,r];e/=60,t/=100;var i=Math.floor(e),s=i%2?e-i:1-(e-i),o=r*(1-t),u=r*(1-t*s);switch(i){case 6:case 0:return[r,u,o];case 1:return[u,r,o];case 2:return[o,r,u];case 3:return[o,u,r];case 4:return[u,o,r];case 5:return[r,o,u]}}function o(){e.unsetClass(d.targetElement,d.activeClass),e.picker.wrap.parentNode.removeChild(e.picker.wrap),delete e.picker.owner}function u(){function l(){var e=d.insetColor.split(/\s+/),n=e.length<2?e[0]:e[1]+" "+e[0]+" "+e[0]+" "+e[1];t.btn.style.borderColor=n}d._processParentElementsInDOM(),e.picker||(e.picker={owner:null,wrap:document.createElement("div"),box:document.createElement("div"),boxS:document.createElement("div"),boxB:document.createElement("div"),pad:document.createElement("div"),padB:document.createElement("div"),padM:document.createElement("div"),padPal:e.createPalette(),cross:document.createElement("div"),crossBY:document.createElement("div"),crossBX:document.createElement("div"),crossLY:document.createElement("div"),crossLX:document.createElement("div"),sld:document.createElement("div"),sldB:document.createElement("div"),sldM:document.createElement("div"),sldGrad:e.createSliderGradient(),sldPtrS:document.createElement("div"),sldPtrIB:document.createElement("div"),sldPtrMB:document.createElement("div"),sldPtrOB:document.createElement("div"),btn:document.createElement("div"),btnT:document.createElement("span")},e.picker.pad.appendChild(e.picker.padPal.elm),e.picker.padB.appendChild(e.picker.pad),e.picker.cross.appendChild(e.picker.crossBY),e.picker.cross.appendChild(e.picker.crossBX),e.picker.cross.appendChild(e.picker.crossLY),e.picker.cross.appendChild(e.picker.crossLX),e.picker.padB.appendChild(e.picker.cross),e.picker.box.appendChild(e.picker.padB),e.picker.box.appendChild(e.picker.padM),e.picker.sld.appendChild(e.picker.sldGrad.elm),e.picker.sldB.appendChild(e.picker.sld),e.picker.sldB.appendChild(e.picker.sldPtrOB),e.picker.sldPtrOB.appendChild(e.picker.sldPtrMB),e.picker.sldPtrMB.appendChild(e.picker.sldPtrIB),e.picker.sldPtrIB.appendChild(e.picker.sldPtrS),e.picker.box.appendChild(e.picker.sldB),e.picker.box.appendChild(e.picker.sldM),e.picker.btn.appendChild(e.picker.btnT),e.picker.box.appendChild(e.picker.btn),e.picker.boxB.appendChild(e.picker.box),e.picker.wrap.appendChild(e.picker.boxS),e.picker.wrap.appendChild(e.picker.boxB));var t=e.picker,n=!!e.getSliderComponent(d),r=e.getPickerDims(d),i=2*d.pointerBorderWidth+d.pointerThickness+2*d.crossSize,s=e.getPadToSliderPadding(d),o=Math.min(d.borderRadius,Math.round(d.padding*Math.PI)),u="crosshair";t.wrap.style.clear="both",t.wrap.style.width=r[0]+2*d.borderWidth+"px",t.wrap.style.height=r[1]+2*d.borderWidth+"px",t.wrap.style.zIndex=d.zIndex,t.box.style.width=r[0]+"px",t.box.style.height=r[1]+"px",t.boxS.style.position="absolute",t.boxS.style.left="0",t.boxS.style.top="0",t.boxS.style.width="100%",t.boxS.style.height="100%",e.setBorderRadius(t.boxS,o+"px"),t.boxB.style.position="relative",t.boxB.style.border=d.borderWidth+"px solid",t.boxB.style.borderColor=d.borderColor,t.boxB.style.background=d.backgroundColor,e.setBorderRadius(t.boxB,o+"px"),t.padM.style.background=t.sldM.style.background="#FFF",e.setStyle(t.padM,"opacity","0"),e.setStyle(t.sldM,"opacity","0"),t.pad.style.position="relative",t.pad.style.width=d.width+"px",t.pad.style.height=d.height+"px",t.padPal.draw(d.width,d.height,e.getPadYComponent(d)),t.padB.style.position="absolute",t.padB.style.left=d.padding+"px",t.padB.style.top=d.padding+"px",t.padB.style.border=d.insetWidth+"px solid",t.padB.style.borderColor=d.insetColor,t.padM._jscInstance=d,t.padM._jscControlName="pad",t.padM.style.position="absolute",t.padM.style.left="0",t.padM.style.top="0",t.padM.style.width=d.padding+2*d.insetWidth+d.width+s/2+"px",t.padM.style.height=r[1]+"px",t.padM.style.cursor=u,t.cross.style.position="absolute",t.cross.style.left=t.cross.style.top="0",t.cross.style.width=t.cross.style.height=i+"px",t.crossBY.style.position=t.crossBX.style.position="absolute",t.crossBY.style.background=t.crossBX.style.background=d.pointerBorderColor,t.crossBY.style.width=t.crossBX.style.height=2*d.pointerBorderWidth+d.pointerThickness+"px",t.crossBY.style.height=t.crossBX.style.width=i+"px",t.crossBY.style.left=t.crossBX.style.top=Math.floor(i/2)-Math.floor(d.pointerThickness/2)-d.pointerBorderWidth+"px",t.crossBY.style.top=t.crossBX.style.left="0",t.crossLY.style.position=t.crossLX.style.position="absolute",t.crossLY.style.background=t.crossLX.style.background=d.pointerColor,t.crossLY.style.height=t.crossLX.style.width=i-2*d.pointerBorderWidth+"px",t.crossLY.style.width=t.crossLX.style.height=d.pointerThickness+"px",t.crossLY.style.left=t.crossLX.style.top=Math.floor(i/2)-Math.floor(d.pointerThickness/2)+"px",t.crossLY.style.top=t.crossLX.style.left=d.pointerBorderWidth+"px",t.sld.style.overflow="hidden",t.sld.style.width=d.sliderSize+"px",t.sld.style.height=d.height+"px",t.sldGrad.draw(d.sliderSize,d.height,"#000","#000"),t.sldB.style.display=n?"block":"none",t.sldB.style.position="absolute",t.sldB.style.right=d.padding+"px",t.sldB.style.top=d.padding+"px",t.sldB.style.border=d.insetWidth+"px solid",t.sldB.style.borderColor=d.insetColor,t.sldM._jscInstance=d,t.sldM._jscControlName="sld",t.sldM.style.display=n?"block":"none",t.sldM.style.position="absolute",t.sldM.style.right="0",t.sldM.style.top="0",t.sldM.style.width=d.sliderSize+s/2+d.padding+2*d.insetWidth+"px",t.sldM.style.height=r[1]+"px",t.sldM.style.cursor="default",t.sldPtrIB.style.border=t.sldPtrOB.style.border=d.pointerBorderWidth+"px solid "+d.pointerBorderColor,t.sldPtrOB.style.position="absolute",t.sldPtrOB.style.left=-(2*d.pointerBorderWidth+d.pointerThickness)+"px",t.sldPtrOB.style.top="0",t.sldPtrMB.style.border=d.pointerThickness+"px solid "+d.pointerColor,t.sldPtrS.style.width=d.sliderSize+"px",t.sldPtrS.style.height=m+"px",t.btn.style.display=d.closable?"block":"none",t.btn.style.position="absolute",t.btn.style.left=d.padding+"px",t.btn.style.bottom=d.padding+"px",t.btn.style.padding="0 15px",t.btn.style.height=d.buttonHeight+"px",t.btn.style.border=d.insetWidth+"px solid",l(),t.btn.style.color=d.buttonColor,t.btn.style.font="12px sans-serif",t.btn.style.textAlign="center";try{t.btn.style.cursor="pointer"}catch(c){t.btn.style.cursor="hand"}t.btn.onmousedown=function(){d.hide()},t.btnT.style.lineHeight=d.buttonHeight+"px",t.btnT.innerHTML="",t.btnT.appendChild(document.createTextNode(d.closeText)),a(),f(),e.picker.owner&&e.picker.owner!==d&&e.unsetClass(e.picker.owner.targetElement,d.activeClass),e.picker.owner=d,e.isElementType(v,"body")?e.redrawPosition():e._drawPosition(d,0,0,"relative",!1),t.wrap.parentNode!=v&&v.appendChild(t.wrap),e.setClass(d.targetElement,d.activeClass)}function a(){switch(e.getPadYComponent(d)){case"s":var t=1;break;case"v":var t=2}var n=Math.round(d.hsv[0]/360*(d.width-1)),r=Math.round((1-d.hsv[t]/100)*(d.height-1)),i=2*d.pointerBorderWidth+d.pointerThickness+2*d.crossSize,o=-Math.floor(i/2);e.picker.cross.style.left=n+o+"px",e.picker.cross.style.top=r+o+"px";switch(e.getSliderComponent(d)){case"s":var u=s(d.hsv[0],100,d.hsv[2]),a=s(d.hsv[0],0,d.hsv[2]),f="rgb("+Math.round(u[0])+","+Math.round(u[1])+","+Math.round(u[2])+")",l="rgb("+Math.round(a[0])+","+Math.round(a[1])+","+Math.round(a[2])+")";e.picker.sldGrad.draw(d.sliderSize,d.height,f,l);break;case"v":var c=s(d.hsv[0],d.hsv[1],100),f="rgb("+Math.round(c[0])+","+Math.round(c[1])+","+Math.round(c[2])+")",l="#000";e.picker.sldGrad.draw(d.sliderSize,d.height,f,l)}}function f(){var t=e.getSliderComponent(d);if(t){switch(t){case"s":var n=1;break;case"v":var n=2}var r=Math.round((1-d.hsv[n]/100)*(d.height-1));e.picker.sldPtrOB.style.top=r-(2*d.pointerBorderWidth+d.pointerThickness)-Math.floor(m/2)+"px"}}function l(){return e.picker&&e.picker.owner===d}function c(){d.importColor()}this.value=null,this.valueElement=t,this.styleElement=t,this.required=!0,this.refine=!0,this.hash=!1,this.uppercase=!0,this.onFineChange=null,this.activeClass="jscolor-active",this.minS=0,this.maxS=100,this.minV=0,this.maxV=100,this.hsv=[0,0,100],this.rgb=[255,255,255],this.width=181,this.height=101,this.showOnClick=!0,this.mode="HSV",this.position="bottom",this.smartPosition=!0,this.sliderSize=16,this.crossSize=8,this.closable=!1,this.closeText="Close",this.buttonColor="#000000",this.buttonHeight=18,this.padding=12,this.backgroundColor="#FFFFFF",this.borderWidth=1,this.borderColor="#BBBBBB",this.borderRadius=8,this.insetWidth=1,this.insetColor="#BBBBBB",this.shadow=!0,this.shadowBlur=15,this.shadowColor="rgba(0,0,0,0.2)",this.pointerColor="#4C4C4C",this.pointerBorderColor="#FFFFFF",this.pointerBorderWidth=1,this.pointerThickness=2,this.zIndex=1e3,this.container=null;for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.hide=function(){l()&&o()},this.show=function(){u()},this.redraw=function(){l()&&u()},this.importColor=function(){this.valueElement?e.isElementType(this.valueElement,"input")?this.refine?!this.required&&/^\s*$/.test(this.valueElement.value)?(this.valueElement.value="",this.styleElement&&(this.styleElement.style.backgroundImage=this.styleElement._jscOrigStyle.backgroundImage,this.styleElement.style.backgroundColor=this.styleElement._jscOrigStyle.backgroundColor,this.styleElement.style.color=this.styleElement._jscOrigStyle.color),this.exportColor(e.leaveValue|e.leaveStyle)):this.fromString(this.valueElement.value)||this.exportColor():this.fromString(this.valueElement.value,e.leaveValue)||(this.styleElement&&(this.styleElement.style.backgroundImage=this.styleElement._jscOrigStyle.backgroundImage,this.styleElement.style.backgroundColor=this.styleElement._jscOrigStyle.backgroundColor,this.styleElement.style.color=this.styleElement._jscOrigStyle.color),this.exportColor(e.leaveValue|e.leaveStyle)):this.exportColor():this.exportColor()},this.exportColor=function(t){if(!(t&e.leaveValue)&&this.valueElement){var n=this.toString();this.uppercase&&(n=n.toUpperCase()),this.hash&&(n="#"+n),e.isElementType(this.valueElement,"input")?this.valueElement.value=n:this.valueElement.innerHTML=n}t&e.leaveStyle||this.styleElement&&(this.styleElement.style.backgroundImage="none",this.styleElement.style.backgroundColor="#"+this.toString(),this.styleElement.style.color=this.isLight()?"#000":"#FFF"),!(t&e.leavePad)&&l()&&a(),!(t&e.leaveSld)&&l()&&f()},this.fromHSV=function(e,t,n,r){if(e!==null){if(isNaN(e))return!1;e=Math.max(0,Math.min(360,e))}if(t!==null){if(isNaN(t))return!1;t=Math.max(0,Math.min(100,this.maxS,t),this.minS)}if(n!==null){if(isNaN(n))return!1;n=Math.max(0,Math.min(100,this.maxV,n),this.minV)}this.rgb=s(e===null?this.hsv[0]:this.hsv[0]=e,t===null?this.hsv[1]:this.hsv[1]=t,n===null?this.hsv[2]:this.hsv[2]=n),this.exportColor(r)},this.fromRGB=function(e,t,n,r){if(e!==null){if(isNaN(e))return!1;e=Math.max(0,Math.min(255,e))}if(t!==null){if(isNaN(t))return!1;t=Math.max(0,Math.min(255,t))}if(n!==null){if(isNaN(n))return!1;n=Math.max(0,Math.min(255,n))}var o=i(e===null?this.rgb[0]:e,t===null?this.rgb[1]:t,n===null?this.rgb[2]:n);o[0]!==null&&(this.hsv[0]=Math.max(0,Math.min(360,o[0]))),o[2]!==0&&(this.hsv[1]=o[1]===null?null:Math.max(0,this.minS,Math.min(100,this.maxS,o[1]))),this.hsv[2]=o[2]===null?null:Math.max(0,this.minV,Math.min(100,this.maxV,o[2]));var u=s(this.hsv[0],this.hsv[1],this.hsv[2]);this.rgb[0]=u[0],this.rgb[1]=u[1],this.rgb[2]=u[2],this.exportColor(r)},this.fromString=function(e,t){var n;if(n=e.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i))return n[1].length===6?this.fromRGB(parseInt(n[1].substr(0,2),16),parseInt(n[1].substr(2,2),16),parseInt(n[1].substr(4,2),16),t):this.fromRGB(parseInt(n[1].charAt(0)+n[1].charAt(0),16),parseInt(n[1].charAt(1)+n[1].charAt(1),16),parseInt(n[1].charAt(2)+n[1].charAt(2),16),t),!0;if(n=e.match(/^\W*rgba?\(([^)]*)\)\W*$/i)){var r=n[1].split(","),i=/^\s*(\d*)(\.\d+)?\s*$/,s,o,u;if(r.length>=3&&(s=r[0].match(i))&&(o=r[1].match(i))&&(u=r[2].match(i))){var a=parseFloat((s[1]||"0")+(s[2]||"")),f=parseFloat((o[1]||"0")+(o[2]||"")),l=parseFloat((u[1]||"0")+(u[2]||""));return this.fromRGB(a,f,l,t),!0}}return!1},this.toString=function(){return(256|Math.round(this.rgb[0])).toString(16).substr(1)+(256|Math.round(this.rgb[1])).toString(16).substr(1)+(256|Math.round(this.rgb[2])).toString(16).substr(1)},this.toHEXString=function(){return"#"+this.toString().toUpperCase()},this.toRGBString=function(){return"rgb("+Math.round(this.rgb[0])+","+Math.round(this.rgb[1])+","+Math.round(this.rgb[2])+")"},this.isLight=function(){return.213*this.rgb[0]+.715*this.rgb[1]+.072*this.rgb[2]>127.5},this._processParentElementsInDOM=function(){if(this._linkedElementsProcessed)return;this._linkedElementsProcessed=!0;var t=this.targetElement;do{var n=e.getStyle(t);n&&n.position.toLowerCase()==="fixed"&&(this.fixed=!0),t!==this.targetElement&&(t._jscEventsAttached||(e.attachEvent(t,"scroll",e.onParentScroll),t._jscEventsAttached=!0))}while((t=t.parentNode)&&!e.isElementType(t,"body"))};if(typeof t=="string"){var h=t,p=document.getElementById(h);p?this.targetElement=p:e.warn("Could not find target element with ID '"+h+"'")}else t?this.targetElement=t:e.warn("Invalid target element: '"+t+"'");if(this.targetElement._jscLinkedInstance){e.warn("Cannot link jscolor twice to the same element. Skipping.");return}this.targetElement._jscLinkedInstance=this,this.valueElement=e.fetchElement(this.valueElement),this.styleElement=e.fetchElement(this.styleElement);var d=this,v=this.container?e.fetchElement(this.container):document.getElementsByTagName("body")[0],m=3;if(e.isElementType(this.targetElement,"button"))if(this.targetElement.onclick){var g=this.targetElement.onclick;this.targetElement.onclick=function(e){return g.call(this,e),!1}}else this.targetElement.onclick=function(){return!1};if(this.valueElement&&e.isElementType(this.valueElement,"input")){var y=function(){d.fromString(d.valueElement.value,e.leaveValue),e.dispatchFineChange(d)};e.attachEvent(this.valueElement,"keyup",y),e.attachEvent(this.valueElement,"input",y),e.attachEvent(this.valueElement,"blur",c),this.valueElement.setAttribute("autocomplete","off")}this.styleElement&&(this.styleElement._jscOrigStyle={backgroundImage:this.styleElement.style.backgroundImage,backgroundColor:this.styleElement.style.backgroundColor,color:this.styleElement.style.color}),this.value?this.fromString(this.value)||this.exportColor():this.importColor()}};return e.jscolor.lookupClass="jscolor",e.jscolor.installByClassName=function(t){var n=document.getElementsByTagName("input"),r=document.getElementsByTagName("button");e.tryInstallOnElements(n,t),e.tryInstallOnElements(r,t)},e.register(),e.jscolor}());
\ No newline at end of file
diff --git a/apps/theming/js/settings-admin.js b/apps/theming/js/settings-admin.js
deleted file mode 100644 (file)
index 5617f7b..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/**
- * @author Björn Schießle <bjoern@schiessle.org>
- *
- * @copyright Copyright (c) 2016, Bjoern Schiessle
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your opinion) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-function startLoading() {
-       OC.msg.startSaving('#theming_settings_msg');
-       $('#theming_settings_loading').show();
-}
-
-function setThemingValue(setting, value) {
-       startLoading();
-       $.post(
-               OC.generateUrl('/apps/theming/ajax/updateStylesheet'), {'setting' : setting, 'value' : value}
-       ).done(function() {
-               hideUndoButton(setting, value);
-               preview(setting, value);
-       }).fail(function(response) {
-               OC.msg.finishedSaving('#theming_settings_msg', response.responseJSON);
-               $('#theming_settings_loading').hide();
-       });
-}
-
-function preview(setting, value, serverCssUrl) {
-       OC.msg.startAction('#theming_settings_msg', t('theming', 'Loading preview…'));
-
-       // Get all theming themes css links and force reload them
-       [...document.querySelectorAll('link.theme')]
-               .forEach(theme => {
-                       // Only edit the clone to not remove applied one
-                       var clone = theme.cloneNode()
-                       var url = new URL(clone.href)
-                       // Set current timestamp as cache buster
-                       url.searchParams.set('v', Date.now())
-                       clone.href = url.toString()
-                       clone.onload = function() {
-                               theme.remove()
-                       }
-                       document.head.append(clone)
-               })
-
-       if (setting === 'name') {
-               window.document.title = t('core', 'Admin') + " - " + value;
-       }
-       
-       // Finish
-       $('#theming_settings_loading').hide();
-       var response = { status: 'success', data: {message: t('theming', 'Saved')}};
-       OC.msg.finishedSaving('#theming_settings_msg', response);
-       hideUndoButton(setting, value);
-}
-
-function hideUndoButton(setting, value) {
-       var themingDefaults = {
-               name: 'Nextcloud',
-               slogan: t('lib', 'a safe home for all your data'),
-               url: 'https://nextcloud.com',
-               color: '#0082c9',
-               logoMime: '',
-               backgroundMime: '',
-               imprintUrl: '',
-               privacyUrl: ''
-       };
-
-       if (value === themingDefaults[setting] || value === '') {
-               $('.theme-undo[data-setting=' + setting + ']').hide();
-       } else {
-               $('.theme-undo[data-setting=' + setting + ']').show();
-       }
-
-       if(setting === 'backgroundMime' && value !== 'backgroundColor')  {
-               $('.theme-remove-bg').show();
-       }
-       if(setting === 'backgroundMime' && value === 'backgroundColor')  {
-               $('.theme-remove-bg').hide();
-               $('.theme-undo[data-setting=backgroundMime]').show();
-       }
-}
-
-window.addEventListener('DOMContentLoaded', function () {
-       $('#theming [data-toggle="tooltip"]').tooltip();
-
-       // manually instantiate jscolor to work around new Function call which violates strict CSP
-       var colorElement = $('#theming-color')[0];
-       colorElement.setAttribute('aria-expanded', 'false');
-       var jscolor = new window.jscolor(colorElement, {hash: true});
-
-       $('#theming .theme-undo').each(function() {
-               var setting = $(this).data('setting');
-               var value = $('#theming-'+setting).val();
-               hideUndoButton(setting, value);
-       });
-
-       $('.fileupload').fileupload({
-               pasteZone: null,
-               dropZone: null,
-               done: function (e, response) {
-                       var $form = $(e.target).closest('form');
-                       var key = $form.data('image-key');
-
-                       preview(key + 'Mime', response.result.data.name, response.result.data.serverCssUrl);
-                       $form.find('.image-preview').css('backgroundImage', response.result.data.url + '?v=' + new Date().getTime());
-                       OC.msg.finishedSaving('#theming_settings_msg', response.result);
-                       $form.find('label.button').addClass('icon-upload').removeClass('icon-loading-small');
-                       $form.find('.theme-undo').show();
-               },
-               submit: function(e, response) {
-                       var $form = $(e.target).closest('form');
-                       var key = $form.data('image-key');
-                       startLoading();
-                       $form.find('label.button').removeClass('icon-upload').addClass('icon-loading-small');
-               },
-               fail: function (e, response){
-                       var $form = $(e.target).closest('form');
-                       const responseJSON = response._response.jqXHR.responseJSON;
-                       OC.msg.finishedError('#theming_settings_msg', responseJSON && responseJSON.data && responseJSON.data.message ? responseJSON.data.message : t('theming', 'Error uploading the file'));
-                       $form.find('label.button').addClass('icon-upload').removeClass('icon-loading-small');
-                       $('#theming_settings_loading').hide();
-               }
-       });
-
-       // clicking preview should also trigger file upload dialog
-       $('#theming-preview-logo').on('click', function(e) {
-               e.stopPropagation();
-               $('#uploadlogo').click();
-       });
-       $('#theming-preview').on('click', function() {
-               $('#upload-login-background').click();
-       });
-
-       function checkName () {
-               var length = $('#theming-name').val().length;
-               try {
-                       if (length > 0) {
-                               return true;
-                       } else {
-                               throw t('theming', 'Name cannot be empty');
-                       }
-               } catch (error) {
-                       $('#theming-name').attr('title', error);
-                       $('#theming-name').tooltip({placement: 'top', trigger: 'manual'});
-                       $('#theming-name').tooltip('_fixTitle');
-                       $('#theming-name').tooltip('show');
-                       $('#theming-name').addClass('error');
-               }
-               return false;
-       }
-
-       $('#theming-name').keyup(function() {
-               if (checkName()) {
-                       $('#theming-name').tooltip('hide');
-                       $('#theming-name').removeClass('error');
-               }
-       });
-
-       $('#theming-name').change(function(e) {
-               var el = $(this);
-       });
-
-       $('#userThemingDisabled').change(function(e) {
-               var checked = e.target.checked
-               setThemingValue('disable-user-theming', checked ? 'yes' : 'no')
-       });
-
-       function onChange(e) {
-               var el = $(this);
-               var setting = el.parent().find('div[data-setting]').data('setting');
-               var value = $(this).val();
-
-               if(setting === 'color') {
-                       if (value.indexOf('#') !== 0) {
-                               value = '#' + value;
-                       }
-               }
-               if(setting === 'name') {
-                       if(checkName()){
-                               $.when(el.focusout()).then(function() {
-                                       setThemingValue('name', value);
-                               });
-                               if (e.keyCode == 13) {
-                                       setThemingValue('name', value);
-                               }
-                       }
-               }
-
-               $.when(el.focusout()).then(function() {
-                       setThemingValue(setting, value);
-               });
-               if (e.keyCode == 13) {
-                       setThemingValue(setting, value);
-               }
-       };
-
-       $('#theming input[type="text"]').change(onChange);
-       $('#theming input[type="url"]').change(onChange);
-
-       $('.theme-undo').click(function (e) {
-               var setting = $(this).data('setting');
-               var $form = $(this).closest('form');
-               var image = $form.data('image-key');
-
-               startLoading();
-               $('.theme-undo[data-setting=' + setting + ']').hide();
-               $.post(
-                       OC.generateUrl('/apps/theming/ajax/undoChanges'), {'setting' : setting}
-               ).done(function(response) {
-                       if (setting === 'color') {
-                               var colorPicker = document.getElementById('theming-color');
-                               colorPicker.style.backgroundColor = response.data.value;
-                               colorPicker.value = response.data.value.slice(1).toUpperCase();
-                       } else if (!image) {
-                               var input = document.getElementById('theming-'+setting);
-                               input.value = response.data.value;
-                       }
-                       preview(setting, response.data.value, response.data.serverCssUrl);
-               });
-       });
-
-       $('.theme-remove-bg').click(function() {
-               startLoading();
-               $.post(
-                       OC.generateUrl('/apps/theming/ajax/updateStylesheet'), {'setting' : 'backgroundMime', 'value' : 'backgroundColor'}
-               ).done(function(response) {
-                       preview('backgroundMime', 'backgroundColor', response.data.serverCssUrl);
-               }).fail(function(response) {
-                       OC.msg.finishedSaving('#theming_settings_msg', response);
-                       $('#theming_settings_loading').hide();
-               });
-       });
-
-});